在同一網路上使用 2 個 NIC 的策略路由似乎沒有任何作用
正如 dirkt 所指出的,我缺少資訊:這是這個問題的延續,但總而言之,我正在嘗試接收大量多播流量,多個介面可以處理,所以為了接收全部,我想使用多個介面並分別在每個介面上加入流。
我有 3 個 NIC,1 個(我們稱之為 webIf)連接到網際網路,另外 2 個(我們稱之為 lanIf1 和 lanIf2)連接到 LAN(兩者相同)。我正在嘗試在兩者上接收多播流量,但只有一個介面在接收 IGMP 查詢時報告,並且僅針對它加入的流。因此,在超時時間之後,交換機停止發送其他介面加入的流。
為了解決這個問題,我嘗試使用策略路由:為每個 lanIf 創建一個路由表,在每個 lanIf 上添加一個路由以轉到同一個網關,並在使用主路由之前創建兩個規則以使用兩個新路由表桌子
所以如果我的地址是:
lanIf1: 25.25.43.88 lanIf2: 25.25.43.84 default gateway of the lan switch: 25.25.43.5 igmp querier: 25.25.43.1
我首先將表添加到 /etc/iproute2/rt_tables ,例如
cat /etc/iproute2/rt_tables
:# # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 2 lanIf1Table 3 lanIf2Table
然後我會以 root 身份執行這個腳本:
ip route add 25.25.43.0/24 dev lanIf1 src 25.25.43.88 table lanIf1Table ip route add default via 25.25.43.5 dev lanIf1 table lanIf1Table ip route add 25.25.43.0/24 dev lanIf2 src 25.25.43.84 table lanIf2Table ip route add default via 25.25.43.5 dev lanIf2 table lanIf2Table ip rule add from 25.25.43.88 table lanIf1Table prio 1000 ip rule add from 25.25.43.84 table lanIf2Table prio 1001
但隨後什麼也沒有發生,IGMP 查詢僅由其中一個介面回答。
我可以讓任何事情發揮作用的唯一方法是更改其中一條規則:
ip rule add from 0.0.0.0 table lanIf1Table prio 1000
. 然後,IGMP 報告在 lanIf1 上完成。但是,當然,我失去了所有網際網路訪問權限,因為所有流量都通過lanIf1Table
.我究竟做錯了什麼?我一直在關注這些教程: http ://www.rjsystems.nl/en/2100-adv-routing.php
https://blog.scottlowe.org/2013/05/29/a-quick-introduction-to-linux-policy-routing/
這裡解釋: https ://access.redhat.com/solutions/53031
這裡不太清楚: https ://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
考慮一台具有 2 個網路介面的電腦,即介面 A 和介面 B。考慮到 Linux 決定使用介面 B 向 IP 地址 X 發送數據包。考慮到介面 A 上從 IP 地址 X 接收到的數據包。Linux 將丟棄該數據包。
除非您
sysctl net.ipv4.conf.all.rp_filter=2
在終端中執行或將該行添加到/etc/sysctl.conf
.它允許從其他介面上的 IP 地址接收數據包,而不是用於向該 IP 地址發送數據包的介面!
以下是開關的工作原理:
交換機有幾個網路埠,這些埠點對點連接到電腦上的 NIC。如果 NIC 可以達到 25 GB/s,這意味著點對點連接將使用 25 GB/s 的協議。
現在使用啞交換機,這也意味著路由到該 NIC 的傳入連接被限制為 25 GB/s。此外,一個啞交換機會將多播路由到所有埠。因此,在同一台電腦上使用兩個 25 GB/s 的 NIC,您將在每個 NIC 上獲得相同的多播數據包,總速度為 25 GB/s。無論交換機本身是否有能力或更高的頻寬。
但在那個頻寬段中,交換機可能非常智能,帶有內部儲存器。所以交換機可以做各種事情:
- 它將數據包儲存並轉發到內部 RAM 中。這意味著傳入連接不會被限制為傳出連接的最大速度。
2)如果它可以做綁定,它可以將兩個點對點連接捆綁成一個頻寬加倍的連接。
- 如果它是多播感知的,並且偵聽多播協議,它只會將數據包轉發給已註冊的多播組接收者。因此,如果您有兩個不同的多播組(或更多),並且一個 NIC 上的一個應用程序在一個組上註冊,而另一個 NIC 上的一個應用程序在另一個組上註冊,那麼您實際上會使頻寬翻倍。再說一遍:這些需要是不同的多播組,只是不同的應用程序是不夠的。
所以最簡單的方法是(2):綁定 NIC 並完成它。
對於 (3),我們還沒有解決 Linux 不能很好地處理不同 NIC 上的相同子網的問題。有辦法解決這個問題:
a) 將網路介面放在不同的網路命名空間中,並在命名空間中啟動接收應用程序。
b) 讓應用程序綁定到網路介面。並非所有應用程序都能夠做到這一點,而且我實際上不確定多播是否沒有復雜性(它適用於單播)。
c) 使用不同的子網,並在網路架構中的其他位置(例如在交換機上,如果可以的話)在子網之間路由多播。
所有這一切都比(2)困難得多。
所有這一切只會讓你獲得 2 倍。無損影片壓縮(如果你堅持保留影片中的嘈雜像素)也會給你 2-3 倍,稍微有損壓縮會給你一個更好的因素. 而且它並不需要大量的 CPU 來獲得一個體面的因素。因此,在您所在的頻寬範圍內,我肯定會考慮將壓縮作為第一步,然後再弄亂網路。