UBNT路由器+WireGuard+Surge配置远程访问家中网络

最近把家里的全套网络设备换成了Ubnt(Ubiquiti)家的,由于Ubnt的路由器自带WireGuard服务端,因此想要利用一下,直接在路由器上配置WireGuard服务端,来避免在额外设备上运行WireGuard,导致复杂的网络拓扑。

在Unifi控制台配置WireGuard非常简单,直接通过UI进行配置并添加客户端即可(每次添加完客户端记得点击下面的保存按钮,不然不会生效):

比较特殊的点在于,我的NAS将软路由的IP手动设置为了网关,没有采用默认的网关地址。这就导致了遇到来自WireGuard的网段的请求时,NAS无法正确应答。

这需要我们手动在Unifi控制台添加一条NAT记录,使得来自WireGuard客户端的流量进局域网之后被识别为局域网内的流量,而不是WireGuard网段的流量。这样,在NAS看来,流量就来自UBNT路由器的IP,而不是外部的IP:

在这一步之后,就已经完整的在Unifi控制台上配置好了WireGuard服务器。由于我的设备都是Apple的设备,并且统一使用Surge,因此下面需要在Surge中配置客户端。这里主要难点是通过module隔离不同设备的配置文件,防止同一个设备上使用多个IP来访问服务器,导致冲突。

我的做法如下,先新建一个WireGuard detached.conf配置文件:

[Proxy]
WG-Home = wireguard, section-name=Router

然后在Main.conf中,include这个配置文件:

[Proxy]
#!include Your_Provider.conf, WireGuard detached.conf

然后为不同的设备新建不同的Surge module,拿iPhone举例,Wireguard iPhone.sgmodule内容如下:

#!name=WireGuard for iPhone
#!desc=WireGuard for iPhone

[WireGuard Router]
private-key = -private-key-
self-ip = 192.168.100.2
dns-server = 192.168.100.1
prefer-ipv6 = false
mtu = 1280
peer = (public-key = -public-key-, allowed-ips = "192.168.100.1/32,192.168.100.2/32,0.0.0.0/0", endpoint = your-ddns-domain:51820)


[Rule]
AND,((OR,((SUBNET,TYPE:CELLULAR), (NOT,((OR,((SUBNET,SSID:YourAPName1), (SUBNET,SSID:YourAPName2))))))), (IP-CIDR,192.168.1.0/24)),WG-Home

这里我们假设Wireguard的网段为192.168.100.0/24,并假设家中内网的网段为192.168.1.0/24,为iPhone分配的Wireguard IP为192.168.100.2,而路由器的WireGuard IP为192.168.100.1。家中的Wi-Fi热点名称分别为YourAPName1和YourAPName2(对应5G和2.4G频段)。上述的rule可以使得未连接到指定Wi-Fi名称时,走WG-Home规则,即通过WireGuard来访问。

每个设备的private key可以在Unifi控制台添加客户端时下载配置文件来获得,而peer的public key则是所有设备统一使用路由器上显示的public key。

依据上述配置文件,可以同理创建出Wireguard iPad.sgmodule、Wireguard Macbook.sgmodule。

然后在不同设备上分别加载不同设备的sgmodule即可实现为不同设备分配不同的WireGuard IP,同时IP间不会互相冲突。这样所有设备在外时都可以通过WireGuard来访问家中内网。(如果采用策略组,而不是module,就会导致IP冲突)