特定のポートの接続数を制限したいです。例:私のサーバーの2300から2500の間のポートで2つの接続しか許可したいと思います。しかし、iptablesを使ってこれを行う方法がわかりません。追加のソフトウェアが必要ですか?どんな提案がありますか?
ベストアンサー1
あなたはこれを行うことができますnftables、カーネル> = 4.18(ここではカーネル5.3を使用してテスト済み)とnftables> = 0.9.1を使用する限界~の計算機能(および動的ここで使用されるロゴ)。それより良いiptables制限作る時に選べるからメーター 置く、制限されたセレクタとマスクが適用され、可能なセレクタは少数(ポートを除く)のみ存在します。iptables、ポートごとに1つのルールが必要な場合があります。
以下は改造された内容ですWikiの例ただし、OP問題を解決するために発信IPアドレスの代わりに着信TCPポートを追跡することは除外されます。 2つの接続が確立された後、2300と2500の間の同じローカルポートへのすべてのTCP接続はTCP RSTによって拒否されます。わかりました。CTステータス新規パケットパスに新しい要素を追加しようとしないための最適化。すべて最初のパケットだけでなく、接続からの着信パケットも同様です。
NFFTロードするルールファイルnft -f
:
flush ruleset
table ip my_filter_table {
set my_connlimit {
type inet_service
size 65535
flags dynamic
}
chain my_input_chain {
type filter hook input priority filter; policy accept;
tcp dport 2300-2500 ct state new add @my_connlimit { tcp dport ct count over 2 } counter reject with tcp reset
}
}
一致する接続は、次の場所に項目を作成します。私の接続制限:現在の数ではなく動的に生成されたセレクタ項目(次に提供)限界使用つながる記入)。この特別なケースでは、コレクションサイズを2500-2300 + 1 = 201に設定するだけで十分です。追加された要素は、関連付けられた数がなくなったとき(つまり、そのポートのすべての接続が閉じられると)自動的に消えます(少なくともカーネル5.3では)。ポート2301で1つまたは2つの接続を確立した後の例:
# nft list set ip my_filter_table my_connlimit
table ip my_filter_table {
set my_connlimit {
type inet_service
size 65535
flags dynamic
elements = { 2301 ct count over 2 }
}
}
UDPは同じように機能しますが、実際の接続がないため、conntrackは通常、最後のアクティビティの後30秒から120秒(以前は180秒)の間にエントリ時間を超えることを除いて同じです。また利用できます従属単に置くたとえば、メーターとして以下を制限します。各サーバーのIPとポートそして同様にポートあたり複数のIPを持つサーバーの場合は、次のようになります。
flush ruleset
table ip my_filter_table {
set my_connlimit {
type ipv4_addr . inet_service
size 65535
flags dynamic
}
chain my_input_chain {
type filter hook input priority filter; policy accept;
tcp dport 2300-2500 ct state new add @my_connlimit { ip daddr . tcp dport ct count over 2 } counter reject with tcp reset
}
}
注:計算ツールでローカル接続を回避するには、次の手順を実行します。ルオデバイスをバイパスする必要があります。たとえば、
# nft insert rule ip my_filter_table my_input_chain iif lo accept