🐋
Apuntes Sistemas
  • ⚓Presentación
  • 📊Sistemas y Servidores
    • Personalizar el prompt de Windows
    • Utilidad de manejo de apps para Windows
    • PRACTICA: Arranque dual Windows y Ubuntu
    • 🚧SysLinuxOS: el SO para ASIX
    • Comandos Linux
      • PRACTICA - Ejercicio de práctica comandos
      • 🚧Instalación de paquetes
      • Apuntes Linux: blue/red team
      • Ejemplos de bash
      • Listado de comandos de Linux
    • Comandos Windows
      • 🚧Apuntes Powershell
      • Bucles FOR con batch
      • Scripts de práctica de Windows
    • Prácticas con Windows 10
    • Configuración de netplan
    • Terminal shell
      • SSH
      • 🚧Ghostty
      • 🚧Warp: la terminal inteligente
      • tmux: paneles de terminal
      • Tabby: Mejorar terminal
      • Conexión SSH en red NAT con VirtualBox
      • TheFuck!: Corrección de comandos
      • Wave: Mejorar terminal Linux
      • 🚧Registros de sesiones
    • Instalación manual de Wordpress en CDMON
    • 🏗️Proxmox
    • 🚧TrueNAS
    • Docker
      • Instalación de Docker
      • Dockerfiles
      • Volúmenes de docker
      • Deployment web con Docker con ejemplos
        • 🚧PRACTICA: Node.js con docker
      • Docker Compose
        • Ejemplo 1: Implantación de Wordpress
        • Ejemplo 2: Implementación de servidor con Nginx, Flask y mySQL
        • Ejemplo 3: Implantación de onlyoffice
        • 🚧Ejemplo 4: Passbolt
        • 🚧PRACTICA: Creando una web de emulación de juegos con docker-compose
      • Monitorización con Grafana en Docker
      • Pi-hole con docker
      • Actividad clase: Deployment app
      • Proyectos self-hosted de docker
    • 🚧Ansible
      • Configuración de laboratorio de ansible
    • 🚧Monitorización de servicios y redes
      • Servicios y cronjobs
      • 1Panel
      • 🚧WatchYourLAN
      • 🚧Uptime-kuma
      • 🚧Netdata
      • 🚧Prometheus + Grafana + Loki
    • LDAP
      • 🚧Gestión gráfica de LDAP
      • Carpetas compartidas NFS
      • PRACTICA: Infraestructura LDAP
  • 🗃️Servicios
    • 🚧Servidor hosting público
    • DHCP
      • DHCP con Ubuntu
      • 🦖DHCP & DNS script
      • DHCP con Alpine
        • Alpine - configuración de red
    • DNS
      • 😡Comprobación DNS
      • Script para enumeración DNS
      • DNS con ubuntu server
      • 🏗️DNSmasq
      • 🚧Securizar servidor DNS
    • Web
      • IIS con Windows server
      • Apache
        • Instalación de LAMP en Ubuntu
          • Prueba de servidor LAMP
          • 🚧Configuración de seguridad de Ubuntu
          • Creación de un VirtualHost en LAMP
          • Creación de varios VirtualHosts en LAMP
          • 🚧Instalación por script de LAMP
        • Aplicaciones con LAMP
          • Instalación de WP en entorno LAMP
          • 🚧Instalación de MantisBT en LAMP
            • 👷Guía de MantisBT
          • 🚧Instalación de QDPM con LAMP
      • Nginx
        • Virtualhosts
        • Instalando Wordpress en nginx
      • 👷MEAN stack
      • 👷‍♂️Caddy
      • 🚧Plesk
      • 🚧Ajenti -Web interface
    • 🏗️Proxy
      • Nginx como proxy inverso y balanceador
      • 🚧Zoraxy
    • Mailing
      • 🚧Servidor Mail con cloudfare
      • 🚧Reenvío de correos de root
      • 🚧Roundcube como MUA
      • Comprobación ESMTP
      • 🚧Seguridad en mailing
      • 🚧Mailhog
    • 🏗️File transfer
      • 🚧FTP
      • Git
    • Sistemas de comunicación instantánea
      • Comunicación mediante CLI
      • Ejabberd - XMPP
        • 🚧Ejabberd con docker
      • 🚧Openfire - XMPP
      • 🚧Comunicaciones servidor-móvil
    • 🏗️Multimedia services
      • Stremio
      • Ver anime por CLI
      • Jellyfin
      • 🚧HLS sobre Apache
      • 🚧Servicio autohospedado de videoconferencia
      • 🚧Morphos: Conversor docs
      • 🚧Reproductores de música en CLI
      • 🚧Icecast - música en streaming
      • 🚧RTMP-HLS server
      • 🚧Guacamole
  • 🖱️Hardware
    • 🚧Identificando conectores
    • Curso de electrónica analógica
    • Alcanzar los 3200MHz con la RAM
    • Calculadora de cuellos de botella
    • 🚧PXE: Bootear sistemas en red
    • 🚧PRÁCTICA - Clonación de disco con Clonezilla
    • Logitech iFixit
  • 🕸️Redes
    • Apuntes IPv4 Alina
    • ¿Cómo diferenciar tantos elementos de red?
    • 🚧IPv6
    • PRÁCTICA - Subneteo con IPcalc en Linux
    • PRÁCTICA - Comandos de red en Windows
    • 🚧PRÁCTICA - Comandos de red en Linux
    • Herramientas de red
      • 🚧TCPDump: analizado de paquetes en red
      • PRÁCTICA - Netsh
      • 🚧PRÁCTICA - mtr.ping.pe
      • 🚧Netcat
    • Wireshark
    • VPN y escritorio remoto
      • Comunicación punto a punto con ngrok
      • 🚧VPN
    • Escaneo de red
      • PRÁCTICA - Mapeado de red con Draw.io
      • 🚧PRÁCTICA - Nmap/Zenmap
    • Redes inalámbricas
      • Wi-fi
        • 🚧PRÁCTICA - Configuración de router
        • 🚧PRÁCTICA - Como hacer un Wifi Heatmap
        • 🚧Seguridad de redes inalámbricas
        • PRÁCTICA - Crackear la contraseña del Wifi con WPA/WPA2
    • PRÁCTICA - Usar SSH en Cisco packet tracer
  • 🛑Ciberseguridad
    • 🚧Securizando un servidor Linux
      • Protégete de ataques de fuerza bruta con Fail2ban
      • Firewall
        • UFW (uncomplicated firewall)
          • GUFW - Interfaz gráfica de ufw
        • 🚧IPTables
        • 🚧PFsense
          • 🚧DMZ con PFsense
      • 🚧Passbolt: gestor de contraseñas autohospedado
      • 🚧Hashes y encriptación
      • 🚧Certificados SSL/TLS
      • Copias de seguridad
    • 🚧Alerta de escaneo de puertos
    • 🚧Google dorks
    • 🚧Enumeración DNS
    • Comandos destructivos de linux
    • Webs enseñanza cyber
    • Wireless Pentesting CheatSheet Github
    • The password game!
    • Personal Security Checklist
  • 🔌Arduino
    • Termómetro e higrómetros digitales y online con Arduino
    • Construyendo un coche multipropósito
      • Multi
      • Montaje del auto
    • Arduino con Sigfox para IoT
    • 10 proyectos de Arduino
  • 📚Recursos y libros
    • Media library: libros varios
    • Herramientas básicas de sysadmin
  • 🌍Sostenibilidad y digitalización
    • Portfolio curso digitalización MOOC
    • 🚧Explotación de recursos por IA
    • 🚧Nuevas tecnologias y comunicaciones
    • 🚧Enlaces sobre Inteligencia artificial
