SYN_RECV接続の数が少ないにもかかわらず、ログに「可能なSYNフラッディング」


30

最近、SYNフラッディングのために非常に遅い応答をするApacheサーバーがありました。これの回避策は、tcp_syncookies(net.ipv4.tcp_syncookies=1 in /etc/sysctl.conf)を有効にすることでした。

あなたがより多くの背景が必要な場合、私はこれに関する質問をここに投稿しました。

syncookiesを有効にした後、約60秒ごとに/ var / log / messagesに次のメッセージが表示されるようになりました。

[84440.731929] possible SYN flooding on port 80. Sending cookies.

Vinko Vrsalovicは、これがsynバックログがいっぱいになっていることを通知してくれたので、tcp_max_syn_backlogを4096に上げましたsysctl -w net.ipv4.tcp_synack_retries=3。これを行った後、頻度は低下しているようで、メッセージの間隔は約60〜180秒の間で変化しました。

次に、を発行しましたがsysctl -w net.ipv4.tcp_max_syn_backlog=65536、まだログにメッセージが記録されています。

このすべてを通して、(実行watch --interval=5 'netstat -tuna |grep "SYN_RECV"|wc -l'することによって)SYN_RECV状態の接続の数を監視してきましたが、それが約240を超えることはなく、バックログのサイズよりはるかに低くなりません。それでも、約512個のRed Hatサーバーがあります(このサーバーの制限はデフォルトの1024です)。

バックログのサイズを制限する他のtcp設定はありますか、または間違ったツリーを起動していますか?SYN_RECV接続の数はnetstat -tuna、バックログのサイズに相関する必要がありますか?


更新

ここで合法的な接続を処理していると言えば、netstat -tuna|wc -l5000前後です。今日これを調査していて、last.fmの従業員からのこの投稿を見つけました。

また、syncookiesが有効になっている場合、tcp_max_syn_backlogは効果がないことも発見しました(このリンクのとおり)

そのため、次のステップとして、sysctl.confで以下を設定します。

net.ipv4.tcp_syn_retries = 3
        # default=5
net.ipv4.tcp_synack_retries = 3
        # default=5
net.ipv4.tcp_max_syn_backlog = 65536
        # default=1024
net.core.wmem_max = 8388608
        # default=124928
net.core.rmem_max = 8388608
        # default=131071
net.core.somaxconn = 512
        # default = 128
net.core.optmem_max = 81920
        # default = 20480

次に、応答時間テストをセットアップし、sysctl -psyncookiesを実行して無効にしましたsysctl -w net.ipv4.tcp_syncookies=0

これを行った後、SYN_RECV状態の接続の数はまだ約220〜250のままですが、接続は再び遅延し始めていました。これらの遅延に気づいたら、syncookiesを再度有効にし、遅延を停止しました。

私が見ていたことはまだ初期状態からの改善だったと思いますが、syncookiesを有効にするよりもはるかに悪いリクエストがまだありました。したがって、負荷に対処するためにさらにサーバーをオンラインにできるようになるまで、それらを有効にしておく必要があります。それでも、サーバーのバッファーがいっぱいになったときにのみ(見かけ上)送信されるため、再度無効にする正当な理由がわかりません。

ただし、SYNバックログは、SYN_RECV状態の接続が〜250だけでいっぱいになっているようには見えません!SYNフラッディングメッセージが赤いニシンであり、syn_backlog以外がいっぱいになっている可能性はありますか?

まだ試していない他のチューニングオプションがあれば、喜んで試してみますが、syn_backlog設定が何らかの理由で適切に適用されていないのではないかと思い始めています。


回答:


27

したがって、これはきちんとした質問です。

当初、私はあなたが見ていることに驚いた任意の SYNクッキーとSYN_RECV状態での接続が可能となりました。SYN Cookieの長所は、暗号化を使用するサーバーとしてステートレスにTCP 3ウェイハンドシェイクに参加できることです。そのため、サーバーはハーフオープン接続をまったく表さないことが期待されます。保持されていません。

