Se ha publicado la versión 1.0.7 del filtro de paquetes nftables, que unifica las interfaces de filtrado de paquetes para IPv4, IPv6, ARP y puentes de red (destinado a reemplazar iptables, ip6tables, arptables y ebtables). El paquete nftables incluye componentes del filtrado de paquetes que funcionan en espacio de usuario, mientras que a nivel de núcleo la funcionalidad es proporcionada por el subsistema nf_tables, que forma parte del núcleo de Linux desde la versión 3.13. A nivel de núcleo, se proporciona solo una interfaz general, independiente del protocolo específico y que proporciona funciones básicas para la extracción de datos de paquetes, la realización de operaciones con esos datos y el control del flujo.
Las reglas de filtrado y los controladores específicos del protocolo se compilan en bytecode en el espacio de usuario, que luego se carga en el núcleo a través de la interfaz Netlink y se ejecuta en el núcleo en un espacio especial una máquina virtual, similar a BPF (Berkeley Packet Filters). Este enfoque permite reducir significativamente el tamaño del código de filtrado que opera a nivel de núcleo y trasladar todas las funciones de análisis de reglas y la lógica de trabajo con protocolos al espacio de usuario.
Principales cambios:
- Para sistemas con núcleo Linux 6.2+, se ha añadido soporte para la coincidencia de protocolos vxlan, geneve, gre y gretap, lo que permite usar expresiones simples para comprobar los encabezados en paquetes encapsulados. Por ejemplo, para comprobar IP en el encabezado de un paquete encapsulado de VxLAN, ahora se pueden usar reglas (sin necesidad de una deencapsulación previa del encabezado de VxLAN y de vincular el filtro a la interfaz vxlan0): … udp dport 4789 vxlan ip protocol udp … udp dport 4789 vxlan ip saddr 1.2.3.0/24 … udp dport 4789 vxlan ip saddr . vxlan ip daddr { 1.2.3.4 . 4.3.2.1 }
- Se ha implementado soporte para la fusión automática de restos después de la eliminación parcial de un elemento de la lista set, lo que permite eliminar un elemento o parte de un rango de un rango existente (anteriormente, solo se podía eliminar el rango completo). Por ejemplo, después de eliminar el elemento 25 de la lista set con rangos de 24-30 y 40-50, quedarán en la lista 24, 26-30 y 40-50. Las correcciones necesarias para el funcionamiento de la fusión automática serán propuestas en lanzamientos correctivos de ramas estables del núcleo 5.10+. # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24-30, 40-50 } } } # nft delete element ip x y { 25 } # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24, 26-30, 40-50 } } }
- Se permite el uso de contactos y rangos al mapear la traducción de direcciones (NAT). table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; dnat to ip daddr . tcp dport map { 10.1.1.136 . 80 : 1.1.2.69 . 1024, 10.1.1.10-10.1.1.20 . 8888-8889 : 1.1.2.69 . 2048-2049 } persistent } }
- Se ha agregado soporte para la expresión «last», que permite conocer el momento del último uso de un elemento de una regla o un conjunto de listas. Esta función es compatible a partir del núcleo de Linux 5.14. table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h } chain z { type filter hook output priority filter; policy accept; update @y { ip daddr . tcp dport } } } # nft list set ip x y table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h elements = { 172.217.17.14 . 443 last used 1s591ms timeout 1h expires 59m58s409ms, 172.67.69.19 . 443 last used 4s636ms timeout 1h expires 59m55s364ms, 142.250.201.72 . 443 last used 4s748ms timeout 1h expires 59m55s252ms, 172.67.70.134 . 443 last used 4s688ms timeout 1h expires 59m55s312ms, 35.241.9.150 . 443 last used 5s204ms timeout 1h expires 59m54s796ms, 138.201.122.174 . 443 last used 4s537ms timeout 1h expires 59m55s463ms, 34.160.144.191 . 443 last used 5s205ms timeout 1h expires 59m54s795ms, 130.211.23.194 . 443 last used 4s436ms timeout 1h expires 59m55s564ms } } }
- Se ha añadido la posibilidad de definir cuotas en conjuntos de listas. Por ejemplo, para definir una cuota de tráfico para cada dirección IP de destino, se puede especificar: table netdev x { set y { typeof ip daddr size 65535 quota over 10000 mbytes } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } } # nft add element inet x y { 8.8.8.8 } # ping -c 2 8.8.8.8 # nft list ruleset table netdev x { set y { type ipv4_addr size 65535 quota over 10000 mbytes elements = { 8.8.8.8 quota over 10000 mbytes used 196 bytes } } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } }
- Se permite el uso de constantes en conjuntos de listas. Por ejemplo, al usar como clave de la lista la dirección de destino y el identificador VLAN, se puede especificar directamente el número VLAN (daddr . 123): table netdev t { set s { typeof ether saddr . vlan id size 2048 flags dynamic,timeout timeout 1m } chain c { type filter hook ingress device eth0 priority 0; policy accept; ether type != 8021q update @s { ether daddr . 123 } counter } }
- Se ha añadido un nuevo comando «destroy» para eliminar objetos de manera irrevocable (a diferencia del comando delete que no genera ENOENT al intentar eliminar un objeto que no existe). Se requiere al menos el núcleo de Linux 6.3-rc. destroy table ip filter
Fuente: opennet.ru
