Cómo configurar un firewall con UFW en Ubuntu

Introducción

UFW, o Firewall sin complicaciones, es una interfaz para iptables diseñada para simplificar el proceso de configuración de un firewall. Mientras que iptables es una herramienta sólida y flexible, puede resultar difícil para los principiantes aprender a usarla para configurar correctamente un firewall. Si estás buscando comenzar a asegurar tu red y no estás seguro de qué herramienta utilizar, UFW puede ser la elección correcta para ti.

Este tutorial te mostrará cómo configurar un firewall con UFW en Ubuntu v18.04 y versiones posteriores.

Prerrequisitos

Si estás utilizando Ubuntu versión 16.04 o anterior, te recomendamos que actualices a una versión más reciente, ya que Ubuntu ya no brinda soporte para estas versiones. Esta colección de guías te ayudará a actualizar tu versión de Ubuntu.

Para seguir este tutorial, necesitarás:

  • Un servidor ejecutando Ubuntu, junto con un usuario no root con privilegios de sudo. Para obtener orientación sobre cómo configurar esto, elige tu distribución de esta lista y sigue nuestra Guía de Configuración Inicial del Servidor.

  • UFW se instala por defecto en Ubuntu. Si ha sido desinstalado por alguna razón, puedes instalarlo con sudo apt install ufw.

Configurar el firewall de Ubuntu con UFW

  1. Habilitar IPv6
  2. Establecer Políticas Predeterminadas
  3. Permitir Conexiones SSH
  4. Habilitar UFW
  5. Permitir Otras Conexiones Requeridas
  6. Denegar Conexiones
  7. Eliminación de Reglas del Firewall
  8. Verificar el Estado y las Reglas de UFW
  9. Cómo Deshabilitar o Restablecer el Firewall en Ubuntu

Paso 1 — Asegurarse de que IPv6 esté Habilitado

En las versiones recientes de Ubuntu, IPv6 está habilitado de forma predeterminada. En la práctica, eso significa que la mayoría de las reglas del firewall agregadas al servidor incluirán tanto una versión IPv4 como una versión IPv6, esta última identificada por v6 dentro de la salida del comando de estado de UFW. Para asegurarse de que IPv6 esté habilitado, puede verificar el archivo de configuración de UFW en /etc/default/ufw. Abra este archivo usando nano o su editor de línea de comandos favorito:

  1. sudo nano /etc/default/ufw

Luego asegúrese de que el valor de IPV6 esté configurado en yes. Debería verse así:

/etc/default/ufw excerpt
  1. IPV6=yes

Guarde y cierre el archivo. Si está utilizando nano, puede hacerlo escribiendo CTRL+X, luego Y y ENTER para confirmar.

Cuando UFW esté habilitado en un paso posterior de esta guía, se configurará para escribir reglas de firewall tanto IPv4 como IPv6.

Paso 2 — Configuración de Políticas Predeterminadas

Si estás comenzando con UFW, un buen primer paso es verificar tus políticas de firewall predeterminadas. Estas reglas controlan cómo manejar el tráfico que no coincide explícitamente con ninguna otra regla.

Por defecto, UFW está configurado para denegar todas las conexiones entrantes y permitir todas las conexiones salientes. Esto significa que cualquier persona que intente alcanzar tu servidor no podrá conectarse, mientras que cualquier aplicación dentro del servidor podrá alcanzar el mundo exterior. Reglas adicionales para permitir servicios y puertos específicos se incluyen como excepciones a esta política general.

Para asegurarte de poder seguir el resto de este tutorial, ahora configurarás las políticas predeterminadas de UFW para el tráfico entrante y saliente.

Para establecer la política de entrada predeterminada de UFW en denegar, ejecuta:

  1. sudo ufw default deny incoming
Output
Default incoming policy changed to 'deny' (be sure to update your rules accordingly)

Para establecer la política de salida predeterminada de UFW en permitir, ejecuta:

  1. sudo ufw default allow outgoing
Output
Default outgoing policy changed to 'allow' (be sure to update your rules accordingly)

Estos comandos establecen los valores predeterminados para denegar las conexiones entrantes y permitir las conexiones salientes. Estas configuraciones predeterminadas de firewall pueden ser suficientes para una computadora personal, pero los servidores generalmente necesitan responder a solicitudes entrantes de usuarios externos. Veremos eso a continuación.