実際、ソース(tcp_ipv4.c)をざっと見ると、カーネルがSYN Cookieを実装する方法に関する興味深い情報が示されています。基本的に、カーネルはそれらをオンにしているにもかかわらず、保留中の接続のキューがいっぱいになるまで通常どおりに動作します。これは、SYN_RECV状態の既存の接続リストを説明しています。

保留中の接続のキューがいっぱいになり、別のSYNパケット(接続試行)が受信され、最後の警告メッセージから1分以上経過した場合にのみ、カーネルは表示された警告メッセージ(「Cookieの送信」 )。SYN Cookieは、警告メッセージが送信されない場合でも送信されます。警告メッセージは、問題が解消されていないことを示すためのものです。

別の言い方をすると、SYN Cookieをオフにすると、メッセージは消えます。これは、SYNフラッドが発生しなくなった場合にのみうまくいきます。

あなたがやった他のことのいくつかに対処するには:

  • net.ipv4.tcp_synack_retries
    • これを増やしても、スプーフィングされた着信接続や、サーバー側の状態ではなくSYN Cookieを受信する接続に対しては、プラスの効果はありません(再試行も行われません)。
    • スプーフィングされた着信接続の場合、これを増やすと、偽のアドレスに送信するパケットの数が増え、スプーフィングされたアドレスが接続テーブルにとどまる時間が長くなります(これは重大な悪影響になる可能性があります)。
    • 通常の負荷/着信接続の数の下では、これが高いほど、パケットをドロップするリンクを介して接続を迅速に/正常に完了する可能性が高くなります。これを増やすと、収益は減少します。
  • net.ipv4.tcp_syn_retries:これを変更してもインバウンド接続には影響しません(アウトバウンド接続にのみ影響します)

あなたが言及した他の変数は調査していませんが、あなたの質問に対する答えはほとんどここにあると思います。

SYNフラッディングが発生しておらず、マシンが非HTTP接続(SSHなど)に応答している場合、おそらくネットワークに問題があると思われるので、ネットワークエンジニアに調べてもらう必要があります。SYNフラッディングされていなくてもマシンが一般に応答しない場合、TCP接続の作成に影響を与えると、深刻な負荷問題のように聞こえます(非常に低レベルで、リソースが集中しません)


ありがとう-これは興味深く有益な答えです。確かに、SYN_RECV状態の接続とCookieの送信との関係についての私の質問に答えます。マシンは、HTTPよりもはるかに少ないトラフィックを受信するSSHやHTTPSを含む、非HTTPに応答しました。したがって、トラフィックを減らすことが道であると判断しました。
アレックスフォーブス

ネットワークエンジニアに見てもらうことに関して-良い提案ですが、このデータセンターから移行しているので、いくつかの新しいサーバーを他の場所でオンラインにする場合はおそらく価値がありません。ネットワークの問題-ロードバランサーまたはファイアウォールの問題である可能性が高いと思います。洞察力をありがとうございます!
アレックスフォーブス

13

私は、Ubuntu Oneiric 11.10を新たにインストールしたときに、Webサーバー(apache2)の負荷が高く、負荷の高いWebサイトでまったく同じ問題に直面しました。Ubuntu Oneiric 11.10では、syncookiesがデフォルトで有効化されていました。

WebサーバーポートでSYNフラッド攻撃の可能性があることを示す同じカーネルメッセージがありました。

カーネル:[739408.882650] TCP:ポート80でのSYNフラッディングの可能性。Cookieの送信。

同時に、攻撃が発生していないことはかなり確信していました。このメッセージは5分間隔で返ってきました。攻撃者は常に負荷を高く保ちながら、サーバーが要求に応答しないようにするため、これは負荷ピークのように見えました。

