Configurar firewalld¶
Un servidor sin firewall expone todos los puertos que tenga abiertos — servicios que ni siquiera estás usando pueden convertirse en puntos de entrada. firewalld es el firewall por defecto en Fedora/RHEL y gestiona el tráfico mediante zonas: cada interfaz de red pertenece a una zona, y cada zona define qué servicios o puertos están permitidos.
Cómo funciona¶
firewalld funciona como una lista blanca basada en zonas:
- Zona por defecto:
public— solo permite SSH y dhcpv6-client. - Reglas permanentes vs temporales: los cambios con
--permanentpersisten entre reinicios; sin esa bandera son temporales (útil para probar). - Servicios integrados: define HTTP, HTTPS, SSH y otros servicios con nombre en vez de números de puerto.
Diferencia con UFW
En UFW, cada regla es permanente e inmediata. En firewalld, los cambios requieren --permanent + --reload para persistir. Sin --permanent, la regla desaparece al reiniciar. Sin --reload, la regla permanece en disco pero no se aplica.
Enfoque por niveles¶
Cada nivel abre lo necesario según el servicio. Puedes parar en el que quieras — los niveles 1 y 2 son obligatorios (sin ellos no entras ni trabajas).
| Nivel | Qué configura | ¿Aplicarlo? |
|---|---|---|
| 1 | Zona por defecto | Obligatorio |
| 2 | SSH | Obligatorio |
| 3 | HTTP/HTTPS | Según servidor web |
| 4 | Puertos extra y límites | Opcional |
Nivel 1 — Zona por defecto¶
Obligatorio. Confirma que el firewall está activo y que la zona por defecto aplica las políticas seguras.
-
Comprobar si firewalld está activo:
sudo firewall-cmd --state -
Si no está activo, habilitarlo e iniciar:
sudo systemctl enable --now firewalld -
Ver la zona por defecto y los servicios permitidos:
sudo firewall-cmd --get-default-zone sudo firewall-cmd --list-services
Nivel 2 — SSH¶
Obligatorio. Sin esta excepción explícita no tienes acceso remoto garantizado.
-
Abrir SSH (normalmente ya está abierto en la zona
public):sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reloadpublicya incluyesshydhcpv6-clientpor defecto. Ejecuta el comando igualmente — si algún día cambias de zona o de puerto, ya queda cubierto.
Nivel 3 — HTTP/HTTPS¶
Según el servidor web que tengas.
-
Abrir HTTP/HTTPS:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
Nivel 4 — Puertos extra y límites¶
Opcional, según los servicios que corran en el servidor (agentes de monitorización, paneles, APIs) y si quieres frenar la fuerza bruta sobre SSH.
-
Abrir el puerto de los servicios que lo necesiten — ejemplo del agente Beszel:
sudo firewall-cmd --permanent --add-port=45876/tcp sudo firewall-cmd --reload -
Rate limiting sobre SSH con una rich rule (máx. 5 conexiones por minuto; a partir de ahí se descarta):
sudo firewall-cmd --permanent \ --add-rich-rule='rule service name="ssh" limit value="5/m" accept' sudo firewall-cmd --reloadEs una capa adicional a Fail2ban a nivel de conexiones. Cuida que un script con muchas conexiones legítimas no se quede fuera.
-
Comprobar el estado final:
sudo firewall-cmd --list-all
Verificar¶
-
Confirmar que las reglas están aplicadas:
sudo firewall-cmd --list-allDebe salir
services: ... ssh http https(además dedhcpv6-client) y la rich rule de límite si la configuraste.
Para una prueba en vivo, intenta conectar desde fuera a un puerto no abierto (debe rechazarse) y a SSH (debe funcionar).
Y ahora qué
firewalld está activo con las reglas mínimas. El siguiente paso es Fail2ban para bloquear intentos de intrusión repetidos.