Con tecnología de GitBook
En esta página
  • Conceptos Básicos
  • Instalación y Activación
  • Comandos Básicos
  • Ejemplos con Servicios
  • Caso práctico 1: Aplicaciones web
  • Caso práctico 2: Docker
  • Caso práctico 3: MySQL
  • Caso práctico 4: Postfix y Dovecot (Correo)
  • Caso práctico 5: FTP
  • Caso práctico 6: ISC DHCP y Bind9 (DNS)
  • Consejos Avanzados
  • Uso de perfiles de aplicaciones
  • Registro y monitoreo
  • Reglas específicas por dirección y protocolo
  • Resumen
  1. Ciberseguridad
  2. Securizando un servidor Linux
  3. Firewall

UFW (uncomplicated firewall)

AnteriorFirewallSiguienteGUFW - Interfaz gráfica de ufw

Última actualización hace 2 meses

UFW es una herramienta de configuración de cortafuegos (firewall) sencilla y amigable para el usuario, diseñada para facilitar la administración de en sistemas Linux. Permite definir reglas para permitir o bloquear el tráfico de red de forma sencilla.

UFW es una herramienta poderosa y sencilla para administrar un cortafuegos en Ubuntu. Esta guía es un punto de partida; según tu infraestructura, podrás ir refinando las reglas y aplicando medidas adicionales de seguridad. ¡Buena configuración!

Conceptos Básicos

  • Reglas de entrada y salida: Por defecto, UFW bloquea o permite conexiones entrantes o salientes según la configuración inicial. Lo habitual es permitir todas las conexiones salientes y restringir las entrantes.

  • Reglas por puerto y protocolo: Se pueden definir reglas específicas para puertos (por ejemplo, TCP o UDP).

  • Reglas por dirección IP o rango: Puedes permitir o bloquear tráfico de direcciones o subredes específicas.

  • Orden de las reglas: UFW evalúa las reglas en orden, por lo que las reglas más específicas deben agregarse antes de las generales.

