Conceptos esenciales de UFW: Reglas y comandos comunes del firewall

Introducción

UFW (uncomplicated firewall) es una herramienta de configuración de firewall que se ejecuta sobre iptables, incluido de forma predeterminada en las distribuciones de Ubuntu. Proporciona una interfaz simplificada para configurar casos de uso comunes de firewall a través de la línea de comandos.

Esta guía en formato de hoja de trucos proporciona una referencia rápida a casos de uso comunes de UFW y comandos, incluidos ejemplos de cómo permitir y bloquear servicios por puerto, interfaz de red y dirección IP de origen.

Cómo Usar Esta Guía

  • Esta guía está en formato de hoja de trucos con fragmentos de línea de comandos autocontenidos.
  • Salta a cualquier sección que sea relevante para la tarea que estés tratando de completar.
  • Cuando veas texto resaltado en los comandos de esta guía, ten en cuenta que este texto debería referirse a direcciones IP de tu propia red.

Recuerda que puedes verificar tu conjunto de reglas UFW actual con sudo ufw status o sudo ufw status verbose.

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

Verificar Estado de UFW

Para verificar si ufw está habilitado, ejecuta:

  1. sudo ufw status
Output
Status: inactive

La salida indicará si tu firewall está activo o no.

Habilitar UFW

Si obtienes un mensaje de Estado: inactivo al ejecutar ufw status, significa que el firewall aún no está habilitado en el sistema. Deberás ejecutar un comando para habilitarlo.

Por defecto, cuando se habilita UFW bloqueará el acceso externo a todos los puertos en un servidor. En la práctica, esto significa que si estás conectado a un servidor vía SSH y habilitas ufw antes de permitir el acceso a través del puerto SSH, serás desconectado. Asegúrate de seguir la sección sobre cómo habilitar el acceso SSH de esta guía antes de habilitar el firewall si ese es tu caso.

Para habilitar UFW en tu sistema, ejecuta:

  1. sudo ufw enable

Verás una salida como esta:

Output
Firewall is active and enabled on system startup

Para ver qué está bloqueado o permitido actualmente, puedes usar el parámetro verbose al ejecutar ufw status, de la siguiente manera:

  1. sudo ufw status
Output
Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), deny (routed) New profiles: skip

Desactivar UFW

Si por alguna razón necesitas desactivar UFW, puedes hacerlo con el siguiente comando:

  1. sudo ufw disable

Ten en cuenta que este comando desactivará completamente el servicio de firewall en tu sistema.

Bloquear una dirección IP

Para bloquear todas las conexiones de red que provienen de una dirección IP específica, ejecute el siguiente comando, reemplazando la dirección IP resaltada con la dirección IP que desea bloquear:

  1. sudo ufw deny from 203.0.113.100
Output
Rule added

En este ejemplo, from 203.0.113.100 especifica una dirección IP fuente de “203.0.113.100”.

Si ejecuta sudo ufw status ahora, verá que la dirección IP especificada está listada como denegada:

Output
Status: active To Action From -- ------ ---- Anywhere DENY 203.0.113.100

Todas las conexiones, entrantes o salientes, están bloqueadas para la dirección IP especificada.

Bloquear una subred

Si necesita bloquear una subred completa, puede utilizar la dirección de la subred como parámetro from en el comando ufw deny. Esto bloquearía todas las direcciones IP en la subred de ejemplo 203.0.113.0/24:

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

Bloquear conexiones entrantes a una interfaz de red

Para bloquear las conexiones entrantes desde una dirección IP específica a una interfaz de red específica, ejecute el siguiente comando, reemplazando la dirección IP resaltada con la dirección IP que desea bloquear:

  1. sudo ufw deny in on eth0 from 203.0.113.100
Output
Rule added

El parámetro in le indica a ufw que aplique la regla solo para conexiones entrantes, y el parámetro on eth0 especifica que la regla se aplica solo para la interfaz eth0. Esto puede ser útil si tiene un sistema con varias interfaces de red (incluidas las virtuales) y necesita bloquear el acceso externo a algunas de estas interfaces, pero no a todas.

Permitir una Dirección IP

Para permitir todas las conexiones de red que se originen desde una dirección IP específica, ejecute el siguiente comando, reemplazando la dirección IP resaltada con la dirección IP a la que desea permitir el acceso:

  1. sudo ufw allow from 203.0.113.101
