ポートに接続されているクライアント(IP)の数を制限する方法はありますか? (Ubuntu 22)

ポートに接続されているクライアント(IP)の数を制限する方法はありますか? (Ubuntu 22)

特定のポートに接続できる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つが終了した後に新しいコマンドが応答を受け取ることができますpingping

おすすめ記事