¿Por qué y cómo pasar de iptables a nftables?

[h]¿Por qué y cómo pasar de iptables a nftables?[/h]
https://media.giphy.com/media/qKgwRH8hyp6py/giphy.gif
Tod@s hemos oído hablar de las** iptables** ya que “son el firewall” de Linux desde el kernel 2.4 (desde 2001).
Pongo la expresión entre comillas porque se suele hablar de iptables cuando deberíamos hablar de netfilter,
Iptable es un elemento de netfilter: Es la utilidad que permite redactar reglas.
Como es a esta utilidad a la cuál el se enfrenta el usuario final, (el temido ejercicio, redactar las reglas iptables) su nombre ha acabado asimilándose al conjunto.

Después muchos años de leales servicios, netfilter y iptables empiezan a hacerse mayorcitos…
¡El nivel de complejidad de las redes y el trafico de datos no tienen nada que ver hoy en día con los años 2000!
Ver: Iptable se jubila y llega bpfilter
Bpfilter ha integrado el kernel 4.18 y está llamado a tomar el relevo de netfilter
ntfstable de su lado ya está presente desde el kernel 3.13 de 2014 y está aquí para reemplazar a las iptables.

No se trata de un cambio “violento”, bpfilter sabe trabajar con reglas iptables.
Pero será siempre bien visto pensar en actualizarse y abrazar el cambio ya que viene con ventajas. :wink:
[h]Ventajas[/h]
Sin entrar en detalles:
[list=*]
]Sintaxis más humana/]
]Reglas combinadas (ahorramos lineas)/]
]Posibilidad de multiplicar las acciones adentro de una misma regla/]
]Podemos establecer Reglas compatibles con todos los protocolos (todo en una regla en lugar de una para cada protocolo)/]
]Es más rápido/]
]etc…/]
[/list]
Además se puede exportar sencillamente un conjunto de reglas en formato JSON para usarlo después… y muchas otras novedades.
Más información en:
[list=
]
]Differences between iptables and nftables explained by Michael Boelen @ Linux Audit/]
[/list]

[h]iptables-translate[/h]
Personalmente no hablo iptables así que para mi es igual de confuso si es iptables o nftables
La sintaxis puede ser más entendible: Sigo sin enterrarme mucho y necesito mirar la ayuda para entender a que sirve una regla.
Afortunadamente tenemos a iptables-translate para convertir una regla iptables en una regla nftsable sin tener idea de uno u otro :smiley:
En sistemas debian y derivados lo instalaremos con:

sudo apt install iptables-nftables-compat

Tomemos en ejemplo unas reglas de airgeddon.sh del amigo v1sitor:

if "${et_mode}" = "et_captive_portal" ]; then "${iptables_cmd}" -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination ${et_ip_router}:80 "${iptables_cmd}" -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination ${et_ip_router}:80 "${iptables_cmd}" -A INPUT -p tcp --destination-port 80 -j ACCEPT "${iptables_cmd}" -A INPUT -p tcp --destination-port 443 -j ACCEPT if ${captive_portal_mode} = "dnsblackhole" ]; then "${iptables_cmd}" -A INPUT -p udp --destination-port 53 -j ACCEPT
si queremos convertir la primera regla hacemos

 iptables-translate  -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80

O sea: Cambiamos** iptables** por iptables translate y tendremos a la conversión en nftable
En este caso he cambiado la variable “ip_router” por una ip real para no tener problemas
Y me sale en consola el resultado:

nft add rule ip nat PREROUTING tcp dport 80 counter dnat to 192.168.1.1:80

Pondríamos nuestra variable en lugar de la dirección ip y la regla estaría adaptada

¿Os acordéis que nftables permite redactar reglas para varios puertos, IP, protocolos…?
Tomemos estas dos lineas:

"${iptables_cmd}" -A INPUT -p tcp --destination-port 80 -j ACCEPT "${iptables_cmd}" -A INPUT -p tcp --destination-port 443 -j ACCEPT
Son la misma cosa solo que la primera linea es para el puerto http y la segundo para el https.
Aquí podemos hacer una sola linea con** nftables** gracias al uso de los arrays: ** { }**.
Traduzco la primera linea

iptables-translate -A INPUT -p tcp --destination-port 80 -j ACCEPT nft add rule ip filter INPUT tcp dport 80 counter accept
Añadimos el puerto 443 así:

nft add rule ip filter INPUT tcp dport { 80, 443 } counter accept

Hemos combinado así dos reglas iptables en una sola regla nftables sin muchas complicaciones gracias a iptables-translate :cool:

Podríamos hacer lo mismo con las dos primeras reglas

"${iptables_cmd}" -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination ${et_ip_router}:80 "${iptables_cmd}" -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination ${et_ip_router}:80
Nos daría

nft add rule ip nat PREROUTING tcp dport { 80, 443 } counter dnat to ${et_ip_router}:80

Fuentes y links de interes
[list=*]
]IPtables vs. nftables @ ungleich/]
]Moving from iptables to nftables @ wiki nftables/]
]iptables-translate (II) by **Shivani Bhardwaj ** @ Imbibe Linux/]
]web official netfilter/]
[/list]

Gracias por este post muy completo, como siempre :cool:

Voy a tener que hacer la modificacion un dia o otro en el hostbaseLa verdad es que no me da gana de poner me otra vez con las reglas iptables perdon, nftables :smiley:

Lo bueno es que parece facil a cambiar pero es que tengo un monton de lineas con iptables a cambiar

He buscado una opción para convertir una lista de reglas de golpe pero no he encontrado
Lo que se puede hacer es traducir las reglas iptables en uso al momento con

iptables-save > save.txt
iptables-restore-translate -f save.txt

Pero mo es muy útil en tu caso ya que tienes a varias configuraciones en tu script.