Output
Rule added

Si ejecuta sudo ufw status ahora, verá una salida similar a esta, mostrando la palabra ALLOW junto a la dirección IP que acaba de agregar.

Output
Status: active To Action From -- ------ ---- ... Anywhere ALLOW 203.0.113.101

También puede permitir conexiones desde toda una subred proporcionando la máscara de subred correspondiente para un host, como 203.0.113.0/24.

Permitir Conexiones Entrantes a una Interfaz de Red

Para permitir conexiones entrantes desde una dirección IP específica a una interfaz de red específica, ejecuta el siguiente comando, reemplazando la dirección IP resaltada con la dirección IP que deseas permitir:

  1. sudo ufw allow in on eth0 from 203.0.113.102
Output
Rule added

El parámetro in le indica a ufw que aplique la regla solo para conexiones entrantes, y el parámetro en eth0 especifica que la regla se aplica solo para la interfaz eth0.

Si ejecutas sudo ufw status ahora, verás una salida similar a esta:

Output
Status: active To Action From -- ------ ---- ... Anywhere on eth0 ALLOW 203.0.113.102

Eliminar Regla de UFW

Para eliminar una regla que configuraste previamente dentro de UFW, utiliza ufw delete seguido de la regla (allow o deny) y la especificación del objetivo. El siguiente ejemplo eliminaría una regla previamente establecida para permitir todas las conexiones desde una dirección IP de 203.0.113.101:

  1. sudo ufw delete allow from 203.0.113.101
Output
Rule deleted

Otra forma de especificar qué regla deseas eliminar es proporcionando el ID de la regla. Esta información se puede obtener con el siguiente comando:

  1. sudo ufw status numbered
Output
Status: active To Action From -- ------ ---- [ 1] Anywhere DENY IN 203.0.113.100 [ 2] Anywhere on eth0 ALLOW IN 203.0.113.102

Desde la salida, puedes ver que hay dos reglas activas. La primera regla, con valores resaltados, niega todas las conexiones provenientes de la dirección IP 203.0.113.100. La segunda regla permite conexiones en la interfaz eth0 provenientes de la dirección IP 203.0.113.102.

Debido a que por defecto UFW ya bloquea todo acceso externo a menos que se permita explícitamente, la primera regla es redundante, por lo que puedes eliminarla. Para eliminar una regla por su ID, ejecuta:

  1. sudo ufw delete 1

Se te pedirá que confirmes la operación y te asegures de que el ID que proporcionas se refiera a la regla correcta que deseas eliminar.

Output
Deleting: deny from 203.0.113.100 Proceed with operation (y|n)? y Rule deleted

Si vuelves a listar tus reglas con sudo ufw status, verás que la regla ha sido eliminada.

Lista de Perfiles de Aplicaciones Disponibles

Al instalar, las aplicaciones que dependen de comunicaciones en red normalmente configurarán un perfil UFW que puedes usar para permitir la conexión desde direcciones externas. Esto suele ser lo mismo que ejecutar ufw allow from, con la ventaja de proporcionar un atajo que abstrae los números de puerto específicos que utiliza un servicio y proporciona una nomenclatura amigable para referenciar servicios.

Para listar qué perfiles están disponibles actualmente, ejecuta lo siguiente:

  1. sudo ufw app list

Si instalaste un servicio como un servidor web u otro software dependiente de la red y no se hizo disponible un perfil dentro de UFW, primero asegúrate de que el servicio esté habilitado. Para servidores remotos, típicamente tendrás OpenSSH disponible fácilmente:

Output
Available applications: OpenSSH

Habilitar Perfil de Aplicación

Para habilitar un perfil de aplicación en UFW, ejecute ufw allow seguido del nombre del perfil de aplicación que desea habilitar, el cual puede obtener con el comando sudo ufw app list. En el siguiente ejemplo, estamos habilitando el perfil de OpenSSH, lo que permitirá todas las conexiones SSH entrantes en el puerto SSH predeterminado.

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

Recuerde entrecomillar los nombres de perfil que consistan en varias palabras, como Nginx HTTPS.

Desactivar Perfil de Aplicación

Para desactivar un perfil de aplicación que haya configurado previamente en UFW, deberá eliminar su regla correspondiente. Por ejemplo, considere la siguiente salida de sudo ufw status:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

