nftablesはIPv4とIPv6をブラックリストに動的に追加します。

nftablesはIPv4とIPv6をブラックリストに動的に追加します。

設定でnftablesの動的ブラックリスト、ABによると良い答え、ipv4、ipv6のブラックリストのコピー中にエラーが発生しました。私は次のコマンドライン(debian nftables)を実行しました(編集:元の質問は以前のバージョン0.9.0に関するものでした)。 0.9.3 APIバージョンの場合は有効です):

nft flush ruleset && nft -f /etc/nftables.conf

構成ファイルには以下が含まれます。

tcp flags syn tcp dport 8000 meter flood size 128000 { ip  saddr timeout 20s limit rate over 1/second } add @blackhole_4 { ip  saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter flood size 128000 { ip6 saddr timeout 20s limit rate over 1/second } add @blackhole_6 { ip6 saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter greed size 128000 { ip  saddr ct count over 3 } add @blackhole_4 { ip  saddr timeout 1m } drop                                                         
tcp flags syn tcp dport 8000 meter greed size 128000 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop

次のエラー応答を受け取りました。

/etc/nftables.conf:130:17-166: Error: Could not process rule: Device or resource busy
                tcp flags syn tcp dport 8000 meter flood size 128000 { ip6 saddr timeout 20s limit rate over 1/second } add @blackhole_6 { ip6 saddr timeout 1m } drop
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/etc/nftables.conf:132:17-145: Error: Could not process rule: Device or resource busy
                tcp flags syn tcp dport 8000 meter greed size 128000 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

また、これが何を測定しているのかよくわかりませんsize。権威あるところで見たので128000に設定されています。

編集:わかりました。私は遊び続けることにしましたが、各ipv6ルールごとに別々のメーターを生成するとエラーメッセージが消えることがわかりましたが、理由がわからないので、私の質問に答えずに代わりに他の人に任せます。より多くの知識メーターを共有できない理由の説明。以下はエラーを生成しません。

tcp flags syn tcp dport 8000 meter flood_4 size 128000 { ip  saddr timeout 20s limit rate over 1/second } add @blackhole_4 { ip  saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter flood_6 size 128000 { ip6 saddr timeout 20s limit rate over 1/second } add @blackhole_6 { ip6 saddr timeout 1m } drop
tcp flags syn tcp dport 8000 meter greed_4 size 128000 { ip  saddr ct count over 3 } add @blackhole_4 { ip  saddr timeout 1m } drop                                                         
tcp flags syn tcp dport 8000 meter greed_6 size 128000 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop

編集:この記事を書く時点でnftablesのマニュアルページでは用語を使用しmeterますが、nftables wiki、この用語は、特定のプロトコルタイプ(例ipv4_addr:)を含む定義を必要とするセットを好むので、使用されなくなりました。したがって、nftablesが現在この用語をmeter新しい用語にマッピングする場合、現在のマッピングが不可能な理由を説明します。setとの間で共有される単一プロトコル間の用語。しかし、に与えられた例はmeteripv4_addripv6_addrnftables wikiそれ自体も最新ではありません。dynamic現在(nftables v0.9.0)有効なフラグタイプではないため、エラーが発生します。manページに戻ってsetフラグまたは入力を表示できます。どのタイプがこの目的に適しているかわかりません。constantintervaltimeout

nftables編集:測定の「計算」形式が:(ct接続追跡)の別のセクションに移動されているようです。これで、次の定義を作成する必要があります。

    set greed_4 {                                                                                                                                                                                 
        type ipv4_addr                                                                                                                                                                            
        flags constant                                                                                                                                                                            
        size 128000                                                                                                                                                                               
        }                                                                                                                                                                                         

    set greed_6 {                                                                                                                                                                                 
        type ipv6_addr                                                                                                                                                                            
        flags constant                                                                                                                                                                            
        size 128000                                                                                                                                                                               
        }                                                                                                                                                                                         

これにより、次の規則が似ていますが、まだエラーが発生する可能性があります。

ct state new add @greed_4 { tcp flags syn tcp dport 8000 ip saddr ct count over 3 } add @blackhole_4 { ip saddr timeout 1m } drop
ct state new add @greed_6 { tcp flags syn tcp dport 8000 ip6 saddr ct count over 3 } add @blackhole_6 { ip6 saddr timeout 1m } drop

ベストアンサー1

この試み

table inet filter {
  set blackhole_4 {
    type ipv4_addr
    flags timeout
  }
  set blackhole_6 {
    type ipv6_addr
    flags timeout
  }
  set greed_4 {
    type ipv4_addr
    flags dynamic
    size 128000
  }
  set greed_6 {
    type ipv6_addr
    flags dynamic
    size 128000
  }
  chain input {
    type filter hook input priority 0;
    ct state new tcp flags syn tcp dport 8000 add @greed_4 { ip saddr ct count over 3 } add @blackhole_4 { ip  saddr timeout 1m } drop
    ct state new tcp flags syn tcp dport 8000 add @greed_6 { ip6 saddr ct count over 3 } add @blackhole_6 { ip6  saddr timeout 1m } drop
  }
}

編集:@User1404316の説明:@Zipがおそらく(正しく)説明を要求したためです。私が知っている限り:ct1つだけ紹介してください接続追跡ルール、この場合new tcp接続の場合はポート8000​​に移動する場合(dport宛先ポート)、事前定義されたコレクションコレクションにソースIPv4を追加しますgreed_4。これが起こると、ルールは最初の角かっこ条件に続きます。つまり、ソースアドレスに3つ以上のアクティブ接続がある場合、ソースIPv4は2番目の事前定義されたセットに追加されますが、blackhole_4それを1分間だけ保持します。ルールから離れていて、接続が切断されました。

もともと投稿された回答には2行の長い行が切り捨てられましたが、それが何でなければならないと思うかを把握して上に挿入しました。良いニュースは、テストの結果、この回答に効果があるということです!

残りの疑問はコレクションセットのサイズをいつ決めるか、どれだけ大きく設定するのか気になって一応はそのままにしました。

おすすめ記事