回答:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
これにより、1つのソースIPからの15を超える接続が拒否されます。
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT
この場合、毎秒150の新しい接続(パケット)の制限が適用される前に、160の新しい接続(実際にはパケット)が許可されます。
-m conntrack --ctstate
代わりに使用することも検討してください-m state --state
。conntrackは新しい状態で、改良されています。
NEW
接続に2番目のルールを追加するための上記のコメント-それをしないでください-それは事実上あなたのINPUT
チェーンをデフォルトに変えますaccept
!!!
質問の両方の要件に答えるために、iptablesに次のルールが必要です。
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 80 -m state \
--state RELATED,ESTABLISHED -j ACCEPT
# Adjust "--connlimit-above NN" to limit the maximum connections per IP
# that you need.
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 --connlimit-mask 32 -j DROP
# Adjust "--connlimit-above NNN" to the maximum total connections you
# want your web server to support
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 150 -j DROP
(OPリクエストに従って)-Iを使用しているため、逆の順序で実行する必要があるため、ボトムアップで「読み取る」必要があります。
また、-connlimit-mask NNの32から24への変更を検討することをお勧めします。これにより、完全なClass-Cネットワーク(同じ範囲で最大256のIPアドレス)が10接続に制限されます。また、サービスの使用方法に応じて、22または30などの他のクラスレス番号を使用することもできます。
また、あなたは、クライアントが動作するようにする方法に応じて、あなたは可能性が使用する代わりに、上記の、あるいは唯一の150個の接続maxの二つの規則では、「-j DROP」の「-jは--reject-とのTCPリセットを拒否」ルール。
接続を拒否すると、ポート80を使用するブラウザまたはソフトウェアはすぐに「使用不可」ステータスを表示しますが、DROPオプションにより、クライアントはサイトを使用不可として報告する前に数回待機して再試行します。オフラインサーバーよりも接続不良のように動作するため、私は自分でDROPに頼る傾向があります。
また、再試行中に接続制限が150(または10)未満に戻った場合、最終的にサーバーに到達します。
ただし、DROPは再試行中に追加のパケットを送信するため、REJECTオプションを使用すると、サイトへのトラフィックがわずかに減少します。おそらく関連するすべてではありません。
一方、ポート80のトラフィックがクラスターの一部である場合、REJECTはクラスターコントローラーにダウンしていることを通知し、リトライタイムアウトの間はトラフィックの送信を停止します。
RELATED、ESTABLISHEDルールは、デフォルトルールがすべてのトラフィックをブロックするという仮定の下にあります(iptables -t filter -P INPUT DROP)。これは、受け入れられた接続に属するさらなるパケットを受け入れるだけです。
また、--synは、TCP接続をセットアップするパケットに注意を払う(またはカウントする)ように指示します。
connlimit
クライアントIPアドレス(またはアドレスブロック)ごとにサーバーへの並列TCP接続の数を制限できるモジュールを使用する必要があります。
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 -j DROP