ポート80にhttpdを備えたUbuntu 12.04サーバーがあり、制限したいとします。
Iptablesでこれを行うにはどうすればよいですか?
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の新しい接続(実際にはパケット)が許可されます。
あなたはあなたの質問の両方の要件に答えるためにあなたの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接続をセットアップするパケットに注意(またはカウント)するように指示します。
connlimit
モジュールを使用する必要があります。これにより、クライアントIPアドレス(またはアドレスブロック)ごとのサーバーへの並列接続数TCP接続数)を制限できます。
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 -j DROP