openwrt通过WIREGUARD组网判断连接是否正常脚本

openwrt通过WIREGUARD组网后利用计划任务来判断连接是否正常脚本,连续PING对端IP地址5次,如果连续掉包便重启相应的WIREGUARD接口.

#!/bin/sh

# ===================== 配置区域(只改这里)=====================
MAX_FAILED=5

# 【格式】每个接口一行:接口名 目标IP
WG_CONFIG="
wg          172.3.2.1
wg0       172.3.3.2
wg1    172.172.122.1
wg2       172.3.4.2
"
# ==============================================================

# 单次 ping
ping_once() {
    ping -I "$1" -c 1 -W 2 "$2" >/dev/null 2>&1
    return $?
}

# 检测单个接口
check_interface() {
    local iface="$1"
    local ip="$2"
    local failed=0

    echo "==== 检测接口:$iface  -> 目标IP:$ip ===="

    for i in $(seq 1 $MAX_FAILED); do
        if ! ping_once "$iface" "$ip"; then
            failed=$((failed+1))
            echo "第 $i 次 ping 失败 ($failed/$MAX_FAILED)"
        else
            echo "✅ 接口 $iface 正常"
            return 0
        fi
    done

    echo "❌ 接口 $iface 连续 $MAX_FAILED 次不通"
    return 1
}

# 重启接口
restart_interface() {
    local iface="$1"
    echo "🔄 重启接口:$iface"
    ifdown "$iface" >/dev/null 2>&1
    sleep 3
    ifup "$iface" >/dev/null 2>&1
    sleep 4
}

# ==================== 主程序(永不错乱版)====================
echo "=================================================="
echo "        WireGuard 多接口自动守护程序"
echo "=================================================="

# 遍历所有配置(永不错位、永不丢失)
echo "$WG_CONFIG" | grep -v "^$" | while read -r IFACE IP; do
    if [ -z "$IFACE" ] || [ -z "$IP" ]; then
        continue
    fi

    if ! check_interface "$IFACE" "$IP"; then
        restart_interface "$IFACE"

        if ping -I "$IFACE" -c 2 -W 2 "$IP" >/dev/null 2>&1; then
            echo "✅ 接口 $IFACE 重启成功!"
        else
            echo "⚠️  接口 $IFACE 重启后仍在重连"
        fi
    fi

    echo "--------------------------------------------------"
done

echo "🏁 所有接口检测完成"

新建一个wireguard-check-restart.sh文件,把上面内容复制到文件保存,并上传到路由的/mnt/sata1-1/位置(根据你实际路径修改),再给文件相应权限:

chmod +x /mnt/sata1-1/wireguard-check-restart.sh

在计划任务中添加以下代码:

*/10 * * * * /mnt/sata1-1/wireguard-check-restart.sh 2>&1 | logger -t wireguard-check

意思是10分钟运行一次,并把运行结果写入系统日志.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code