Linuxサーバーで実行されている特定のサービスへの同時接続数を制限しようとしています。私の理解では、これはiptables
モジュールを使用してconnlimit
で実行できるということです。したがって、たとえば、SSHサーバーへの同時接続を制限したい場合(およびデフォルトのポリシーが拒否であると仮定した場合)、これにより10の同時接続が許可され、11番目は拒否されます(メモリから書き込まれます)。
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-upto 10 -j ACCEPT
問題は、私が構築している新しいサーバーで、nftables
を使用してファイアウォールを実装することです。 manページに記載されているconnlimit
は見つかりますが、consider native interface. Refer to Meters
。 Metersについて調べてみましたが、レート制限には優れているように見えますが、connlimit
と同等のことができることを示唆するものは何も見つかりません。
それで、nftables
を使用したい場合、最大Xの同時接続のみに一致するルールを作成するにはどうすればよいですか?
Linuxカーネル4.18以降、新しい拡張機能 nft_connlimit が 追加 になり、ct count
式が提供されます。
この場合、同等のルール(ゼロから)は次のようになります。
nft flush ruleset
nft add table ip filter
nft add chain ip filter input '{ type filter hook input priority 0; }'
nft add rule ip filter input tcp dport 22 ct count 10 counter accept
# nft add rule ip filter input tcp dport 22 counter reject with tcp reset
いくつかの備考:
いつものようにcounter
はオプションであり、ルールがトリガーされた回数を知るためにnft list ruleset
でカウンターを取得するために使用されます。
上記のすべてのip
をip6
で置き換えると、IPv6と同等になります。ここでさらに興味深いのは、inet
を使用して、IPv4とIPv6のSSH接続の数を組み合わせて取得することです。これらの接続は、conntrackによって一緒に計算されるためです。
この機能を使用するとホストがクラッシュする可能性があるため、4.19.0と4.19.9の間のカーネルは回避する必要があります。 (今後の)カーネル4.20およびカーネル4.19.10には、conncountに関連するいくつかのパッチが含まれ、クラッシュと間違ったカウントを修正します。カーネル4.18.xのステータスは不明です。
[〜#〜] update [〜#〜]:IPごとではなくネットワークごとの制限。iptablesの--connlimit-mask
と同等
再読み込み netfilter-develメーリングリストの最初のパッチからの希少なドキュメント 、ct count
はスタンドアロンでの使用に限定されていません(または上記の例に限定されます)。 meter
expression/list内で使用して、より複雑な使用を行うことができます。
ランダム/ 24ネットワークソースIPごとに3接続カウントを超えるポート2222(プロセスがリスニングしている)への接続を拒否する場合、このルールを使用する必要があります(nft 0.9.0 /カーネル4.19.10以降)。
nft add rule ip filter input tcp dport 2222 meter test-2222-count-meter '{ ip saddr & 255.255.255.0 ct count over 3 }' counter reject with tcp reset
metertest-2222-count-meter
という名前のリストが作成され、関連する「マップ」データが動的に追加されます(一致するすべての/ 24ネットワークについて)接続)。古くなったデータ(つまり、接続がなくなった/ 24ネットワーク)がガベージコレクションによって削除されたかどうかはわかりません。
メーターの内容を一覧表示できます(到達したカウントは表示されず、新しいネットワークが表示されたときに動的に追加された「マップ」のみが表示されます)。たとえば、10.0.3.1
、10.0.3.66
、10.0.4.5
および172.31.4.5
からの接続後:
# nft list meter ip filter test-2222-count-meter
table ip filter {
meter test-2222-count-meter {
type ipv4_addr
size 65535
elements = { 10.0.3.0 : ct count over 3 , 10.0.4.0 : ct count over 3 , 172.31.4.0 : ct count over 3 }
}
}