Configurar el firewall en Linux: UFW y firewalld en un VPS (IPv4 e IPv6)
Un servidor Linux recién instalado responde en cualquier puerto que abra un servicio, por eso el firewall del sistema es una de las primeras cosas que hay que configurar. Esta guía explica cómo configurar el firewall de Linux con UFW en Debian y Ubuntu y con firewalld en CentOS, Rocky Linux y AlmaLinux: permitir SSH antes que nada, abrir los puertos web, limitar los servicios sensibles por IP de origen, cubrir IPv6 y recuperar el acceso si te bloqueas. Todos los servidores cloud de JUSTG en Johannesburgo, Moscú, Tokio y Seúl incluyen IPv6 gratis, así que las reglas IPv6 importan tanto como las de IPv4.
Paso 1: Revisa los puertos abiertos y tu puerto SSH
Antes de escribir reglas, comprueba qué servicios escuchan realmente y en qué puerto está SSH. Si moviste SSH a un puerto personalizado, usa ese puerto en lugar del 22 en todas las reglas siguientes.
# Which ports are services actually listening on?
ss -tulpn
# Which port does SSH use?
sshd -T | grep -i '^port'
Paso 2: Prepara una red de seguridad antes de activar el firewall
Una sola regla equivocada puede cortar tu sesión SSH. Un temporizador en segundo plano que vuelva a desactivar el firewall pasados unos minutos te devuelve el acceso automáticamente. Cancélalo cuando confirmes que puedes entrar desde una terminal nueva.
# Safety net: turn the firewall off again in 10 minutes unless you cancel it
nohup sh -c 'sleep 600; ufw disable' >/dev/null 2>&1 & # UFW
nohup sh -c 'sleep 600; systemctl stop firewalld' >/dev/null 2>&1 & # firewalld
# Everything works? Cancel the timer:
pkill -f 'sleep 600'
Paso 3: Configura UFW en Debian y Ubuntu
UFW (Uncomplicated Firewall) es una interfaz sencilla para el firewall del kernel. Deniega por defecto el tráfico entrante, permite SSH primero y solo después activa el firewall. ufw limit permite SSH pero bloquea temporalmente una dirección que abre demasiadas conexiones en poco tiempo.
apt update && apt install -y ufw
# Make sure IPv6 rules are managed too
grep '^IPV6' /etc/default/ufw # should print IPV6=yes
ufw default deny incoming
ufw default allow outgoing
# SSH FIRST (use your real SSH port if you changed it)
ufw limit 22/tcp # allow + basic brute-force rate limit
# Web server
ufw allow 80,443/tcp
ufw enable # answer "y"
ufw status verbose
Paso 4: Limita las reglas de UFW por IP de origen (IPv4 e IPv6)
Bases de datos, paneles de administración y agentes de monitorización nunca deberían estar abiertos a todo Internet: permítelos solo desde direcciones conocidas. UFW evalúa las reglas en orden, así que una regla de bloqueo debe insertarse por encima de una de permiso más amplia.
# Allow MySQL only from one office IPv4 and one IPv6 network
ufw allow from 198.51.100.25 to any port 3306 proto tcp
ufw allow from 2001:db8:10::/64 to any port 3306 proto tcp
# Block an abusive network (insert at the top so it is matched first)
ufw insert 1 deny from 203.0.113.0/24
# List rules with numbers and delete one
ufw status numbered
ufw delete 4
Paso 5: Configura firewalld en CentOS, Rocky Linux y AlmaLinux
firewalld trabaja con zonas; la interfaz de red suele estar en la zona public, que ya permite SSH. Las reglas con --permanent sobreviven al reinicio, pero solo se aplican tras --reload.
dnf install -y firewalld # CentOS 7: yum install -y firewalld
systemctl enable --now firewalld
firewall-cmd --get-default-zone # usually "public"
# SSH FIRST (or: --add-port=2222/tcp for a custom port)
firewall-cmd --permanent --add-service=ssh
# Web server
firewall-cmd --permanent --add-service=http --add-service=https
# Close what you do not use
firewall-cmd --permanent --remove-service=cockpit
firewall-cmd --reload
firewall-cmd --list-all
--add-port antes de quitar el servicio ssh. En Rocky y AlmaLinux el puerto también debe permitirse en SELinux.Paso 6: Restringe el acceso por IP con rich rules de firewalld
Una rich rule combina dirección de origen, puerto y acción en una sola línea. Cada regla se aplica a una única familia de direcciones, así que escribe una para IPv4 y otra para IPv6.
# Allow MySQL from one IPv4 address and one IPv6 network only
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.25" port port="3306" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="2001:db8:10::/64" port port="3306" protocol="tcp" accept'
# Drop all traffic from an abusive network
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" drop'
firewall-cmd --reload
firewall-cmd --list-rich-rules
Paso 7: Asegúrate de que IPv6 también se filtra
Un error habitual es tener reglas IPv4 perfectas mientras los mismos servicios están totalmente abiertos por IPv6. UFW solo gestiona IPv6 con IPV6=yes (busca las líneas «(v6)» en ufw status); las zonas y servicios de firewalld cubren ambas familias automáticamente. Prueba desde otra máquina:
# Your server's IPv6 address
ip -6 addr show scope global
# From ANOTHER machine: test a port over IPv4 and IPv6
nc -vz 203.0.113.50 443
nc -vz 2001:db8:50::10 443
nc -vz 2001:db8:50::10 3306 # should fail from a non-allowed address
Paso 8: Cuidado con los puertos publicados por Docker
Docker escribe sus propias reglas de iptables, por lo que un puerto publicado con -p 8080:80 puede ser accesible aunque UFW o firewalld deberían bloquearlo. Publica los contenedores en 127.0.0.1 detrás de un proxy inverso o gestiona la cadena DOCKER-USER.
# Publish a container port on localhost only, then proxy it with Nginx
docker run -d -p 127.0.0.1:8080:80 nginx
Paso 9: Recupera el acceso tras un bloqueo del firewall
Si SSH deja de responder tras un cambio, espera al temporizador del paso 2. Si no, abre la consola VNC: entra en el área de clientes de JUSTG → Mis productos y servicios → selecciona el servidor → panel de gestión (abre un ticket si no encuentras la consola). Inicia sesión como root y vuelve a permitir SSH:
# Debian / Ubuntu (UFW)
ufw allow 22/tcp # or: ufw disable
# CentOS / Rocky / AlmaLinux (firewalld)
firewall-cmd --panic-off 2>/dev/null
firewall-cmd --add-service=ssh # runtime only; add --permanent once fixed
# last resort
systemctl stop firewalld
Preguntas frecuentes
¿Puedo usar UFW y firewalld a la vez?
No. Ambos gestionan las mismas tablas del kernel y entran en conflicto. Usa UFW en Debian/Ubuntu y firewalld en CentOS/Rocky/AlmaLinux, y desactiva el otro si está instalado.
Mis reglas de firewalld desaparecieron tras reiniciar. ¿Por qué?
Se añadieron sin --permanent y solo cambiaron la configuración en ejecución. Guarda las reglas actuales con firewall-cmd --runtime-to-permanent.
¿Puedo bloquear una IP que ataca mi servidor?
Sí: ufw insert 1 deny from 203.0.113.66 con UFW, o una rich rule con drop en firewalld. Ante ataques volumétricos grandes un firewall local no basta; contacta con soporte.
Si sigues teniendo problemas al configurar el firewall de Linux, abre un ticket en https://www.justg.com/submitticket.php y el soporte técnico de JUSTG te ayudará.