到同一服务器的多个 wireguard 隧道如何强制使用不同的接口

到同一服务器的多个 wireguard 隧道如何强制使用不同的接口

我的路由器上有多个 wan 链接,并且我希望每个 wan 接口上都有一个到同一台服务器的 wireguard 隧道。

我使用不同的目标端口启动了到服务器的不同工作隧道,但它们当然使用默认网关和接口。

我如何强制每个连接坚持不同的接口?

答案1

iproute2我设法利用的功能做到了这一点netns。Wireguard 会将加密数据包从其创建的命名空间内的默认路由中发送出去1,即使它后来被移动到不同的命名空间。如果您有物理接口eth1eth2,您可以将它们分别移动到自己的命名空间,并在每个命名空间中创建一个 Wireguard 隧道。然后,您可以将两个隧道移动到命名空间 1,并照常管理它们,包括使用ip route通过这些隧道路由流量。

$ ip netns add wan1
$ ip netns add wan2
# Warning: if you're plugging these commands into SSH, there's a good chance
# this will break your SSH connection. Proceed with caution.
$ ip link set eth1 netns wan1
$ ip link set eth2 netns wan2
$ ip -n wan1 add wg1 type wireguard
$ ip -n wan2 add wg2 type wireguard
$ ip -n wan1 link set wg1 netns 1
$ ip -n wan2 link set wg2 netns 1

我怀疑您的eth1eth2将由于此设置而“卡在”自己的命名空间中。如果这是一个问题,那么您可以设置一个桥接器,而不是批量移动接口。

答案2

您可以根据目标端口添加路由规则——如果第一个 WireGuard 隧道的(远程)端点端口是51821,而第二个是51822,则可以添加以下路由规则,对第一个隧道使用路由表 1 ,对第二个隧道使用路由表 2:

ip rule add dport 58121 table 1 priority 101
ip rule add dport 58122 table 2 priority 102

然后,如果您的 WAN 接口是eth1eth2(并且 WAN 网关例如是203.0.113.1),您可以将表 1 的默认路由设置为使用第一个接口,将表 2 的默认路由设置为使用第二个接口:

ip route add default via 203.0.113.1 dev eth1 table 1
ip route add default via 203.0.113.1 dev eth2 table 2

或者,您可以根据防火墙标记添加路由规则,您可能会(也可能不会)发现它比使用目标端口更易于维护。如果您使用 配置了一个(本地)WireGuard 接口,使用 配置了FwMark = 11第二个接口FwMark = 22,则可以改用以下路由规则:

ip rule add fwmark 11 table 1 priority 101
ip rule add fwmark 22 table 2 priority 102

相关内容