Paso 3 — Permitir conexiones SSH

Si habilitaras ahora tu firewall UFW, denegaría todas las conexiones entrantes. Esto significa que necesitarás crear reglas que permitan explícitamente conexiones entrantes legítimas, como las conexiones SSH o HTTP, por ejemplo, si deseas que tu servidor responda a esos tipos de solicitudes. Si estás utilizando un servidor en la nube, probablemente querrás permitir conexiones SSH entrantes para poder conectarte y administrar tu servidor.

Permitir el Perfil de Aplicación OpenSSH UFW

Tras la instalación, la mayoría de las aplicaciones que dependen de conexiones de red registrarán un perfil de aplicación dentro de UFW, lo que permite a los usuarios permitir o denegar rápidamente el acceso externo a un servicio. Puedes verificar qué perfiles están actualmente registrados en UFW con:

  1. sudo ufw app list
Output
Available applications: OpenSSH

Para habilitar el perfil de aplicación OpenSSH, ejecuta:

  1. sudo ufw allow OpenSSH
Output
Rule added Rule added (v6)

Esto creará reglas de firewall para permitir todas las conexiones en el puerto 22, que es el puerto en el que el daemon SSH escucha de forma predeterminada.

Permitir SSH por Nombre de Servicio

Otra forma de configurar UFW para permitir conexiones entrantes de SSH es haciendo referencia a su nombre de servicio: ssh.

  1. sudo ufw allow ssh
Output
Rule added Rule added (v6)

UFW sabe qué puertos y protocolos utiliza un servicio en función del archivo /etc/services.

Permitir SSH por Número de Puerto

Alternativamente, puedes escribir la regla equivalente especificando el puerto en lugar del perfil de aplicación o nombre de servicio. Por ejemplo, este comando funciona igual que los ejemplos anteriores:

  1. sudo ufw allow 22
Output
Rule added Rule added (v6)

Si has configurado 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
Output
Rule added Rule added (v6)

Ahora que tu firewall está configurado para permitir conexiones entrantes de SSH, puedes habilitarlo.

Paso 4 — Habilitar UFW

Su firewall debería estar configurado ahora para permitir conexiones SSH. Para verificar qué reglas se han agregado hasta ahora, incluso cuando el firewall todavía está desactivado, puedes usar:

  1. sudo ufw show added
Output
Added user rules (see 'ufw status' for running firewall): ufw allow OpenSSH

Después de confirmar que tienes una regla para permitir conexiones SSH entrantes, puedes habilitar el firewall con:

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

Recibirás una advertencia que dice que el comando puede interrumpir las conexiones SSH existentes. Ya configuraste una regla de firewall que permite conexiones SSH, así que debería estar bien continuar. Responde a la solicitud con y y presiona ENTER.

El firewall está ahora activo. Ejecuta el comando sudo ufw status verbose para ver las reglas que están configuradas. 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, deberías permitir todas las otras conexiones a las que tu servidor necesita responder. Las conexiones que debes permitir dependen de tus necesidades específicas. Ya sabes cómo escribir reglas que permiten conexiones basadas en un perfil de aplicación, un nombre de servicio o un puerto; ya lo hiciste para SSH en el puerto 22. También puedes hacer esto para:

  • HTTP en el puerto 80, que es lo que utilizan los servidores web no encriptados, utilizando sudo ufw allow http o sudo ufw allow 80
  • HTTPS en el puerto 443, que es lo que utilizan los servidores web encriptados, usando sudo ufw allow https o sudo ufw allow 443.
  • Apache con tanto HTTP como HTTPS, usando sudo ufw allow ‘Apache Full’.
  • Nginx con tanto HTTP como HTTPS, usando sudo ufw allow ‘Nginx Full’.

No olvides verificar qué perfiles de aplicación están disponibles para tu servidor con sudo ufw app list.

Hay varias otras formas de permitir conexiones, aparte de especificar un puerto o nombre de servicio conocido. Veremos algunas de estas a continuación.

Rangos de Puertos Específicos

Puedes especificar rangos de puertos con UFW. Algunas aplicaciones utilizan múltiples puertos, en lugar de un solo puerto.

Por ejemplo, para permitir conexiones X11, que utilizan los puertos 60006007, usa estos comandos:

  1. sudo ufw allow 6000:6007/tcp
  2. sudo ufw allow 6000:6007/udp

