WireGuard on OpenWrt+IPv6 组网

之前在路由器上使用 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 接口,保证两台路由器之间持续连接。

WireGuard on OpenWrt+IPv6 组网》有43个想法

  1. yishion819

    请问大佬,我是移动宽带,ipv6设置好了的,检测没问题,我在openwrt设置好wireguard后,手机连接就提示dbs解析错误,一个或多个端点的域名无法解析,但我的ddns的ipv6又是正常的,这是怎么回事呢

    回复
  2. 非凡网络

    博主
    我的A-B都联通了ipv6两端的wgd虚拟ip能互相平通,就是两端的内网业务ip不能ping通路由都是正常的就是不通,是怎么回事的

    回复
    1. Neo 文章作者

      看情况应该是转发问题,你着重看一下文章里防火墙区域的设置部分再试试看吧。

      回复
      1. 非凡网络

        防火墙都看过,对端的网关可以打开就是其他设备ip不同

        回复
        1. Neo 文章作者

          既然能打开网关,说明问题肯定是出在转发上面了,多仔细检查转发设置吧。

          回复
            1. 和合

              问题解决了吗?我也是转发这不会。能打开网关的东西,但是内网的服务访问不了。有经验可以分享吗?

              回复
  3. Joynaruto

    两个OpenWrt都需要有公网ip才能相互连接么?
    想问下博主,端点地址的地方填的都是公网ip么?

    回复
    1. Neo 文章作者

      至少一个端点为公网 IP 就可以成功连接,有公网 IP 的设备在填写无公网 IP 对端配置的时候可以不填写地址。端点地址填写的都是公网 IP 或者域名,我文章中为了方便演示使用了两个局域网地址。

      回复
      1. Joynaruto

        ok!感谢博主回复。
        我的环境是这样的:
        -我家里的A路由有公网;公司的B路由没公网;
        -两个路由都是OpenWrt系统;
        -现在通过Wireguard相互连接,B端点填入A的ddns,而A端点只能空着(因为B无公网)
        现在我在公司的B路由下(无公网)的设备可以访问A路由(有公网)下的设备,但家中A路由下的设备却无法访问公司B路由下的设备,A路由下的设备只能访问B路由的后台界面。

        想问下博主:如果想实现A路由(有公网)下的设备访问B路由(无公网)下的设备,是否可行;想要AB路由双向访问(A路由下设备访问B路由下设备(未达成);B路由下设备访问A路由下设备(已达成))是不是AB两端都要有公网呢?

        回复
        1. Neo 文章作者

          1:可行,2:不需要都有,有一个公网就可以。

          至于你说的A网无法访问B网内设备,那检查一下B网的防火墙转发设置有没有与A同样设置好;再者就是检查 WireGuard 配置,其实除了少填写一个对端地址之外,AB两端的设置都是同样的操作。

          回复
          1. Joynaruto

            AB子网设备互联搞定了!谢谢博主!我在A路由(有公网)上重连wg接口就能访问B路由(无公网)下的设备了!
            但我现在还有个问题:我家中的A路由(有公网)是常年在线的,公司的B路由(无公网)每天下班断电关闭,上班再开机的。我发现每次上班B路由启动后,总是需要去A路由后台重连下wg接口,双方才能正常连接,不做这个操作,AB无法互通,求解?ps:我家A路由的公网ip很久都不会变,应该不是公网ip变更,wg没有解析的问题。

            回复
    1. Neo 文章作者

      就目前的情况来看,运营商普遍还没有对 IPv6 地址的端口做出限制,且 IPv6 的 QoS 力度也比较小,所以不太可能是运营商的锅。需要多仔细检查自己的配置、防火墙的策略。

      回复

发表回复

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