Esta salida indica que el perfil de aplicación Nginx Full está actualmente habilitado, permitiendo todas las conexiones al servidor web tanto a través de HTTP como a través de HTTPS. Si desea permitir solo solicitudes HTTPS desde y hacia su servidor web, primero deberá habilitar la regla más restrictiva, que en este caso sería Nginx HTTPS, y luego desactivar la regla actualmente activa de Nginx Full:

  1. sudo ufw allow "Nginx HTTPS"
  2. sudo ufw delete allow "Nginx Full"

Recuerda que puedes listar todos los perfiles de aplicación disponibles con sudo ufw app list.

Permitir SSH

Cuando trabajas con servidores remotos, querrás asegurarte de que el puerto SSH esté abierto a conexiones para poder iniciar sesión en tu servidor de forma remota.

El siguiente comando habilitará el perfil de aplicación UFW de OpenSSH y permitirá todas las conexiones al puerto SSH predeterminado en el servidor:

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

Aunque menos amigable para el usuario, una sintaxis alternativa es especificar el número de puerto exacto del servicio SSH, que normalmente está configurado en 22 de forma predeterminada:

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

Permitir SSH entrante desde una dirección IP o subred específica

Para permitir conexiones entrantes desde una dirección IP o subred específica, incluirás una directiva from para definir la fuente de la conexión. Esto requerirá que también especifiques la dirección de destino con un parámetro to. Para bloquear esta regla solo a SSH, limitarás el proto (protocolo) a tcp y luego usarás el parámetro port y lo configurarás en 22, el puerto predeterminado de SSH.

El siguiente comando permitirá solo conexiones SSH provenientes de la dirección IP 203.0.113.103:

  1. sudo ufw allow from 203.0.113.103 proto tcp to any port 22
Output
Rule added

También puedes usar una dirección de subred como parámetro from para permitir conexiones SSH entrantes desde toda una red:

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

Permitir Rsync Entrante desde una Dirección IP o Subred Específica

El programa Rsync, que se ejecuta en el puerto 873, puede ser usado para transferir archivos de una computadora a otra.

Para permitir conexiones entrantes de rsync desde una dirección IP específica o subred, usa el parámetro from para especificar la dirección IP de origen y el parámetro port para establecer el puerto de destino 873.
El siguiente comando permitirá solo conexiones Rsync provenientes de la dirección IP 203.0.113.103:

  1. sudo ufw allow from 203.0.113.103 to any port 873
Output
Rule added

Para permitir que toda la subred 203.0.113.0/24 pueda rsync a tu servidor, ejecuta:

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

Permitir Nginx HTTP / HTTPS

Al instalarlo, el servidor web Nginx configura varios perfiles de UFW dentro del servidor. Una vez que tenga Nginx instalado y habilitado como servicio, ejecute el siguiente comando para identificar qué perfiles están disponibles:

  1. sudo ufw app list | grep Nginx
Output
Nginx Full Nginx HTTP Nginx HTTPS

Para permitir tanto el tráfico HTTP como HTTPS, elija Nginx Completo. De lo contrario, elija Nginx HTTP para permitir solo HTTP o Nginx HTTPS para permitir solo HTTPS.

El siguiente comando permitirá tanto el tráfico HTTP como HTTPS en el servidor (puertos 80 y 443):

  1. sudo ufw allow "Nginx Full"
Output
Rule added Rule added (v6)

Permitir Apache HTTP / HTTPS

Al instalarlo, el servidor web Apache configura varios perfiles de UFW dentro del servidor. Una vez que tenga Apache instalado y habilitado como servicio, ejecute el siguiente comando para identificar qué perfiles están disponibles:

  1. sudo ufw app list | grep Apache
Output
Apache Apache Full Apache Secure

Para permitir tanto el tráfico HTTP como HTTPS, elija Apache Completo. De lo contrario, elija Apache para HTTP o Apache Seguro para HTTPS.

El siguiente comando permitirá tanto el tráfico HTTP como HTTPS en el servidor (puertos 80 y 443):

  1. sudo ufw allow "Nginx Full"
Output
Rule added Rule added (v6)

Permitir todo el tráfico entrante HTTP (puerto 80)

