web-dev-qa-db-ja.com

遅いSYNフラッド:SYN増幅を防ぎますか?

少量のWebサイト用に(VPSで)管理している(Linux)Webサーバーは、ポート80で毎秒約5回のSYN要求を受け、リモートホストから他のトラフィックは発生していません。洪水というよりはドリップでしたが、最初に気付いてから1時間ほど続きました。これが増幅攻撃だったかどうかはわかりません。

私はそのようなことの一部になりたいとは思っていません。いずれにせよ、実際に害がなかったとしても、netstatを詰まらせている半分開いた接続はすべて迷惑でした。 (SYN-cookieが有効になっていて、リンクが飽和状態からかなり離れていて、Apacheが対処していましたが、メモリ使用量が増え、応答が通常より少し遅くなったと思います。)

したがって、これは、スプーフィングされた/実際の発信元IPアドレスを手動でブロックすることで「軽減」し、tcpdumpで監視していました。これにより、彼らが諦めたことがわかりました。自動ソリューションが欲しいのですが...

公開されているWebサーバーであるため、接続があると思われます。また、ページによっては写真やCSSファイルなどがたくさん載っています。したがって、本物のユーザーが1秒あたり5回の攻撃要求をはるかに超えることを完全に期待しています。

iptables -A INPUT -m state --state NEW -m limit --limit 4/second --limit-burst 20..。

本物のユーザーを捕まえるだけですが、攻撃を捕まえることはほとんどありません。

Netstatの出力でSYN_RCVDエントリを頻繁にカウントし、その結果をfail2banが応答するログにフィードするスクリプトのような大雑把なもの以外に、からのハーフオープン接続の累積合計が特定のIPがいくつかの数を超えていますか? iptablesには何も表示されませんが、何かが足りない可能性があります。

[〜#〜] edit [〜#〜]:言うのを忘れた、VPSはopenVZベース(RHEL6上に構築)なので、私が固執しているカーネルは現時点では2.6.32です。古代のカーネルで機能する答えは素晴らしいでしょう!

EDIT2:要求に応じて、Conntrackのタイムアウト:

net.netfilter.nf_conntrack_generic_timeout = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 30
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 15
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 15
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 10
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_close = 5
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 60
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 60
net.netfilter.nf_conntrack_udp_timeout = 10
net.netfilter.nf_conntrack_udp_timeout_stream = 60
net.netfilter.nf_conntrack_icmpv6_timeout = 30
net.netfilter.nf_conntrack_icmp_timeout = 10
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.ipv6.nf_conntrack_frag6_timeout = 4194

しかし、上で書いたように、私はphpmyAdmin、dlinkを持っているかどうかを確認しようとするときのように、スクリプトキディなどをブロックするほどサーバーへの影響にはあまり関心がありません(これまでのところ最小限です)。 -ルーターなど、私が入手した最後のパケットについてです。

1
somloigaluska

はい、iptablesの制限とSYNPROXYと組み合わせて、カーネル設定(conntrackモジュールを介したタイムアウトの設定など)を行うことができます。

基本的に、synproxyが行うことは、完全なTLS接続が確立されているかどうかを確認し、確立されていない場合は要求をドロップすることです。以前に提供された他のソリューション(ハッシュ制限など)よりもはるかに優れたパフォーマンスを発揮します。

そして、その通りです。1秒あたり4接続の制限は、多くの正当な接続をブロックします。約60〜80 /秒がより現実的です。ユースケースでは、synproxyが間違いなく進むべき道です。

今年初めに組み込みのLinuxツールを使用してDDoS保護を試してみたところ、ここで優れたアンチDoSガイドを見つけました: https://javapipe.com/ddos/blog/iptables-ddos-protection/

このガイドは基本的に、私が上で述べたすべてのことへのハウツーです。すべてのルールの機能、実装する必要がある理由、実装しない理由、機能、パフォーマンスへの影響、オプションかどうかを説明する、非常に優れたガイドです。

2
Broco