![当有多个链接到同一网络时指定首选路由](https://linux22.com/image/544939/%E5%BD%93%E6%9C%89%E5%A4%9A%E4%B8%AA%E9%93%BE%E6%8E%A5%E5%88%B0%E5%90%8C%E4%B8%80%E7%BD%91%E7%BB%9C%E6%97%B6%E6%8C%87%E5%AE%9A%E9%A6%96%E9%80%89%E8%B7%AF%E7%94%B1.png)
我有一台服务器,该服务器在同一个网络上具有多个接口和 IP 地址。我希望非 iSCSI 流量仅使用其中一个接口,而 iSCSI 流量仅使用其余接口。将 iSCSI 流量限制到我的接口子集很容易;我只需不在 /var/lib/iscsi/ifaces/ 中为我不想使用的接口创建条目即可。但是,我不确定将非 ISCSI 流量限制到一个接口的好方法是什么。就 Linux 而言,iSCSI 和非 iSCSI 接口都是同样好的网络路由。
以下是示例配置
iSCSI 存储的 IP 地址为 172.16.50.70-78。
该服务器具有以下接口、地址和路由。
$ ip route list
149.76.12.0/24 dev eth0 proto kernel scope link src 149.76.12.4
172.16.0.0/16 dev eth1 proto kernel scope link src 172.16.50.80
172.16.0.0/16 dev eth2 proto kernel scope link src 172.16.50.81
172.16.0.0/16 dev eth3 proto kernel scope link src 172.16.50.82
default via 149.76.12.1 dev eth0
理想的配置是将 eth3 用于非 ISCSI 流量,将 eth1 和 eth2 用于 iSCSI 流量。但是,非 iSCSI 流量目前从 eth1 流出。
$ ip route get to 172.16.50.90
172.16.50.90 dev eth1 src 172.16.50.80
(以下自原始帖子以来进行了一些编辑)
使用我当前的配置,如果 eth1 和 eth2 完全饱和地发送 iSCSI 流量,则我的非 iSCSI 流量将与 eth1 上的 iSCSI 流量竞争,而 eth3 处于空闲状态。
我该如何配置 Linux,让其优先使用 eth3 而不是 eth1 或 eth2 将流量发送到本地网络?
我已经将 net.ipv4.conf.all.arp_ignore 设置为 1,将 net.ipv4.conf.all.arp_announce 设置为 2。这应该可以防止我的 IP 地址在接口之间浮动,例如 arp flux。我想我只需要路由方面的帮助。
(更多编辑)
感谢 pfo,我开始查看指标。如果我删除路由并重新创建路由,使 iSCSI 接口的指标高于非 iSCSI 接口,事情似乎会按照我想要的方式进行。iSCSI 流量仍然使用专用接口,而无需我设置到 iSCSI IP 地址的静态路由。所有其他本地流量都通过 eth3 流出。现在我需要找出在启动接口时自动设置指标的正确方法。这是在 RHEL 5.5 上。
ip route delete to 172.16.0.0/16 dev eth1
ip route delete to 172.16.0.0/16 dev eth2
ip route delete to 172.16.0.0/16 dev eth3
ip route add to 172.16.0.0/16 dev eth1 src 172.16.50.80 metric 1
ip route add to 172.16.0.0/16 dev eth2 src 172.16.50.81 metric 1
ip route add to 172.16.0.0/16 dev eth3 src 172.16.50.82 metric 0
(最后更新)
使用现有的 RHEL 网络脚本分配不同的指标似乎是不可能的,https://bugzilla.redhat.com/show_bug.cgi?id=498472
答案1
当您使用多宿主主机时,需要注意一些事项。首先,您需要了解 Linux TCP/IP 堆栈处理同一子网中多个接口的 ARP 查询和应答的方式 - 此设置是arp_filter
您可以通过sysctl(1)
或/proc
文件系统查询的接口值。
0 -(默认值)TCP/IP 堆栈将使用来自其他接口的地址来响应 ARP 请求。这看起来可能不对,但通常是有意义的,因为它增加了成功通信的机会。在 Linux 上,IP 地址归整个主机所有,而不是由特定接口所有。
1 - 允许您在同一子网上拥有多个网络接口,并根据内核是否将数据包从 ARP 的 IP 路由出该接口来回答每个接口的 ARP。换句话说,它允许控制哪些 NIC 将响应 ARP 请求并最终让您的 TCP/IP 流运行。
您应该首先在同一子网中的所有接口上启用 arp_filter,然后您可以轻松地在路由表中添加一个条目,以便您的 iSCSI 门户使用特定的 iface,并调整其他接口指标,以便其中一个接口优于另一个接口。
另一个选项是设置基于源的路由,因为默认的基于目的地的路由将完全按照您描述的运行,所有 iface 都位于同一子网中。
取出 eth1 的原因是它的 IP 数值最低,因此被选中用于与该网络进行通信。
答案2
为了解决我的问题我写了网钩,这是一个守护进程,当基于 RHEL 的发行版上的网络接口状态发生变化时,它会运行脚本。我让它运行这个脚本对于我想增加其路由度量的接口。
编辑:在我意识到之前我写了 nethookifup-local 和 ifdown-local。你也许可以用它们来代替。