
Wireguard异地组网之访问子网资源
声明:本文中Wireguard中心节点架设于中国大陆境内,且各组网子网均位于中国大陆境内,全程数据均不出境。
起因
曾经异地组网用的是Zerotier,虽然慢一点,但是傻瓜化组网属实是很舒服。可惜某月之后,Zerotier服务崩坏,无法在家庭宽带网上稳定异地组网,被迫寻找替代方法。在一番查找后,发现了Wireguard这个异地组网工具。
Wireguard其实是一种虚拟XX网技术,其以性能为第一要素。但是,其自由的网络拓扑规则,给了多地域异地组网的可能性。
本文不涉及非法国际联网方法,仅为境内异地组网技术的操作笔记。
Wireguard配置
这部分不展开细说了,主要是配置中心服务器,然后在中心服务器上记录各固定子网节点的AllowedIPs,即该节点在Wireguard域内的地址和其所归属的子网网络地址。在星形拓扑下,各子节点只需要将所有发往其他子网的数据全部路由至中心服务器即可。中心服务器会由Wireguard指导,将数据对应发往相应子网的固定节点。
图为组网拓扑的简化版,Wireguard域的网络地址是172.160.226.0/24。其中中心服务器(Wireguard域IP 172.160.226.254)设置在北京,笔记本代表移动接入的在外节点,路由器0代表位于子网172.16.0.0/16的固定节点,PC(IP 172.16.7.204)代表子网中被访问的设备。本例中路由器0运行OpenWRT,配备Wireguard程序。
问题:子节点能够访问Wireguard域内的所有节点,但是无法访问子节点所在的子网
问题表现如图,无法ping通子网172.16.7.204:
首先从服务器ping子网的固定节点172.160.226.30:
说明中心服务器到路由器0在Wireguard域是通的。
检查wg0
接口,发现其归属的防火墙区域wg
所设置策略拒绝了来自wg
区域的数据包转发。
设置策略允许其向lan
区域转发,并同时允许来自lan
区域的转发:
再次测试,不再出现不可达信息,取而代之的是连续的数据包超时:
经过确认,172.16.7.204是在线的,从固定节点ping可ping通。
值得注意的是,ping显示结果需要收到对端的回复,无论是什么回复。如果没有回复,那就不会显示,仅仅会记录为超时。而收不到回复的原因有二:
- 对端根本没收到ping包
- 收到了ping包,但是回复的包未送达
为了确认原因,从172.160.226.254上持续ping172.16.7.204。同时在172.16.7.204上运行Wireshark抓包,并设置filter为icmp
。
结果如下:
也就是说,固定节点成功的将来自Wireguard域的172.160.226.254的ping数据包路由到了172.16.0.0/16子网,但是172.16.7.204并没有回应。猜测可能是172.16.7.204看到来源地址是172.160.226.254,并不归属本地子网,因此并未回应。
查阅资料后得知,一部分服务设置了限制,不允许从本子网以外的位置访问(包括SMB与ICMP回显,但不包括RDP)。要绕过这个限制也很简单,在OpenWRT上如图设置一对SNAT规则即可:
其中wg规则用于Wireguard域向子网资源发起连接,wg-R规则用于子网向Wireguard域资源发起连接。
设置后,Wireshark抓包结果显示ping包的来源即为172.16.0.1,正常应答: