我在 2 个不同的 ISP 上有 2 台服务器(S1 和 S2)。它们通过 Wireguard 隧道(10.0.100.0/24)连接。
我有不同的移动设备连接到 S1 或 S2。
今天,当移动设备连接到 S1 时,它位于 10.0.1.0/24 网络上,而当它连接到 S2 时,它位于 10.0.2.0/24 网络上。
通过非常基本的路由,任何移动设备都可以访问两个服务器。
我需要实现一种架构,让移动设备无论连接到 S1 还是 S2 都能保持相同的 IP,以便它们可以访问两台服务器并相互访问移动设备。
我查找了 VxLAN,但 wireguard 转发的是 L3,而不是 L2。我也查找了动态路由协议,但我不知道客户端是否已连接...
有人有办法解决我的需求吗?
PS:我可以在服务器上安装任何软件,但它必须对移动设备透明。
答案1
使用 定期监控您的 WireGuard 接口wg show $IF latest-handshakes
。单个监控主机需要定期从两个服务器收集握手时间戳,以确定哪个服务器是每个对等体的“活动”服务器,然后它需要在该服务器上为该对等体的 AllowedIP 添加内核路由,并在另一台服务器上将其删除。
ssh $active_host "ip route add 2a06:e881:108:28::8/128 dev wg0"
ssh $inactive_host "ip route del 2a06:e881:108:28::8/128 dev wg0"
(通常 wg-quick 会为所有对等点静态添加此类路由 - 如果您确实使用 wg-quick 来设置 WireGuard,则需要使用 Table=off 禁用此功能并让监控系统来处理它。)
配置动态路由软件(Bird2 或 FRR 或其他)以从内核导入这些静态路由,并将它们重新分发到其他服务器以及主网关。(OSPF 是一种很好的方法,但请注意 Bird2 有与“设备”路由相关的错误1,这些错误似乎只在最新版本中得到修复;您可能想尝试 FRR。)
请注意,为了使其正常工作,两个服务器需要“相邻”,即,如果它们没有直接连接,则必须在它们之间建立专用的 GRE 或 WireGuard 隧道,以运行路由协议。
结果是,您的网络应该有一个内部路由表,其中包含每个客户端设备的 /32 和 /128,指向一个服务器或另一个服务器。
1公平地说,我不完全确定它们是否确实是 Bird2 错误,或者它们是否来自在我的网络上运行的另一个 OSPF 实现,尽管它们最终确实消失了。