firewalld es el gestor de cortafuegos por defecto de AlmaLinux 9 y Rocky Linux 9. En su VPS Linux Infrawire permite abrir solo los servicios necesarios, limitar SSH a su propia IP y redirigir puertos, sin tocar reglas nftables en bruto.
El riesgo principal es cortar su propia sesión SSH. Esta guía gira en torno a ello: cada cambio arriesgado se prueba primero en la configuración runtime y después se hace permanente.
📋 Requisitos previos
- Un VPS con AlmaLinux 9 o Rocky Linux 9
- Acceso SSH como root (la IP y la contraseña root están en su área de cliente)
- Una segunda sesión SSH abierta mientras edita las reglas
1. Instalar e iniciar firewalld
Bashdnf install -y firewalld systemctl enable --now firewalld firewall-cmd --state
El último comando debe mostrar running. La zona por defecto es public, que ya permite SSH, Cockpit y el cliente DHCPv6, y descarta el resto de conexiones entrantes.
2. Entender zonas, servicios y puertos
Una zona es un conjunto de reglas aplicado a una interfaz. Un servicio es un grupo de puertos con nombre (ssh es 22/tcp, http es 80/tcp, https es 443/tcp).
Bashfirewall-cmd --get-default-zone firewall-cmd --get-active-zones firewall-cmd --list-all firewall-cmd --get-services | tr ' ' '\n' | head -20
Hay dos configuraciones. La runtime se aplica de inmediato y desaparece al recargar o reiniciar. La permanente (--permanent) se guarda en disco pero solo se activa tras firewall-cmd --reload.
3. Abrir servicios y puertos
Bash# Servicios firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https # Un puerto personalizado firewall-cmd --permanent --add-port=8080/tcp # Un rango de puertos firewall-cmd --permanent --add-port=30000-30100/udp # Aplicar la configuración permanente firewall-cmd --reload
Para cerrar algo, use la opción --remove-service o --remove-port correspondiente. Elimine el servicio cockpit si no usa la consola web: firewall-cmd --permanent --remove-service=cockpit.
4. Permitir SSH solo desde su IP con una rich rule
Las rich rules expresan condiciones como la dirección de origen. No elimine nunca la regla SSH genérica antes de comprobar que la restringida funciona.
Bash# 1. Añadir la regla solo en runtime (sustituya por SU IP pública) firewall-cmd --add-rich-rule='rule family="ipv4" source address="YOUR_IP/32" service name="ssh" accept' # 2. Abra un terminal NUEVO y confirme que SSH sigue funcionando desde YOUR_IP # 3. Hacerla permanente y luego quitar el servicio SSH abierto a todos firewall-cmd --runtime-to-permanent firewall-cmd --permanent --remove-service=ssh firewall-cmd --reload
Si su IP cambia, perderá el acceso: mantenga disponible la consola del VPS desde su área de cliente como vía de recuperación. Para una dirección IPv6, escriba family="ipv6" y la dirección IPv6.
5. Redirigir un puerto
Para enviar el tráfico entrante del puerto 80 a una aplicación que escucha en el 8080 del mismo servidor:
Bashfirewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080 firewall-cmd --reload
Para reenviar a otra máquina, añada toaddr=TARGET_IP a la opción forward-port y active el enmascaramiento con firewall-cmd --permanent --add-masquerade. El kernel también debe permitir el reenvío, algo que firewalld gestiona para el enmascaramiento.
6. Verificar la configuración
Bashfirewall-cmd --list-all firewall-cmd --list-rich-rules firewall-cmd --permanent --list-all ss -tlnp
Compare las listas runtime y permanente: deben coincidir tras una recarga. Desde otra máquina, pruebe un puerto con nc -zv VPS_IP 80. Un servicio en escucha (ss -tlnp) solo es accesible si el cortafuegos permite su puerto.
🛠️ Solución de problemas
FirewallD is not running: inícielo con systemctl enable --now firewalld y revise journalctl -u firewalld en busca de errores.
Una regla nueva no tiene efecto: usó --permanent sin recargar. Ejecute firewall-cmd --reload.
INVALID_SERVICE o INVALID_ZONE: error tipográfico en el nombre. Liste los nombres válidos con firewall-cmd --get-services y --get-zones.
SSH en un puerto personalizado es rechazado aunque el puerto esté abierto: SELinux debe conocer el puerto. Ejecute semanage port -a -t ssh_port_t -p tcp 2222 (instale antes policycoreutils-python-utils), abra el puerto en firewalld y reinicie sshd.
Acceso perdido: use la consola del VPS desde su área de cliente y ejecute firewall-cmd --permanent --add-service=ssh y firewall-cmd --reload. Evite firewall-cmd --panic-on, que bloquea todo el tráfico, incluida su sesión.
🔒 Su VPS expone ahora solo lo que usted elige, y SSH sigue a su alcance.