本文目录导读:

检测VPN连接是否正常,通常有几种不同的思路,具体取决于“正常”的定义:是网络可达性(能上网)、IP地址归属(IP在VPN服务器那边),还是隧道状态(VPN协议是否建立)。
以下是几种常见的脚本检测方法,适用于Windows、Linux环境:
检测网络连通性(最常用)
核心逻辑:通过Ping或HTTP请求检测是否能访问特定目标。注意:为了避免“DNS污染”或“流量泄露”,最好直接请求被VPN服务器覆盖的私网IP,而不是外网域名。
Python脚本示例(检测是否能访问10.0.0.1):
import subprocess
import sys
def check_vpn_connectivity(target_ip="10.0.0.1"):
"""
通过ping检测VPN内网目标是否可达
"""
# ping命令参数:-n 1 (Windows) 或 -c 1 (Linux/Mac)
param = "-n" if sys.platform.lower().startswith("win") else "-c"
command = ["ping", param, "1", target_ip]
try:
output = subprocess.run(command, capture_output=True, timeout=5, text=True)
if output.returncode == 0:
print(f"VPN连接正常:成功Ping通 {target_ip}")
return True
else:
print(f"VPN连接异常:Ping失败 {target_ip}")
return False
except subprocess.TimeoutExpired:
print("VPN连接异常:Ping超时")
return False
except Exception as e:
print(f"检测过程中发生错误:{e}")
return False
# 使用示例
if __name__ == "__main__":
check_vpn_connectivity("10.0.0.1") # 替换为你的VPN内网网关或服务器IP
使用场景:当VPN建立后,某些内部服务只有通过VPN才能访问。
检测VPN隧道具体状态(协议级)
核心逻辑:直接查询VPN客户端或系统网络接口状态,OpenVPN、WireGuard等都有专门的命令。
OpenVPN检测脚本示例:
#!/bin/bash
# 方法1:检查OpenVPN进程是否存活
if pgrep -x openvpn > /dev/null; then
echo "OpenVPN进程正在运行"
else
echo "OpenVPN进程未运行"
exit 1
fi
# 方法2:检查OpenVPN管理接口状态(需要开启管理端口)
# openvpn_status=$(echo "status" | nc -w 2 127.0.0.1 7505 2>/dev/null) # 端口需和配置一致
# if echo "$openvpn_status" | grep -q "CLIENT_LIST"; then
# echo "OpenVPN隧道正常"
# else
# echo "OpenVPN无客户端连接"
# fi
WireGuard检测脚本示例:
#!/bin/bash
# 检查WireGuard接口状态
wg_interface="wg0" # 根据配置修改
if ip link show $wg_interface 2>/dev/null | grep -q "UP"; then
echo "WireGuard接口 $wg_interface 已启用"
wg show $wg_interface
else
echo "WireGuard接口未启用或不存在"
fi
检测IP地址是否在VPN网段(防泄露)
核心逻辑:获取当前公网IP,判断是否属于VPN服务器所在网络,这样能发现“配置故障”或“网络暴露”的情况。
PowerShell脚本(Windows):
# 获取当前公网IP(通过api.ipify.org或其他可信源)
$publicIP = (Invoke-RestMethod -Uri "https://api.ipify.org?format=json" -TimeoutSec 10).ip
Write-Host "当前公网IP:$publicIP"
# 判断是否在VPN网段内(192.168.100.0/24)
$vpnSubnet = "192.168.100."
if ($publicIP.StartsWith($vpnSubnet)) {
Write-Host "VPN连接正常,IP在VPN网段内"
exit 0
} else {
Write-Host "VPN连接异常,IP不在预期网段内,可能断线或DNS泄露"
exit 1
}
注意:此方法依赖外部api服务,且VPN服务器需要允许公网API访问,更可靠的是使用VPN服务器本身的IP(如10.x.x.x)。
综合状态检查(推荐)
结合多种方式,避免单一错误判断,一个健壮的脚本应该:
- 检查VPN进程或隧道接口(快速确认协议层)。
- 尝试Ping内部网关(确认路由和链路质量)。
- 检查IP归属(确认流量经过VPN)。
Linux Bash综合示例:
#!/bin/bash
VPN_IF="tun0" # VPN虚拟接口名
VPN_GW="10.0.0.1" # VPN内网网关
VPN_SUBNET="10.0.0.0/8" # VPN内网网段
echo "=== VPN连接状态检测 ==="
# Step 1: 检查接口
if ip link show $VPN_IF 2>/dev/null | grep -q "UP"; then
echo "[✓] 接口 $VPN_IF 已启用"
else
echo "[✗] 接口 $VPN_IF 不存在或未启用"
exit 1
fi
# Step 2: 检查路由(确保流量走VPN)
if ip route show | grep -q "$VPN_SUBNET dev $VPN_IF"; then
echo "[✓] VPN路由 $VPN_SUBNET 存在"
else
echo "[✗] VPN路由缺失"
fi
# Step 3: Ping检测(丢包率和延迟)
ping_result=$(ping -c 2 -W 3 $VPN_GW 2>&1)
if [ $? -eq 0 ]; then
latency=$(echo "$ping_result" | tail -1 | awk -F '/' '{print $5}')
echo "[✓] 到 $VPN_GW 通信正常 (延迟: ${latency}ms)"
else
echo "[✗] 到 $VPN_GW 不通"
exit 1
fi
echo "=== 检测完成:VPN运行正常 ==="
常见问题和注意事项
- 防火墙规则:VPN服务器可能禁止ICMP,此时Ping失败不代表VPN断开,建议改用 TCP端口检测(如
nc -zv 服务器IP 443或curl -m 5 http://内部服务/健康检查)。 - 多VPN环境:如果你同时有多个VPN连接,记得指定正确的接口或IP范围。
- 脚本权限:查询网络接口、路由表可能需要sudo/管理员权限,建议嵌入
sudo -n或提前提权。 - 自动化集成:可以将脚本加入系统定时任务(cron/计划任务),并输出Prometheus/Heka格式便于监控。
- 更好的方式——使用操作系统提供的VPN状态API:
- Windows:
Get-VpnConnection -Name "你的连接名" | Select-Object ConnectionState - macOS:
scutil --nc show "你的连接名" | grep "State"
- Windows:
选择哪种方法取决于你的VPN类型和环境,对于生产环境,建议将脚本封装为HTTP健康检查端点,由外部监控系统(如Nagios、Zabbix)周期性触发检测。