当有多个链接到同一networking时指定首选路由

我有一个在同一个networking上有多个接口和IP地址的服务器。 我希望非iSCSIstream量专门使用其中一个接口,而iSCSIstream量则专门使用其余的接口。 将iSCSIstream量限制为接口的一个子集很容易; 我只是不要在/ var / lib / iscsi / ifaces /中为我不想使用的接口创build条目。 但是,我不确定什么是一个好的方法来限制非ISCSIstream量到一个接口。 就linux而言,iSCSI和非iSCSI接口对于networking同样是好path。

这是一个示例configuration

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 

所需的configuration是将eth3用于非ISCSI通信,并将eth1和eth2用于iSCSI通信。 但是,非iSCSIstream量目前已经熄灭了eth1。

 $ ip route get to 172.16.50.90 172.16.50.90 dev eth1 src 172.16.50.80 

(从下面的原始发布开始进行一些编辑)

使用我目前的configuration,如果eth1和eth2完全饱和发送iSCSIstream量,那么当eth3闲置时,我的非iSCSIstream量将与eth1上的iSCSIstream量竞争。

我怎么能configurationLinux更喜欢发送stream量到本地networking使用eth3而不是eth1或eth2?

我已经将net.ipv4.conf.all.arp_ignore设置为1,net.ipv4.conf.all.arp_announce设置为2.这应该防止我的IP地址在接口之间浮动,例如arp flux。 我想我只需要路由帮助。

(更多编辑)

感谢pfo,我开始看指标。 如果我删除这些路由并使用比非iSCSI接口更高的iSCSI接口重新创build它们,那么事情似乎按照我想要的方式工作。 iSCSIstream量仍使用专用接口,无需设置到iSCSI IP地址的静态路由。 所有其他本地stream量熄灭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 

(最终更新)

使用现有的RHELnetworking脚本分配不同的度量标准似乎是不可能的, https: //bugzilla.redhat.com/show_bug.cgi?id =498472

当你是多宿主的时候,有一些事情需要注意。 首先,您需要了解Linux TCP / IP堆栈将如何处理位于同一子网中的有关ARP查询和答案的多个接口 – 此设置是您可以通过sysctl(1)查询的接口的arp_filter值,或者/proc文件系统。

0 – (默认)TCP / IP堆栈将响应来自其他接口的地址的ARP请求。 这可能看起来不对,但通常是有道理的,因为它增加了成功沟通的机会。 IP地址由Linux上的完整主机拥有,而不是由特定的接口所拥有。

1 – 允许您在同一子网上有多个networking接口,并根据内核是否将来自ARP'd IP的数据包路由到该接口来应答每个接口的ARP。 换句话说,它允许控制哪些网卡将响应ARP请求,并最终让您的TCP / IPstream运行。

您应该首先在位于同一子网的所有接口上启用arp_filter,并且可以轻松地将条目添加到您的iSCSI门户的路由表中,以便使用特定的iface并调整其他接口指标,以便优先考虑其他。

另一种select是设置基于源的路由,因为默认的基于目的地的路由将按照您所描述的所有ifaces在同一个子网中的情况。

eth1被取出的原因是IP的数值是最低的,所以select与networking进行通信。

为了解决我的问题,我写了一个nethook ,一个在networking接口在基于RHEL的发行版上改变状态时运行脚本的守护进程。 我已经运行这个脚本接口的路线的度量我想增加。

编辑:我写了nethook之前,我知道ifup本地和ifdown本地 。 你可以用它们代替。