Para probar estas configuraciones creamos una máquina virtual ubuntu desktop con un adaptador de red NAT mismamente


Instalación y Activación

Instalación

En la mayoría de las distribuciones Ubuntu, UFW viene preinstalado y activado pero si no fuera así, siempre puedes instalarlo con:

sudo apt update
sudo apt install ufw

Estado inicial y activación

Para ver el estado de UFW:

sudo ufw status verbose

Para resetearlo:

sudo ufw reset

Para recargarlo:

sudo ufw reload

Para activarlo:

sudo ufw enable

Para desactivarlo (si fuese necesario):

sudo ufw disable


Comandos Básicos

  • Cambiar reglas a denegar por defecto: Denegar cualquier comunicación entrante o saliente

    sudo ufw default deny incoming
    sudo ufw default deny outgoing

  • Agregar regla: Permitir el tráfico entrante por el puerto 80 (HTTP):

    sudo ufw allow 80/tcp
    sudo ufw allow out http
    sudo ufw allow in http

Ahora, se podria hacer lo mismo con https

  • Denegar regla: Bloquear el tráfico entrante por el puerto 22 (SSH):

    sudo ufw deny 22/tcp
  • Eliminar una regla: Primero, lista las reglas numeradas:

    sudo ufw status numbered

    Luego elimina la regla deseada, por ejemplo, la regla número 3:

    sudo ufw delete 3
  • Permitir/denegar por IP: Permitir todo el tráfico desde una IP específica:

    sudo ufw allow from 192.168.1.100

    Bloquear una IP específica:

    sudo ufw deny from 10.0.0.5
  • Permitir tráfico en una subred: Por ejemplo, para permitir a toda la subred 192.168.1.0/24:

    sudo ufw allow from 192.168.1.0/24


Ejemplos con Servicios

A continuación se muestran ejemplos de reglas UFW teniendo en cuenta la presencia de diversos servicios:

Caso práctico 1: Aplicaciones web

Porbamos a permitir los puertos comunes:

  • HTTP (80/tcp)

  • HTTPS (443/tcp)

Permitir ambos puertos:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Recargarmos el firewall:

sudo ufw reload

Si tratamos de acceder a una pagina web, veremos que seguirá fallando, esto es debido al DNS (53) que tampoco esta funcionando, activémoslo:

sudo ufw allow out 53

Ten en cuenta que este comando habilitara las peticiones de salida de DNS, si nuestro servidor fuera el propio DNS deberiamos usar este comando:

sudo ufw allow 53/udp

Deberíamos recuperar el acceso ahora si teníamos configurada una política de negación total.

Caso práctico 2: Docker

  • Configura Docker para que no altere las reglas iptables automáticamente modificando el archivo /etc/docker/daemon.json (agrega "iptables": false) y administra las reglas manualmente.

  • Permite los puertos de los contenedores que deseas exponer. Por ejemplo, si tienes un contenedor en el puerto 8080:

    sudo ufw allow 8080/tcp

Caso práctico 3: MySQL

MySQL utiliza por defecto el puerto 3306/tcp. Si deseas permitir conexiones externas (solo si es necesario y de fuentes confiables):

sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp

Esta regla permite que solo la subred 192.168.1.0/24 se conecte a MySQL, lo cual es más seguro que permitir acceso global.

Caso práctico 4: Postfix y Dovecot (Correo)

  • Postfix (SMTP): Usa el puerto 25/tcp (además de 587 para envío seguro o 465 para SMTPS).

    sudo ufw allow 25/tcp
    sudo ufw allow 587/tcp
  • Dovecot (IMAP/POP3): Usa los puertos 143/tcp (IMAP), 993/tcp (IMAPS), 110/tcp (POP3) y 995/tcp (POP3S).

    sudo ufw allow 143/tcp
    sudo ufw allow 993/tcp
    sudo ufw allow 110/tcp
    sudo ufw allow 995/tcp

Caso práctico 5: FTP

FTP tradicional utiliza el puerto 21/tcp, pero también puede requerir una configuración para los puertos pasivos:

  • Permitir el puerto FTP:

    sudo ufw allow 21/tcp
  • Configura el rango de puertos pasivos en el servidor FTP (por ejemplo, 30000-31000) y permite ese rango:

    sudo ufw allow 30000:31000/tcp

Caso práctico 6: ISC DHCP y Bind9 (DNS)

El servidor DHCP utiliza varios puertos y protocolos (normalmente UDP 67 y 68). En un servidor DHCP:

sudo ufw allow 67/udp
sudo ufw allow 68/udp

Bind9 utiliza el puerto 53 en TCP y UDP:

