Cómo configurar una firewall con UFW en Ubuntu

Introducción

UFW, o Fuerte de la Red Simple, es una interfaz para iptables que se dirige hacia simplificar el proceso de configuración de un firewall. Aunque iptables es una herramienta sólida y flexible, puede ser difícil para principiantes aprender cómo usarla para configurar correctamente un firewall. Si estás buscando empezar a proteger tu red y no sabes qué herramienta usar, UFW podría ser la elección correcta para ti.

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

Requisitos previos

Si estás utilizando Ubuntu en la versión 16.04 o inferior, te recomendamos actualizar a una versión más reciente ya que Ubuntu no proporciona soporte para estas versiones. Este conjunto de guías te ayudarán en la actualización de tu versión de Ubuntu.

Para seguir este tutorial, necesitarás:

  • Un servidor ejecutando Ubuntu, junto con un usuario no root que tiene privilegios de sudo. Para obtener instrucciones sobre cómo configurar estos, por favor elija su distribución de la lista siguiente y siga nuestra Guía de Configuración Inicial del Servidor.

  • UFW está instalado de forma predeterminada en Ubuntu. Si por alguna razón se ha desinstalado, puede instalarlo con sudo apt install ufw.

Configurar el cortafuegos de Ubuntu con UFW

  1. Habilitar IPv6
  2. Configurar Políticas Predeterminadas
  3. Permitir Conexiones SSH
  4. Habilitando UFW
  5. Permitir Cualquier Otra Conexión Requerida
  6. Negando Conexiones
  7. Eliminando Reglas de Firewall
  8. Comprobar el Estado y las Reglas de UFW
  9. Cómo Deshabilitar o Restablecer el Firewall en Ubuntu

Primera etapa: Asegurarse de que IPv6 está habilitado

En las versiones recientes de Ubuntu, IPv6 se encuentra habilitado por defecto. En la práctica, eso significa que la mayoría de reglas de fuego agregadas al servidor incluirán tanto una versión IPv4 como una versión IPv6, última identificada por v6 en la salida del comando estatus de UFW. Para asegurarte de que IPv6 está habilitado, puedes verificar tu configuración de UFW en el archivo /etc/default/ufw. Abre este archivo usando nano o tu edificador de línea de comandos preferido:

  1. sudo nano /etc/default/ufw

Asegúrate de que el valor de IPV6 sea si. Debería parecer así:

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

Guarda y cierra el archivo. Si estás usando nano, lo haces escribiendo CTRL+X, luego Y y ENTER para confirmar.

Cuando UFW se active más tarde en esta guía, será configurado para escribir reglas de fuego tanto para IPv4 como para IPv6.

Etapa 2 – Configurar políticas predeterminadas

Si estás empezando con UFW, un buen paso es verificar tus políticas predeterminadas de fuego. 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 su servidor no podrá conectarse, mientras que cualquier aplicación dentro del servidor podrá alcanzar el mundo exterior. Las reglas adicionales para permitir servicios específicos y puertos se incluyen como excepciones a esta política general.

Para asegurarse de que podrá seguir con el resto de este tutorial, a continuación configurará las políticas predeterminadas de UFW para el tráfico entrante y saliente.

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

  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 predeterminada de salida de UFW en permitir, ejecute:

  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. Estos valores predeterminados de cortafuegos podrían ser suficientes para una computadora personal, pero los servidores típicamente necesitan responder a solicitudes entrantes de usuarios externos. Examinaremos eso próximamente.

Paso 3 — Permitir Conexiones SSH

Si habilita su cortafuegos UFW ahora, denegaría todas las conexiones entrantes. Esto significa que tendrá que crear reglas que expresamente permitan conexiones legítimas entrantes — por ejemplo, conexiones SSH o HTTP — si quiere que su servidor responda a esos tipos de solicitudes. Si utiliza un servidor en la nube, probablemente desee permitir conexiones entrantes SSH para poder conectarse y administrar su servidor.

Permitiendo el Perfil de Aplicación OpenSSH de UFW

Después de 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. Puede 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, ejecute:

  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 demonio SSH escucha por defecto.

Permitiendo SSH por Nombre de Servicio

Otra forma de configurar UFW para permitir conexiones SSH entrantes es referenciando 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 basado en el archivo /etc/services.

