web-dev-qa-db-ja.com

Linuxでパケットごとのマルチパスルーティングを実現する方法

Linuxカーネル3.6より前は、ルートキャッシングを使用してIPv4マルチパスルーティングを実行していました。つまり、2つの別々の回線/ ISP間のルーティングは非常に簡単でした。 3.6から、アルゴリズムはパケット単位に変更されました。つまり、2つの回線/ ISPを実現するには、ルートテーブル/ルール/ iptablesマーカートリックが必要でした。

ただし、同じISPで2つの回線があり、1つのIPをパケットごとにバランスのとれた/フェールオーバー方式で両方の回線にルーティングできる場合、3.6から、次の理由により(IPレベルで)回線のボンディングを簡単に実現できます。双方向のパケットごとのルーティング。

4.4から カーネルが再び変更されました は、送信元アドレスと宛先アドレスのハッシュに基づくフローベースのロードバランシングになりました。

現在カーネル4.4.36を実行しており、PPPoE接続を介してマルチパスルーティングを使用しています。ISPからのダウンストリームトラフィックは、パケット単位(1つのIPが両方の回線にルーティングされます)。これにより、1つの個別の回線の速度よりも速いダウンロード速度が得られます。ほぼ両方の回線の速度が加算されます。さて、Skypeビデオ、VoIP(UDP)、YouTubeなどはすべてうまく機能します。

このような優れたダウンストリームエクスペリエンスがあるため、アップストリームを試したいのですが、アップストリームトラフィックは両方のpppデバイス(同じIPアドレスを持つ)全体で新しいフローベースのアルゴリズムに従ってルーティングされます。これは、1行の速度よりも速いアップロード速度を実現できないことを意味します。

パケットごとのアルゴリズムを使用するように現在のカーネルを構成する方法はありますか?または、パケットごとのマルチパスルーティングを実現する他の方法はありますか?古いカーネルに戻す必要がありますか(他のさまざまな理由でやりたくない)。

私のISPはマルチリンクPPPをサポートしていません。

関連性がある場合、私は現在、Raspberry Pi 3でArch Linux ARMv7を実行しています。

9
bao7uo

さて、これを調査するためにもっと時間をかけた後、私は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 +にあり、teql +にはPOSTROUTING MASQUERADEがあります。これは、発信トラフィックが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デバイスに割り当てる必要はありません。私のセットアップでは、2つのpppリンクが同じIPを共有しています(pppoeなどによってネゴシエートされています)。上に示したように手動で割り当てたteqlリンクISPは、IPのトラフィックを両方のリンクに等しく送信する必要があります。

上記のスクリプトでは、リバースパス(rp_filter)が2(緩い)に設定されているため、戻りパケットは、teql0ではなくpppインターフェイスに戻ってくるためにドロップされません。

私はそのように設定しましたが、完全に機能します。非常に簡単!リンクに障害が発生すると、シームレスなフェイルオーバーが発生します。彼らが現れたとき、彼らは再び働き始めます。フェイルオーバー時のパケット損失や遅延はなく、復旧時のパケット損失もないようです。

また、コメント提供者の1人が、ポリシールーティングを使用して、iptablesが他のすべてのパケットにマークを付けるなどの以下のリンクを提案しましたが、数日後にそれが上記よりもうまく機能するかどうかを確認し、それに応じてフィードバックを提供します。

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

3
bao7uo