特定のポートに接続できるIPの数を制限する方法を見つけようとしています。以下は、ポートに接続された一意のIP数を返す簡単な例です。
netstat -ntu | grep :80 | grep -v LISTEN | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | grep -v 127.0.0.1 | wc -l
あるいは、条件付きスクリプトは、上記のコードが条件を満たすときに新しいIPからの接続を拒否することができます。
それともiptablesにすることもできます。
私もこのコードを見ました。
iptables -A INPUT -p tcp --syn -dport 80 -m iplimit --iplimit-above 10 -J REJECT
しかし、iplimitまたは--iplimit-aboveのドキュメントが見つかりませんでした。
答え1
~中iptables拡大する、これconnlimit
一致は次のことができます。
connlimit
クライアントIPアドレス(またはクライアントアドレスブロック)あたりのサーバーへの並列接続の数を制限できます。
それもともとは呼び出されiplimit
ましたが、名前が変更されました(2003!)connlimit
:
iplimit の名前を connlimit に変更します。
それにかかっているつながる進行中の確立された接続の現在の状態を追跡するサブシステム。したがって、この一致は、エンドノードで使用されるフィルタ/入力だけでなく、フィルタ/配信のルータ(コンテナまたはVMをホストするシステムを含む)でも使用できます。
あなたの例は次のように翻訳されます。
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
デフォルトでは、制限はソースアドレスごとに適用されます。
--connlimit-mask
プレフィックス長[...] 指定しない場合、そのプロトコルの最大プレフィックス長が使用されます。
IPv4 の場合 /32、IPv6 の場合 /128 を意味します。
--connlimit-saddr
[...] これがデフォルトです [...]
グローバル制限の場合は、--connlimit-mask 0
追加オプションを使用できます。
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 0 -j REJECT
OPの初期コマンドは127.0.0.1を除外するため、これらの接続が次の規則で考慮されないように最終(最適化されていない)結果を得るには、前に例外を挿入する必要があります。
iptables -A INPUT -p tcp --syn --dport 80 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 0 -j REJECT
以前のルールをすぐに置き換えたり所有したりする-s 127.0.0.1
こともでき、すべてのルールを共通にすることができます。-i lo
-i lo
この-p tcp --syn --dport 80
ブロックは、デフォルトのタイムアウトを考慮すると、他のデータグラム指向プロトコル(UDP、ICMP...)に使用できます-p tcp --dport 80 -m conntrack --ctstate new
。--ctstate new
たとえば、2つの(グローバル)進行中のping(ICMPエコー要求)に対する応答を同時に制限するには、次のようにします。
iptables -I INPUT -p icmp --icmp-type echo-request -m conntrack --ctstate NEW -m connlimit --connlimit-above 2 --connlimit-mask 0 -j DROP
注:次のようにつながるICMPを使用するエントリは30秒でタイムアウトし、「スロット」が再利用できるようになるまで30秒かかり、以前に許可された2つのコマンドのうちの1つが終了した後に新しいコマンドが応答を受け取ることができますping
。ping