Los servidores web, como Apache y Nginx, típicamente escuchan las solicitudes HTTP en el puerto 80. Si tu política predeterminada para el tráfico entrante está configurada para denegar o rechazar, deberás crear una regla de UFW para permitir el acceso externo en el puerto 80. Puedes usar tanto el número de puerto como el nombre del servicio (http) como parámetro para este comando.

Para permitir todas las conexiones entrantes HTTP (puerto 80), ejecuta:

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

Una sintaxis alternativa es especificar el número de puerto del servicio HTTP:

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

Permitir Todas las Conexiones Entrantes HTTPS (puerto 443)

HTTPS típicamente se ejecuta en el puerto 443. Si tu política predeterminada para el tráfico entrante está configurada para denegar o rechazar, deberás crear una regla de UFW para permitir el acceso externo en el puerto 443. Puedes usar tanto el número de puerto como el nombre del servicio (https) como parámetro para este comando.

Para permitir todas las conexiones entrantes HTTPS (puerto 443), ejecuta:

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

Una sintaxis alternativa es especificar el número de puerto del servicio HTTPS:

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

Permitir Todas las Conexiones Entrantes HTTP y HTTPS

Si deseas permitir tanto el tráfico HTTP como HTTPS, puedes crear una regla única que permita ambos puertos. Este uso requiere que también definas el protocolo con el parámetro proto, que en este caso debería establecerse en tcp.

Para permitir todas las conexiones entrantes HTTP y HTTPS (puertos 80 y 443), ejecuta:

  1. sudo ufw allow proto tcp from any to any port 80,443
Output
Rule added Rule added (v6)

Permitir la Conexión de MySQL desde una Dirección IP o Subred Específica

MySQL escucha conexiones de clientes en el puerto 3306. Si tu servidor de base de datos MySQL está siendo utilizado por un cliente en un servidor remoto, necesitarás crear una regla UFW para permitir ese acceso.

Para permitir conexiones entrantes de MySQL desde una dirección IP específica o una subred, utiliza el parámetro from para especificar la dirección IP de origen y el parámetro port para establecer el puerto de destino 3306.

El siguiente comando permitirá que la dirección IP 203.0.113.103 se conecte al puerto MySQL del servidor:

  1. sudo ufw allow from 203.0.113.103 to any port 3306
Output
Rule added

Para permitir que toda la subred 203.0.113.0/24 pueda conectarse a tu servidor MySQL, ejecuta:

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

Permitir la conexión de PostgreSQL desde una dirección IP específica o una subred

PostgreSQL escucha las conexiones de clientes en el puerto 5432. Si su servidor de base de datos PostgreSQL está siendo utilizado por un cliente en un servidor remoto, es necesario asegurarse de permitir ese tráfico.

Para permitir conexiones entrantes de PostgreSQL desde una dirección IP específica o una subred, especifique la fuente con el parámetro from y establezca el puerto en 5432:

  1. sudo ufw allow from 203.0.113.103 to any port 5432
Output
Rule added

Para permitir que toda la subred 203.0.113.0/24 pueda conectarse a su servidor PostgreSQL, ejecute:

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

Bloquear el correo SMTP saliente

Los servidores de correo, como Sendmail y Postfix, suelen utilizar el puerto 25 para el tráfico SMTP. Si su servidor no debe enviar correo saliente, es posible que desee bloquear ese tipo de tráfico. Para bloquear las conexiones SMTP salientes, ejecute:

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

Esto configura su firewall para descartar todo el tráfico saliente en el puerto 25. Si necesita rechazar conexiones salientes en un número de puerto diferente, puede repetir este comando y reemplazar 25 con el número de puerto que desea bloquear.

Conclusión

UFW es una herramienta poderosa que puede mejorar considerablemente la seguridad de tus servidores cuando se configura correctamente. Esta guía de referencia cubre algunas reglas comunes de UFW que se utilizan con frecuencia para configurar un firewall en Ubuntu.

La mayoría de los comandos en esta guía pueden adaptarse para satisfacer diferentes casos de uso y escenarios, cambiando parámetros como la dirección IP de origen y/o el puerto de destino. Para obtener información más detallada sobre cada parámetro de comando y los modificadores disponibles, puedes utilizar la utilidad man para consultar el manual de UFW:

  1. man ufw

La página oficial de UFW en la documentación de Ubuntu es otro recurso que puedes utilizar como referencia para casos de uso más avanzados y ejemplos.

Source:
https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands