Cómo comprobar puertos remotos con el comando nc en Linux
Aprende a comprobar si los puertos remotos están abiertos con el comando nc (netcat) en Linux. Cubre pruebas TCP/UDP, rangos de puertos, timeouts y patrones para scripts.
Actualizado Publicado 10 min de lectura

¿Necesitas saber si un puerto está abierto en un servidor remoto? El comando nc (netcat) es la forma más rápida de averiguarlo. Un solo comando, respuesta instantánea. Sin navegador, sin interfaz gráfica, sin herramientas pesadas.
Esta guía cubre cómo comprobar puertos remotos con nc en Linux, incluidas las pruebas TCP y UDP, rangos de puertos, timeouts para scripts y los problemas habituales entre las distintas implementaciones de netcat.
Guías relacionadas:
- Más de 100 comandos de Linux que DEBES conocer
- Cómo securizar un servidor SSH en Linux
- Cómo hacer SSH Port Forwarding en Linux
- Cómo monitorizar los recursos del servidor y Docker
¿Qué es nc (netcat)?
nc es una utilidad de línea de comandos que lee y escribe datos a través de conexiones de red usando TCP o UDP. La gente lo llama la “navaja suiza” de las redes porque puede hacer muchas cosas: escaneo de puertos, transferencias de archivos, banner grabbing y actuar como cliente o servidor simple.
El netcat original fue escrito por Hobbit en 1995. Desde entonces han aparecido varias implementaciones, y se comportan de forma diferente:
| Implementación | Predeterminada en | Nombre del paquete | Notas |
|---|---|---|---|
| netcat-openbsd | Debian, Ubuntu | netcat-openbsd |
Soporta -z, IPv6, proxies |
| ncat (de Nmap) | CentOS, RHEL, Fedora | nmap-ncat |
Soporta -z (desde nmap 7.25), SSL |
| netcat-traditional | (legacy) | netcat-traditional |
Más antigua, menos funciones |
La mayoría de los ejemplos de esta guía funcionan con las tres, pero si algo se comporta de forma inesperada, comprueba qué versión estás ejecutando:
nc -h 2>&1 | head -1
# o
which nc && ls -l $(which nc)Instalar nc en Linux
Puede que nc ya esté instalado. Si no:
Debian / Ubuntu:
sudo apt install netcat-openbsdNota: en Ubuntu 24.04+, netcat es un paquete virtual. Instalar netcat-openbsd explícitamente es el enfoque más limpio.
CentOS / RHEL / Fedora:
sudo dnf install nmap-ncatArch Linux:
sudo pacman -S openbsd-netcatmacOS:
nc viene preinstalado (BSD netcat). Funciona para comprobaciones básicas de puertos.
Comprobar si un puerto TCP está abierto
La sintaxis básica para comprobar un puerto remoto:
nc -zv <host> <puerto>Flags explicados:
-z: solo escanea, no envía ningún dato tras conectar-v: salida detallada (muestra mensajes de éxito/fallo)
Ejemplo: comprobar si SMTP es accesible en Gmail:
nc -zv smtp.gmail.com 587Connection to smtp.gmail.com port 587 [tcp/submission] succeeded!Ejemplo: comprobar un puerto que está cerrado:
nc -zv smtp.gmail.com 5555nc: connectx to smtp.gmail.com port 5555 (tcp) failed: Connection refusedEjemplo: comprobar SSH en tu VPS:
nc -zv 192.168.1.100 22Connection to 192.168.1.100 port 22 [tcp/ssh] succeeded!Interpretar la salida
nc te da tres resultados posibles:
| Salida | Significado |
|---|---|
Connection to <host> <port> port [tcp/*] succeeded! |
El puerto está abierto, el servicio está escuchando |
Connection refused |
El puerto está cerrado o no hay nada escuchando |
Operation timed out |
El firewall está descartando paquetes, o el host es inalcanzable |
“Connection refused” y “timed out” son problemas distintos. “Refused” significa que el servidor rechazó activamente la conexión (puerto cerrado). “Timed out” significa que no recibiste ninguna respuesta (firewall bloqueando, IP incorrecta o problema de red). Esta distinción importa al diagnosticar problemas.
Comprobar un rango de puertos
Puedes escanear varios puertos en un solo comando usando un guion:
nc -zv <host> <inicio>-<fin>Ejemplo: escanear los puertos 585 a 590:
nc -zv smtp.gmail.com 585-590nc: connectx to smtp.gmail.com port 585 (tcp) failed: Connection refused
nc: connectx to smtp.gmail.com port 586 (tcp) failed: Connection refused
Connection to smtp.gmail.com port 587 [tcp/submission] succeeded!
nc: connectx to smtp.gmail.com port 588 (tcp) failed: Connection refused
nc: connectx to smtp.gmail.com port 589 (tcp) failed: Connection refused
nc: connectx to smtp.gmail.com port 590 (tcp) failed: Connection refusedFiltrar solo los puertos abiertos:
nc -zv smtp.gmail.com 585-590 2>&1 | grep succeededConnection to smtp.gmail.com port 587 [tcp/submission] succeeded!Esto es útil cuando escaneas un montón de puertos y solo te importan los que están abiertos.
Establecer un timeout de conexión con -w
Por defecto, nc espera mucho tiempo antes de abandonar un intento de conexión. Para scripts y automatización, casi siempre querrás establecer un timeout:
nc -zv -w 3 <host> <puerto>El flag -w 3 le indica a nc que se rinda después de 3 segundos si la conexión no se ha establecido. Sin él, un puerto bloqueado puede quedarse colgado más de 30 segundos (el timeout TCP del sistema operativo).
Saltarse la resolución DNS con -n:
Si pasas una dirección IP, añade -n para omitir las búsquedas DNS. Esto acelera los escaneos considerablemente:
nc -zvn -w 3 192.168.1.100 22Comprobar puertos UDP
Usa el flag -u para probar puertos UDP:
nc -zuv <host> <puerto>Ejemplo: comprobar DNS (puerto UDP 53):
nc -zuv 8.8.8.8 53Advertencia importante: UDP no es orientado a conexión. A diferencia de TCP, no hay handshake, así que nc envía un paquete y no tiene forma de confirmar que llegó. Puede que veas “succeeded” aunque no haya nada escuchando, o puede que no veas ninguna salida.
Para pruebas UDP fiables, combina nc con tcpdump en la máquina de destino, o usa herramientas específicas del protocolo como dig para DNS o iperf3 para throughput.
Usar nc en scripts
Un patrón habitual es esperar a que un servicio esté disponible antes de ejecutar otra cosa. Esto aparece en configuraciones de Docker Compose, pipelines de CI/CD y scripts de despliegue:
#!/bin/bash
HOST=db.example.com
PORT=5432
echo "Waiting for $HOST:$PORT..."
until nc -z -w 2 "$HOST" "$PORT" 2>/dev/null; do
sleep 1
done
echo "Port $PORT is open. Continuing..."Este bucle comprueba el puerto cada segundo hasta que es accesible, y después continúa. El 2>/dev/null suprime la salida detallada para que tus logs se mantengan limpios.
Comprobar varios puertos en un bucle:
for port in 80 443 8080; do
if nc -z -w 2 example.com "$port" 2>/dev/null; then
echo "Port $port: OPEN"
else
echo "Port $port: CLOSED"
fi
doneBanner grabbing con nc
Más allá de comprobar puertos, nc puede obtener banners de servicio: el texto que un servidor envía cuando te conectas por primera vez. Esto te dice qué software y qué versión se está ejecutando:
nc -v smtp.gmail.com 25220 smtp.gmail.com ESMTP ...Lo mismo para HTTP:
printf "HEAD / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80Esto envía una petición HTTP mínima y te muestra las cabeceras de respuesta en crudo. Útil para depurar servidores web, reverse proxies o balanceadores de carga sin la sobrecarga de curl.
Solución de problemas
| Problema | Causa probable | Qué probar |
|---|---|---|
Connection refused |
Puerto cerrado, ningún servicio escuchando | Verifica que el servicio se está ejecutando en el destino (ss -tlnp en el host de destino) |
Operation timed out |
El firewall descarta paquetes, IP incorrecta | Haz ping al host primero, revisa las reglas del firewall (iptables -L, ufw status) |
No route to host |
Problema de enrutado de red | Comprueba la subred, la puerta de enlace y la conectividad VPN |
nc -z dice “invalid option” |
Versión antigua de ncat sin soporte de -z |
Actualiza nmap-ncat o usa nc --send-only </dev/null <host> <puerto> como workaround |
| La salida está en silencio | La conexión tuvo éxito pero no hay banner | El servicio no envía un saludo. Usa -v para confirmar el estado de la conexión |
| UDP muestra “succeeded” pero el servicio no responde | UDP no es orientado a conexión | Usa tcpdump o herramientas específicas del protocolo para verificar |
nc frente a otras herramientas para comprobar puertos
nc no es la única forma de comprobar puertos. Así se compara:
| Herramienta | Ideal para | ¿Instalada por defecto? | Notas |
|---|---|---|---|
nc |
Comprobaciones rápidas de un puerto, scripts | A menudo sí | Ligero, rápido, sin dependencias |
nmap |
Escanear muchos puertos, detección de servicios | No | Exagerado para comprobar un solo puerto |
curl |
Probar endpoints HTTP/HTTPS | Normalmente sí | Solo funciona para protocolos web |
telnet |
Pruebas TCP interactivas | En desuso | Sin soporte UDP, sin equivalente a -z |
ss / netstat |
Comprobar puertos locales en escucha | Sí | Solo funciona para puertos de la máquina en la que estás |
Para comprobar un puerto remoto desde la línea de comandos, nc está en el punto óptimo: es rápido, funciona tanto para TCP como para UDP, y está disponible en casi cualquier sistema Linux.
Conclusión
El comando nc es la forma más rápida de comprobar si un puerto remoto es accesible desde un terminal Linux. El comando principal es nc -zv <host> <puerto>. Añade -w para timeouts en scripts y -u para pruebas UDP.
Solo recuerda: distintas distribuciones de Linux incluyen distintas implementaciones de netcat, y no todas soportan los mismos flags. Si nc -zv se comporta de forma extraña, comprueba qué versión estás ejecutando. En sistemas modernos (Ubuntu 22.04+, RHEL 8+, Fedora), el flag -z funciona directamente con el paquete netcat predeterminado.


