在兩個 NIC 之間共享相同的 IP,通過專用 NIC 路由一個 IP
我有幾台主機連接到同一個交換機,它們都在同一個子網(10.0.0.0/16)上。其中兩台主機有更快的網路介面,所以我將它們連接在一起,這意味著這兩台機器現在可以直接連接,無需通過交換機。
我現在需要設置路由,這樣當這兩台機器嘗試相互通信時,數據包通過這個更快的直接連結而不是通過交換機的更慢的連結。
最簡單的方法是將直接連結配置在不同的子網上,但是我需要根據要使用的介面使用不同的 IP 或主機名,並且我希望能夠將標準配置部署到所有機器(例如 NFS 使用主機名掛載)並且不必維護自定義 IP 覆蓋
/etc/hosts
,我覺得這個解決方案太容易得到錯誤的主機名並通過錯誤的介面發送流量。我正在尋找一種方法來告訴兩台 Linux 機器即使
eth0
處理 10.0.0.0/16,當你想與 10.0.0.5 通信時,即使它在 eth0 的子網中,也可以發送數據包eth1
。我嘗試添加一個主機路由規則,
route add -host 10.0.0.5 dev eth1
它確實在正確的介面上發送數據包,但是它來自錯誤的 IP 地址(直接連結的子網而不是原始子網。)我想解決這個問題的唯一方法是在兩個介面上設置相同的 IP 地址,但這會導致任何問題嗎?一台機器能否在多個 NIC 上正確地擁有相同的 IP 而不會導致問題?我假設我需要正確設置路由指標,以便為連接到交換機的 NIC 提供優先級(以避免子網的所有流量被錯誤地發送到另一台主機),但是我還需要什麼知道這個設置嗎?它會導致任何其他問題或難以解決的問題嗎?
還是有更好、更強大的方法來實現這一目標?
編輯:這是@AB 要求的額外內容:
$ ip -br link lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> eth0 UP ec:f4:xx:xx:xx:a4 <BROADCAST,MULTICAST,UP,LOWER_UP> eth1 UP ec:f4:xx:xx:xx:a5 <BROADCAST,MULTICAST,UP,LOWER_UP> $ ip -br address lo UNKNOWN 127.0.0.1/8 eth0 UP 10.0.0.4/16 eth1 UP 10.0.99.4/24 $ ip route default via 10.0.0.1 dev eth0 proto static 10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.4 10.0.0.5 dev eth1 scope link 10.0.99.0/24 dev eth1 proto kernel scope link src 10.0.99.4
我在一個單獨的子網上設置了直接連結 (
eth1
),然後嘗試了route
我原來文章中的命令,這就是現在的情況。看起來我可能需要src
為我的直接路線設置屬性。
由於 10.0.99.4 是 10.0.0.0/16 的一部分,因此應避免使用此 IP 地址。否則會與實際的 10.0.99.4/16 地址發生衝突,即使在eth0上,考慮到 Linux 使用的是弱主機模型,並且預設情況下也會在eth0上為 10.0.99.4 響應此 IP 地址的 ARP 請求,從而產生 ARP 衝突. 不要使用有衝突的 IP 地址。
清理:
ip route flush dev eth1 ip address flush dev eth1
粘合 IP 地址的標準方法
讓我們選擇兩個不相關的地址供兩台主機使用。它們必須不與您網路上使用的其他任何東西發生衝突,但由於它們是點對點/32 地址,任何事情都可以做,它們不會被用作 LAN 的一部分,而只能用作點對點點/對等地址。我會隨意使用192.168.100.4/32和192.168.101.5/32。如果稍後超過 2 個這些主機繼承了一個更快的交換機並使用這個單獨的交換機連接在一起,這可以稍微修改,並且在同一個塊中擁有相關的 IP 地址再次變得更容易。
主機 10.0.0.4 的配置:
# /32 : no route gets created (beside the hidden *local* routing table) ip address add 192.168.100.4/32 dev eth1 # add the peer (point to point) route on the same link ip route add 192.168.101.5/32 dev eth1
實際上上面的兩個命令有一個快捷方式,你可以用下面的這個命令替換它們:
ip address add 192.168.100.4 peer 192.168.101.5/32 dev eth1
現在告訴主機到達 10.0.0.5/32(比 10.0.0.0/16 更具體)有一個使用對等 IP 地址的路由,但更喜歡與預設選擇不同的源 IP 地址(過時的
route
命令不能這樣做):ip route add 10.0.0.5/32 via 192.168.101.5 dev eth1 src 10.0.0.4
有了這個,你會得到:
# ip route get 10.0.0.5 10.0.0.5 via 192.168.101.5 dev eth1 src 10.0.0.4 uid 0 cache
有一個小缺點:IP 廣播仍然發送到eth0並且如果嚴格反向路徑轉發處於活動狀態(
sysctl net.ipv4.conf.eth0.rp_filter
或者sysctl net.ipv4.conf.all.rp_filter
給出 1 而不是 0 或 2)這些廣播,當由對等方發送時(例如在對等主機 10.0.0.5 上執行類似的東西toecho test | socat udp4-datagram:10.0.255.255:5555,broadcast -
) 將被忽略,因為在現在錯誤的介面上收到。因此,如果您正在使用依賴於此的協議並且已經應用了嚴格的反向路徑轉發,請在需要時將eth0切換到鬆散模式:sysctl -w net.ipv4.conf.eth0.rp_filter=2
主機 10.0.0.5 的等效配置:
ip address add 192.168.101.5 peer 192.168.100.4/32 dev eth1 ip route add 10.0.0.4/32 via 192.168.100.4 dev eth1 src 10.0.0.5 sysctl -w net.ipv4.conf.eth0.rp_filter=2
例如,在類似 Debian 的ifupdown
interface
配置文件中,您可以對沒有等效方向配置的任何命令使用pointopoint
關鍵字和一些附加命令。up
(sysctl
寧願放入/etc/sysctl.d
)。無需額外(或重複)IP 地址的簡化方法
實際上 192.168.100.4 和 192.168.100.5 的唯一作用是解析鏈路層地址以了解 10.0.0.4 和 10.0.0.5 的路由:它們被用作某種膠水,不會起到任何其他作用。這些 IP 地址將完全不可見,並且任何 IP 數據包都不會在其內容中使用 192.168.100.4 或 192.168.100.5(除非明確使用它們),只有 ARP 請求和應答會。根本不需要使用這種粘合 IP 地址。
例如,主機提供商Hetzner 舉了一個例子:
ip route add 203.0.113.40/32 dev tap0
到達介面上的 IP 地址,而不在該介面上配置 IP 地址(也不將此介面用作橋接埠)。在此範例中,對等方
tap0
(它是乙太網模式下的 tun/tap 設備,連結到另一端的 VM)必須回答 ARP 請求以解析鏈路層地址。但是再次出於對稱原因,如果它已經在其他地方配置了 IP 地址,它也不需要在那裡配置 IP 地址,以正確回答通過eth1完成的 ARP 請求:這又是 Linux弱主機模型實現的一部分。
所以這可以簡單地用於主機 10.0.0.4,而無需使用任何額外的 IP 地址,只使用一個命令:
ip route add 10.0.0.5/32 dev eth1
或者指定來源(以避免在主機有多個的情況下產生歧義):
ip route add 10.0.0.5/32 dev eth1 src 10.0.0.4
對於主機 10.0.0.5:
ip route add 10.0.0.4/32 dev eth1 src 10.0.0.5
為了從對等點接受eth0上的“慢”廣播,他們仍然需要像以前一樣:
sysctl -w net.ipv4.conf.eth0.rp_filter=2
解析其 IP 地址的 ARP 請求可以在兩個介面上得到響應(如上面連結的那樣,Linux 預設情況下會這樣做),但這裡的解析或通常(舊)端eth0上的條目( 如果有)(例如:在這些設置到位之前)不會觸發諸如ARP 通量之類的影響,因為兩個對等點都配置在一起以使用eth1,而對路由沒有其他可能的解釋。
選擇您喜歡的方法。第一個更經典,第二個設置更簡單(但您可能會從同行那裡得到一些“這行不通”)。請記住,當介面被管理性關閉然後打開時,手動添加的路由會失去,因此必須將這些設置放入適當的網路配置設置中以保持正常有效。