---
title: "Cómo comprobar puertos remotos con el comando nc en Linux"
description: "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."
date: 2023-11-22
categories: ["linux"]
tags: ["networking","devops"]
---

¿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](https://www.bitdoze.com/es/comandos-linux/)
- [Cómo securizar un servidor SSH en Linux](https://www.bitdoze.com/es/securizar-servidor-ssh-linux/)
- [Cómo hacer SSH Port Forwarding en Linux](https://www.bitdoze.com/es/tuneles-ssh-linux/)
- [Cómo monitorizar los recursos del servidor y Docker](https://www.bitdoze.com/es/monitorizar-servidor/)

## ¿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
```

```
Connection to smtp.gmail.com port 587 [tcp/submission] succeeded!
```

**Ejemplo: comprobar un puerto que está cerrado:**

```bash
nc -zv smtp.gmail.com 5555
```

```
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
```

```
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
```

```
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
```

```
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
```

## Banner 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:

```bash
nc -v smtp.gmail.com 25
```

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