Linux

當有多個連結到同一網路時指定首選路由

  • April 10, 2014

我在同一網路上有一個具有多個介面和 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

為了解決我的問題,我編寫了nethook,一個在基於 RHEL 的發行版上網路介面改變狀態時執行腳本的守護程序。我讓它為我想增加其路由度量的介面執行這個腳本。

編輯:在我知道ifup-local 和 ifdown-local之前,我寫了 nethook 。您可能可以改用它們。

當您是多宿主主機時,需要注意一些事項。首先,您需要了解 Linux TCP/IP 堆棧將如何處理同一子網中有關 ARP 查詢和應答的多個介面 - 此設置是您可以通過或文件系統arp_filter查詢的介面值。sysctl(1)``/proc

0 -(預設值)TCP/IP 堆棧將使用來自其他介面的地址響應 ARP 請求。這似乎是錯誤的,但通常是有道理的,因為它增加了成功溝通的機會。IP 地址由 Linux 上的整個主機擁有,而不是由特定介面擁有。

1 - 允許您在同一子網上擁有多個網路介面,並根據核心是否將來自 ARP 的 IP 的數據包路由到該介面來回答每個介面的 ARP。換句話說,它允許控制哪些 NIC 將響應 ARP 請求並最終讓您的 TCP/IP 流執行。

您應該首先在同一子網中的所有介面上啟用 arp_filter,然後您可以輕鬆地將條目添加到您的 iSCSI 門戶的路由表中,以使用特定的 iface 並調整其他介面指標,以便一個比其他。

另一種選擇是設置基於源的路由,因為預設的基於目標的路由將完全按照您在同一子網中的所有 iface 的描述行事。

取出eth1的原因是它的IP具有最低的數值,並且被選擇用於與該網路進行通信。

引用自:https://serverfault.com/questions/254773