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分钟运行一次,并把运行结果写入系统日志.