ポート80にhttpdを持つUbuntu 12.04サーバーがあり、以下を制限しようとしています。
- IPアドレスあたりのhttpdへの最大接続数は10です。
- 1秒あたりのhttpdへの新しい新しい接続数は150です。
iptablesを使ってこれを行うにはどうすればよいですか?
答え1
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
これにより、ソースIPから15を超える接続が拒否されます。
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT
毎秒150の新しい接続(パケット)制限が適用される前に、160の新しい接続(実際にはパケット)が許可されます。
答え2
質問の両方の要件を満たすために、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
-I(OPの要求に応じて)を使用するため、下から上に「読み込む」ためには逆順で実行する必要があります。
また、--connlimit-mask NNを32から24に変更することを検討することをお勧めします。これは、クラスCネットワーク全体(同じ範囲で最大256個のIPアドレス)を10個の接続に制限します。サービスの使用方法に応じて、22または30などの他の未分類番号を使用することもできます。
また、顧客がどのように行動したいかによって可能上記の2つのルールまたは最大150のリンクルールで、「-j DROP」の代わりに「-j REJECT --reject-with tcp-reset」を使用したかったです。
接続を拒否すると、ポート80を使用するブラウザまたはソフトウェアはすぐに「使用できません」ステータスを表示しますが、DROPオプションを使用すると、サイトが利用できないと報告する前にクライアントが何度も待って再試行します。私自身もDROPを使用する傾向があります。これは、オフラインサーバーよりも接続状態が悪いように動作するためです。
また、再試行中に接続制限が150(または10)未満になると、最終的にサーバーに到達します。
ただし、REJECTオプションを使用すると、DROPを使用すると再試行時に追加のパケットが送信されるため、サイトのトラフィックがわずかに減少します。おそらくあまり関係がないでしょう。
一方、ポート 80 トラフィックがクラスタの一部である場合、REJECT はクラスタ コントローラにダウンしていることを通知し、再試行タイムアウト中にトラフィックの送信を停止します。
RELATED、ESTABLISHEDルールは、デフォルトルールがすべてのトラフィックをブロックしていると仮定します(iptables -t filter -P INPUT DROP)。これは、すでに許可されている接続に属する追加のパケットのみを許可します。
また、--synはTCP接続を確立するパケットに注意(または計算)するように指示します。
答え3
connlimit
クライアントIPアドレス(またはアドレスブロック)あたりのサーバーへの並列TCP接続の数を制限できるモジュールを使用する必要があります。
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 -j DROP