Cómo instalar el firewall UFW en Debian 10 Buster

Cómo instalar el firewall UFW en Debian 10 Buster

En esta entrada veremos cómo instalar el firewall UFW en Debian 10 Buster paso a paso. Esta es una de esas guías que no debes perderte, porque tener instalado un buen firewall en un servidor o un VPS Debian 10 es obligatorio.

Antes de instalar UFW en Debian 10 Buster

Para seguir esta guía de instalación del firewall UFW en Debian 10 Buster necesitas partir de unos requisitos mínimos:

  • Una máquina Debian 10 actualizada.
  • Acceso a consola como usuario con privilegios de sudo o root.
  • Conexión a Internet.

Nada especial, seguro que ya lo cumples, así que abre una consola en tu máquina Debian 10 y empezamos.

Cómo instalar UFW en Debian 10 Buster

Para instalar el firewall UFW en Debian 10 Buster usaremos los repositorios de la distribución, por lo que lo primero que haremos será sincronizar las listas de paquetes y, algo opcional pero bastante recomendable, actualizar también los paquetes instalados:

~$ sudo apt update && sudo apt -y upgrade

Ya podemos instalar el firewall UFW mediante apt:

~$ sudo apt -y install ufw

En unos instantes tendremos descargado e instalado el firewall, pero no estará activado. Antes de hacerlo vamos a empezar a trabajar con algunas configuraciones básicas.

Cómo configurar y trabajar con UFW en Debian 10 Buster

Para empezar a configurar UFW en Debian 10 lo primero será establecer unas políticas generales por defecto.

En primer lugar impediremos todo el tráfico que provenga del exterior a nuestro servidor Debian 10:

~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)

Con este ajuste nadie puede conectar a nuestra máquina, de modo que podremos ir abriendo uno a uno los servicios a los que sí permitamos conexiones y a quien queramos específicamente.

Por otro lado, permitiremos todas las conexiones salientes:

~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'
(be sure to update your rules accordingly)

Podríamos activar en este momento el firewall, pero si estás trabajando remotamente vía SSH podrías tener problemas. Por tanto podemos añadir una regla concreta a nuestra configuración de UFW que permita las conexiones SSH.

Abrir y cerrar puertos en UFW

Para abrir puertos de nuestro servidor Debian 10 usamos la opción allow del comando ufw:

~$ sudo ufw allow ssh
Rules updated
Rules updated (v6)

Hemos especificado expresamente el servicio, pero podríamos haber especificado manualmente el puerto y el protocolo, de esta forma:

~$ sudo ufw allow 22/tcp
Rules updated
Rules updated (v6)

El protocolo SSH usa por convención el puerto 22 TCP, y los servicios normalizados figuran en el archivo /etc/services:

~$ grep -i ssh /etc/services
ssh             22/tcp

Precisamente es del archivo /etc/services de donde UFW obtiene el puerto y protocolo.

Si lo que quieres es cerrar puertos el parámetro en lugar de allow es deny, siendo el resto del comando idéntico.

Cómo activar UFW

Ha llegado el momento de activar el firewall:

~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Fíjate que igualmente se lanza una advertencia sobre las posibles conexiones SSH establecidas, pero no debería haber problema. En cualquier caso, antes de continuar y cerra la conexión SSH actual, intenta abrir otra conexión SSH distinta. Si se abre sin problemas todo va bien, si la conexión es rechazada algo no está bien y deberás averiguar qué es sin cerrar la conexión establecida, a no ser que también tengas acceso directo a consola del servidor Debian 10.

Añadiendo reglas al firewall activo en Debian 10

Vamos a trabajar con más reglas ahora que el firewall UFW está activado. En la máquina de esta guía el servidor web está funcionando, como podemos comprobar con systemctl:

