
Кажется, я заставил 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
}
}