经过长时间的搜索,我找到了我的挑战的答案,但最后一步失败了。
我有两台相同的服务器,它们都为多个客户机提供服务。服务器有两个接口:一个用于我从 ISP 获得的外部 IP,另一个用于内部后端网络。所有客户机都获得一个内部后端网络地址,并通过网桥连接到物理后端网络。两台服务器都可以 ping 两台服务器上的所有客户机。我通过将客户机 IP D/SNAT 为主机上的一个可用 IP 来公开客户机。这对于驻留在主机上的客户机非常有效。
为了使 D/SNAT 能够工作到另一台主机,我了解到我需要为到达后端接口的数据包添加路由,因为默认路由告诉另一台服务器上的堆栈返回错误的接口和错误的公共 IP。我在两台本地虚拟测试机上都运行了这种方案,甚至通过“虚拟”桥接到物理后端接口。
这也适用于真实服务器,用于对位于后端桥上的后端 IP 地址进行 DNAT,但不适用于分配给另一台服务器上的客户机的地址,这些地址也连接到同一个后端桥。
配置,服务器A:
/etc/iproute2/rt_tables:
..
200 internal
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o $WAN_IF -j SNAT --to $PUBLIC_IP
iptables -t nat -A PREROUTING -i $WAN_IF -p tcp -d $PUBLIC_IP --dport 53 -j DNAT --to $GUEST_IP
ip rule add from $LAN_IP table internal
ip route add default via $LAN_GW dev $LAN_IF table internal
Where
WAN_IF = WAN bridge interface (br1)
PUBLIC_IP = is public ip address on WAN bridge if
LAN_IP = private ip on LAN bridge (br0)
LAN_GW = private ip on LAN bridge on other server
brctl show
br0 8000.003018a96c83 no eth0
vnet0
vnet1
vnet2
vnet3
vnet4
vnet5
br1 8000.003018a96c84 no eth1
当 $GUEST_IP 是同一主机上的来宾 IP 时,一切正常。当 $GUEST_IP 是其他服务器的 LAN IP 时也是如此。但我无法访问其他服务器上的来宾?
更新
调整来宾的默认网关是可行的,但这不是我想要创建的对称解决方案。但如果需要的话,只要我跟踪路由,只需进行一点小改动就可以让事情正常进行。然而,除非我在来宾上也为此创建一些规则,否则它将使通过不同的公共 IP 路由不同的协议变得不可能。
更新 2
事实证明,我可以通过单独调整客户的默认网关来解决问题,但这并不像我所希望的那样“灵活”。
有没有更优雅/灵活的解决方案?
答案1
调整客户机的默认网关似乎是最简单的解决方案。