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:
Bashsudo apt update && sudo apt install -y ufw
- Una segunda sesión SSH abierta mientras modificas el cortafuegos.
🧭 Qué rangos bloquear
| Rango | Uso |
|---|---|
10.0.0.0/8 | Privado RFC1918 |
172.16.0.0/12 | Privado RFC1918 |
192.168.0.0/16 | Privado RFC1918 |
100.64.0.0/10 | NAT de operador (RFC6598) |
169.254.0.0/16 | Link-local IPv4 |
192.0.0.0/24 | Asignaciones de protocolo IETF |
198.18.0.0/15 | Pruebas de rendimiento |
fc00::/7 | Direcciones 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:
Baship 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.
Bashsudo 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:
Bashsudo 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):
Bashsudo 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:
Bashsudo 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:
Bashsudo 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:
TEXT1# 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:
Bashsudo 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:
Bashsudo 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:
Bashsudo 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.