Cuando se especifican rangos de puertos con UFW, debes especificar el protocolo (tcp o udp) al que se aplicarán 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 trabajas con UFW, también puedes especificar direcciones IP dentro de tus reglas. Por ejemplo, si deseas permitir conexiones desde una dirección IP específica, como la dirección IP de trabajo o de casa de 203.0.113.4, necesitas utilizar el parámetro from, proporcionando entonces la dirección IP que deseas permitir:

  1. sudo ufw allow from 203.0.113.4
Output
Rule added

También puedes especificar un puerto al que la dirección IP tiene permitido conectarse añadiendo to any port seguido del número de puerto. Por ejemplo, si deseas permitir que 203.0.113.4 se conecte al puerto 22 (SSH), utiliza este comando:

  1. sudo ufw allow from 203.0.113.4 to any port 22
Output
Rule added

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 hasta 203.0.113.254, podrías utilizar este comando:

  1. sudo ufw allow from 203.0.113.0/24
Output
Rule added

De igual manera, también puedes especificar el puerto de destino al que la subred 203.0.113.0/24 tiene permitido conectarse. Nuevamente, utilizaremos el puerto 22 (SSH) como ejemplo:

  1. sudo ufw allow from 203.0.113.0/24 to any port 22
Output
Rule added

Conexiones a una Interfaz de Red Específica

Si desea crear una regla de firewall que solo se aplique a una interfaz de red específica, puede hacerlo especificando “permitir en en” seguido del nombre de la interfaz de red.

Es posible que desee buscar sus interfaces de red antes de continuar. Para hacerlo, utilice este comando:

  1. 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 las interfaces de red. Normalmente, tienen nombres como eth0 o enp3s2.

Entonces, si su servidor tiene una interfaz de red pública llamada eth0, podría permitir el tráfico HTTP (puerto 80) con este comando:

  1. sudo ufw allow in on eth0 to any port 80
Output
Rule added Rule added (v6)

Al hacerlo, su servidor podría recibir solicitudes HTTP desde Internet público.

O, si desea que su servidor de base de datos MySQL (puerto 3306) escuche conexiones en la interfaz de red privada eth1, por ejemplo, podría usar este comando:

  1. sudo ufw allow in on eth1 to any port 3306
Output
Rule added Rule added (v6)

Esto permitiría que otros servidores en su red privada se conecten a su base de datos MySQL.

Paso 6 — Denegar conexiones

Si no ha cambiado la política predeterminada para las conexiones entrantes, UFW está configurado para denegar todas las conexiones entrantes. Generalmente, esto simplifica el proceso de creación de una política de firewall segura al requerir que cree reglas que permitan explícitamente puertos específicos y direcciones IP.

Sin embargo, a veces querrás denegar conexiones específicas basadas en la dirección IP de origen o en la subred, tal vez porque sabes que tu servidor está siendo atacado desde allí. Además, si deseas cambiar tu política de entrada predeterminada a permitir (lo cual no se recomienda), necesitarías crear reglas de denegación para cualquier servicio o dirección IP para las cuales no quieras permitir conexiones.

Para escribir reglas de denegación, puedes usar los comandos descritos anteriormente, reemplazando permitir con denegar.

Por ejemplo, para denegar conexiones HTTP, podrías usar este comando:

  1. sudo ufw deny http
Output
Rule added Rule added (v6)

O si deseas denegar todas las conexiones desde 203.0.113.4 podrías usar este comando:

  1. sudo ufw deny from 203.0.113.4
Output
Rule added

En algunos casos, también puedes querer bloquear conexiones salientes desde el servidor. Para denegar que todos los usuarios utilicen un puerto en el servidor, como el puerto 25 para el tráfico SMTP, puedes usar denegar salida seguido del número de puerto:

  1. sudo ufw deny out 25
Output
Rule added Rule added (v6)

Esto bloqueará todo el tráfico SMTP saliente en el servidor.

Paso 7 — Eliminar Reglas

Saber cómo eliminar reglas de 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 su denominación legible por humanos (similar a cómo se especificaron las reglas cuando se crearon).

Eliminar una regla de UFW por número

Para eliminar una regla de UFW por su número, primero querrás obtener una lista numerada de todas tus reglas de firewall. El comando de estado de UFW tiene una opción para mostrar números junto a cada regla, como se demuestra aquí:

  1. 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 decides que deseas eliminar la regla número 2, la que permite conexiones al puerto 80 (HTTP), puedes especificarlo en un comando de eliminación de UFW de esta manera:

  1. sudo ufw delete 2
