Iproute2ポリシールーティングとアップリンク間のトラフィックバランシング-接続ドロップの問題

不快な落とし穴に出会いました。 複数のアップリンクとポリシールーティングを備えたシステムがあります。これは、アップリンク間の接続のバランシングを実装します。



ip route replace default scope global

nexthop via 11.22.33.1 dev eth0 weight 1

nexthop via 55.66.77.1 dev eth1 weight 1









ここにサンプル命令)



問題はこれです。接続が定期的に切断され、システムがありません。 それは数時間立つことができます、5-10分で落ちるかもしれません。 httpやtorrent'amはこれを妨害しません。 最初の場合、セッションは通常非常に短く、2番目の場合、再接続は気付かれず、結果なしになります。 しかし、sshを使用する場合はどうでしょうか?



そのようなルーティングスキームがどのように機能するかを知らない人のための説明。



デフォルトゲートウェイを通過する各接続について、使用可能なチャネルの1つが選択され、確率は重みパラメータに対応します。



次に、この接続のルートレコードがキャッシュに入力され、これらのIPアドレス間のすべてのパケットがこのルートに沿ってさらに進みます。 しばらくの間、このルートにパケットがない場合、キャッシュエントリは削除されます。 デフォルトでは、これには約5分かかります。 これには少なくとも1つの問題があります。接続が長時間データを送信しない場合、ルートキャッシュからのレコードは消去されますが、まだ接続キャッシュからではない場合があります。 デフォルトでは、nf_conntrackモジュールはtcp接続の非常に長い有効期間を公開します。 どうなるの? 次回もパケットがこの接続を通過すると、まだ切断されていないと見なされ、新しいルートが再確立されたかのように選択されます。 運がよければ-同じです。 その後、すべてが機能し続けます。 しかし、他の場合-何も行きません。



しかし、実際には、これは小さな問題です。接続が長い間アイドル状態になっている状況がかなりあります。たとえば、sshセッションであっても、キープアライブパケットを有効にできます。 他のほとんどの実際の場合と同様。 理論的には、このような状況はftpでも可能ですが、長い間使用していません。お勧めしません。 また、ほとんどのftpクライアントはキープアライブも可能です。



さらに悪いことに、このようなスキームでは、データの連続的な流れを伴うセッションでさえも落ちました。 そして、これは理解できないことが判明しました。

急いで盲目にされた問題の単純なバイパスは、最も必要なリモートホストへの静的ルートの確立であることが判明したため、それらへのルートは厳密に1つのインターフェイスを経由しました。 しかし、それはいです。 普遍的ではなく、接続フェイルオーバーのアイデアを壊します。



これが助けになり、問題がルーティングのどこかにあると思うようになったという事実。 3時間の発掘で次のことが明らかになりました: 2.6.35までのカーネル (およびそれらに多くのシステムがあります)のルーティング設定にはパラメーターnet.ipv4.route.secret_intervalがあり、秒単位で、デフォルトは600です。それを回避するために強制的にルートキャッシュフラッシュするオーバーフロー。 将来的には、それを放棄することが決定されました-https ://github.com/torvalds/linux/commit/3ee943728fff536edaf8f59faa58aaa1aa7366e3



したがって、10分ごとに1回、キャッシュがリセットされ、ルートが再度選択されます。 そして、私たちが望むように常にではありません。

したがって、複数のアップリンクを持つシステムでポリシールーティングを安定して動作させるには、このパラメーターを0に設定することをお勧めします。



sysctl -w net.ipv4.route.secret_interval=0









もちろん、この動作全体を排除するカーネルパッチを置くこともできますが、これは誰にとっても解決策ではありません。



後のカーネルではルートキャッシュのオーバーフローに対する追加の保護メカニズムが導入されていないため、このリセットを無効にすることは非常に安全です;既存のものは非常に信頼できると考えられていました。



All Articles