error de configuración después de actualizar nftables

error de configuración después de actualizar nftables

He estado usando nftables durante los últimos 2 años con la misma configuración, actualicé el programa el otro día y ahora se queja de que mi configuración no es válida a pesar de que toda la documentación todavía dice que es correcta. ¿Quizás alguien pueda detectar un símbolo rebelde o algo así?

aquí está mi configuración:


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;
    }
}

y el error al 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.

Respuesta1

Esto está dentro de unnftables guioncargado con el comando nft -f. La nftpalabra no tiene significado interior y no debería aparecer. Pero hay otros 1 1/2 problemas en el mismo lugar. Así que veamos:

Alrededor de la línea del nftcomando se queja hay:

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

  • ya dentro de un inet filter forwardbloque (cadena)

    Por eso add rule inet filter forwardtambién hay que eliminarlo. En realidad, ;es superfluo porque hay una nueva línea después.

           ct status dnat accept
    
  • policy drop;debe ponerse con la definición de la cadena base

    Esta vez con su ;parte obligatoria de la sintaxis. la policypalabra clave es parte de lacadenadefinición, no parte de unregladefinición. Si bien esto parece aceptarse actualmente separado de su definición de cadena base por reglas intermedias, no es algo en lo que confiar: esto podría cambiar en una versión posterior.

    La misma observación se aplica a la outputcadena: no la separe policy accept;de su definición de cadena base para no insertar reglas entre ellas por error más adelante.

forwardAl final la cadena debería ser reemplazada por:

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

Lo que sería una sintaxis correcta, pero no realmente interesante, es definir la regla no dentro de los bloques, sino completamente fuera de las estructuras, al final del script de esta manera:

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

De todos modos, nft list rulesetse mostrará nuevamente como antes dentro del inet filter forwardbloque de cadena.


Notas:

  • Si bien está bien usarlo ip protocol icmp, no está bien usarlo.ip6 nexthdr ipv6-icmp

    la razón es que, a diferencia de IPv4, donde el protocolo en el encabezado IPv4 es siempre el protocolo de capa 4, IPv6siguiente encabezadono siempre es el encabezado de la capa 4 (icmp, udp, tcp...): podría ser en cambio unEncabezado de extensiónque aparece entre el encabezado IPv6 y el encabezado de la capa 4 (final). En este caso la regla no coincidirá.

    El sistema operativo ya determinó a qué protocolo de capa 4 pertenece este paquete, por lo que la información está disponible como metainformación en lugar de información del contenido del paquete: meta l4proto ipv6-icmp.

    Esto es tambiéndocumentado en la página de manual:

    Esta expresión se refiere a los campos del encabezado ipv6. Precaución al usar ip6 nexthdr, el valor solo se refiere al siguiente encabezado, es decir, ip6 nexthdr tcpsolo coincidirá si el paquete ipv6 no contiene ningún encabezado de extensión. Los paquetes que estén fragmentados o que, por ejemplo, contengan encabezados de extensión de enrutamiento, no coincidirán. Úselo meta l4proto si desea hacer coincidir el encabezado de transporte real e ignore cualquier encabezado de extensión adicional.

    Pero en realidad, como la misma línea incluye una icmpv6 type ...línea, esto ya filtra el protocolo de capa 4 para que coincida con ICMPv6 y, al mismo tiempo,el uso de ICMPv6 establece implícitamente el protocolo de capa 3 para que coincida con IPv6: no se necesita nada en absoluto para corregirlo.

    Del mismo modo, la línea anterior puede prescindir ip protocol icmppor las mismas razones (pero su comportamiento actual sigue siendo bueno).

    La línea:

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

    debe reemplazarse simplemente con:

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

    (sin necesidad de anteponer meta nfproto ipv6 meta l4proto icmpv6)

  • TFTP

    • TFTP usa solo UDP

      El puerto TCP 69 nunca se utiliza, por lo que no requiere una regla para permitirlo.

    • TFTP y firewall con estado

      TFTPEs un protocolo tan difícil como FTP para firewalls. Después de la consulta inicial, la transferencia de datos en sí ya no utiliza el puerto UDP 69 en ninguna parte. Uso adecuado de laAyudante de conexión TFTPcon reglas adicionales (que deberían cargar automáticamente el nf_conntrack_tftpmódulo del kernel) probablemente debería ser necesario, a menos que la configuración obsoleta sysctl net.netfilter.nf_conntrack_helperse haya vuelto a habilitar.

      Realmente estaría fuera de tema abordarlo aquí. Vea el comienzo (únicamente) de mi respuesta aCentOS 8 como enrutador NAT con nft y firewalld: ¿cómo lograr que pase TFTP?tener un conjunto de reglas TFTP de ejemplo que se pueda copiar para reemplazar elEjemplo de FTP en la wiki de nftables.

  • reglas idénticas con valores de puerto diferentes se pueden factorizar usandoconjuntos anónimos.nftables La versión >= 1.0.2 incluso tiene la -oopción (optimizar)para intentar hacer esto automáticamente.

información relacionada