Erro de configuração Nftables: protocolos conflitantes especificados: inet-service v. icmp

0

Estou tentando criar um firewall com monitoração de estado simples com nftables seguindo o Guia do Arch Linux nftables . Eu postei essa pergunta no fórum Arch Linux e nunca recebi uma resposta.

Depois de concluir o guia e reinicializar 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 é reclamar sobre uma regra que defini para aceitar novos pings (icmp) na cadeia de entrada. Aqui está a regra e não vejo nada de errado com isso:

        icmp type echo-request ct state new accept

Se eu remover a regra, ela funcionará. Mas eu quero a regra.

Aqui está o 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? Obrigado antecipadamente.

    
por justinnoor.io 03.12.2017 / 07:09

1 resposta

1

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 ]
    
por 03.09.2018 / 23:05