我最近正在使用Wireguard组网以替代原本受限的Frp服务。Wireguard是一个很好用的东西。
我的wireguard虚拟子网设置为10.42.0.0/16
,内网子网为192.168.2.0/24
。
为了能更加方便地访问家里的内网,我打算配置网段映射,将10.42.1.*
映射到192.168.2.*
。例如访问10.42.1.1
,将会被转发到192.168.2.1
,这样即使我长期不在家也可以访问家里所有有IP地址的设备。
服务端的配置
第一步,我们需要将目标是10.42.1.*
的peer的流量路由到用于转发的peer。
在服务端的wg0.conf
中配置:
1 |
|
其中,10.42.0.2
为转发peer的wg虚拟子网中的IP地址,10.42.1.0/24
则指定了将目标是10.42.1.*
的流量发送到此peer。
转发peer的配置
转发peer位于局域网,除了接入wireguard虚拟网以外还要接入局域网,它负责将接收到的来自wireguard的流量转发到局域网中(还要在建立连接后确保把把局域网中的流量转发回虚拟网)
值得注意的是,转发peer的一个接口必须接入了192.168.2.0/24
的局域网子网。
以下是转发peer的详细配置及其对应注释:
1 |
|
其中,我注释掉了两条DNAT指令,他们用于无法使用NETMAP的情况下,通过使用DNAT进行范围映射来间接满足需要。使用时需要注释这两条NETMAP命令。
这样就实现了很好用的网段映射,我也终于将frp去掉了。
更新:不使用SNAT/MASQUERADE的方法
由于使用SNAT/MASQUERADE会导致接收流量的服务器错认为流量是从转发peer发出的,原则上这是不对的。而技术上只要服务端知道目标为10.42.0.0/16
的流量应该发送到哪个接口,就可以避免使用SNAT/MASQUERADE功能。
我们需要为这个目标IPIP地址段设置路由,由于我使用Openwrt,在Network
->Routing
页面中添加新的Static IPv4 route
:
interface
选lan
oute type
选unicast
target
设置10.42.0.0.0/16
gateway
设置<转发peer的局域网IP地址>
经过测试,在取消掉上文的MASQUERADE配置后,仍然可以正常工作,且当访问peer访问10.42.1.x
时,IP地址为192.168.2.x
的服务端可以识别出正确的IP地址为10.42.0.y
。
但是最终我又换回了MASQUERADE,因为以下几个原因:
- 有部分设备根本无法连接到我的openwrt。为了避免我学习网络相关的东西时修改配置从而影响家里的网络的情况,我的openwrt是作为旁路由存在的。
- 部分关键机器没有走openwrt,例如wireguard转发节点。为了避免openwrt出现意外,无法正常启动的情况下,远程连接完全失效的情况,这部分关键节点连接的是主路由器。
- 最重要的一点,我想让wireguard自己独立地完成它的任务,避免外部依赖,便于迁移。