web-dev-qa-db-ja.com

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

ポート80にhttpdを備えたUbuntu 12.04サーバーがあり、制限したいとします。

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

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

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

49
totti

あなたはあなたの質問の両方の要件に答えるためにあなたの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のような他のクラスレス番号を使用することもできます。

また、クライアントの動作に応じて、mightは、「-j REJECT --reject-with tcp-reset」の代わりに「上記の2つのルールでは「-j DROP」、または150接続の最大ルールでのみ。

接続を拒否すると、ポート80を使用するブラウザまたはソフトウェアはすぐに「利用不可」ステータスを表示しますが、DROPオプションにより、クライアントは数回待機してから、サイトが利用不可であると報告する前に再試行します。 DROPはオフラインサーバーよりも接続不良のように動作するため、私はDROPに頼る傾向があります。

また、再試行中に接続制限が150(または10)未満に下がると、最終的にサーバーに到達します。

ただし、DROPは再試行中に追加のパケットを送信するため、REJECTオプションを使用すると、サイトへのトラフィックがわずかに減少します。おそらくすべての関連性はありません。

一方、ポート80トラフィックがクラスターの一部である場合、REJECTはクラスターコントローラーにダウンしていることを通知し、再試行タイムアウトの間、トラフィックの送信を停止します。

RELATED、ESTABLISHEDルールは、デフォルトルールがすべてのトラフィックをブロックすることを前提としています(iptables -t filter -P INPUT DROP)。これは、受け入れられた接続に属するさらなるパケットを受け入れるだけです。

また、-synは、TCP接続をセットアップするパケットに注意(またはカウント)するように指示します。

8
Ian Macintosh

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

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