Cómo comprobar los puertos en uso en Linux
Saber si un servicio está escuchando en un puerto determinado es una de las primeras comprobaciones que hace cualquier sysadmin ante una incidencia. ¿El servicio arrancó? ¿Está el puerto abierto? ¿Es un problema de red o de firewall? Esta guía cubre las herramientas actuales para responder esas preguntas, tanto en local como en remoto.
Nota:
netstatforma parte del paquetenet-tools, considerado obsoleto y no instalado por defecto en RHEL 9+, Ubuntu 22.04+ y la mayoría de distribuciones modernas. Su reemplazo oficial esss, mucho más rápido y con mejor soporte para IPv6 y sockets Unix. Si buscasnetstaten tus servidores nuevos y no aparece, es normal.
Antes de tirar de tcpdump: ¿qué está escuchando en local?
El primer paso, antes de ir a la red, es confirmar en el propio servidor qué puertos están activos y qué proceso los tiene abiertos.
ss — el reemplazo moderno de netstat
ss (socket statistics) es la herramienta de referencia actual para inspeccionar el estado de los sockets en Linux.
# Ver todos los puertos TCP y UDP en escucha, con PID y nombre del proceso
ss -tulpn
Salida de ejemplo:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=987,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
tcp LISTEN 0 100 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=2001,fd=21))
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("dhclient",pid=512,fd=5))
Opciones más usadas:
| Opción | Significado |
|---|---|
-t | Sockets TCP |
-u | Sockets UDP |
-l | Solo los que están en LISTEN |
-p | Muestra el proceso y PID |
-n | No resuelve nombres (más rápido) |
Para filtrar por un puerto concreto, por ejemplo el 3181 de BMC Patrol:
ss -tulpn | grep 3181
O usando la opción de filtro nativa:
ss -tulpn 'sport = :3181'
Si no aparece nada, el servicio no está escuchando — el problema es del proceso, no del firewall.
lsof -i — ver qué proceso tiene abierto un puerto
lsof (list open files) es otra herramienta clásica que sigue siendo muy útil para identificar el proceso propietario de un socket:
# Todos los sockets de red abiertos
lsof -i
# Solo TCP, filtrado por puerto
lsof -i TCP:3181
# Ver quién tiene el puerto 80
lsof -i :80
Salida de ejemplo:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 23456 0t0 TCP *:http (LISTEN)
nginx 1235 nobody 6u IPv4 23457 0t0 TCP *:http (LISTEN)
Muy útil cuando tienes un puerto ocupado y necesitas el PID exacto para matar el proceso o investigar:
lsof -i :8080 | awk 'NR>1 {print $2}' | sort -u
fuser — identificar el PID de un puerto rápidamente
Menos conocido pero muy directo para scripting:
# ¿Qué proceso usa el puerto 443 TCP?
fuser 443/tcp
# Con nombre de proceso y usuario
fuser -v 443/tcp
Verificar conectividad remota al puerto
Una vez confirmado que el servicio escucha localmente, el siguiente paso es comprobar si es accesible desde fuera. Aquí es donde telnet ha quedado obsoleto — nc (netcat) es la herramienta estándar en 2026.
nc (netcat) — test de conectividad a un puerto remoto
nc es la navaja suiza de la conectividad de red. Para un test básico de puerto:
# ¿Está el puerto 3181 accesible en el servidor remoto?
nc -zv <servidor> 3181
La opción -z activa el modo de escaneo (no envía datos), -v da salida verbosa.
Salida si el puerto está abierto:
Connection to 192.168.1.50 3181 port [tcp/*] succeeded!
Salida si está cerrado o filtrado:
nc: connect to 192.168.1.50 port 3181 (tcp) failed: Connection refused
Nota sobre variantes de netcat: Hay tres implementaciones habituales en Linux:
nc(OpenBSD, presente en Ubuntu/Debian por defecto),ncat(parte del paquetenmap, más potente y con soporte SSL) ync.traditional(GNU netcat). La sintaxis básica de-zvfunciona en todas. Si tu sistema no tienenc, instalanmappara obtenerncat:# Debian/Ubuntu apt install ncat # RHEL/CentOS/Fedora dnf install ncat
Añadir timeout para no quedarse esperando indefinidamente:
# Timeout de 5 segundos
nc -zv -w5 <servidor> 3181
Probar un rango de puertos:
nc -zv <servidor> 3180-3185
Para UDP (recuerda que el comportamiento es diferente — los puertos UDP cerrados devuelven ICMP, los abiertos simplemente no responden):
nc -zuv <servidor> 161
nmap — cuando necesitas más detalle
nmap va más allá del simple test de conectividad. Es especialmente útil cuando quieres verificar varios puertos a la vez o necesitas más información:
# Verificar si el puerto 3181 está abierto
nmap -p 3181 <servidor>
# Escanear puertos específicos y detectar el servicio
nmap -sV -p 22,80,443,3181 <servidor>
# Comprobar los puertos más comunes (útil en troubleshooting inicial)
nmap --top-ports 20 <servidor>
Salida de ejemplo:
PORT STATE SERVICE
3181/tcp open bmcpatrol
Si el estado es
filtered, hay un firewall bloqueando. Si esclosed, el puerto es accesible pero no hay nada escuchando.
Contexto: puertos en entornos Docker y Kubernetes
Cuando trabajas con contenedores, el comportamiento de las herramientas cambia según dónde las ejecutes.
Dentro de un contenedor Docker
ss y lsof dentro de un contenedor solo ven los sockets del namespace de red del contenedor:
docker exec -it <nombre_contenedor> ss -tulpn
Para ver los puertos expuestos del contenedor desde el host:
docker port <nombre_contenedor>
Desde el host, en el namespace del contenedor
Si necesitas usar ss o lsof con visibilidad completa del proceso dentro del contenedor:
# Obtener el PID del proceso principal del contenedor
PID=$(docker inspect --format '{{.State.Pid}}' <nombre_contenedor>)
# Ejecutar ss en el namespace de red del contenedor
nsenter -t $PID -n ss -tulpn
En Kubernetes
Para hacer un test de conectividad a un puerto de un pod desde otro pod:
kubectl exec -it <pod-origen> -- nc -zv <ip-pod-destino> 3181
O usando el nombre del servicio:
kubectl exec -it <pod-origen> -- nc -zv <nombre-servicio> 80
Flujo de diagnóstico recomendado
Cuando un servicio no responde, sigue este orden:
- ¿El servicio está escuchando en local? →
ss -tulpn | grep <puerto> - ¿Qué proceso tiene el puerto? →
lsof -i :<puerto> - ¿Es accesible desde fuera? →
nc -zv <servidor> <puerto> - ¿Necesito más detalle? →
nmap -p <puerto> <servidor> - ¿Hay tráfico llegando? →
tcpdump -i eth0 port <puerto>(ver artículo relacionado)
Resumen de herramientas
| Herramienta | Uso principal | Instalada por defecto |
|---|---|---|
ss | Ver puertos en escucha en local | Sí (iproute2) |
lsof -i | Identificar proceso/PID por puerto | Sí |
fuser | PID de un puerto, scripting | Sí (psmisc) |
nc / ncat | Test de conectividad remota | Casi siempre |
nmap | Escaneo de puertos, detección de servicios | No (instalar) |
netstat | Obsoleto, no usar en sistemas nuevos | No |
telnet | Obsoleto para tests de puerto, no usar | No |
Artículos relacionados
- Comprobar puertos con nc (netcat) en Linux — profundiza en el uso de netcat
- Dominando SNMP y Traceroute — herramientas de diagnóstico de red
- Curl: la navaja suiza para SREs y administradores de sistemas — otra herramienta imprescindible para test de servicios HTTP
Actualizado en 2026. Herramientas verificadas en Ubuntu 24.04 LTS, RHEL 9 y Debian 12.

[…] ese contexto, la captura posterior tiene mucho más sentido. Si en el blog ya has leído cómo comprobar los puertos en uso en Linux, este es el paso anterior […]