Output
Deleting: allow 80 Proceed with operation (y|n)? y Rule deleted

Esto solicitará una confirmación y luego eliminará la regla 2, que permite conexiones HTTP. Ten en cuenta que si tienes IPv6 habilitado, también querrías eliminar la regla IPv6 correspondiente.

Eliminar una regla de UFW por nombre

En lugar de utilizar números de regla, también puedes hacer referencia a una regla por su denominación legible por humanos, que se basa en el tipo de regla (típicamente allow o deny) y el nombre del servicio o el número de puerto que era el objetivo de esta regla, o el nombre del perfil de aplicación en caso de que se haya utilizado. Por ejemplo, si deseas eliminar una regla de allow para un perfil de aplicación llamado Apache Full que estaba habilitado anteriormente, puedes usar:

  1. sudo ufw delete allow "Apache Full"
Output
Rule deleted Rule deleted (v6)

El comando delete funciona de la misma manera para las reglas que se crearon haciendo referencia a un servicio por su nombre o puerto. Por ejemplo, si previamente configuraste una regla para permitir conexiones HTTP con sudo ufw allow http, así es como podrías eliminar dicha regla:

  1. sudo ufw delete allow http
Output
Rule deleted Rule deleted (v6)

Como los nombres de los servicios son intercambiables con los números de puerto al especificar reglas, también podrías referirte a la misma regla como allow 80, en lugar de allow http:

  1. sudo ufw delete allow 80
Output
Rule deleted Rule deleted (v6)

Cuando se eliminan reglas de UFW por nombre, se eliminan tanto las reglas IPv4 como las IPv6 si existen.

Paso 8 — Verificar el 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 el estado predeterminado, verás algo como esto:

Output
Status: inactive

Si UFW está activo, lo cual debería ser si seguiste el Paso 3, la salida indicará que está activo y enumerará las reglas que están configuradas. Por ejemplo, si el firewall está configurado para permitir conexiones SSH (puerto 22) desde cualquier lugar, la salida podría verse algo así:

Output
Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere

Usa el comando status si deseas verificar cómo UFW ha configurado el firewall.

Paso 9 — Desactivar o Restablecer el Firewall

Si decides que no deseas utilizar el firewall UFW, puedes desactivarlo con este comando:

  1. sudo ufw disable
Output
Firewall stopped and disabled on system startup

Cualquier regla que hayas creado con UFW ya no estará activa. Si necesitas activarlo más tarde, siempre puedes ejecutar sudo ufw enable.

Si ya tienes reglas de UFW configuradas pero decides que quieres empezar de nuevo, puedes utilizar el comando de reinicio:

  1. sudo ufw reset
Output
Resetting all rules to installed defaults. This may disrupt existing ssh connections. Proceed with operation (y|n)? y Backing up 'user.rules' to '/etc/ufw/user.rules.20210729_170353' Backing up 'before.rules' to '/etc/ufw/before.rules.20210729_170353' Backing up 'after.rules' to '/etc/ufw/after.rules.20210729_170353' Backing up 'user6.rules' to '/etc/ufw/user6.rules.20210729_170353' Backing up 'before6.rules' to '/etc/ufw/before6.rules.20210729_170353' Backing up 'after6.rules' to '/etc/ufw/after6.rules.20210729_170353'

Esto desactivará UFW y eliminará cualquier regla que se haya definido previamente. Esto te dará un nuevo comienzo con UFW. Ten en cuenta que las políticas predeterminadas no volverán a sus configuraciones originales si las modificaste en algún momento.

Implementa tus aplicaciones frontend desde GitHub usando la Plataforma de Aplicaciones de DigitalOcean. Deja que DigitalOcean se encargue de escalar tu aplicación.

Conclusión

Ahora tu firewall está configurado para permitir (al menos) conexiones SSH. Asegúrate de permitir cualquier otra conexión entrante que requiera tu servidor, mientras limitas cualquier conexión innecesaria, para que tu servidor sea funcional y seguro.

Para aprender sobre configuraciones más comunes de UFW, echa un vistazo al tutorial UFW Essentials: Reglas y Comandos de Firewall Comunes.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-22-04