Introducción
UFW, o Uncomplicated Firewall (firewall no complicado), es una interfaz de iptables que está orientada a simplificar el proceso de configuración de un firewall.
Si bien iptables es una herramienta sólida y flexible, puede ser difícil para los principiantes aprender a usarla para configurar correctamente un firewall.
Si estás buscando comenzar a proteger tu red y no estás seguro de qué herramienta usar, UFW puede ser la opción correcta para ti.
Este tutorial te mostrará cómo configurar un firewall con UFW en Ubuntu 18.04.
Prerrequisitos
Para seguir este tutorial, necesitarás:
- Un servidor Ubuntu 18.04 con un usuario sudo no root, que puedes configurar siguiendo los Pasos 1–3 en el tutorial Configuración básica de un servidor con Ubuntu 18.04 .
UFW se instala por defecto en Ubuntu. Si se ha desinstalado por algún motivo, puedes instalarlo con sudo apt install ufw.
Paso 1 – Uso de IPv6 con UFW (opcional)
Este tutorial está escrito con IPv4 en mente, pero funcionará para IPv6 siempre que lo habilites.
Si tu servidor Ubuntu tiene habilitado IPv6, asegúrate de que UFW esté configurado para admitir IPv6 para que puedas administrar las reglas de firewall para IPv6 además de IPv4.
Para hacer esto, debes abrir la configuración de UFW con nano o tu editor favorito.
1 |
$ sudo nano /etc/default/ufw |
Luego asegúrate de que el valor de IPV6 es yes. Debe tener un aspecto como este:
1 2 |
/etc/default/ufw excerpt IPV6=yes |
Guarda y cierra el archivo. Ahora, cuando UFW está habilitado, se configurará para escribir reglas de firewall IPv4 e IPv6.
Sin embargo, antes de habilitar UFW, queremos asegurarnos de que tu firewall esté configurado para permitirle conectarse a través de SSH.
Comencemos con la configuración de las políticas predeterminadas.
Paso 2 – Configuración de políticas predeterminadas
Si recién estás comenzando con tu firewall, las primeras reglas para definir son tus políticas predeterminadas.
Estas reglas controlan cómo manejar el tráfico que no coincide explícitamente con ninguna otra regla.
De manera predeterminada, UFW está configurado para denegar todas las conexiones entrantes y permitir todas las conexiones salientes.
Esto significa que cualquiera que intente llegar a tu servidor no podrá conectarse, mientras que cualquier aplicación dentro del servidor podrá llegar al mundo exterior.
Regresemos las reglas de UFW a los valores predeterminados para que podamos estar seguros de que podrás seguir este tutorial.
Para establecer los valores predeterminados utilizados por UFW, debes usar estos comandos:
1 2 |
$ sudo ufw default deny incoming $ sudo ufw default allow outgoing |
Estos comandos establecen los valores predeterminados para denegar conexiones entrantes y permitir conexiones salientes.
Estos valores predeterminados del firewall solo pueden ser suficientes para una computadora personal, pero los servidores generalmente necesitan responder a las solicitudes entrantes de usuarios externos.
Lo veremos a continuación.
Paso 3 – Permitir conexiones SSH
Si habilitamos nuestro firewall UFW ahora, negaría todas las conexiones entrantes.
Esto significa que necesitaremos crear reglas que permitan explícitamente conexiones entrantes legítimas, por ejemplo, conexiones SSH o HTTP, si queremos que nuestro servidor responda a ese tipo de solicitudes.
Si estás utilizando un servidor en la nube, probablemente desees permitir conexiones SSH entrantes para poder conectarte y administrar tu servidor.
Para configurar tu servidor para permitir conexiones SSH entrantes, puedes usar este comando:
1 |
$ sudo ufw allow ssh |
Esto creará reglas de firewall que permitirán todas las conexiones en el puerto 22, que es el puerto que el demonio SSH escucha de manera predeterminada.
UFW sabe qué allow ssh significa puerto porque está listado como un servicio en el archivo /etc/services.
Sin embargo, en realidad podemos escribir la regla equivalente especificando el puerto en lugar del nombre del servicio.
Por ejemplo, este comando funciona igual que el anterior:
1 |
$ sudo ufw allow 22 |
Si configuraste tu demonio SSH para usar un puerto diferente, tendrás que especificar el puerto apropiado.
Por ejemplo, si tu servidor SSH está escuchando en el puerto 2222, puedes usar este comando para permitir conexiones en ese puerto:
1 |
$ sudo ufw allow 2222 |
Ahora que tu firewall está configurado para permitir conexiones SSH entrantes, podemos habilitarlo.
Paso 4 – Habilitar UFW
Para habilitar UFW, usa este comando:
1 |
$ sudo ufw enable |
Recibirás una advertencia que dice que el comando puede interrumpir las conexiones SSH existentes.
Ya configuramos una regla de firewall que permite conexiones SSH, por lo que debería estar bien continuar. Debes responder a la solicitud con y y presionar ENTER.
El firewall ahora está activo. Ejecuta el comando sudo ufw status verbose para ver las reglas establecidas.
El resto de este tutorial cubre cómo usar UFW con más detalle, como permitir o denegar diferentes tipos de conexiones.
Paso 5 – Permitir otras conexiones
En este punto, debes permitir todas las demás conexiones a las que tu servidor necesita responder.
Las conexiones que debes permitir dependen de tus necesidades específicas.
Afortunadamente, ya sabes cómo escribir reglas que permiten conexiones basadas en un nombre de servicio o puerto; Ya hicimos esto para SSH en el puerto 22. También puedes hacer esto para:
- HTTP en el puerto 80, que es lo que usan los servidores web sin cifrar, usando sudo ufw allow http o sudo ufw allow 80
- HTTPS en el puerto 443, que es lo que usan los servidores web cifrados, usando sudo ufw allow https o sudo ufw allow 443
Hay varias otras formas de permitir otras conexiones, además de especificar un puerto o servicio conocido.
Rangos de puertos específicos
Puedes especificar rangos de puertos con UFW. Algunas aplicaciones usan múltiples puertos, en lugar de un solo puerto.
Por ejemplo, para permitir conexiones X11, que utilizan puertos 6000- 6007, utilizan estos comandos:
1 2 |
$ sudo ufw allow 6000:6007/tcp $ sudo ufw allow 6000:6007/udp |
Al especificar rangos de puertos con UFW, debes especificar el protocolo (tcp o udp) al que deben aplicarse las reglas.
No hemos mencionado esto antes porque no especificar el protocolo automáticamente permite ambos protocolos, lo cual está bien en la mayoría de los casos.
Direcciones IP específicas
Cuando trabajes con UFW, también puedes especificar direcciones IP.
Por ejemplo, si deseas permitir conexiones desde una dirección IP específica, como una dirección IP de trabajo o particular 203.0.113.4, debe especificar from, para la dirección IP:
1 |
$ sudo ufw allow from 203.0.113.4 |
También puedes especificar un puerto específico al que la dirección IP puede conectarse agregando to any port seguido del número de puerto.
Por ejemplo, si deseas permitir a 203.0.113.4 conectarse al puerto 22 (SSH), debes usar este comando:
1 |
$ sudo ufw allow from 203.0.113.4 to any port 22 |
Subredes
Si deseas permitir una subred de direcciones IP, puedes hacerlo utilizando la notación CIDR para especificar una máscara de red.
Por ejemplo, si deseas permitir todas las direcciones IP que van desde 203.0.113.1 a 203.0.113.254, puedes usar este comando:
1 |
$ sudo ufw allow from 203.0.113.0/24 |
Del mismo modo, también puedes especificar el puerto de destino al que la subred 203.0.113.0/24 puede conectarse.
Nuevamente, usaremos el puerto 22 (SSH) como ejemplo:
1 |
$ sudo ufw allow from 203.0.113.0/24 to any port 22 |
Conexiones a una interfaz de red específica
Si deseas crear una regla de firewall que solo se aplique a una interfaz de red específica, puedes hacerlo especificando “allow in on” seguido del nombre de la interfaz de red.
Es posible que desees buscar sus interfaces de red antes de continuar. Para hacerlo, usa este comando:
1 2 3 4 5 6 |
$ ip addr Output Excerpt 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state . . . 3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default |
La salida resaltada indica los nombres de la interfaz de red. Suelen llamarse algo así como eth0 o enp3s2.
Entonces, si tu servidor tiene una interfaz de red pública llamada eth0, puedes permitirle el tráfico HTTP (puerto 80) con este comando:
1 |
$ sudo ufw allow in on eth0 to any port 80 |
Hacerlo permitiría que tu servidor reciba solicitudes HTTP de Internet público.
O, si deseas que tu servidor de base de datos MySQL (puerto 3306) escuche conexiones en la interfaz de red privada eth1, por ejemplo, puedes usar este comando:
1 |
$ sudo ufw allow in on eth1 to any port 3306 |
Esto permitiría que otros servidores en tu red privada se conecten a tu base de datos MySQL.
Paso 6 – Negar conexiones
Si no has cambiado la política predeterminada para las conexiones entrantes, UFW está configurado para denegar todas las conexiones entrantes.
En general, esto simplifica el proceso de creación de una política de firewall segura al exigirte que crees reglas que permitan explícitamente puertos específicos y direcciones IP.
Sin embargo, a veces querrás negar conexiones específicas basadas en la dirección IP o subred de origen, tal vez porque sabes que tu servidor está siendo atacado desde allí.
Además, si deseas cambiar tu política de entrada predeterminada para permitir (que no se recomienda), necesitarías crear reglas de denegación para cualquier servicio o dirección IP para la que no deseas permitir conexiones.
Para escribir reglas de denegación (deny), puedes usar los comandos descritos anteriormente, reemplazando permitir (allow) con denegar (deny).
Por ejemplo, para denegar conexiones HTTP, puedes usar este comando:
1 |
$ sudo ufw deny http |
O si deseas negar todas las conexiones 203.0.113.4, puedes usar este comando:
1 |
$ sudo ufw deny from 203.0.113.4 |
Ahora echemos un vistazo a cómo eliminar reglas.
Paso 7 – Eliminar reglas
Saber cómo eliminar las reglas del firewall es tan importante como saber cómo crearlas.
Hay dos formas diferentes de especificar qué reglas eliminar: por número de regla o por la regla real (similar a cómo se especificaron las reglas cuando se crearon).
Comenzaremos con la eliminación por método de número de regla porque es más fácil.
Por número de regla
Si estás utilizando el número de regla para eliminar las reglas del firewall, lo primero que querrás hacer es obtener una lista de las reglas del firewall.
El comando de estado UFW tiene una opción para mostrar números al lado de cada regla, como se demuestra aquí:
1 2 3 4 5 6 7 8 9 |
$ sudo ufw status numbered Numbered Output: Status: active To Action From -- ------ ---- [ 1] 22 ALLOW IN 15.15.15.0/24 [ 2] 80 ALLOW IN Anywhere |
Si decidimos que queremos eliminar la regla 2, la que permite las conexiones del puerto 80 (HTTP), podemos especificarla en un comando de eliminación UFW como este:
1 |
$ sudo ufw delete 2 |
Esto mostraría un mensaje de confirmación y luego eliminaría la regla 2, que permite conexiones HTTP.
Ten en cuenta que, si tienes habilitado IPv6, también querrás eliminar la regla IPv6 correspondiente.
Por regla
La alternativa a los números de regla es especificar la regla real a eliminar. Por ejemplo, si deseas eliminar la regla allow http, puedes escribirla así:
1 |
$ sudo ufw delete allow http |
También puedes especificar la regla por allow 80, en lugar de por el nombre del servicio:
1 |
$ sudo ufw delete allow 80 |
Este método eliminará las reglas IPv4 e IPv6, si existen.
Este método eliminará las reglas IPv4 e IPv6, si existen.
Paso 8 – Verificación del estado y las reglas de UFW
En cualquier momento, puedes verificar el estado de UFW con este comando:
1 |
$ sudo ufw status verbose |
Si UFW está desactivado, lo cual es predeterminado, verás algo como esto:
1 2 |
Output Status: inactive |
Si UFW está activo, lo que debería ser si seguiste el Paso 3, la salida indicará que está activo y enumerará todas las reglas establecidas.
Por ejemplo, si el firewall está configurado para permitir conexiones SSH (puerto 22) desde cualquier lugar, la salida podría verse así:
1 2 3 4 5 6 7 8 9 |
Output Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere |
Utiliza el comando status si deseas verificar cómo UFW ha configurado el firewall.
Paso 9 – Deshabilitar o restablecer UFW (opcional)
Si decides que no deseas usar UFW, puedes deshabilitarlo con este comando:
1 |
$ sudo ufw disable |
Cualquier regla que hayas creado con UFW ya no estará activa. Siempre puedes ejecutar sudo ufw enable si necesitas activarlo más tarde.
Si ya tienes configuradas las reglas de UFW, pero decides que deseas comenzar de nuevo, puedes usar el comando de reinicio:
1 |
$ sudo ufw reset |
Esto deshabilitará UFW y eliminará cualquier regla que se haya definido previamente.
Ten en cuenta que las políticas predeterminadas no cambiarán a su configuración original, si las modificaste en algún momento. Esto debería darte un nuevo comienzo con UFW.
Conclusión
Tu firewall ahora está configurado para permitir (al menos) conexiones SSH.
Asegúrate de permitir cualquier otra conexión entrante a tu servidor, al tiempo que limitas las conexiones innecesarias, para que tu servidor sea funcional y seguro.
Para obtener información sobre las configuraciones más comunes de UFW, puedes consultar el tutorial Reglas y comandos comunes del firewall UFW.