Bloquear el tráfico saliente a redes privadas con UFW

3 min
Hosting VPS/VDS

Cuando un script comprometido o una aplicación mal configurada empieza a sondear direcciones 10.x o 192.168.x, el tráfico sale de tu servidor y a menudo provoca avisos de abuso desde la red. Bloquear las conexiones salientes a rangos privados es una protección sencilla en cualquier VPS Linux Infrawire. Esta guía muestra cómo hacerlo con UFW sin romper el DNS ni tu propia conectividad.

📋 Requisitos previos

  • Un VPS con acceso root por SSH, con Ubuntu 24.04 o Debian 12 (UFW está disponible en ambos).
  • Nociones básicas de UFW. Si aún no está instalado:
Bash
sudo apt update && sudo apt install -y ufw
  • Una segunda sesión SSH abierta mientras modificas el cortafuegos.

🧭 Qué rangos bloquear

RangoUso
10.0.0.0/8Privado RFC1918
172.16.0.0/12Privado RFC1918
192.168.0.0/16Privado RFC1918
100.64.0.0/10NAT de operador (RFC6598)
169.254.0.0/16Link-local IPv4
192.0.0.0/24Asignaciones de protocolo IETF
198.18.0.0/15Pruebas de rendimiento
fc00::/7Direcciones locales únicas IPv6

No bloquees fe80::/10: IPv6 usa direcciones link-local para el descubrimiento de vecinos y a menudo para la puerta de enlace por defecto, así que bloquearlas corta IPv6 por completo.

🔍 Comprueba primero lo que necesita tu VPS

Si tu puerta de enlace o tu resolvedor DNS están en un rango privado, un bloqueo general cortará tu red. Revisa tu configuración antes de añadir ninguna regla:

Bash
ip route ip -6 route cat /etc/resolv.conf resolvectl status | grep -E 'DNS Servers|Link'

Si un resolvedor o un servicio del que dependes tiene dirección privada (PRIVATE_DNS_IP), permítelo explícitamente y pon esa regla la primera, como se muestra abajo. Si todo lo que usas es público, puedes saltarte este paso.

🧱 Método 1: ufw deny out

Asegúrate de que SSH siga accesible y fija las políticas por defecto. Las respuestas entrantes a tus sesiones SSH no se ven afectadas por reglas salientes sobre rangos privados.

Bash
sudo ufw allow 22/tcp sudo ufw default deny incoming sudo ufw default allow outgoing

Si necesitas una excepción, insértala en la posición 1 para que se evalúe antes que las denegaciones:

Bash
sudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53

Ahora añade las denegaciones, una por rango (UFW evalúa las reglas en orden y gana la primera que coincide):

Bash
sudo ufw deny out to 10.0.0.0/8 sudo ufw deny out to 172.16.0.0/12 sudo ufw deny out to 192.168.0.0/16 sudo ufw deny out to 100.64.0.0/10 sudo ufw deny out to 169.254.0.0/16 sudo ufw deny out to 192.0.0.0/24 sudo ufw deny out to 198.18.0.0/15 sudo ufw deny out to fc00::/7 sudo ufw enable

ufw enable puede avisar de que podría interrumpir las conexiones SSH; como el puerto 22 está permitido, responde y. Revisa el orden con:

Bash
sudo ufw status numbered

📄 Método 2: before.rules

Si prefieres un único bloque de reglas aplicado antes de las reglas de usuario, edita /etc/ufw/before.rules. Haz antes una copia de seguridad:

Bash
sudo cp /etc/ufw/before.rules /etc/ufw/before.rules.bak sudo nano /etc/ufw/before.rules

En la sección *filter, después de las líneas que aceptan el loopback y las conexiones establecidas, añade:

TEXT
1# Block outbound traffic to private networks 2-A ufw-before-output -d 10.0.0.0/8 -j REJECT 3-A ufw-before-output -d 172.16.0.0/12 -j REJECT 4-A ufw-before-output -d 192.168.0.0/16 -j REJECT 5-A ufw-before-output -d 100.64.0.0/10 -j REJECT 6-A ufw-before-output -d 169.254.0.0/16 -j REJECT

IPv6 tiene su propio archivo, /etc/ufw/before6.rules, con la cadena ufw-before-output:

TEXT
-A ufw-before-output -d fc00::/7 -j REJECT

Coloca una excepción para PRIVATE_DNS_IP justo encima de estas líneas con -A ufw-before-output -d PRIVATE_DNS_IP -j ACCEPT. Recarga:

Bash
sudo ufw reload

REJECT responde de inmediato con un error, de modo que las aplicaciones fallan rápido en lugar de esperar un timeout. Usa -j DROP si prefieres el silencio.

✅ Verificar

Las reglas deben estar cargadas y los destinos bloqueados deben fallar, mientras los públicos siguen funcionando:

Bash
sudo ufw status verbose ping -c 1 10.0.0.1 # debe fallar ping -c 1 192.168.1.1 # debe fallar curl -m 5 http://10.0.0.1 # debe fallar ping -c 2 1.1.1.1 # debe funcionar dig +short example.com # debe resolverse curl -I https://www.debian.org

Con ufw deny out, el ping fallido suele indicar Operation not permitted. Los contadores de paquetes confirman las coincidencias:

Bash
sudo iptables -L ufw-user-output -n -v sudo iptables -L ufw-before-output -n -v

🛠️ Solución de problemas

El DNS dejó de funcionar. Tu resolvedor está en un rango privado. Corrige el orden con sudo ufw status numbered y añade sudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53. También puedes pasar a un resolvedor público en tu configuración de red.

IPv6 falla tras el cambio. Probablemente bloqueaste fe80::/10 o una puerta de enlace dentro de fc00::/7. Elimina la regla con sudo ufw delete deny out to fc00::/7 y vuelve a crear solo lo necesario.

Te quedaste sin acceso a un servicio de una red privada (VPN, API interna). Añade una regla de permiso para esa dirección exacta con ufw insert 1 allow out to PRIVATE_IP. Si lo bloqueado es el propio SSH, usa cualquier acceso de consola al servidor y ejecuta sudo ufw disable.


🔒 Tu VPS ya no puede escanear redes privadas por accidente: los avisos de abuso de este tipo deberían cesar.

Mantente al día con las últimas ofertas, descuentos y promociones especiales.

Ver promociones

Utilizamos cookies

Utilizamos cookies analíticas para mejorar su experiencia en nuestro sitio. No vendemos datos a terceros. Más información en nuestra política de privacidad.