Saltar a contenido

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 --permanent persisten 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.

  1. Comprobar si firewalld está activo:

    sudo firewall-cmd --state
    
  2. Si no está activo, habilitarlo e iniciar:

    sudo systemctl enable --now firewalld
    
  3. 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.

  1. Abrir SSH (normalmente ya está abierto en la zona public):

    sudo firewall-cmd --permanent --add-service=ssh
    sudo firewall-cmd --reload
    

     

    public ya incluye ssh y dhcpv6-client por 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.

  1. 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.

  1. 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
    
  2. 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 --reload
    

     

    Es una capa adicional a Fail2ban a nivel de conexiones. Cuida que un script con muchas conexiones legítimas no se quede fuera.

  3. Comprobar el estado final:

    sudo firewall-cmd --list-all
    

Verificar

  1. Confirmar que las reglas están aplicadas:

    sudo firewall-cmd --list-all
    

    Debe salir services: ... ssh http https (además de dhcpv6-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.