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 nft
palabra 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 nft
comando se queja hay:
chain forward { type filter hook forward priority 0; nft add rule inet filter forward ct status dnat accept; policy drop; }
nft
ser eliminado,ya dentro de un
inet filter forward
bloque (cadena)Por eso
add rule inet filter forward
tambié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 baseEsta vez con su
;
parte obligatoria de la sintaxis. lapolicy
palabra 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
output
cadena: no la separepolicy accept;
de su definición de cadena base para no insertar reglas entre ellas por error más adelante.
forward
Al 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 ruleset
se mostrará nuevamente como antes dentro del inet filter forward
bloque 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 tcp
solo 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. Úselometa 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 icmp
por 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
-
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_tftp
módulo del kernel) probablemente debería ser necesario, a menos que la configuración obsoleta sysctlnet.netfilter.nf_conntrack_helper
se 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
-o
opción (optimizar)para intentar hacer esto automáticamente.