Logotipo de Bitdoze

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.

Dragos

Actualizado Publicado 10 min de lectura

Cómo comprobar puertos remotos con el comando nc en Linux

¿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:

¿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:

bash
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:

bash
sudo apt install netcat-openbsd

Nota: en Ubuntu 24.04+, netcat es un paquete virtual. Instalar netcat-openbsd explícitamente es el enfoque más limpio.

CentOS / RHEL / Fedora:

bash
sudo dnf install nmap-ncat

Arch Linux:

bash
sudo pacman -S openbsd-netcat

macOS:

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:

bash
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:

bash
nc -zv smtp.gmail.com 587
text
Connection to smtp.gmail.com port 587 [tcp/submission] succeeded!

Ejemplo: comprobar un puerto que está cerrado:

bash
nc -zv smtp.gmail.com 5555
text
nc: connectx to smtp.gmail.com port 5555 (tcp) failed: Connection refused

Ejemplo: comprobar SSH en tu VPS:

bash
nc -zv 192.168.1.100 22
text
Connection 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:

bash
nc -zv <host> <inicio>-<fin>

Ejemplo: escanear los puertos 585 a 590:

bash
nc -zv smtp.gmail.com 585-590
text
nc: 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 refused

Filtrar solo los puertos abiertos:

bash
nc -zv smtp.gmail.com 585-590 2>&1 | grep succeeded
text
Connection 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:

bash
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:

bash
nc -zvn -w 3 192.168.1.100 22

Comprobar puertos UDP

Usa el flag -u para probar puertos UDP:

bash
nc -zuv <host> <puerto>

Ejemplo: comprobar DNS (puerto UDP 53):

bash
nc -zuv 8.8.8.8 53

Advertencia 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:

bash
#!/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:

bash
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
done

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:

bash
nc -v smtp.gmail.com 25
text
220 smtp.gmail.com ESMTP ...

Lo mismo para HTTP:

bash
printf "HEAD / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80

Esto 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.