之前在路由器上使用 Zerotier 组网,效果还是不错的。但是两台路由器都是通过打洞连接的,效果可能并不是特别稳定。恰好我的两台路由器都是有 IPv6 地址的,那么何不试试使用 IPv6 地址直连的方式来进行组网呢?
安装 WireGuard 依赖
在两台路由器上均安装相关的依赖,只需要安装 luci-i18n-wireguard-zh-cn
系统即可自动将所有依赖安装完毕,完成之后必须要重启路由器。
opkg update
opkg install luci-i18n-wireguard-zh-cn
重新登录路由器管理页面,就可以在 状态 – WireGuard 中看到 WireGuard 连接的状态。
配置 WireGuard 接口
若使用 N 台路由器互相连接,则需要在每台路由器上设置 N-1 个对端,这样可以确保任意两台路由器之间能互相连接。此处假设使用两台路由器来配置互相连接,每台路由器上均需要设置一个对端。
路由器 A 的网段为 192.168.1.0/24,路由器 B 的网段为 192.168.2.0/24,我们选择为 WireGuard 网络设置网段 172.16.0.0/16,路由器 A 在 WireGuard 网络中的地址为 172.16.1.1,路由器 B 在 WireGuard 网络中的地址为 172.16.2.1。
路由器 A
进入 网络 – 接口 页面中,添加新的接口,接口名称填入 wg,协议需要选择 WireGuard VPN。
在 常规设置 中,点击生成密钥按钮,私钥栏中会自动生成内容,监听端口填写 12000,IP 地址填入 172.16.1.1/16,注意此处最好是带上网段。
在 高级设置 中,MTU 填入 1280,此处如果填大了会让两端连接速度变慢。
在 防火墙设置 中,新建一个 vpn 区域。
保存并应用,创建端口。
在 状态 – WireGuard 中可以看到路由器 A 的公钥,复制下来,等下要填入路由器 B 的对端设置中。
回到 网络 – 接口 中,编辑 wg 接口,在 对端 中,添加一个对端,描述可以写 OpenWrt2,公钥中填入路由器 B 的公钥(参考本文后面路由器 B 的设置获得公钥),允许的 IP 中填入 172.16.2.1/32 和 192.168.2.0/24,勾选路由允许的 IP,端点主机填入对端路由器的公网地址,端点端口填入对端路由器的端口 12000,持续 Keep-Alive 中可以填入自己喜欢的大小,如 15,保存并应用所有设置。
进入 网络 – 防火墙 – 常规设置 – 区域 中,编辑 lan 区域,将允许转发到目标区域勾选上 vpn 区域,将允许来自源区域的转发也勾选上 vpn 区域,保存;将 vpn 区域的转发改为接受,保存并应用设置。
在 网络 – 防火墙 – 通信规则 页面中,新增一项规则。
在 常规设置 中,名称填写 Allow-WireGuard,协议保持默认 TCP+UDP 即可,源区域选择 wan,目标区域选择 设备(输入),目标端口调入 WireGuard 监听端口 12000,操作选择接受,保存防火墙设置。
回到 网络 – 接口 页面中,重启 wg 接口。
路由器 B
进入 网络 – 接口 页面中,添加新的接口,接口名称填入 wg,协议需要选择 WireGuard VPN。
在 常规设置 中,点击生成密钥按钮,私钥栏中会自动生成内容,监听端口填写 12000,IP 地址填入 172.16.2.1/16,注意此处最好是带上网段。
在 高级设置 中,MTU 填入 1280,此处如果填大了会让两端连接速度变慢。
在 防火墙设置 中,新建一个 vpn 区域。
保存并应用,创建端口。
在 状态 – WireGuard 中可以看到路由器 B 的公钥,复制下来,等下要填入路由器 A 的对端设置中。
回到 网络 – 接口 中,编辑 wg 接口,在 对端 中,添加一个对端,描述可以写 OpenWrt1,公钥中填入路由器 A 的公钥(参考本文前面路由器 A 的设置获得公钥),允许的 IP 中填入 172.16.1.1/32 和 192.168.1.0/24,勾选路由允许的 IP,端点主机填入对端路由器的公网地址,端点端口填入对端路由器的端口 12000,持续 Keep-Alive 中可以填入自己喜欢的大小,如 15,保存并应用所有设置。
进入 网络 – 防火墙 – 常规设置 – 区域 中,编辑 lan 区域,将允许转发到目标区域勾选上 vpn 区域,将允许来自源区域的转发也勾选上 vpn 区域,保存;将 vpn 区域的转发改为接受,保存并应用设置。
在 网络 – 防火墙 – 通信规则 页面中,新增一项规则。
在 常规设置 中,名称填写 Allow-WireGuard,协议保持默认 TCP+UDP 即可,源区域选择 wan,目标区域选择 设备(输入),目标端口调入 WireGuard 监听端口 12000,操作选择接受,保存防火墙设置。
回到 网络 – 接口 页面中,重启 wg 接口。
完成
此时,稍等片刻,在两台路由器的 状态 – WireGuard 中即可看到另外一台路由器的连接信息。
此时两端路由器下的设备就都可以访问另一端路由器下的设备了,就像是在同一个局域网中。
如果需要更省心的操作,可以选择参考以下内容。
配合 DDNS 使用
当其中一个路由器重新连接网络之后,公网地址可能会发生变化,此时可能会无法连接 WireGuard,不过我们可以配合 DDNS 使用。
两台路由器均配置好 DDNS 之后,可以在 WireGuard 的对端配置中将端点主机的地址由 IP 地址更换为域名。
DDNS 配置好之后,这样即使路由器更换了 IP 地址也可以重新连接上。
配合 IPv6 使用
WireGuard 可完美兼容 IPv6 使用,只需要 DDNS 的域名只有 IPv6 地址记录即可,在这种情况下,WireGuard 就使用 IPv6 与其他路由器连接。只需将上文图中 172.27.0.0/16 的地址替换为 DDNS 域名即可。
IPv6 DDNS 的配置可以参考另一篇文章:OpenWrt IPv6 DDNS
配合 WatchCat 使用
当出现问题无法连通对端路由器的时候,如果有自动化的操作可以直接重启接口,就很方便了,省去手动重启操作。
opkg update
opkg install watchcat luci-app-watchcat luci-i18n-watchcat-zh-cn
在 服务 – WatchCat 页面中,增加一项配置,模式选择“重启接口”(有些固件可能会翻译为“重启实例”),周期可以设置为 1m,在路由器 A 上安装的 WatchCat 就填写路由器 B 的地址 192.168.2.1,在路由器 B 上安装的 WatchCat 就填写路由器 A 的地址 192.168.1.1,检查间隔填写 10s,接口的话就选择 wg,其余保持不动,保存应用所有设置。
这样,在路由器发现无法 ping 通对端路由器 1 分钟之后将会自动重启 wg 接口,保证两台路由器之间持续连接。
我也是这样的,不知道为什么。我是两台路由器A和B,A有IPV4公网IP,B是DDNS动态域名绑定的IPV6地址。
B端设置端点主机地址是A的公网IP:xxxx.xxx.xxx.xx。在A端不填B端的端点主机地址时,B可以访问A此事可以看到wireguard状态已握手
在A端填写B端的域名后,wireguard就不通了,B端的域名是可以通过浏览器直接访问的。但是在端点主机那里填写以后wireguard就不通了
之前状态已经握手说明配置应该是没问题的,不知道两边能不能用 WireGuard 隧道地址 ping 通?
两边都填写了域名之后,有没有尝试过两边都重启 WireGuard 测试?
又懵了呀,我改了resolv之后测试ping然后就改wireguard设置保存,重启wireguard接口也不行,最后重启了路由,还是不行,查看resolv发现nameserver 又变回127,整个过程是这样子的?
又扒了扒恩山,用winscp打开etc/resolv.conf 下的nameserve,发现设置的是127.0.0.1,改成主路由ip了,发现网络诊断里的ping域名可以了,也能解析到ipv6地址了,但是重启路由文件内又会变回127。
重点是wireguard里对端地址如果填域名,仍然不行,越来越吊诡了
似乎问题也不是OP能否解析IPV6域名的锅
有可能是你在用的某个插件禁止了 IPv6 解析,比如 SmartDNS 之类的插件。建议你把所有插件都关了之后,改一下 resolve.conf 再试试。
我翻看了一下系统日志,显示是这样的,另外我没有额外的插件,就是istoreos默认的,装了个lucky,没有科学,需要在哪查看这些
Thu Apr 18 20:47:22 2024 daemon.info dnsmasq[1]: using nameserver 192.168.101.1#53
Thu Apr 18 20:47:28 2024 daemon.warn dnsmasq[1]: possible DNS-rebind attack detected: [此处是我的域名]
Thu Apr 18 20:47:28 2024 daemon.notice netifd: wg (19482): Name does not resolve: `[此处还是我的域名]:12000′
Thu Apr 18 20:47:28 2024 daemon.notice netifd: wg (19482): Configuration parsing error
日志提示可能有 DNS 重绑定攻击,意味着解析你的域名结果是私有 IP,而非公网 IP,因此 dnsmasq 屏蔽了这个域名解析结果,WireGuard 才无法启动。
建议你再研究一下你的域名解析结果。
我继续翻看了之前的日志,在我没有操作resolv之前的日志里,关于报错也是这三行日志,也就是我的操作虽然在网络诊断那里起作用了,但在wireguard里并没有作用,dhcp/dns设置里的dns重定向?这个解析到底是需要在哪里设置…真的懵
因为在改了文件之后,WireGuard 服务并没有重启,文件改动并没有对本次系统启动全局生效。
又懵了呀,我改了resolv之后测试ping然后就改wireguard设置保存,重启wireguard接口也不行,最后重启了路由,还是不行,查看resolv发现nameserver 又变回127,整个过程是这样子的?
完整日志
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: reading /tmp/resolv.conf.d/resolv.conf.auto
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: using nameserver 192.168.101.1#53
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: using nameserver fe80::9e9d:7eff:fe57:11e6%br-lan#53
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: using only locally-known addresses for test
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: using only locally-known addresses for onion
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: using only locally-known addresses for localhost
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: using only locally-known addresses for local
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: using only locally-known addresses for invalid
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: using only locally-known addresses for bind
Thu Apr 18 20:55:36 2024 daemon.info dnsmasq[1]: using only locally-known addresses for lan
Thu Apr 18 20:55:36 2024 daemon.warn dnsmasq[1]: possible DNS-rebind attack detected: [我的域名]
Thu Apr 18 20:55:36 2024 daemon.notice netifd: wg (24751): Name does not resolve: `[我的域名]:12000′
Thu Apr 18 20:55:36 2024 daemon.notice netifd: wg (24751): Configuration parsing error
Thu Apr 18 20:55:36 2024 daemon.debug ModemManager[24786]: hotplug: event reported: action=add, name=wg, subsystem=net
Thu Apr 18 20:55:36 2024 daemon.err ModemManager[24786]: hotplug: parent device sysfspath not found
Thu Apr 18 20:55:41 2024 daemon.debug ModemManager[24928]: hotplug: event reported: action=remove, name=wg, subsystem=net
Thu Apr 18 20:55:41 2024 daemon.notice netifd: Interface ‘wg’ is now down
而且改了resolv后,网络诊断的NSLOOKUP里,域名解析出来的ipv6地址就是ddns的ipv6公网地址,我仔细核对了,都没问题,而且ping也没问题,难道是我用winscp改resolv的方式不对?