要创建一个VPN连接失败检测工具,可以使用Python编写一个命令行工具来监测VPN服务器的连接状态,以下是一个示例工具的思路和代码:
工具名称:vpn_health_check.py
工具目标:
- 监测多个VPN服务器的连接状态。
- 检查TCP和UDP端口是否开放。
- 检查服务器的SSL/TLS证书是否有效。
- 定期执行检测并提供报告。
工具功能:
-
输入参数:
- 您的VPN服务器列表,包含服务器地址、端口、协议和证书文件路径。
- 定时检测的时间间隔(默认30分钟)。
-
检测项:
- TCP连接测试。
- UDP连接测试。
- SSL/TLS证书有效性测试。
- 服务器响应时间监控。
-
输出:
- 实时状态显示(绿色正常,红色异常)。
- 每次检测结果的报告文件。
- 异常日志文件。
工具代码:
import argparse
import time
import socket
import ssl
import requests
from datetime import datetime
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def is_port_open(host, port, protocol):
try:
if protocol == 'tcp':
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
return True
elif protocol == 'udp':
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b'', (host, port))
return True
except socket.error:
return False
except:
return False
finally:
if 's' in locals():
s.close()
return False
def check_ssl_certificate(host, port, cert_path):
try:
# 创建 SSL 上下文
context = ssl.create_default_context()
# 连接到服务器
conn = context.connect(host, port)
# 检查证书
certificate = conn.getpeercert()
# 保存证书
with open(cert_path, 'wb') as f:
f.write(certificate)
return True
except Exception as e:
logger.error(f"SSL检查失败:{str(e)}")
return False
finally:
if 'conn' in locals():
conn.close()
def main():
# 解析命令行参数
parser = argparse.ArgumentParser(description='VPN连接健康检查工具')
parser.add_argument('--servers', type=str, help='服务器配置文件路径')
parser.add_argument('--interval', type=int, default=30, help='检测间隔分钟')
args = parser.parse_args()
# 加载服务器配置
try:
with open(args.servers, 'r') as f:
servers = json.load(f)
except Exception as e:
logger.error(f"读取服务器配置失败:{str(e)}")
return
# 创建定时任务
while True:
logger.info('开始检测')
for server in servers:
host = server['host']
port = int(server['port'])
protocol = server['protocol']
cert_path = server['cert_path']
# 检查端口
if not is_port_open(host, port, protocol):
logger.error(f"服务器 {host}:{port} 端口 {protocol} 检查失败")
continue
# 检查SSL证书
if not check_ssl_certificate(host, port, cert_path):
logger.error(f"服务器 {host}:{port} SSL证书检查失败")
continue
logger.info(f"服务器 {host}:{port} 连接正常")
# 保存检测结果
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
logger.info(f"检测结果:{current_time}")
with open('vpn_health_report.log', 'a') as f:
f.write(f"检测时间:{current_time}\n")
for server in servers:
host = server['host']
port = int(server['port'])
status = '正常'
if not is_port_open(host, port, server['protocol']):
status = '端口检查失败'
if not check_ssl_certificate(host, port, server['cert_path']):
status = '证书检查失败'
f.write(f"服务器:{host}:{port} - {status}\n")
# 等待下一次检测
time.sleep(args.interval * 60)
if __name__ == '__main__':
main()
使用说明:
-
安装依赖:
- 使用
pip install requests安装必要的库。
- 使用
-
配置文件:
- 创建一个
servers.json文件,格式如下:[ { "host": "server1.example.com", "port": 1194, "protocol": "tcp", "cert_path": "server1.crt" }, { "host": "server2.example.com", "port": 1195, "protocol": "udp", "cert_path": "server2.crt" } ]
- 创建一个
-
运行工具:
- 在终端中运行:
python vpn_health_check.py --servers servers.json --interval 60
- 参数说明:
--servers:服务器配置文件路径。--interval:检测间隔时间(分钟)。
- 在终端中运行:
-
日志输出:
- 工具会生成
vpn_health_report.log文件,记录每次检测的结果。
- 工具会生成
功能扩展:
- 支持更多协议:如 IKEv2 等。
- 添加健康阈值:当连续多次检测失败时触发警报。
- 集成告警系统:通过邮件或钉钉发送异常通知。
这个工具可以根据实际需求进行扩展和定制,帮助您自动化监控VPN服务器的健康状态。









