折腾笔记

折腾笔记

当IP地址变化自动重新连接wireguard解决办法

2025-05-02

遇到的问题

wg-easy部署在家庭服务器上,云服务器连接到了wg上然后做内网反向代理,但是当家庭局域网变化的时候,wg客户端无法重新连接,导致内网反向代理失败,此脚本是用来解决该问题的

原理

利用脚本定时检测域名解析的ip变化情况,当ip地址出现变化的时候,重新启动wg。

脚本

#!/bin/bash

WG_HOSTNAME="yourname.example.com"      # 请替换为你自己的 DDNS 域名
WG_INTERFACE="wg0"                      # WireGuard 接口名称
IP_CACHE_FILE="/tmp/wg_last_ip.txt"     # 上次 IP 缓存文件

# 获取当前解析的公网 IP
current_ip=$(dig +short "$WG_HOSTNAME" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)

# 判断解析是否成功
if [[ -z "$current_ip" ]]; then
    echo "[$(date)] 域名解析失败:$WG_HOSTNAME"
    exit 1
fi

# 读取上一次的 IP
last_ip=""
if [[ -f "$IP_CACHE_FILE" ]]; then
    last_ip=$(cat "$IP_CACHE_FILE")
fi

# 如果 IP 变了,就重启 WireGuard
if [[ "$current_ip" != "$last_ip" ]]; then
    echo "[$(date)] IP 变化:$last_ip → $current_ip"
    echo "$current_ip" > "$IP_CACHE_FILE"

    echo "[$(date)] 正在重启 WireGuard:$WG_INTERFACE"
    wg-quick down "$WG_INTERFACE"
    sleep 2
    wg-quick up "$WG_INTERFACE"
else
    echo "[$(date)] IP 未变,当前 IP:$current_ip"
fi

使用方法

1、打开云服务器终端,创建脚本文件。

sudo nano /usr/local/bin/wg-watchdog.sh

2、粘贴上面脚本文件,注意需要修改相对应的变量。

3、保存退出nano文件。

按下 Ctrl+O,回车,接着 Ctrl+X 退出。

4、赋予脚本执行权限。

sudo chmod +x /usr/local/bin/wg-watchdog.sh

设置定时任务(crontab)

通过以上方法可以实现判断解析域名变化然后实现重启wg,接下来增加该脚本的定时任务,设置每 3 分钟自动检测。

1、编辑当前用户定时任务。

crontab -e

2、添加以下内容。

*/3 * * * * /usr/local/bin/wg-watchdog.sh >> /var/log/wg-watchdog.log 2>&1

检查和调试

1、手动运行脚本查看结果。

/usr/local/bin/wg-watchdog.sh

2、查看wireguard的当前状态。

wg show

3、查看日志.

cat /var/log/wg-watchdog.log

4、通过日志可以看到脚本运行成功。

后续优化

后续配置smtp邮箱通知服务或者tg机器人提醒,当ip变化的时候会自动提示,方便监控服务器状态变化情况。