Todo aquel que alguna vez ha configurado un servidor o ha intentado entender por qué una aplicación web «no ve» la base en el contenedor vecino se ha topado con la expresión mágica «escaneo de puertos». Parece que no puede ser más sencillo: basta comprobar si el puerto necesario está abierto. Pero luego resulta que el «puerto» necesario lo está escuchando otro proceso, o los paquetes toman rutas indirectas a través de iptables, y ya estás hasta las rodillas en tcpdump, aunque solo querías saber: «¿Y el 5432 está vivo?»
Para no tener que arrancar wireshark antes de tiempo, aquí tienen una guía detallada (y en ocasiones irónica) sobre los escáneres de Linux más populares.
Por qué es necesario escanear puertos
El escaneo no es solo para «hackear». Con mayor frecuencia se utiliza para:
- Auditoría de las propias redes — ¿y si una interfaz de administración de Jenkins quedó expuesta por accidente?
- Triage de incidentes — si un servicio no responde, lo primero es comprobar si el puerto está abierto o si un cortafuegos lo está bloqueando silenciosamente.
- Monitorización e inventario — me he encontrado redes corporativas donde la lista de servidores vivía en Excel. Un escáner aporta mucha claridad a esas infraestructuras.
- Tests de penetración — sí, sin escaneo de puertos no se llega muy lejos.
Breve anatomía de un puerto TCP/UDP (para no confundirse después)
El puerto es una «puerta» virtual hacia el proceso que escucha (listen) conexiones entrantes. La puerta TCP tiene un picaporte (el apretón de manos de tres fases), la de UDP no — entra quien quiera, pero no hay garantías de entrega. El escáner, en términos generales:
- Construye un paquete (SYN para TCP, un paquete vacío para UDP).
- Lo envía al IP y puerto objetivo.
- Observa la respuesta: SYN-ACK → puerto abierto, RST → cerrado, silencio → filtrado.
Ese conocimiento es suficiente para interpretar los registros de nmap y no asustarse con la opción -sS.
nmap: el abuelo de los escáneres, que aún sigue en forma
nmap apareció en 1997, y desde entonces su interfaz ha ido acumulando opciones como si fuera un abeto de Navidad sin podar durante 28 años. Por otro lado, nmap es una navaja suiza que hace prácticamente de todo.
Instalación
# Debian/Ubuntu
sudo apt install nmap
# RHEL/Fedora
sudo dnf install nmap
Ejemplos básicos
- Escanear los 1000 puertos más comunes en un host:
nmap 192.168.1.10 - Rango completo TCP + UDP:
nmap -sS -sU -p- 192.168.1.10 - Escaneo de toda una subred /24:
nmap -sn 192.168.1.0/24(solo ping-scan, rápido para averiguar quién está activo) - Detección de SO y servicios:
nmap -A 192.168.1.10 - Modo de alta concurrencia:
nmap --min-rate 5000 -p 1-65535 192.168.1.10– rápido, pero puede despertar sospechas en un IDS.
La opción -A añade detección de SO, intentos de enumeración de servicios (scripts NSE) y un montón de detalles útiles, pero puede generar mucho ruido en los registros. Por eso en producción primero «tanteamos» con -sS (SYN scan medio abierto) y luego usamos -A.
¿Cuándo nmap no es adecuado?
Si necesitas escanear un /16 en un minuto o quieres evitar usar sudo (el SYN-scan requiere raw sockets), entonces entran en escena herramientas «turbo rápidas».
masscan: velocidad con esteroides
masscan envía paquetes directamente al adaptador de red, por eso puede «verter» millones de paquetes por segundo. El autor advierte con sinceridad: «Ejecuta con precaución, o podrías provocar un DOS en una red ajena accidentalmente».
Instalación
git clone [URL=https://github.com/robertdavidgraham/masscan]https://github.com/robertdavidgraham/masscan[/URL]
cd masscan
make && sudo make install
Atajos principales
- Escaneo ultrarrápido de un puerto en /16:
sudo masscan 10.0.0.0/16 -p80 --max-rate 100000 - Todos los puertos TCP en un host:
sudo masscan 192.168.1.10 -p0-65535 --rate 2000 - Exportar en XML compatible con nmap:
--output-format xml --output-filename scan.xml
masscan es ideal para trazos amplios — encuentra rápidamente puertos activos para luego detallar con nmap.
rustscan: un puente amigable entre masscan y nmap
Si masscan es una máquina sin alma, rustscan intenta ser una envoltura elegante que impulsa la acción. Escanea hosts con masscan y luego pasa los puertos abiertos a nmap para el fingerprinting. Todo ello aprovechando el I/O asincrónico y las bondades de Rust.
Ejemplo de cadena completa
rustscan -a 192.168.1.10 --ulimit 5000 -- -A -sC
Tras los dos guiones (--) van las opciones puras de nmap, y --ulimit es una forma práctica de aumentar el número de sockets concurrentes sin lidiar con ulimit -n.
netcat (nc): la navaja suiza para tocar puertos
nc suele conocerse como «telnet a lo bestia», y también sirve para escanear puertos. Eso sí, sin grandes pretensiones.
Mini-escaneo de 10 puertos
nc -zv 192.168.1.10 20-30
# -z — sin E/S (solo «tocar»)
# -v — detallado
La utilidad es práctica cuando necesitas comprobar un par de puertos desde un script y no quieres cargar con el pesado nmap.
ss y lsof: una mirada local desde dentro
A veces un escaneo externo muestra un puerto cerrado cuando la aplicación cree que todo está bien. Entonces abrimos una «radiografía» en el propio servidor:
ss — el netstat moderno
ss -tulwn
# t — TCP, u — UDP, l — escucha, w — datos sin procesar, n — no resolver DNS
Un truco útil — filtrar por puerto: ss -ltn sport = :8080
lsof — muestra QUIÉN mantiene el puerto
sudo lsof -i :5432
Obtendrás el nombre del proceso, PID e incluso la ruta al binario. Útil cuando «otro Postgres» ocupa por accidente el puerto de la base de datos de producción.
Escaneo UDP: por qué todo es tan doloroso
Con UDP ocurre que el servicio puede no responder en absoluto, incluso si el puerto está abierto (por ejemplo, syslog espera un paquete válido). Por eso:
- Lanza nmap con la opción
-sUy ten paciencia — las velocidades son lentas, pero las estadísticas son fiables. - Si necesitas mayor rapidez, usa
masscan --udp, pero prepárate para muchos falsos negativos. - Para comprobaciones orientadas a servicios (DNS, SNMP) es mejor enviar peticiones válidas mediante scripts o herramientas como
dig.
Cómo evitar activar IDS/IPS y molestar a otros administradores
Incluso un SYN scan inofensivo puede parecer sospechoso. Reglas simples de higiene:
- Ritmo. Si escaneas una red pública, ajusta
--max-rate 1000o menos. - Lista blanca. Aclara de antemano el rango IP y la ventana temporal con las personas responsables.
- Ejecuta el escaneo como root donde se necesitan raw sockets. Sin
sudo, nmap recurre al connect-scan, que es más lento y más detectable. - Registra. Guarda informes en XML/grepable — serán útiles para análisis posteriores.
Automatización: cron + escáner = informe matutino en Telegram
Aburrido pero útil: escanea cada noche la zona crítica de la DMZ y envía un diff si aparece de repente un puerto «abierto» adicional. Se hace con un sencillo script bash:
#!/usr/bin/env bash
TODAY=$(date +%F)
OUTPUT="/var/reports/scan-$TODAY.xml"
nmap -sS -p 1-1024 -oX "$OUTPUT" 203.0.113.0/28
# diff con el día anterior y envío vía telegram-bot
Si quieres algo más elegante, echa un vistazo a nmap-vulners — un complemento que inyecta las versiones detectadas en la base CVE.
En conclusión: qué elegir según la tarea
- nmap — el todoterreno. Auditoría detallada, análisis profundo, scripts NSE.
- masscan — «radar de largo alcance»: encuentra rápidamente puertos vivos en amplias áreas.
- rustscan — híbrido práctico: la velocidad de masscan con el análisis de nmap.
- netcat/nc — probador de bolsillo: comprueba puntualmente un par de puertos.
- ss/lsof — diagnóstico interno: mira qué sucede en el propio servidor.
No olvides que escanear sin permiso puede ser un verdadero «campo minado» legal. Si la red es de terceros, en lugar de sacar nmap, saca un contrato de permiso para pruebas.
Enlaces útiles y chuletas
Resumen
El escaneo de puertos no consiste en «hacer daño al administrador de al lado», sino en aportar transparencia a la propia infraestructura. Saber qué puertas están abiertas es importante tanto para la seguridad como para la resolución de problemas cotidiana. Elige la herramienta según la situación, respeta las buenas prácticas de la red y que tu siguiente nmap -A muestre solo los servicios que ya conocías.
Y si algo sigue «sin abrirse», recuerda: siempre queda el recurso final — tcpdump -nnvvXSs 0. Pero esa ya es otra historia...