Permitiendo SSH por Número de Puerto

Lo alternativo es escribir la regla equivalente especificando el puerto en lugar del perfil de aplicación o nombre de servicio. Por ejemplo, esta comanda funciona de la misma manera que las anteriores:

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

Si configuró su servidor SSH para usar un puerto diferente, tendrás que especificar el puerto adecuado. Por ejemplo, si tu servidor SSH está escuchando en el puerto 2222, puedes usar esta comanda 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

Puedes verificar qué reglas se agregaron hasta ahora, incluso cuando el firewall todavía esté deshabilitado, utilizando:

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

Después de confirmar que tengas una regla que permita conexiones entrantes de SSH, 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

Te mostrará una advertencia que dice que la comanda podría interromper conexiones existentes de SSH. Ya has establecido una regla de firewall que permite conexiones SSH, así que debería estar bien continuar. Responde al mensaje con y y haz clic en ENTER.

El firewall está activo. Ejecuta la comanda sudo ufw status verbose para ver las reglas establecidas. El resto de este tutorial cubre cómo usar UFW en detalle, como permitir o denegar diferentes tipos de conexiones.

Step 5 — Permitiendo otras conexiones

En este punto, deberías permitir todas las otras conexiones que tu servidor necesite para responder. Las conexiones que debes permitir dependen de tus necesidades específicas. Ya sabes cómo escribir reglas que permitan conexiones basadas en perfiles de aplicación, nombre de servicio o puerto; ya lo hiciste para SSH en el puerto 22. También puedes hacerlo para:

  • HTTP en el puerto 80, que es el que usan los servidores web sin encriptar, utilizando sudo ufw allow http o sudo ufw allow 80
  • HTTPS en el puerto 443, que es el que usan los servidores web encriptados, utilizando sudo ufw allow https o sudo ufw allow 443
  • Apache con ambos HTTP y HTTPS, utilizando sudo ufw allow 'Apache Full'
  • Nginx con ambos HTTP y HTTPS, utilizando sudo ufw allow 'Nginx Full'

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

Hay varias otras maneras de permitir conexiones, además de especificar un puerto o nombre conocido de servicio. Vendrán algunos de estos próximamente.

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 puertos 60006007, usa estos comandos:

  1. sudo ufw allow 6000:6007/tcp
  2. 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 permite automáticamente ambos protocolos, lo cual está bien en la mayoría de los casos.

Direcciones IP Específicas

Al trabajar 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 IP de trabajo o casa 203.0.113.4, necesitas usar el parámetro from, proporcionando luego 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), usa este comando:

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

Subredes

Para permitir una subred de direcciones IP, puedes hacerlo usando la notación CIDR para especificar un enmascarado de red. Por ejemplo, si quieres permitir todas las direcciones IP que van desde 203.0.113.1 hasta 203.0.113.254, podrías usar esta orden:

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

De manera similar, también puedes especificar el puerto destino al que la subred 203.0.113.0/24 está permitida conectarse. Aquí volvemos a usar 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 deseas crear una regla de fuego que solo aplique a una interfaz de red específica, puedes hacerlo especificando “allow in on” seguido por el nombre de la interfaz de red.

Puedes buscar tu interfaz de red antes de continuar. Para hacerlo, utilice esta orden:

  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 se llaman algo como eth0 o enp3s2.

Así pues, si tu servidor tiene una interfaz de red pública llamada eth0, podrías permitir trafico HTTP (puerto 80) a ella con esta orden:

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

Esto permitiría que tu servidor reciba solicitudes HTTP de la red pública internet.

Para que el servidor de base de datos MySQL (puerto 3306) escuchara conexiones en la interfaz de red privada eth1, por ejemplo, podrías usar esta comanda:

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

Esto permitiría que otros servidores en tu red privada conectaran a tu 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 crear una política de fuego que requiere de reglas que explicitamente permitan puertos específicos y direcciones IP.

Pero a veces deseas denegar conexiones basadas en la dirección IP o subred, tal vez porque sabes que tu servidor está siendo atacado desde allí. También puedes cambiar tu política predeterminada de inicio a permitir (que no es recomendable), entonces necesitarás crear reglas de denegar para cualquier servicio o dirección IP que no quieras permitir conexiones.

