我想要实现的目标:我有一台服务器,它是客户端通过 VPN(WireGuard)连接到它的网关。服务器本身通过 VPN(WireGuard)连接到另外 4 台服务器,我希望通过负载平衡通过这 4 台服务器路由所有传入流量。我知道 Linux 中有多路径路由,但由于某种原因,它在我的例子中不起作用。
我拥有的:
- Ubuntu 服务器
- wg0 网络接口,所有传入流量都来自此接口。服务器本身的 IP 为 192.168.155.1。
- wg1 网络接口,所有 4 个其他服务器都连接到此接口。服务器本身的 IP 为 192.168.166.1,其他服务器的 IP 为 192.168.166.10-14。
- 我有这样的路由规则:
32763: from 192.168.155.0/24 lookup 120
- 我有以下路线:
default
nexthop via 192.168.166.10 dev wg1 weight 1
nexthop via 192.168.166.11 dev wg1 weight 1
nexthop via 192.168.166.12 dev wg1 weight 1
nexthop via 192.168.166.13 dev wg1 weight 1
我不知道为什么,但所有流量都经过 192.168.166.11。如何使路由通过 192.168.166.10-14 随机转发流量?
答案1
所以我更仔细地重读了这篇文章......
选择特定的下一跳via
仅适用于支持链路层 (L2) 寻址的接口,WireGuard 通过隧道没有,所以结果是正常的。
在传统的以太网接口上,路由数据包via 192.168.166.10
是通过将数据包发送到MAC地址指定 192.168.166.10 下一跳 - 即,路由时 IP(L3)报头不会改变,只有下层报头会改变。
但是诸如WireGuard、PPP或GRE之类的“L3隧道”接口无法让IP层指定数据包应定向到哪个节点,这意味着全部你的 nexthops 基本上相当于nexthop dev wg1
。
(在 WireGuard 中,当每个接口有多个对等点时,您的“AllowedIPs”设置将根据目标 IP 地址决定哪个对等点应该接收哪些数据包——它几乎就像一个路由表,但隐藏在 WireGuard 内部,并且不以任何方式与真正的 Linux 路由表集成。)
您的选择是使用单独的 WireGuard 隧道接口(每个下一跳一个)或切换到 L2 隧道(例如 EoIP、ZeroTier、'tap' 模式下的 OpenVPN,或者可能是 VXLAN)。