3.6より前のLinuxカーネルは、IPv4マルチパスルーティングを実行するためにパスキャッシュを使用していました。これは、2つの独立した回線/ ISP間のルーティングが非常に簡単であることを意味します。 3.6以降、アルゴリズムはパケットごとの計算に変更されました。これは、2つの回線/ ISPを実装するためにいくつかのルーティングテーブル/ルール/iptablesマークアップトリックが必要であることを意味します。
ただし、同じISPを使用する2つの回線があり、バランスのとれた/障害対策としてパケットごとに2つの回線に沿って単一のIPをルーティングできる場合は、3.6以降の回線結合を簡単に実装できます(IPレベルで)。これは、各パケットが双方向にルーティングされるためです。
4.4から、コアがまた変わった。送信元アドレスと宛先アドレスのハッシュに基づくフローベースのロードバランシング。
現在、カーネル4.4.36を実行しており、PPPoE接続を介したマルチパスルーティングを使用しています。 ISPのダウンストリームトラフィックは、2つの別々の回線を介してパケットごとにルーティングされます(1つのIPが2つの回線に沿ってルーティングされます)。これは、単一回線からダウンロードできるよりも速いダウンロード速度を達成できることを意味します。私のアップストリームトラフィックは、最新のフローベースのアルゴリズムに基づいて2つのpppデバイス(同じIPアドレスを使用)間でルーティングされます。これは、単一のワイヤ速度よりも速いアップロード速度を達成できないことを意味します。
パケットごとのアルゴリズムを使用するように現在のカーネルを設定する方法はありますか?以前のカーネルに戻す必要があります(他のさまざまな理由で元に戻したくありません)。
私のISPはマルチリンクpppをサポートしていません。
関連している場合は、現在Arch Linux ARMv7(Raspberry Pi 3)を実行していますが、必要に応じてRaspianに変更できます。
ベストアンサー1
さて、この問題を調査するのにもっと時間を費やした後、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
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トラフィックを送信する必要があります。
上記のスクリプトでは、戻りパケットがteql0の代わりにpppインターフェースに戻り、ドロップされないようにリバースパス(rp_filter
)を(loose)に設定しました。2
このように設定しましたが、とてもうまくいきます。とても簡単!リンク障害時にシームレスなフェイルオーバーが可能です。彼らが現れたら、再び仕事を始めます。フェイルオーバーや回復時にパケットの損失や待ち時間がないようです。
また、以下のリンクの別のアプローチは、ポリシールーティングを使用し、iptablesを使用して他のすべてのパケットを表示するなどです。しかし、数日後に試してみて、上記の方法よりもうまく機能していることを確認し、それに応じたフィードバックをここに提供します。
http://support.aa.net.uk/Router__Linux_upload_bonding_using_policy_routing