分类
Tips

WireGuard on OpenWrt+IPv6 组网

之前在路由器上使用 Zerotier 组网,效果还是不错的。但是两台路由器都是通过打洞连接的,效果可能并不是特别稳定。恰好我的两台路由器都是有 IPv6 地址的,那么何不试试使用 IPv6 地址直连的方式来进行组网呢?

安装 WireGuard 依赖

在两台路由器上均安装相关的依赖,安装完毕之后建议重启路由器。

opkg update
opkg install kmod-wireguard wireguard-tools luci-proto-wireguard luci-app-wireguard luci-i18n-wireguard-zh-cn

之后退出并重新登录路由器管理页面,就可以在 状态 – WireGuard 中看到 WireGuard 连接的状态。

配置 WireGuard 接口

此处假设使用两台路由器来配置互相连接。若使用 N 台路由器互相连接,则需要在每台路由器上设置 N-1 个对端。

路由器 A

进入 网络 – 接口 页面中,添加新的接口,接口名称填入 wg,协议需要选择 WireGuard VPN。
在 常规设置 中,填入私钥,填好监听端口,如 12311,IP 地址可以填入一个你喜欢的 C 类地址,如 172.16.31.10/16,注意此处最好是带上网段。
在 防火墙设置 中,最简单的方式就是将此接口放在 lan 区域中。
在 对端 中,添加一个对端,描述可以随意填写,公钥中填入对端路由器的公钥,允许的 IP 中填入对端路由器在 常规设置 中的 IP,如 172.16.99.1/32,再填入对端路由器的局域网段,如 192.168.99.0/24,勾选路由允许的 IP,端点主机填入对端路由器的 IPv6 地址,端点端口填入对端路由器的端口 12991,持续 Keep-Alive 中可以填入自己喜欢的大小,如 10。
保存所有设置。

进入 网络 – 防火墙 – 通信规则 页面中,新增一项规则。
在 常规设置 中,名称可以随意填写,如 Allow-WireGuard,协议保持默认 TCP+UDP 即可,源区域选择 wan,目标区域选择 设备(输入),目标端口调入 WireGuard 监听端口,如 12311,操作选择接受。
在 高级设置 中,限制地址类型选择仅 IPv6。
保存防火墙设置。

回到 网络 – 接口 页面中,重启 wg 接口。

路由器 B

进入 网络 – 接口 页面中,添加新的接口,接口名称填入 wg,协议需要选择 WireGuard VPN。
在 常规设置 中,填入私钥,填好监听端口,如 12991,IP 地址可以填入一个你喜欢的 C 类地址,如 172.16.99.1/16,注意此处最好是带上网段。
在 防火墙设置 中,最简单的方式就是将此接口放在 lan 区域中。
在 对端 中,添加一个对端,描述可以随意填写,公钥中填入对端路由器的公钥,允许的 IP 中填入对端路由器在 常规设置 中的 IP,如 172.16.31.10/32,再填入对端路由器的局域网段,如 192.168.31.0/24,勾选路由允许的 IP,端点主机填入对端路由器的 IPv6 地址,端点端口填入对端路由器的端口 12311,持续 Keep-Alive 中可以填入自己喜欢的大小,如 10。
保存所有设置。

进入 网络 – 防火墙 – 通信规则 页面中,新增一项规则。
在 常规设置 中,名称可以随意填写,如 Allow-WireGuard,协议保持默认 TCP+UDP 即可,源区域选择 wan,目标区域选择 设备(输入),目标端口调入 WireGuard 监听端口,如 12991,操作选择接受。
在 高级设置 中,限制地址类型选择仅 IPv6。
保存防火墙设置。

回到 网络 – 接口 页面中,重启 wg 接口。

完成

此时,稍等片刻,即可访问对端路由器局域网。

如果需要更省心的操作,可以选择参考以下内容。

配合 DDNS 使用

当其中一个路由器重新连接网络之后,IPv6 地址可能会发生变化,此时可能会无法连接 WireGuard,不过我们可以配合 DDNS 使用。
两台路由器均配置好 DDNS 之后,可以在 WireGuard 的对端配置中将端点主机的地址由 IPv6 地址更换为域名。
DDNS 配置好之后,以下进阶的使用就可以进行了。

配合 WatchCat 使用

当出现问题无法连通对端路由器的时候,如果有自动化的操作可以直接重启接口,就很方便了,省去手动重启操作。

opkg update
opkg install watchcat luci-app-watchcat luci-i18n-watchcat-zh-cn

在 服务 – WatchCat 页面中,增加一项配置,模式选择“重启接口”(有些固件可能会翻译为“重启实例”),周期可以设置为 1m,要检查的主机就填入对端路由器的地址,比如 192.168.99.1,检查间隔可以写 10s,接口的话就选择 wg,其余保持不动。

这样,在路由器发现无法 ping 通对端路由器 1 分钟之后将会自动重启 wg 接口。

配合定时任务使用

在配置好 DDNS 之后,虽然可以解析到对端路由器的 IPv6 地址了,但如果对端路由器此时重启,本地路由器默认连接的地址还是上一次 DDNS 配置的地址。本地路由不能及时更新解析,导致无法连接。此问题可以使用定时任务来解决。

domain="example.com"

record="/root/example.com.txt"
[ -f $record ] || echo "$domain" > $record
last=`cat $record`
this=`/usr/bin/host -t AAAA $domain | awk '{print $5}'`

if [ "$last" != "$this" ]
then
    logger -p info -t "`basename $0`[$$]" "Restarting interface wg..."
    ifdown wg && ifup wg
    echo $this > $record
else
    logger -p info -t "`basename $0`[$$]" "No need to restart interface wg"
fi

将以上内容存为 /root/check_domain.sh,第一行的域名修改为对端路由器的动态域名。

crontab -e 添加定时任务。

*/5 * * * * /bin/sh /root/check_domain.sh

这样,就可以每五分钟检查一次对端路由器的动态域名。若检测到发生了变化,则自动重启 wg 接口。这样,本地路由器就可以及时使用最新的地址连接对端路由器了。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注