Persistencia y migración de ufw a iptables-persistent

5 min

language: ja bn en es hi pt ru zh-cn zh-tw

Hola, soy un inútil.
Hasta ahora, había estado usando ufw para configurar fácilmente el firewall, pero quería gestionarlo a nivel de configuración para facilitar la migración, como con pf.conf, así que instalé iptables-persistent.
Parece que también hay un parche de kernel para poder usar pf, pero forzar su uso hasta ese punto no es lo correcto, y también sería huir de iptables, así que lo implementé.

Instalación

Como iptables ya debería estar instalado en la mayoría de los casos, solo instalaré iptables-persistent.
Por cierto, ufw se eliminará automáticamente debido a conflictos, así que asegúrese de verificar las reglas existentes de antemano.

sudo apt install iptables-persistent

Uso mínimo de netfilter-persistent

Para guardar las reglas actuales en /etc/iptables/

sudo netfilter-persistent save

Para recargar usando la configuración actual de /etc/iptables/

sudo netfilter-persistent reload

Por cierto, tenga cuidado, si save sin haber hecho reload, se guardarán las reglas actuales y la configuración que haya escrito se perderá.

Configuración

La configuración quedó así.
Es bastante duro que iptables borre todos los comentarios y saltos de línea con save...

# cat rules.v4
# Generated by iptables-save v1.8.9 (nf_tables) on Sat Oct 11 16:27:52 2025
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [18:1900]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i 127.0.0.1/32 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -j ACCEPT
-A INPUT -i wg0 -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT
# Completed on Sat Oct 11 16:27:52 2025

En cuanto a las reglas de permiso, básicamente se permite por cada interfaz local y de WireGuard.
Básicamente, lo copié de la Arch Wiki.
Firewall con estado simple - ArchWiki

Esto se debe a que,
si no se añade -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT, por ejemplo, la respuesta de un curl no podría regresar, por lo que parece necesario asignar explícitamente las conexiones establecidas a una regla separada. Me di cuenta de nuevo de que la potencia de pf radica en que también gestiona este tipo de estados de forma inteligente, y fue un día en el que quise volver a 'acariciar' a pf.
Hasta la próxima.

Por cierto, sin IPv6.

# cat rules.v6
# Generated by ip6tables-save v1.8.9 (nf_tables) on Sat Oct 11 17:37:50 2025
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Sat Oct 11 17:37:50 2025

Saludos.

Related Posts