~$ systemctl status apache2
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset:
   Active: active (running) since Mon 2019-08-12 04:28:05 CEST; 1h 51min left
     Docs: https://httpd.apache.org/docs/2.4/
 Main PID: 348 (apache2)
    Tasks: 6 (limit: 1150)
   Memory: 26.9M
   CGroup: /system.slice/apache2.service
           ├─348 /usr/sbin/apache2 -k start
           ├─350 /usr/sbin/apache2 -k start
           ├─351 /usr/sbin/apache2 -k start
           ├─352 /usr/sbin/apache2 -k start
           ├─353 /usr/sbin/apache2 -k start
           └─354 /usr/sbin/apache2 -k start

Pero el firewall está activo, la política por defecto es impedir conexiones entrantes y no hemos establecido reglas para el servidor web. Por lo tanto, si intentamos acceder desde otra máquina a alguna página web del servidor Debian 10 no obtendremos respuesta:

como instalar firewall ufw en debian 10 buster

Añadiremos las reglas para permitir que el sevidor web pueda ofrecer páginas web a través de los protocolos HTTP y HTTPS:

~$ sudo ufw allow http
Rule added
Rule added (v6)
~$ sudo ufw allow https
Rule added
Rule added (v6)

Automáticamente se permiten las conexiones al servidor web:

instalar firewall ufw en debian 10 buster

Listando las reglas de UFW en Debian 10

Ya tenemos unas cuantas reglas configuradas en UFW, y conforme añadimos servicios a nuestro servidor o VPS Debian 10, la lista de reglas del firewall puede crecer más. En cualquier momento podemos ver las reglas de UFW con el parámetro status:

~$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Fíjate que las reglas que afectan al protocolo IPv6 se añaden al final de la lista.

Una opción interesante es que podemos mostrar esta lista de reglas numerada, añadiendo el parámetro numbered:

~$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

Esto será útil para eliminar fácilmente reglas concretas e insertar otras en un determinado orden de la pila.

Por ejemplo, si quisiéramos eliminar las reglas al protocolo HTTPS (puerto 443) de la lista anterior, deberíamos eliminar las reglas números 3 y 6. No se puede hacer en un solo comando, así que primero eliminamos la regla 3:

~$ sudo ufw delete 3
Deleting:
 allow 443/tcp
Proceed with operation (y|n)? y
Rule deleted

Nos queda una regla más por eliminar, pero ahora la lista ha cambiado y ya no sería la regla número 6 la que queremos eliminar. Lo mejor es volver a listar las reglas:

~$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 4] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 5] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

Y comprobamos que ahora es la regla número 5 la que nos interesaría eliminar.

En cuanto a insertar reglas en una posición concreta esto es importante porque la lista se comporta como una pila en la que algunas reglas pueden contradecirse o no funcionar como se espera de ellas.

Veamos un ejemplo. Partimos de una situación donde sólo hay reglas para SSH (vamos a obviar las reglas para IPv6, por brevedad):

~$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere

Queremos abrir los puertos del 50 al 100 para el protocolo TCP, pero dejando justo el puerto 80 cerrado.

Cómo especificar rangos de puertos

Podríamos permitir el rango de puertos 50:100 para TCP (en el caso de rangos hay que especificar el protocolo):

~$ sudo ufw allow 50:100/tcp

Y a continuación añadir la regla que cierra el puerto 80/tcp:

~$ sudo ufw deny 80/tcp

Imaginando que hay un servidor web escuchando en el puerto 80/tcp en teoría lo que hemos hecho es impedir que reciba conexiones. Sin embargo, el servidor web es accesible, ¿por qué?

Echemos un vistazo a la pila de reglas:

