iptablesでIPアドレスごとの最大接続数と1秒あたりの新しい接続数を制限する


37

ポート80にhttpdを持つUbuntu 12.04サーバーがあり、制限したい:

  • IPアドレスごとのhttpdへの最大接続数は10
  • 1秒あたりのhttpdへの最大新規接続数は150

iptablesでこれを行うにはどうすればよいですか?

回答:


48
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の新しい接続(実際にはパケット)が許可されます。


1
上記は、ポート80だけでなく、すべてのポートで動作するように設定できますか?
エミネズアータス

1
これはIPごとですか?
-LatinSuD

2
すべてのポートのために、このルールを設定するには、ちょうど--dport 80削除
ダンPritts

5
2番目のルールは「新しい接続」では機能しません。既存の(「ESTABLISHED」)接続に明示的に影響します。新しい接続を行うには、-state NEWが必要です。の-m conntrack --ctstate代わりに使用することも検討してください-m state --state。conntrackは新しい状態で、改良されています。
ダンプリッツ

2
NEW接続に2番目のルールを追加するための上記のコメント-それをしないでください-それは事実上あなたのINPUTチェーンをデフォルトに変えますaccept!!!
スチュアートカーダル

8

質問の両方の要件に答えるために、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接続をセットアップするパケットに注意を払う(またはカウントする)ように指示します。


これらのコマンドの詳細をご覧いただきありがとうございます。
txyoji

--connlimit-maskを取得して、範囲全体ではなく特定のIPアドレスのみをブロックできますか?
アナログ

--connlimit-mask 32 単一のアドレス制限です。つまり、/ 32ネットマスクのようなものです。24のようなものは、/ 24ネットマスクのようなもので、下位8ビットを無視します。
イアンMacintosh

5

connlimitクライアントIPアドレス(またはアドレスブロック)ごとにサーバーへの並列TCP接続の数を制限できるモジュールを使用する必要があります。

/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
      --connlimit-above 10 -j DROP

私はあなたの答えを更新しましたが、それでも大丈夫だと思います(「--syn」が必要な理由は?)+そして、「1秒あたりの最大接続(ポート80、tcp)から150へ」についてはどうでしょうか。ありがとうございました!
エヴァクリスティン14年

--synは、ルールがsynフラグを持つTCPパケットのみを参照することを意味します-これは新しい接続を意味します。-m state --state NEWでもほぼ同じことができますが、これはおそらくより高速です。
ダンプリッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.