Para escribir reglas de denegar, puedes usar las comandas previas descritas, reemplazando permitir con denegar.

Por ejemplo, para denegar conexiones HTTP se podría utilizar esta comanda:

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

O si quieres denegar todas las conexiones de 203.0.113.4 podrías usar esta comanda:

  1. sudo ufw deny from 203.0.113.4
Output
Rule added

En algunos casos, también podrías querer bloquear conexiones salientes desde el servidor. Para negar todas las conexiones salientes del servidor en un puerto específico, como el puerto 25 para el tráfico de SMTP, puedes usar deny out seguido por el número del puerto:

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

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

Paso 7: Eliminando reglas

Conocer cómo eliminar reglas es tan importante como saber cómo crearlas. Hay dos formas diferentes de especificar qué reglas eliminar: por número o por su denominación humano-leible (similares a cómo se especificaron cuando se crearon).

Eliminando una Regla de UFW Por Número

Para eliminar una regla de UFW por su número, primero deberás obtener una lista numerada de todas tus reglas de fuego. La comanda estatus de UFW tiene una opción para mostrar números junto a cada regla, como muestra 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 desea eliminar la regla número 2, la que permite conexiones al puerto 80 (HTTP), podrías especificarlo en una comanda de eliminación de UFW como esta:

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

Esta le pedirá confirmación y luego eliminará la regla 2, que permite conexiones HTTP. Nota que si hay activado IPv6, también deberías eliminar la correspondiente regla IPv6.
<|observation|>

Eliminando una Regla de UFW por Nombre

En lugar de usar números de reglas, también puedes referirte a una regla por su nombre legible para el humano, que se basa en el tipo de regla (normalmente allow o deny) y el nombre del servicio o número de puerto que fue la meta de esta regla. Por ejemplo, si quieres eliminar una regla allow para un perfil de aplicación llamado Apache Full que fue anteriormente habilitada, podrías usar:

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

La comanda delete funciona de la misma manera para las reglas creadas referenciando un servicio por su nombre o puerto. Por ejemplo, si previamente estableciste 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)

Porque los nombres de servicios son intercambiables con números de puertos cuando se especifican reglas, también podrías referirse a la misma regla como allow 80, en lugar de allow http.

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

Al eliminar reglas por nombre, ambos IPv4 y IPv6 se eliminan si existen.

Paso 8 — Comprobando el Estado de UFW y las Reglas

En cualquier momento, puede comprobar el estado de UFW con este comando:

  1. sudo ufw status verbose

Si UFW está desactivado, lo cual es por defecto, verás algo así:

Output
Status: inactive

Si UFW está activo, lo que debería ser si seguiste el paso 3, la salida decirá que está activo y listará cualquier regla que haya establecido. Por ejemplo, si la configuración del fuego abrio conexiones SSH (puerto 22) desde cualquier lugar, la salida podría parecer 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

Use la comanda status para comprobar cómo ha configurado UFW el fuego.

Paso 9: Desactivar o Restablecer Firewall

Si decides que no quiere usar el fuego UFW, puede desactivarlo con esta comanda:

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

Cualquier regla que haya creado con UFW ya no estará activa. Puedes siempre ejecutar sudo ufw enable si necesitas activarlo más tarde.

Si ya tiene reglas definidas con UFW pero decide que quiere empezar de nuevo, puedes usar la comanda reset:

  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 borrará cualquier regla que hubiera definido anteriormente. Esto te dará un nuevo inicio con UFW. Ten en cuenta que las políticas predeterminadas no cambiaran a sus valores originales, si les modificaste en algún momento.

Despliegue tu aplicación front-end de GitHub usando Plataforma de Aplicaciones de DigitalOcean. Dejé a DigitalOcean la responsabilidad de escalar tu aplicación.

Conclusión

Ahora tu muro de fuego está configurado para permitir conexiones entrantes de SSH. Asegúrate de permitir cualquier otra conexión entrante que tu servidor necesite, mientras limites cualesquiera conexiones innecesarias, así tu servidor será funcional y seguro.

Para aprender más sobre configuraciones comunes de UFW, consulta la guía básica de UFW: reglas y comandos comunes.

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