Ir directamente al contenido

Ajustes de cookies

Elija por tipo qué cookies permite. Puede cambiar su elección en cualquier momento en Ajustes de cookies, al pie de cada página. Declaración de privacidad

Necesarias

Siempre activadas

Necesarias para iniciar sesión, conservar su carrito y recordar sus preferencias. Siempre están activadas.

¿Qué cookies?
  • weboke_sessie, weboke_klant, weboke_remember: su sesión y mantener la sesión iniciada
  • weboke_basket: su carrito
  • wkBtwIncl: mostrar los precios con o sin IVA
  • wok_cookies: su elección de cookies, 12 meses

Mide qué anuncio lleva a una visita o a un pedido, para no pagar por anuncios que no sirven de nada.

¿Qué cookies?
  • Google Ads a través de Google Tag Manager (_gcl_au, _gcl_aw), hasta 90 días
  • OpenAI Ads, anuncios en ChatGPT
  • wok_aff: a través de qué socio llegó a nosotros (programa de afiliados), 60 días

4,6

País e idioma

Cada país tiene su propio sitio, con los precios y el IVA de ese país.

Ver

Módulo 5 · 5.2

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, iptables suele 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:

  1. 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.
  2. Haga una instantánea (snapshot) si tiene dudas.
  3. 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/3

Puede 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 tcp

Paso 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 startup

Paso 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 OpenSSH en lugar de allow. 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 ruleset

Utilice 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 aunque ufw status no lo muestre. La solución (publicar en 127.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 --reload

Sin --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 de ufw 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 familia inet lo hace de una vez.
  • deny se ve desde fuera como "filtrado", reject como "cerrado"; limit frena 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

1. ¿En qué orden activa ufw por primera vez en un servidor en el que ha iniciado sesión por SSH?



2. Después de ufw enable, su sitio web ya no funciona por IPv4, pero SSH sí. ¿Cuál es la causa más probable?



3. Publica con Docker el puerto 5432 de un contenedor de base de datos. ufw status no muestra ninguna regla para 5432. ¿Es accesible la base de datos desde fuera?



4. ¿Por qué el ejemplo de nftables utiliza una tabla de la familia inet?



5. Su proveedor ofrece un firewall de red en el panel de cliente. ¿Necesita aun así un firewall en el servidor?



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.



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

Un momento…

Configure sus dominios

Configure para cada dominio los servidores de nombres, la vinculación a su hosting y quién será el titular.

Cargando sus dominios…