Esta era uma limitação de sintaxe de 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:
icmp type echo-request ct state new accept
para trabalhar tanto no IPv4 quanto no IPv6 tem que ser escrito duas vezes assim:
ip protocol icmp icmp type echo-request ct state new accept
ip6 nexthdr icmpv6 icmpv6 type echo-request ct state new accept
dando o bytecode correspondente (exibido usando nft --debug=netlink list ruleset -a
):
inet filter input 9 8
[ meta load nfproto => reg 1 ]
[ cmp eq reg 1 0x00000002 ]
[ payload load 1b @ network header + 9 => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ payload load 1b @ transport header + 0 => reg 1 ]
[ cmp eq reg 1 0x00000008 ]
[ ct load state => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ immediate reg 0 accept ]
inet filter input 10 9
[ meta load nfproto => reg 1 ]
[ cmp eq reg 1 0x0000000a ]
[ payload load 1b @ network header + 6 => reg 1 ]
[ cmp eq reg 1 0x0000003a ]
[ payload load 1b @ transport header + 0 => reg 1 ]
[ cmp eq reg 1 0x00000080 ]
[ ct load state => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ immediate reg 0 accept ]
ICMP é o protocolo IP 1, valor de solicitação de eco 8.
O ICMPv6 é o protocolo IPv6 58 (0x3a), seu valor de solicitação de eco 128 (0x80).
Novos nftables 0.9 aceitam diretamente a regra icmp type echo-request ct state new accept
, mas seu bytecode correspondente é somente:
inet filter input 9 8
[ meta load nfproto => reg 1 ]
[ cmp eq reg 1 0x00000002 ]
[ meta load l4proto => reg 1 ]
[ cmp eq reg 1 0x00000001 ]
[ payload load 1b @ transport header + 0 => reg 1 ]
[ cmp eq reg 1 0x00000008 ]
[ ct load state => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ immediate reg 0 accept ]
o que significa que ele está lidando apenas com o ICMP, e não com o ICMPv6, que ainda deve ser adicionado com uma regra adicional, simplesmente como:
icmpv6 type echo-request ct state new accept
devolvendo o código de bytes equivalente da versão anterior:
inet filter input 10 9
[ meta load nfproto => reg 1 ]
[ cmp eq reg 1 0x0000000a ]
[ meta load l4proto => reg 1 ]
[ cmp eq reg 1 0x0000003a ]
[ payload load 1b @ transport header + 0 => reg 1 ]
[ cmp eq reg 1 0x00000080 ]
[ ct load state => reg 1 ]
[ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
[ cmp neq reg 1 0x00000000 ]
[ immediate reg 0 accept ]