net.ipv4.tcp_max_syn_backlogパラメーターを調整しても改善は見られませんでした-メッセージは同じ速度で続きました。SYN_RECV接続の数が常に非常に少なかったという事実(私の場合は250未満)は、このメッセージの原因となる他のパラメーターが必要であることを示す指標でした。

Red Hatサイトでこのバグメッセージhttps://bugzilla.redhat.com/show_bug.cgi?id=734991を見つけました。カーネルメッセージはアプリケーション側のバグ(または設定ミス)の結果である可能性があることを示しています。もちろん、ログメッセージは非常に紛らわしいです!これは、その場合に責任があるカーネルパラメーターではなく、アプリケーションのパラメーターであり、カーネルに渡されるためです。

そのため、Webサーバーアプリケーションの構成パラメーターも確認する必要があります。Apacheドキュメントを入手して、http: //httpd.apache.org/docs/2.0/mod/mpm_common.html#listenbacklogにアクセスします

ListenBacklogパラメーターのデフォルト値は511です(これは、Red Hatサーバーで確認した接続の数に対応します。別のサーバーでは、より小さな数が構成されている可能性があります)。

Apacheには、着信接続のバックログキュー用の独自の構成パラメーターがあります。多くの着信接続があり、いつでも(ランダムなものとして)それらがほぼ同時にすべて一緒に到着する場合、Webサーバーが適切な方法で十分に速くそれらを提供できない場合、バックログは511接続でいっぱいになると、カーネルはSYNフラッド攻撃の可能性を示す上記のメッセージを発します。

これを解決するために、次の行を/etc/apache2/ports.confapacheによってロードされる他の.confファイルに追加します(/etc/apache2/apache2.confこれも問題ないはずです):

ListenBackLog 5000

また、net.ipv4.tcp_max_syn_backlogを適切な値に設定する必要があります。私の理解では、カーネルの最大値によって値が制限され、Apache構成で構成できるようになります。だから実行:

sudo sysctl -w net.ipv4.tcp_max_syn_backlog=5000

設定を調整した後、Apacheを再起動することを忘れないでください:

sudo service apache2 restart ( or sudo /etc/init.d/apache2 restart )

私の場合、この構成の変更により、カーネルの警告はすぐに停止しました。Apacheの設定でListenBackLogの値を低く設定することで、メッセージを再現できます。


2
素晴らしい答え。あなたの言うことが正しいと仮定すると、私はこれを受け入れられた答えとしてマークしますが、実際にテストすることはできません-負荷を減らすことで問題が解決し、正当な理由なく実稼働サーバーをいじらないというポリシーがあります:)
Alex Forbes

これは本質的に機能することを確認できますが、これはカーネルのアンチDDOS機能ですが、多くのWebトラフィックを受信すると、正当なユーザーをブロックすることになります!
アレブスーヤシル

5

カーネル3.4.9でのいくつかのテストの後、netstatのSYN_RECV接続の数は、

  • /proc/sys/net/core/somaxconn 次の2のべき乗に切り上げられます(128-> 256など)
  • /proc/sys/net/ipv4/tcp_max_syn_backlogifの75%/proc/sys/net/ipv4/tcp_syncookiesが設定されている場合、0または100%/proc/sys/net/ipv4/tcp_syncookiesが設定されている場合1
  • ListenBackLog apache configで次の2のべき乗に切り上げられます(128-> 256など)

この各パラメーターの最小値が使用されます。somaxconnまたはListenBackLogを変更した後、Apacheを再起動する必要があります。

また、tcp_max_syn_backlogを増やした後、Apacheも再起動する必要があります。

tcp_syncookiesがなければ、Apacheはブロックします。この場合、tcp_max_syn_backlogの75%だけが制限である理由は奇妙です。このパラメーターを増やすと、Apacheを再起動せずにSYN_RECV接続が古い値の100%に増えます。


また、この呼び出しにより、ポート80でSYNフラッディングが発生/bin/echo m >/proc/sysrq-triggerすることがよくあります。Cookieメッセージを送信します。
usoft
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.