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.
Tabla de contenidos
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:
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:
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, y quieres agradecérnoslo, puedes hacerlo dejando una propina de tan sólo 1 $ desde PayPal:
¡Gracias!