WireGuard在连接节点时,若Endpoint填入了域名,则只会将第一次解析到的IP作为Endpoint IP,之后遇到IP变化导致断连就不会尝试重解析DNS。因为家宽的公网IP都是动态公网IP,故产生了这方面需求。于是笔者查找了一下资料,在此记录一下解决方法。
先上参考链接:
Endpoint with changing IP - Arch Linux Wiki
操作方法很简单,使用systemd来完成。
注意:假设有一台拥有动态公网IP的服务器A,和位于内网/公网的机器B,发起连接的方向是B->A,那么以下步骤均于机器B上进行,服务器A上除了DDNS不需要额外配置。并且机器B需要Linux系统。
生成配置文件
先生成定时器配置,每半分钟更新一次Endpoint IP
nano /etc/systemd/system/wireguard_reresolve-dns.timer #要创建的第一个文件
配置如下,复制粘贴即可。
[Unit]
Description=Periodically reresolve DNS of all WireGuard endpoints
[Timer]
OnCalendar=*:*:0/30
[Install]
WantedBy=timers.target
生成任务配置
nano /etc/systemd/system/wireguard_reresolve-dns.service
配置如下
[Unit]
Description=Reresolve DNS of all WireGuard endpoints
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'for i in /etc/wireguard/*.conf; do /usr/share/wireguard-tools/examples/reresolve-dns/reresolve-dns.sh "$i"; done'
注:部分发行版的 reresolve-dns.sh
并不在 /usr/share/wireguard-tools/examples/reresolve-dns/
目录下。要验证可以在终端尝试直接运行这个脚本,如果报错了,可以按照以下方法解决:
-
方案一:浏览器打开https://pkgs.org/search/?q=reresolve-dns.sh,找到你的发行版对应这个脚本的位置(若有),修改脚本的目录。
-
方案二:如果发行版没有对应的脚本(比如说我的OpenSUSE),那么
mkdir -p /usr/share/wireguard-tools/examples/reresolve-dns/ nano /usr/share/wireguard-tools/examples/reresolve-dns/reresolve-dns.sh
浏览器打开https://github.com/WireGuard/wireguard-tools/blob/master/contrib/reresolve-dns/reresolve-dns.sh,复制全文,然后把脚本的内容粘贴进去,再执行
chmod +x /usr/share/wireguard-tools/examples/reresolve-dns/reresolve-dns.sh
启用配置
终端输入
systemctl enable --now wireguard_reresolve-dns.timer
现在WireGuard的Endpoint ip应该可以动态更新了。