web-dev-qa-db-ja.com

nftablesで最大接続制限をどのように設定しますか?

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の同時接続のみに一致するルールを作成するにはどうすればよいですか?

3
PeterM

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でカウンターを取得するために使用されます。

  • 上記のすべてのipip6で置き換えると、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.110.0.3.6610.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  }
    }
}
1
A.B