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 组网》有68个想法

  1. 端点主机写域名就不行

    按照教程一步步走,用的istoreos,出现吊诡的一幕,现在我用ipv6格式的标准地址就是240那个填入端点主机处,一切正常了,但是填入我自己已配置好的ddns域名,就不行,但我正常用浏览器打开域名没问题,反过来说ipv6的地址本身就是ddns解析中复制过来的,这种要怎么解?wireguard版本是22.316.76227-771eb78

    回复
    1. 端点主机写域名就不行

      补充一下,我的公网ipv6地址就是用istoreos里的lucky插件配置完成的,解析没有问题,直接外网域名访问端口映射都没问题

      回复
    2. Neo 文章作者

      也许是域名同时有 A 和 AAAA 记录,可能 WireGuard 使用了 IPv4 地址。

      回复
      1. 端点主机写域名就不行

        我用的是腾讯云的DNS解析,我看了控制台记录类型只有AAAA,而且我这里的电信宽带也只给了IPV6公网。有没有其他的办法解决或者检查问题

        回复
        1. Neo 文章作者

          之前测试浏览器打开域名的时候,是不是就在这个路由器的局域网下测试的?我怀疑是光猫或者路由器的防火墙拦截了。你可以试试用手机流量能不能浏览器打开域名。

          回复
          1. 端点主机写域名就不行

            域名是绝对没有问题的,IPV6 DDNS的解析我已经用了几个月了,而且通过LUCKY插件了的端口转发,其实远程桌面,ALIST外网访问,MT PHOTOS外网访问这些全部都打通的,非常便捷,现在就是看了楼主的教程手痒痒,想把异地组网组起来,之前我通过ALIST的SMB共享,然后端口转发+RAIDRIVE的方式,巨迂回的实现了两边局域网的SMB共享,现在IPV6地址填入就组网成功已经感受了异地组网的乐趣,但就差这最后一哆嗦了,但找不到问题所在

            回复
          2. 端点主机写域名就不行

            好像囤了一条评论,现在的问题就是只要对端的端点主机处填入域名,WireGuard状态直接就是无信息,对端一个短杠,公钥都看不到了,填入IPV6地址,保存完设置都不需要重启接口,瞬间查看WireGuard状态显示已正常握手,两边的电脑都能局域网查看到一切正常。

            回复
          3. 端点主机写域名就不行

            稍微扯远一点,IPV6DDNS我还发现了一个吊轨的事,手机端外网访问SMB,可通过NPLAYER MIX文件管理器,直接域名加端口(通过LUCKY转发445为别的端口)访问,WINDOWS不行,也是翻了很多教程最后发现只能通过VPN。

            回复
          4. 端点主机写域名就不行

            昨天把某度、恩山、某乎、B站、csdn翻烂了。 WireGuard 两台IP组网的实战教程详细篇只有楼主做的,现在是唯一的稻草,求指导

            回复
            1. Neo 文章作者

              😂好吧。再想想,是不是你路由器上装的有 passwall clash 之类的东西,屏蔽了 IPv6 的解析。你试试在路由器的 shell 中 ping6 一下对端的域名。

              回复
              1. 端点主机写域名就不行

                我只会图形化操作,op里如何ping我正在搜,我现在感觉问题是出在这,我的op是旁路由,所以现在问题是不转变为旁路由模式下的op可ip访问但无法解析域名?但实际情况是 我外网访问一直都正常,我把旁路由的dns设置为硬路由地址或者公共dns都不行, passwall clash之类的我都没装

                回复
      2. 端点主机写域名就不行

        还有些细节问题,只要我在对端填入的是域名,WireGuard状态里直接就啥都没了,原本显示公钥的部分空白,对端信息一个短杠,起初我就以为是我的防火墙设置之类的有问题,反复修改,最后逐个试错才发现只要对端信息填入真实IPV6地址也不用打[],保存完配置都不用重启接口,瞬间就完成了握手,WireGuard状态信息全部正常了,所以我就发现问题只存在于端点主机的地方填IP不填域名,吊轨不?我属于纯小白类型,只能做这些图形化操作,现在我已经进展不下去了,全网关于两台OP通过WireGuard连接的教程已经翻烂了,只有楼主的详细配置教学,几乎唯一稻草,求帮助

        回复
  2. yishion819

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

    回复
  3. 非凡网络

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

    回复
    1. Neo 文章作者

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

      回复
      1. 非凡网络

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

        回复
        1. Neo 文章作者

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

          回复
            1. 和合

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

              回复
  4. 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 力度也比较小,所以不太可能是运营商的锅。需要多仔细检查自己的配置、防火墙的策略。

      回复

发表回复

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