Un firewall con ufw y nftables
Módulo 5: Proteger la red · Tiempo de lectura: 12 minutos
Objetivo de aprendizaje: Después de esta lección, usted podrá configurar un firewall que solo permita lo necesario, para IPv4 e IPv6, sin quedarse fuera de su propio servidor, y sabrá contra qué no le protege un firewall en su servidor.
Conceptos clave: filtro de paquetes, netfilter, nftables, iptables-nft, ufw, política predeterminada, allow, deny, reject, limit, IPv6 en ufw, firewall del proveedor, firewalld, Docker y el firewall
Qué hace un firewall
Un firewall en su servidor es un filtro de paquetes: para cada paquete de red entrante consulta una lista de reglas y decide si puede pasar. En Linux, ese filtro está en el kernel y se llama netfilter. Se configura con un programa:
- nftables (comando
nft) es la herramienta actual. Debian la utiliza de forma predeterminada desde Debian 10. - iptables es la herramienta antigua. En los sistemas modernos,
iptablessuele ser una traducción a nftables (iptables-nft), para que los manuales antiguos sigan funcionando. - ufw (Uncomplicated Firewall) es una capa sencilla por encima, presente de forma predeterminada en Ubuntu y que se instala en Debian con un solo comando. Para un único servidor, ufw es la opción más fácil. Esta lección utiliza ufw y después muestra cómo se ven las mismas reglas en nftables.
Un firewall es su segunda capa de defensa. La primera es que los servicios solo escuchen en la dirección correcta (lección 5.1). Juntas evitan que un error en una de las capas se convierta directamente en una puerta abierta.
Primero: ¿cómo vuelve a entrar si algo sale mal?
El error clásico: activa el firewall, olvida permitir SSH y su conexión se corta. Entonces ya no puede acceder por SSH. Antes de empezar:
- Sepa cómo abrir la consola de su proveedor (lección 1.2). Funciona al margen de la red, así que también cuando el firewall lo bloquea todo. Allí inicia sesión y escribe
ufw disable. - Haga una instantánea (snapshot) si tiene dudas.
- Mantenga abierta su sesión SSH actual y pruebe con una segunda sesión.
ufw en cinco pasos
Paso 1: instalar y elegir la política predeterminada.
anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'La política predeterminada se aplica a todo lo que no tiene una regla. "Deny incoming" significa: todo lo que entra está prohibido, salvo lo que usted permita a continuación. Es la única base segura. El tráfico saliente (su servidor descargando actualizaciones) lo permite.
Paso 2: permitir SSH antes de activar el firewall.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH es un perfil de aplicación que ufw conoce (corresponde al puerto 22/tcp). Si SSH funciona en otro puerto, utilice el número: sudo ufw allow 2222/tcp. Fíjese en "Rules updated (v6)": ufw crea la regla también para IPv6. Lo hace porque en /etc/default/ufw figura la línea IPV6=yes, que es el valor predeterminado. Compruébelo; si está en no, su firewall solo se aplica a IPv4.
Paso 3: lo que necesite además.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # solo si usa HTTP/3Puede limitar una regla a una sola dirección de origen, por ejemplo un puerto de administración que solo debe ser accesible desde su oficina:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpPaso 4: activar.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupPaso 5: comprobar. Abra una segunda ventana e inicie sesión de nuevo. Si funciona, SSH está bien configurado. Después, revise las reglas:
anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)Para eliminar una regla se usan números: sudo ufw status numbered y luego sudo ufw delete 3.
deny, reject y limit
- deny descarta el paquete en silencio: desde fuera se ve "filtrado" (lección 5.1).
- reject devuelve un rechazo: desde fuera se ve "cerrado". Es más correcto para sus propios servicios, pero delata que hay un servidor.
- limit permite una conexión, pero bloquea una dirección que intenta conectarse seis veces o más en 30 segundos. Es útil para SSH:
sudo ufw limit OpenSSHen lugar deallow. Es una medida tosca (cuenta conexiones, no inicios de sesión fallidos); fail2ban (lección 5.3) es más preciso.
Las mismas reglas en nftables
Por debajo, ufw escribe reglas de netfilter. Si quiere trabajar sin ufw, escribe usted mismo un archivo de nftables. En Debian se encuentra en /etc/nftables.conf y se carga con el servicio nftables:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}Léalo así. La tabla se llama filter y pertenece a la familia inet: una sola tabla para IPv4 e IPv6 a la vez, de modo que no puede olvidarse de IPv6. En la cadena input, la política es drop. A continuación: las respuestas a conexiones ya existentes pueden volver (established,related), todo lo que va por loopback está permitido, ICMP está permitido (necesario, entre otras cosas, para IPv6 y para los mensajes de error sobre el tamaño de los paquetes) y los puertos 22, 80 y 443 están permitidos.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # comprobar sin cargar
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetUtilice o bien ufw o bien un archivo propio de nftables, no ambos: escriben en el mismo netfilter y sus reglas pueden interferir entre sí.
Contra qué no le protege su firewall
- Los servicios que usted mismo permite. El puerto 443 está abierto para su sitio web; una vulnerabilidad en su sitio web es, por tanto, perfectamente accesible. El firewall solo protege los puertos que están cerrados.
- Docker. Si publica un puerto con Docker (
-p 5432:5432), Docker establece sus propias reglas de netfilter, que redirigen el tráfico antes de que se apliquen las reglas de ufw. La documentación de Docker dice literalmente que Docker y ufw no se llevan bien. Por eso, un puerto de un contenedor puede estar abierto desde fuera aunqueufw statusno lo muestre. La solución (publicar en127.0.0.1) la aprenderá en la lección 9.3. - El tráfico saliente. Con "allow outgoing", un programa comprometido puede conectarse a cualquier sitio. Para la mayoría de los servidores pequeños es una opción aceptable; los entornos estrictos también limitan el tráfico saliente.
El firewall de su proveedor
Muchos proveedores también ofrecen un firewall en la red, delante de su servidor, que se configura en el panel de cliente (a veces llamado "cloud firewall" o "security group"). Es una capa adicional excelente y también funciona si usted comete un error en el propio servidor. Pero no sustituye al firewall del servidor: si traslada el servidor o cambia de proveedor, no le acompaña, y no todos los proveedores lo ofrecen. Por eso, mantenga siempre un firewall en el propio servidor.
En AlmaLinux y Rocky Linux
Allí firewalld está activo de forma predeterminada, con zonas. Los comandos más importantes:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadSin --permanent, un cambio solo se mantiene hasta el siguiente reinicio; con --permanent, solo se aplica después de --reload. SSH ya está abierto en la zona predeterminada.
En la práctica
Si a pesar de todo se queda fuera de un VPS de WebOké, abra la consola en la pantalla del VPS, inicie sesión y desactive el firewall (ufw disable) o deshaga la última regla. En otros proveedores, esa entrada de emergencia también se llama consola, VNC o rescue. Sepa dónde está ese botón antes de necesitarlo.
Resumen
- Un firewall es su segunda capa después de "escuchar solo donde sea necesario"; nftables es la herramienta del kernel y ufw una capa sencilla por encima.
- Empiece con
default deny incoming, permita SSH antes deufw enable, pruebe con una segunda sesión y conozca la consola de su proveedor. - Compruebe que ufw también cubre IPv6 (
IPV6=yes); en nftables, la familiainetlo hace de una vez. denyse ve desde fuera como "filtrado",rejectcomo "cerrado";limitfrena las conexiones repetidas.- Los puertos de Docker esquivan ufw (lección 9.3); el firewall de su proveedor es una capa adicional, no un sustituto.
Cuestionario
Ejercicio
Ejercicio O5.2: Configurar su firewall. Active un firewall en su servidor con ufw (o nftables, o firewalld en AlmaLinux/Rocky): por defecto todo cerrado para el tráfico entrante, SSH y lo que realmente necesite además. Pruebe con una segunda sesión, compruebe que IPv6 está cubierto y verifique desde fuera con nc que un puerto no permitido está cerrado o filtrado. Rellene la lista de comprobación y pegue su ufw status verbose (o nft list ruleset); indique para cada puerto abierto para qué sirve.
Ejercicio O5.2: Configurar su firewall
Este ejercicio lo hace usted mismo; nadie lo revisa. Marque lo que haya hecho y señale el ejercicio como realizado.
Para un servidor web, solo el 22 (o su puerto SSH), el 80 y el 443, para IPv4 e IPv6. Los puertos de administración, solo desde una dirección fija o mediante un túnel SSH. Desde la consola: ufw disable (o vaciar las reglas de nftables).
Sus marcas y notas se quedan solo en este navegador; no las enviamos a ningún sitio. Si ha iniciado sesión, en Mis cursos solo guardamos que ha realizado el ejercicio.
Para saber más
- Proteger su VPS: los primeros cinco minutos
- Sin acceso a su VPS: ¿qué hacer?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Documentación de Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Documentación de Docker, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
