Estou tentando construir um firewall stateful simples com nftables seguindo o guia Arch Linux nftables . Postei esta pergunta no fórum do Arch Linux e nunca recebi uma resposta.
Depois de concluir o guia e reiniciar minha máquina, o systemd falhou ao carregar o nftables.service . Para solucionar o erro, executei:
systemctl status nftables
Aqui está a saída relevante:
/etc/nftables.conf:7:17-25: Error: conflicting protocols specified: inet-service v. icmp
O erro está reclamando de uma regra que estabeleci para aceitar novos pings (icmp) na cadeia de entrada. Aqui está a regra e não vejo nada de errado nisso:
icmp type echo-request ct state new accept
Se eu remover a regra, funcionará. Mas eu quero a regra.
Aqui está meu conjunto de regras em nftables.conf depois de concluir o guia:
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif "lo" accept
ct state invalid drop
icmp type echo-request ct state new accept
ip protocol udp ct state new jump UDP
tcp flags & (fin | syn | rst | ack) == syn ct state new jump TCP
ip protocol udp reject
ip protocol tcp reject with tcp reset
meta nfproto ipv4 counter packets 0 bytes 0 reject with icmp type prot-unreachable
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
chain TCP {
tcp dport http accept
tcp dport https accept
tcp dport ssh accept
tcp dport domain accept
}
chain UDP {
tcp dport domain accept
}
}
o que estou perdendo? Agradeço antecipadamente.
Esta foi uma limitação de sintaxe do nftables 0.7 (ou algumas outras versões): não considerou ICMP e ICMPv6 diretamente utilizáveis na tabela dual IPv4/IPv6
inet
sem declarar explicitamente qual protocolo IP primeiro:Então a regra:
para funcionar tanto em IPv4 quanto em IPv6 tem que ser escrito duas vezes assim:
ATUALIZAÇÃO : na verdade, não se deve confiar no IPv6 ao
nexthdr
apontar para o protocolo da camada superior: pode haver cabeçalhos de extensão entre o cabeçalho fixo e o cabeçalho da camada superior (que vem por último). Adicionando a sintaxe correta (usando as meta-informações que já fornecem informações de protocolo) e deixando minha resposta original riscada, porque não sei se a sintaxe "correta" é válida com nftables 0.7:fornecendo o bytecode correspondente (exibido usando
nft --debug=netlink list ruleset -a
):ICMP é o protocolo IP 1, valor de solicitação de eco 8.
ICMPv6 é o protocolo IPv6 58 (0x3a), seu valor de solicitação de eco é 128 (0x80).
O nftables 0.9 mais recente aceita diretamente a regra
icmp type echo-request ct state new accept
, mas seu bytecode correspondente é apenas:o que significa que está lidando apenas com ICMP, não também ICMPv6, que ainda deve ser adicionado com uma regra adicional, simplesmente como:
devolvendo o bytecode equivalente da versão anterior: