脚本如何检测VPN连接是否正常

wen 实用脚本 2

本文目录导读:

脚本如何检测VPN连接是否正常

  1. 方法一:检测网络连通性(最常用)
  2. 方法二:检测VPN隧道具体状态(协议级)
  3. 方法三:检测IP地址是否在VPN网段(防泄露)
  4. 方法四:综合状态检查(推荐)
  5. 常见问题和注意事项

检测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)。

综合状态检查(推荐)

结合多种方式,避免单一错误判断,一个健壮的脚本应该:

  1. 检查VPN进程或隧道接口(快速确认协议层)。
  2. 尝试Ping内部网关(确认路由和链路质量)。
  3. 检查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运行正常 ==="

常见问题和注意事项

  1. 防火墙规则:VPN服务器可能禁止ICMP,此时Ping失败不代表VPN断开,建议改用 TCP端口检测(如nc -zv 服务器IP 443curl -m 5 http://内部服务/健康检查)。
  2. 多VPN环境:如果你同时有多个VPN连接,记得指定正确的接口或IP范围。
  3. 脚本权限:查询网络接口、路由表可能需要sudo/管理员权限,建议嵌入sudo -n或提前提权。
  4. 自动化集成:可以将脚本加入系统定时任务(cron/计划任务),并输出Prometheus/Heka格式便于监控。
  5. 更好的方式——使用操作系统提供的VPN状态API
    • WindowsGet-VpnConnection -Name "你的连接名" | Select-Object ConnectionState
    • macOSscutil --nc show "你的连接名" | grep "State"

选择哪种方法取决于你的VPN类型和环境,对于生产环境,建议将脚本封装为HTTP健康检查端点,由外部监控系统(如Nagios、Zabbix)周期性触发检测。

抱歉,评论功能暂时关闭!