Linux

如何在 Linux 上實現每包多路徑路由?

  • September 14, 2020

3.6 之前的 Linux Kernel 使用路由記憶體來進行 IPv4 多路徑路由,這意味著在兩條單獨的線路/ISP 之間進行路由非常容易。從 3.6 開始,算法更改為按數據包計算,這意味著需要一些路由表/規則/iptables 標記技巧來實現兩條線路/ISP。

但是,如果您有兩條具有相同 ISP 的線路,可以以平衡/故障轉移方式在每個數據包的基礎上將單個 IP 路由到兩條線路,那麼從 3.6 開始,您可以輕鬆實現線路綁定(在 IP 級別),因為每個數據包在兩個方向上的路由。

從 4.4 開始,核心再次更改為基於源地址和目標地址的散列的基於流的負載平衡。

我目前正在執行核心 4.4.36,並且正在通過 PPPoE 連接使用多路徑路由。**我來自 ISP 的下游流量基於每個數據包通過兩條單獨的線路路由(一個 IP 沿兩條線路路由)。**這使我的下載速度比單行的速度更快。幾乎將兩條線的速度加在一起。它執行良好,Skype 影片、VoIP (UDP)、YouTube 等都執行良好。

由於擁有如此良好的下游體驗,我想在上游嘗試它,但我的上游流量是根據更新的基於流的算法在兩個 ppp 設備(具有相同的 IP 地址)之間路由的。這意味著我無法達到比單行速度更快的上傳速度。

有沒有辦法將目前核心配置為使用每包算法?或者其他一些方法來實現每包多路徑路由?我是否需要恢復到較舊的核心(由於其他各種原因我不想這樣做)?

我的 ISP 不支持多連結 ppp。

如果相關,我目前正在 Raspberry Pi 3 上執行 Arch Linux ARMv7。

好的,所以在有更多時間對此進行調查之後,我找到了一種使用 Linux TEQL(True Link Equalizer)的方法。這是我鬆散地遵循的連結,但有一些調整。

http://lartc.org/howto/lartc.loadshare.html

這就是我在 Arch Linux ARMv7 (Raspberry Pi 3) 上工作的方式

開機時:

以下命令應在啟動時執行以載入適當的核心模組。

modprobe sch_teql

假設您想從 eth0 上的本地網路進行 NAT,以下命令也將在啟動時執行。

sysctl -w net.ipv4.ip_forward=1
iptables -A INPUT -i ppp+ -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -o teql+ -j MASQUERADE

FORWARD 返回流量在 ppp+ 上,POSTROUTING MASQUERADE 在 teql+ 上,因為傳出流量在 teql 上流出,返回流量在 ppp 上返回。

當 ppp 連結出現時:

假設要負載均衡的連結是ppp,下面的命令要在一個腳本中執行/etc/ppp/ip-up.d/

sysctl -w net.ipv4.conf.ppp1.rp_filter=2
sysctl -w net.ipv4.conf.ppp2.rp_filter=2
tc qdisc add dev ppp1 root teql0
tc qdisc add dev ppp2 root teql0
ip address add 1.1.1.1/32 dev teql0
# you can add additional public IP addresses teql0 if you need to
ip link set teql0 up
ip route replace default scope global dev teql0

1.1.1.1您面向 ISP 的公共 IP 地址在哪裡。額外的公共 IP 可以分配給 teql0 設備,但不需要分配給 ppp 設備。在我的設置中,兩個 ppp 連結共享相同的 IP(由 pppoe 等協商)它手動分配的 teql 連結如上所示。ISP 需要在兩條鏈路上平等地發送 IP 流量。

在上面的腳本中,反向路徑 ( rp_filter) 都設置為2(loose),這樣返回的數據包就不會因為它們返回 ppp 介面而不是 teql0 而被丟棄。

我已經這樣設置了,而且效果很好。好簡單!當鏈路發生故障時,將進行無縫故障轉移。當他們出現時,他們又開始工作了。故障轉移時似乎沒有丟包或延遲,恢復時也沒有。

此外,其中一位評論者建議使用以下連結,該連結使用策略路由,使用 iptables 標記所有其他數據包等,但我會在幾天后嘗試看看它是否比上述更好,並在此處提供相應的回饋。

http://support.aa.net.uk/Router_-_Linux_upload_bonding_using_policy_routing

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