sudo ufw allow 53/tcp
sudo ufw allow 53/udp

Ten en cuenta que normalmente estos servicios se utilizan en redes locales y no se exponen a Internet.


Consejos Avanzados

Uso de perfiles de aplicaciones

UFW permite gestionar reglas mediante perfiles predefinidos de aplicaciones, para ver los perfiles disponibles:

sudo ufw app list

Si se muestra un perfil para un servicio, puedes permitirlo con:

sudo ufw allow "OpenSSH"

Estos perfiles suelen incluir las reglas necesarias para los puertos requeridos por el servicio, por ejemplo, con OpenSSH negaremos el servicio por SSH.

Registro y monitoreo

Habilita el registro para monitorear la actividad:

sudo ufw logging on

Los registros se almacenan en /var/log/ufw.log, lo que facilita identificar intentos de acceso no autorizados.

Reglas específicas por dirección y protocolo

Si necesitas reglas más específicas, por ejemplo, permitir solo conexiones seguras desde una IP determinada:

sudo ufw allow from 203.0.113.5 to any port 443 proto tcp

Esto es especialmente útil para acceder a paneles de administración o servicios sensibles.

Caso ejemplo: Configuración de UFW para Control de Acceso en una Red

Imaginemos un escenario real donde administramos una red interna y necesitamos controlar el acceso de diferentes usuarios a ciertos servicios dentro de la empresa. Y donde nuestro objetivo es:

  1. Permitir que solo ciertos usuarios (por IP o subred) accedan a un servidor MySQL.

  2. Permitir acceso a un servidor DNS interno solo para clientes internos.

  3. Bloquear el acceso de un usuario específico a un servicio específico (por ejemplo, denegar acceso a un servidor FTP para una IP en particular).

Estos son los dato de la red:

  • La empresa tiene una red local: 192.168.1.0/24

  • Hay un servidor con MySQL (192.168.1.100, puerto 3306) y FTP (192.168.1.100, puerto 21).

  • Hay otro servidor también en BIND9 (DNS) en 192.168.1.200, puerto 53).

  • Un usuario con la IP 192.168.1.50 necesita ser bloqueado para acceder al servidor FTP.

Configuración Paso a Paso

1️⃣ Restringir el acceso a MySQL solo a ciertos usuarios

Por seguridad, MySQL no debe estar accesible desde toda la red. Solo dos máquinas administrativas deben poder conectarse:

  • Administrador 1: 192.168.1.10

  • Administrador 2: 192.168.1.20

🔹 Configuramos UFW en el servidor MySQL (192.168.1.100) para permitir solo estas IPs:

sudo ufw allow from 192.168.1.10 to any port 3306 proto tcp
sudo ufw allow from 192.168.1.20 to any port 3306 proto tcp
sudo ufw deny 3306/tcp  # Bloquear acceso a MySQL para cualquier otra IP

✅ Resultado: Solo los administradores pueden conectarse a MySQL desde sus direcciones IP específicas.


2️⃣ Permitir acceso al servidor DNS solo para clientes internos

El servidor de DNS (192.168.1.200) solo debe atender consultas de la red local (192.168.1.0/24).

🔹 Configuramos UFW en el servidor DNS para aceptar tráfico solo desde la red interna:

sudo ufw allow from 192.168.1.0/24 to any port 53 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 53 proto udp
sudo ufw deny 53  # Bloquear acceso al DNS desde cualquier otro origen

✅ Resultado: Solo las máquinas dentro de la red local pueden usar este servidor DNS. Si alguien externo intenta consultar, será bloqueado.


3️⃣ Bloquear acceso al servidor FTP para un usuario específico

El usuario con la IP 192.168.1.50 no debe poder acceder al FTP en 192.168.1.100.

🔹 Configuramos UFW en el servidor FTP (192.168.1.100) para bloquear esta IP:

sudo ufw deny from 192.168.1.50 to any port 21 proto tcp

✅ Resultado: Cualquier otro usuario en la red puede acceder al FTP, pero 192.168.1.50 será bloqueado.


Verificación Final

Para ver todas las reglas aplicadas, ejecutamos:

sudo ufw status verbose

🔍 Salida esperada (resumida):

Status: active

To                         Action      From
--                         ------      ----
3306/tcp                   ALLOW       192.168.1.10
3306/tcp                   ALLOW       192.168.1.20
3306/tcp                   DENY        Anywhere
53/tcp                     ALLOW       192.168.1.0/24
53/udp                     ALLOW       192.168.1.0/24
53                         DENY        Anywhere
21/tcp                     DENY        192.168.1.50

Resumen

Docker, por defecto, crea sus propias reglas , lo que puede interferir con UFW, por eso es interesante, algunas recomendaciones:

iptables
iptables
🛑
🚧
Page cover image