Cómo Comprobar Puertos en Linux Usando /dev/tcp y /dev/udp (sin Telnet ni Netcat)

Comprobar si un puerto está abierto en un servidor remoto es una tarea común para administradores de sistemas. Aunque herramientas como telnet o netcat (nc) suelen usarse para este fin, Bash ofrece una alternativa incorporada que no necesita instalar nada adicional: el uso de /dev/tcp/ y /dev/udp/.

En este artículo aprenderás cómo usar estas funciones integradas de Bash para verificar puertos TCP y UDP de forma rápida, simple y sin dependencias externas.

¿Qué es /dev/tcp/host/puerto y /dev/udp/host/puerto?

Bash tiene una característica oculta que permite usar redirecciones especiales para crear conexiones de red. Estas rutas (/dev/tcp/ y /dev/udp/) no existen en el sistema de archivos, pero Bash las interpreta internamente para abrir sockets.

echo > /dev/tcp/host/puerto

Esto intenta abrir una conexión TCP al host y puerto especificado.

Verificar un Puerto TCP desde Línea de Comandos

Para probar si un puerto está abierto, simplemente ejecuta:

echo > /dev/tcp/google.com/80 && echo "Puerto abierto" || echo "Puerto cerrado"

¿Qué hace esto?

Si la conexión se abre exitosamente, Bash continúa y muestra «Puerto abierto».

Si falla (por ejemplo, el puerto está cerrado o el host no responde), muestra «Puerto cerrado».

Con timeout

Para evitar que el comando quede colgado si el host no responde, puedes usar timeout:

timeout 3 bash -c "echo > /dev/tcp/google.com/80" && echo "Abierto" || echo "Cerrado o Timeout"

🛈 Requiere Bash con soporte de redirección /dev/tcp. No funciona en shells como sh o dash.

Verificar un Puerto UDP con /dev/udp

El uso para UDP es similar:

echo > /dev/udp/8.8.8.8/53 && echo "Enviado" || echo "Fallo"

Pero hay un detalle importante: UDP no garantiza entrega ni respuesta, por lo que este método no te dice si el puerto está abierto realmente.

¿Cómo recibir respuesta?

Puedes usar un descriptor de archivo para enviar y luego intentar leer:

exec 3<> /dev/udp/8.8.8.8/53
echo -ne '\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00' >&3
read -t 2 -u 3 respuesta && echo "Respuesta: $respuesta" || echo "Sin respuesta"

Este ejemplo envía una consulta DNS vacía al puerto 53 y espera una respuesta.

Limitaciones del Método
Característica TCP UDP
Detectar si el puerto está abierto Fiable No confiable
Requiere herramientas externas No No
Recibe respuesta del servicio Sí (si el servicio responde) Solo si esperas una respuesta válida

¿Y si quiero algo más confiable para UDP?

Si necesitas verificar si un puerto UDP está realmente abierto y responde, mejor usa herramientas como:

nc -uzv       # netcat en modo UDP
nmap -sU -p   # escaneo UDP con Nmap

Usar /dev/tcp/ y /dev/udp/ es una excelente forma de comprobar puertos rápidamente sin depender de herramientas externas. Es especialmente útil en entornos minimalistas o scripts automatizados.

Resumen rápido:

✅ TCP: Funciona muy bien para comprobar puertos abiertos.

⚠️ UDP: Puede enviar datagramas, pero no garantiza saber si el puerto está abierto.

🧰 No necesitas instalar nada si tienes Bash.

¿Ya lo has probado en tus scripts? Déjanos tus dudas o comparte cómo lo usas tú.

Deja una respuesta