Welcome nftables!

Este mes de Mayo el proyecto Debian anuncio, que incluirá oficialmente el framework nftables en su próxima versión estable (Debian Strech), por lo que si todavía no has empezado a familiarizarte con nftables deberías ir haciéndolo ya.

Diferencias entre IPtables y nftables.

  • La sintaxis elimina la utilización de guiones, y es mucho mejor que en IPtables.
  • En nftables las tablas y cadenas son totalmente configurables.
  • Ya no hay distinción entre “targets” y “matchs”, en nftables son sustituidos por expresiones.
  • Con nftables a diferencia de iptables, podemos definir varias acciones para una sola regla.
  • Los contadores son opcionales y se pueden activar si lo creemos necesario.
  • Nftables tiene un mejor soporte para hacer actualizaciones dinámicas de un conjunto de reglas.
  • La administración de conjuntos de reglas en IPv4/IPv6 se ha simplificado a través de la familia inet.
  • Clasificación más rápida de paquetes a través de una infraestructura mejorada de mapas y conjuntos genéricos.

Estas serian algunas de la mejoras/diferencias básicas que incluye nftables, además según nuestras necesidades, y según a que niveles, nftables es una herramienta mucho más útil que nuestro viejo conocido iptables, y esto es debido a que el nuevo código evita la duplicación de código existente en iptables y sus extensiones, que generalmente eran especificas para un protocolo, esto hinchaba la base de código con un código muy similar para realizar una tarea similar, coincidencia de carga.

Como podemos ver las mejoras internas son sustanciosas y extensas, y ahora nos toca a nosotros adaptarnos a estos cambios y sacarle todo el provecho que podamos a nftables, al igual que hacíamos con iptables.
Al final de este post dejare unos cuantos enlaces de interés, en el que se amplían todas estas diferencias y mejoras, mientras tanto nosotros veremos unas cuantas operaciones básicas con nftables, y en el siguiente post haremos una migración de iptables a nftables.

Operaciones básicas.
Tablas.

Tenemos que ver las tablas como meros contenedores para las cadenas. En nftables no hay tablas predefinidas  (filter, raw, mangle…) y aunque podemos seguir recreando el estilo de iptables, somos libres de crearlas como queramos.
Otro punto a tener en cuenta son las familias de tablas:

  • ip: Usado para cadenas IPv4.
  • ip6: Usado para cadenas Ipv6.
  • arp: Usado para cadenas ARP.
  • bridge: Usado pra cadenas Bridge.
  • inet: Para cadenas mixtas con ipv4/ipv6 (Con kernel 3.14 y superio).

Agregar Tablas.

# nft add table ip filter

Eliminar tablas.

% nft delete table ip filter

Cadenas

Las cadenas se utilizan para agrupar reglas, y al igual que las tablas no hay ninguna predefinida y se diferencian entre Cadenas Base y Cadenas Non-Base, la diferencia entre ambas es la siguiente:

  • Cadenas Base tienen  un “gancho” un tipo y una prioridad además de estar registrada a uno delos hooks de netfilter.
  • Cadenas Non-Base no están conectadas a un hook, y no ven el trafico por defecto.

Disponemos de 3 tipos de cadenas filter, route y NAT, y 5 tipos de hooks, si conoces iptables ya los conocerás: prerouting, input:, forward, output, postrouting.

Esta seria la sintaxis habitual:

% nft add chain [<family>] <table-name> <chain-name> { type <type> hook <hook> priority <value> \; }

Agregar cadenas.

% nft add chain ip filter input { type filter hook input priority 0 \; }

Eliminar cadenas.

# nft delete chain ip filter input

Reglas

Las reglas especifican qué acción se debe tomar para los paquetes, y dichas reglas pueden tener una expresión para hacer coincidir paquetes y una o más acciones a realizar cuando se emparejan. Esta es una de las diferencias principales respecto a iptables,  es posible especificar varias acciones y por defecto los contadores están desactivados, además se debe especificar explícitamente en las reglas, si desea habilitar los contadores de paquetes y bytes para una regla. Cada regla tiene un número de identificador diferente y único para poder diferenciarlas.
Los siguientes partidos están disponibles:

  • ip: Protocolo IP
  • ip6: Protocolo IPv6
  • tcp: Protocolo TCP
  • udp: Protocolo UDP
  • udplite: Protocolo UDP-lite
  • sctp: Protocolo SCTP
  • dccp: Protocolo DCCP
  • ah: Authentication headers
  • esp: Encrypted security payload headers
  • ipcomp: IPcomp headers
  • icmp: Protocolo icmp
  • icmpv6: Protocolo icmpv6
  • ct: Connection tracking
  • meta: meta properties such as interfaces

Agregar regla.

# nft add rule ip filter input tcp dport 80 drop

Eliminar regla, es necesario obtener el “handle” de la regla.

# nft rule ip filter input tcp dport 80 drop
table ip filter {
        chain input {
                 type filter hook input priority 0;
                 tcp dport http drop # handle 2
        }
}

En nuestro caso sería el número 2.

nft delete rule ip filter input handle 2

Como se puede ver, con un conocimiento previo de iptables y un mínimo de ingles, la creación de tablas, cadenas y reglas es un tarea sencilla, y en nuestro primer acercamiento no queremos “liaros” mas de lo necesario.
En el siguiente post haremos una migración de iptables a nftables, y seguramente, y viendo las posibilidades que ofrece nftables, continuaremos avanzando en su uso y posibilidades.

Fuentes y enlaces de interés.
Wiki nftables
RedHat developers “What comes after ‘iptables’? Its successor, of course: nftables”

Arturo Borreo “New in Debian stable Stretch: nftables”

 

Deja un comentario