Как заставить 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, но я не уверен, что можно использовать вместо нее nft. iptables-applyотменит правила, если вы не сможете подтвердить в течение заданного периода времени, что вы (все еще) можете получить доступ к хосту ...

решение2

В конце концов я решил эту проблему, перейдя к отдельной цепочке для правил только для локальной сети, так что в inputцепочке была только одна строка журнала. Я не уверен, почему простого добавления policy dropк inputцепочке, как предложил @0xC0000022L, было недостаточно.

#!/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
  }
}

Связанный контент