nftables でドロップされたパケットをログに記録するにはどうすればよいですか?

nftables でドロップされたパケットをログに記録するにはどうすればよいですか?

nftables が、拒否されたトラフィックだけでなく、許可されたすべての着信トラフィックをログに記録するようにしたようですが、他に「他のすべてを拒否してログに記録する」という方法がわかりません。

これが私の/etc/nftables.confファイルです:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0;

    # Accept any localhost traffic
    iif lo accept

    # Accept traffic originated from us
    ct state established,related accept

    # Accept neighbour discovery otherwise IPv6 connectivity breaks
    ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept

    # Allow incoming SSH connections
    tcp dport ssh ct state new counter accept

    # Allow mdns from the LAN
    ip saddr 192.168.1.0/24 udp dport mdns counter accept
    ip6 saddr fe80::/10 udp dport mdns counter accept

    ip saddr 192.168.1.0/24 log prefix "Rejected: " flags all reject comment "send rejection to LAN only"
    ip6 saddr fe80::/10 log prefix "Rejected: " flags all reject comment "send rejection to LAN only"

    # Log and drop any other traffic
    # THIS IS THE BROKEN PART
    log prefix "Dropped:  " flags all drop
  }
  chain forward {
    type filter hook forward priority 0;
  }
  chain output {
    type filter hook output priority 0;
  }
}

答え1

チェーンのデフォルトに関する部分を見逃したようです。マニュアル:

{add | create} chain [family] table chain [{ type type hook hook [device device] priority priority ; [policy policy ;] }]

ここで言及されている値はpolicy次のように説明されます。

基本チェーンでは、チェーンのpolicy、つまり、含まれるルールで明示的に承認または拒否されていないパケットに何が起こるかを設定することもできます。サポートされているポリシー値は、accept(デフォルト) または ですdrop

したがって、次の行を置き換える必要があると思います:

  chain input {
    type filter hook input priority 0;

これらについては:

  chain input {
    type filter hook input priority 0;
    policy drop;

ただし、ルールによってロックアウトされた場合に備えて、このマシンにアクセスする何らかの方法があることを確認してください。 にiptables使用するコマンドは ですiptables-applyが、 の代わりに何が使用できるかはわかりませんnftiptables-applyは、指定されたタイムアウト期間内にホストに (引き続き) アクセスできることを確認できない場合、ルールを元に戻します...

答え2

最終的に、LAN のみのルールの別のチェーンにジャンプして、チェーンのログ行が 1 つだけになるようにすることで、この問題を解決しました。@0xC0000022L の提案どおりにチェーンに追加するだけでは不十分だったinput理由がよくわかりません。policy dropinput

#!/usr/sbin/nft --file

flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0
    policy drop
    # Normal "prelude" things you always want.
    ct state vmap {
      new: continue,
      established: accept,
      related: accept,
      invalid: drop
    }
    ct status dnat  accept
    iiftype loopback  accept
    icmp type echo-request  accept
    icmpv6 type {
      echo-request,
      nd-neighbor-solicit,
      nd-router-advert,
      nd-neighbor-advert
    } accept

    tcp dport ssh accept comment "Allow incoming SSH connections"

    ip  saddr 192.168.1.0/24  jump lan_only
    ip6 saddr fe80::/10       jump lan_only

    log prefix "Dropped:  " flags all drop comment "non-LAN gets dropped brusquely"
  }

  chain lan_only {
    udp dport mdns counter accept comment "Allow mdns from the LAN"
    log prefix "Rejected: " flags all reject comment "LAN gets rejected politely (others get dropped brusquely)"
  }

  chain forward {
    type filter hook forward priority 0
  }
  chain output {
    type filter hook output priority 0
  }
}

関連情報