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


9

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

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

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

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

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

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

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

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


3
これは非常に悪い考えです。L2でのパケットごとのバランシング(つまり、MLPPP)には、パケットを正しい順序で再構成するのに十分なロジックが含まれています。これをIPで実行すると、順序どおりに配信されない可能性が非常に高くなります(ほぼ確実でない場合)。これにより、遅いTCPセッション、完全に壊れたUDP、あらゆる種類のリアルタイムストリーミングに関する問題など、多くの問題が発生します。他の問題は、ISPにパケットをラウンドロビンで送信している場合でも、彼らがあなたに対して同様にバランスをとっているという提案は絶対にありません。
rnxrx 16

@rnxrxコメントをありがとう-追加の詳細を提供するために質問を編集しました。私の質問から:「ISPからのダウンストリームトラフィックは、パケットごとに2つの別々の回線にルーティングされます」。ISPはコントロールパネルを提供します-両方の回線でルーティングするIPを1つ選択すると、それらは完全にバランスのとれたラウンドロビンをパケットごとにルーティングします。両方の回線の合計速度の合計の約90%でうまく機能し、瞬時のフェイルオーバーを提供します。Skypeビデオ、VOIP通話、YouTube、BBCストリーミングなどすべて素晴らしい-このような素晴らしいダウンストリームエクスペリエンスにより、アップストリームを試してみたいと思います
bao7uo

1
ああ-わかりました...では、現在2つの一意のIP(接続ごとに1つ)を持っていますか、それとも2つの並列パスを介して側の単一のIP(またはサブネット)にルーティングしていますか?どんな種類のNATを実行している場合でも、このバランスの前に発生することが明らかに重要です。とにかく、support.aa.net.uk / …を見たことがありますか?基本的にあなたが説明していることを達成するためにiptables拡張を使用しているため、合理的に最新のカーネルバージョン全体でかなり一貫性があるはずです。
rnxrx 2016

@rnxrxに感謝-はい、どちらのオプションも実行できます(2つの一意のIPまたは並列パスを介した1つのIP)。私はそれがより理にかなっているように思われたので、単一のIPオプションを選択しました。
bao7uo 2016

回答:


3

さて、これを調査するためにもっと時間をかけた後、私は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.1ISP側のパブリック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


TEQLがうまく機能したため、ポリシールーティングを試したことがありません。それが壊れていなかったら....
bao7uo 2017

これを機能させるようにしています。ボンディングが機能しているため、ルーターからボンディングされたインターフェースを使用できます。ただし、NATを機能させることはできません。LANからのトラフィックが結合リンクを下りません:(
andynormancx

サーバー障害について新しい質問を投稿し、コメントからそれにリンクする場合、私はあなたのためにそれを理解しようとします。ここにすべての情報をコメントに含めることができない限り、インターフェイス/ IP構成、ルーティングテーブル、iptablesルールなど、できるだけ多くの情報を含めますか?
bao7uo 2018

1
PS。私の設定の間違いに気づきました。それは言ったsysctl -w net.ipv4.ip_forwardsysctl -w net.ipv4.ip_forward=1、私は上記で修正したので言うべきです。これにより、LANからのトラフィックが結合リンクを下るのを確実に防ぐことができます。
bao7uo 2018

sysctlで転送を有効にしていたので、それが機能しなくなったとは思いません。私は今、私が見ている大量の順序が乱れたパケットが予想されるかどうかを調べようとしています。
andynormancx 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.