在使用 RouterOS 和 OpenWrt 通过 WireGuard 组网的过程中,RouterOS 的公网 IP 是动态的,而OpenWrt 仅在连接时解析 Peer 中的域名地址以获取 IP。这导致当 RouterOS 使用 DDNS 更新 IP 后,OpenWrt 不会自动获取新的 IP 并重启 WireGuard 接口。
我们的思路是定时检测域名解析是否发生变化,如果有变化,则重启 WireGuard 隧道。
已在Openwrt系统上测试OK,其他发行版类似。
#! /bin/ash
# ============================================================================
# check_wg.sh
# 用途:检查 WireGuard 家庭服务器的公网 IP 是否变化,若变化则重启 WireGuard 接口。
# 配置:
# PEER_DOMAIN - 你的 Peer 域名,用于 DNS 解析
# WG_INTERFACE - WireGuard 接口名(默认 wg)
# DNS_SERVER - 用于解析的 DNS 服务器(默认 223.5.5.5)
# SLEEP_SECONDS - 接口重启后等待的秒数(默认 600)
# IP_FILE - 存储上次 IP 的文件(默认 current_wg_home_ip.txt)
# ============================================================================
PEER_DOMAIN="[你的Peer域名]" # 请替换为你的实际域名
WG_INTERFACE="wg" # WireGuard 接口名
DNS_SERVER="223.5.5.5" # DNS 服务器
SLEEP_SECONDS=600 # 等待时间(秒)
IP_FILE="current_wg_home_ip.txt" # IP 记录文件
echo "Checking WireGuard home server endpoint..."
# 读取上次记录的 IP,如果文件不存在则使用空字符串
if [ -f "$IP_FILE" ]; then
origin=$(cat "$IP_FILE")
else
origin=""
echo "No previous IP file found, treating as first run."
fi
echo "Original IP: $origin"
# 解析域名获取当前 IP
# nslookup 输出中包含多行,提取第一个 Address 行(排除头部)
lookup_output=$(nslookup "$PEER_DOMAIN" "$DNS_SERVER")
new=$(echo "$lookup_output" | tail -n 6 | grep -m 1 Address | awk '{print $2}')
# 检查是否为空
if [ -z "$new" ]; then
echo "New IP is empty! DNS lookup may have failed."
exit 1
fi
# 验证 IP 格式(支持 IPv4 和 IPv6)
# IPv4 格式:x.x.x.x,IPv6 格式包含冒号
if echo "$new" | grep -q -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' ; then
# IPv4 格式有效
:
elif echo "$new" | grep -q ':' ; then
# IPv6 格式有效
:
else
echo "New IP Invalid! Got: '$new'"
exit 1
fi
echo "New IP: $new"
# 保存新 IP 到文件
echo "$new" > "$IP_FILE"
if [ "$origin" = "$new" ]; then
echo "IP not changed."
else
echo "IP changed!"
echo "Restarting the interface $WG_INTERFACE..."
ifdown "$WG_INTERFACE"
sleep $SLEEP_SECONDS
ifup "$WG_INTERFACE"
echo "Reconnect successfully!"
fi
使用时只需在相同路径建立一个current_wg_home_ip.txt的空白文件,将脚本命名为check_wg.sh,并添加一条cron任务即可。
例如我每30分钟检查一次:
*/30 * * * * sh check_wg.sh
文章末尾固定信息
我的微信
微信号已复制
我的微信
微信扫一扫



