![到同一服务器的多个 wireguard 隧道如何强制使用不同的接口](https://linux22.com/image/764558/%E5%88%B0%E5%90%8C%E4%B8%80%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E5%A4%9A%E4%B8%AA%20wireguard%20%E9%9A%A7%E9%81%93%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E6%8E%A5%E5%8F%A3.png)
我的路由器上有多个 wan 链接,并且我希望每个 wan 接口上都有一个到同一台服务器的 wireguard 隧道。
我使用不同的目标端口启动了到服务器的不同工作隧道,但它们当然使用默认网关和接口。
我如何强制每个连接坚持不同的接口?
答案1
iproute2
我设法利用的功能做到了这一点netns
。Wireguard 会将加密数据包从其创建的命名空间内的默认路由中发送出去1,即使它后来被移动到不同的命名空间。如果您有物理接口eth1
和eth2
,您可以将它们分别移动到自己的命名空间,并在每个命名空间中创建一个 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
我怀疑您的eth1
和eth2
将由于此设置而“卡在”自己的命名空间中。如果这是一个问题,那么您可以设置一个桥接器,而不是批量移动接口。
答案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 接口是eth1
和eth2
(并且 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