WireGuard 在 OpenWrt 环境下解决 DDNS 环境中 Peer 域名动态变化问题

Jinpeng
Jinpeng
管理员
40
文章
0
粉丝
MikroTik OpenWRT WireguardWireGuard 在 OpenWrt 环境下解决 DDNS 环境中 Peer 域名动态变化问题已关闭评论300阅读模式

在使用 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

 

文章末尾固定信息

weinxin
我的微信
微信号已复制
我的微信
微信扫一扫
 
Jinpeng
  • 本文由 Jinpeng 发表于2025年12月2日 22:05:01
  • 转载请务必保留本文链接:https://www.ixmu.net/166.html