我有以下网络结构,其中有两台主机(主主机和从主机),它们不是在同一个网络中,但有一些“Mid”主机与 Master 和 Slave 共享网络。所有主机都运行 CentOS。
我需要主从设备之间进行通信,因此我从 Mid2 开始,启用 IP 转发并配置 IP 表。我还在主设备中添加了一条通过 Mid2 到从设备的静态路由,反之亦然。到目前为止,一切正常。配置如下:
从站配置:
[user@slave] $ ip r
192.168.10.150 via 192.9.202.52 dev ens3f0
主服务器配置:
[user@master] $ ip r
192.9.202.242 via 192.168.10.52 dev bond0
mid2 处的配置:
[user@mid2] $ cat /proc/sys/net/ipv4/ip_forward
1
[user@mid2] $ iptables -L
...
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.9.202.242 192.168.10.150
ACCEPT all -- 192.168.10.150 192.9.202.242
之后,我尝试与其余主机复制相同的配置,但开始失败:
# ip r add 192.9.202.242 via 192.168.10.51 dev bond0
RTNETLINK answers: File exists
然后我使用不同的度量标准对每条路由进行测试。然而,一旦为 mid1 和 mid2 配置好一切,就没有 ping 了。
问题是,这可能吗?我是否可以有多个“选项”来将通信路由到远程主机?我该怎么做?
答案1
总的来说,你描述的正是ECMP 路由。尽管动态路由协议可以(并且会)安装此类路由,但如果您不希望网络拓扑发生变化,则运行动态路由协议会增加复杂性,我认为这有点过头了。相信我,OSPF 并非易事。
当然,你可以手动安装这样的路线:
ip route add 192.9.202.242 proto static scope global \
nexthop dev ens2f0 via 192.168.10.51 weight 1 \
nexthop dev ens2f0 via 192.168.10.52 weight 1 \
nexthop dev ens2f0 via 192.168.10.53 weight 1
反面亦然。
有很多选项,您可以在这里看到其中之一 - 重量,但也有其他的。Cumulus 网络文章如这个总体来说,是有关 Linux 网络的良好信息来源。
答案2
如果你使用多条路由的目的是为了提高可靠性(在中间节点发生故障时提供冗余),那么可以在所有五个节点上运行 OSPF。一种选择是斑驴,为包括 CentOS 在内的各种 Linux 版本提供 OSPF 和其他路由协议。
在节点上运行 OSPF 使每个节点都成为路由器,并且如果主节点和从节点正在使用的中间系统出现故障,则主节点和从节点之间的通信将自动切换到另一个中间系统。
如果您的目的是在三个路由之间实现负载平衡,请参阅 Nikita Kipriyanov 关于 ECMP 的回答。请注意,只有当您有多个流(例如,多个 TCP 连接或不同端口之间的 UDP 连接)或您专门配置 ECMP 哈希以对不同数据包的不同内容进行哈希处理时,您才能获得负载平衡。(我不熟悉 Linux 允许 ECMP 哈希配置的内容。)或者在一端有三个不同的 IP 地址。
如果您想要同时获得两种好处(负载共享和稳健性),那么您需要这两种解决方案,但是如果您使用 OSPF,配置 ECMP 将会有所不同(您将配置 OSPF 来执行此操作而不是定义静态路由。)
请注意,中间系统不会有特别好/快的路由器,因此@Bernhard 的想法是重组并在它们之间添加一个实际的路由器,这可能是更好的解决方案。但如果带宽要求较低,并且您想避免重组网络或添加新设备,那么这可以与您现有的设备配合使用。