erro de configuração após atualizar nftables

erro de configuração após atualizar nftables

Uso nftables há 2 anos com a mesma configuração, atualizei o programa outro dia e agora está reclamando que minha configuração não é válida embora toda a documentação ainda diga que está certa. talvez alguém consiga identificar um símbolo desonesto ou algo assim?

aqui está minha configuração:


flush ruleset

# `inet` applies to both IPv4 and IPv6.
table inet filter {
    chain input {
        type filter hook input priority 0;

        # accept any localhost traffic
        iif lo accept

        # no ping floods:
        ip protocol icmp icmp type echo-request limit rate over 10/second burst 4 packets drop
        ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop

        # accept traffic originated from us
        ct state established,related accept

        # ssh
        tcp dport 22 accept

        # http/https
        tcp dport 80 accept
        tcp dport 443 accept

        # tftp/netboot
        udp dport 4011 accept
        udp dport 67 accept
        tcp dport 69 accept
        udp dport 69 accept

        # listinator
        tcp dport 8080 accept
        tcp dport 4343 accept

        # smb
        tcp dport 139 accept
        tcp dport 445 accept
        udp dport 137 accept
        udp dport 138 accept

        # mc
        tcp dport 25565 accept

        # count and drop any other traffic
        counter drop
    }

    chain output {
        type filter hook output priority 0;
        policy accept;
    }

    chain forward {
        type filter hook forward priority 0;
        nft add rule inet filter forward ct status dnat accept;
        policy drop;
    }
}

e o erro ao iniciar:

Starting nftables...
/etc/nftables.conf:57:6-8: Error: syntax error, unexpected add
        nft add rule inet filter forward ct status dnat accept;
            ^^^
nftables.service: Main process exited, code=exited, status=1/FAILURE
nftables.service: Failed with result 'exit-code'.
Failed to start nftables.

Responder1

Isto está dentro de umnftáveis roteirocarregado com o comando nft -f. A nftpalavra não tem significado por dentro e não deveria aparecer. Mas existem 1 1/2 outros problemas no mesmo lugar. Então vamos ver:

Ao redor da linha o nftcomando reclama que existe:

   chain forward {
       type filter hook forward priority 0;
       nft add rule inet filter forward ct status dnat accept;
       policy drop;
   }
  • nftpara ser removido,

  • já dentro de um inet filter forwardbloco (cadeia)

    Portanto, add rule inet filter forwardtambém deve ser removido. Na verdade, ;é supérfluo porque há uma nova linha depois.

           ct status dnat accept
    
  • policy drop;deve ser colocado com a definição da cadeia base

    Desta vez com sua ;parte obrigatória da sintaxe. a policypalavra-chave faz parte docorrentedefinição, não faz parte de umregradefinição. Embora isso pareça ser atualmente aceito separado de sua definição de cadeia básica por regras intermediárias, isso não é algo em que se possa confiar: isso pode mudar em uma versão posterior.

    A mesma observação se aplica à outputcadeia: não separe policy accept;de sua definição de cadeia base para não inserir regras por engano posteriormente.

A forwardcorrente deve no final ser substituída por:

    chain forward {
        type filter hook forward priority 0; policy drop;
        ct status dnat accept
    }

O que seria uma sintaxe correta, mas não muito interessante, é definir a regra não dentro dos blocos, mas completamente fora das estruturas, no final do script assim:

    chain forward {
        type filter hook forward priority 0; policy drop;
    }
}
add rule inet filter forward ct status dnat accept

De qualquer forma nft list ruleset, ele será exibido novamente como antes, dentro do inet filter forwardbloco de cadeia.


Notas:

  • embora seja bom usar ip protocol icmp, não é bom usarip6 nexthdr ipv6-icmp

    a razão é que, ao contrário do IPv4, onde o protocolo no cabeçalho IPv4 é sempre o protocolo da camada 4, o protocolo IPv6próximo cabeçalhonem sempre é o cabeçalho da camada 4 (icmp, udp, tcp...): poderia ser, em vez disso, umCabeçalho de extensãoaparecendo entre o cabeçalho IPv6 e o ​​cabeçalho da camada 4 (final). Neste caso, a regra não corresponderá.

    O sistema operacional já determinou a qual protocolo da camada 4 esse pacote pertence, portanto, as informações estão disponíveis como metainformações em vez de informações de conteúdo do pacote: meta l4proto ipv6-icmp.

    Isto é tambémdocumentado na página de manual:

    Esta expressão refere-se aos campos do cabeçalho ipv6. Cuidado ao usar ip6 nexthdr, o valor refere-se apenas ao próximo cabeçalho, ou seja, ip6 nexthdr tcpsó corresponderá se o pacote ipv6 não contiver nenhum cabeçalho de extensão. Pacotes que estão fragmentados ou, por exemplo, contêm cabeçalhos de extensão de roteamento não serão correspondidos. Use meta l4proto se desejar corresponder ao cabeçalho de transporte real e ignorar quaisquer cabeçalhos de extensão adicionais.

    Mas na verdade, como a mesma linha inclui uma icmpv6 type ...linha, isso já filtra o protocolo da camada 4 para corresponder ao ICMPv6 e, ao mesmo tempo,o uso de ICMPv6 define implicitamente o protocolo da camada 3 para corresponder ao IPv6: nada é necessário para consertar.

    Da mesma forma, a linha anterior pode ser dispensada ip protocol icmppelos mesmos motivos (mas seu comportamento atual ainda é bom).

    A linha:

            ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
    

    deve ser substituído simplesmente por:

            icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
    

    (sem a necessidade de preceder meta nfproto ipv6 meta l4proto icmpv6)

  • TFTP

    • TFTP usa apenas UDP

      A porta TCP 69 nunca é usada, portanto não requer uma regra para permitir isso.

    • TFTP e firewall com estado

      TFTPé um protocolo tão difícil quanto o FTP para firewalls. Após a consulta inicial, a transferência de dados em si não usa mais a porta UDP 69 em lugar nenhum. Uso adequado doAuxiliar de conexão TFTPcom regras adicionais (que devem carregar automaticamente o nf_conntrack_tftpmódulo do kernel) provavelmente serão necessárias, a menos que a configuração obsoleta do sysctl net.netfilter.nf_conntrack_helpertenha sido habilitada novamente.

      Seria realmente fora do assunto abordar isso aqui. Veja o início (apenas) da minha resposta paraCentOS 8 como roteador NAT com nft e firewalld - como fazer com que ele passe TFTP?ter um exemplo de conjunto de regras TFTP que possa ser copiado para substituir oExemplo de FTP no wiki nftables.

  • regras idênticas com apenas valores de porta diferentes podem ser fatoradas usandoconjuntos anônimos.nftáveis versão >= 1.0.2 ainda tem a -oopção (otimizar)para tentar fazer isso automaticamente.

informação relacionada