[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 50:100/tcp                 ALLOW IN    Anywhere
[ 3] 80/tcp                     DENY IN     Anywhere

Como puedes observar, las reglas se van añadiendo secuencialmente por la cola de la lista, pero el orden de evaluación es desde el final de la liasta hasta el principio y estaría concebido para ir de lo más general hacia lo más particular.

Nosotros hemos introducido las reglas secuencialmente diciéndole a UFW que abra el rango de puertos 50:100 y cierre el 80. Pero UFW entiende que cierre el 80 y luego abra el rango 50:100, con lo que se deshace el cierre del 80.

Sin embargo, en la situación antes de especificar el cierre del puerto podemos listar las reglas:

~$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 50:100/tcp                 ALLOW IN    Anywhere

Lo que tendríamos que hacer es insertar la regla en alguna posición por encima de la regla número 2, o en la misma regla número 2, usando para ello el modificador insert:

~$ sudo ufw insert 2 deny 80/tcp

Ahora la posición de esta nueva regla en la pila está por encima de la regla relativa al rango, por tanto prevalece:

~$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     DENY IN     Anywhere
[ 3] 50:100/tcp                 ALLOW IN    Anywhere

Basta intentar conectar al sevidor web para comprobar que no es posible.

Bloquear direcciones IP

Partiendo de una configuración inicial que permite los servicios que nos interesen:

~$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere

Si detectamos alguna dirección IP con comportamientos que no nos interesan, podemos bloquearla, pero con la precaución de insertar las correspondientes reglas por encima de las reglas generales:

~$ sudo ufw insert 1 deny from 192.168.112.124

Quedando así:

~$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] Anywhere                   DENY IN     192.168.112.124
[ 2] 22/tcp                     ALLOW IN    Anywhere
[ 3] 80/tcp                     ALLOW IN    Anywhere
[ 4] 443/tcp                    ALLOW IN    Anywhere

Podríamos haber bloqueado una subred completa de direcciones si recibimos ataques desde distintas direcciones de la misma:

~$ sudo ufw insert 1 deny from 192.168.112.0/24

Comprobando:

~$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] Anywhere                   DENY IN     192.168.112.0/24
[ 2] 22/tcp                     ALLOW IN    Anywhere
[ 3] 80/tcp                     ALLOW IN    Anywhere
[ 4] 443/tcp                    ALLOW IN    Anywhere

Permitir direcciones IP específicas a un puerto

En este ejemplo en el que tenemos abiertos los servicios SSH, HTTP y HTTPS, podríamos tener también un servidor de bases de datos MySQL con acceso remoto permitido, cuyo puerto de escucha suele ser el 3306. Podríamos querer acceder remotamente para trabajar sobre las bases de datos desde otra máquina, pero dejar el puerto abierto es una temeridad, ya que la mayoría del tiempo no lo estaremos usando y sin embargo estará siendo atacado constantemente.

Una solución puede ser no abrir el puerto en general, sino permitir conexiones sólo desde la dirección IP desde la que vamos a conectar. Aunque la IP no sea fija, las concesiones de la mayoría de provedores suele durar días o semanas, así que podemos añadir una regla de este tipo:

~$ sudo ufw insert 1 allow from 192.168.112.124 to any port mysql

Cuando cambie la dirección IP puedes añadir otra regla con la nueva dirección IP y eliminar la vieja. Y puedes añadir varias reglas si accedes desde varios sitios con distintas direcciones IP. Incluso puedes acceder por SSH, permitir el puerto que necesites para la IP temporal desde la que conectes, realizar las conexiones y al terminar, eliminar la regla del firewall desde la sesión SSH.

Conclusión

Ahora que sabes cómo instalar el firewall UFW en Debian 10 Buster puedes abrir y cerrar puertos según tus necesidades, bloquear direcciones IP maliciosas, etc. No sólo hay que configurar adecuadamente los servicios y características de nuestro VPS Debian 10, también hay que protegerlos con la capa extra de seguridad que supon un buen firewall.

Si tienes alguna pregunta, sugerencia, duda, notificación, etc. puedes dejar un comentario.

Y si este tutorial ha provocado en ti la revelación de que instalar un firewall en Debian 10 es algo muy necesario, pero no necesariamente difícil, ¡puedes invitarme a un café si quieres!

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (1 votos, promedio: 5,00 de 5)
Cargando…

Deja un comentario

Cerrar menú

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información

ACEPTAR
Aviso de cookies