Comando ss: comprobar puertos y procesos en Linux, comparado con netstat
En un servidor Linux, el comando ss muestra qué puertos están abiertos y quién está conectado. ss es la herramienta de consulta de sockets de iproute2 que sustituye a netstat. Al consultar con ss los puertos en escucha (LISTEN) y las conexiones en un servidor Debian 12, comprobamos que, desde una cuenta normal, el nombre de los programas iniciados por otras cuentas no aparece en la columna Process aunque añadas -p.
La salida de abajo se obtuvo con un locale en inglés. Las direcciones del servidor y de sus interlocutores aparecen como direcciones de ejemplo.
1️⃣ Uso básico del comando ss y columnas de la salida
Si ejecutas ss sin opciones, quedan fuera los puertos en escucha y solo aparecen los sockets con una conexión establecida. En el servidor de pruebas, las primeras líneas eran todas sockets Unix (u_str, u_dgr) que usan los programas del propio servidor para comunicarse entre sí.
ss | head -n 5Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str ESTAB 0 0 * 1013903 * 1013904
u_dgr ESTAB 0 0 * 1013960 * 13394
u_str ESTAB 0 0 * 1013907 * 1013908
u_str ESTAB 0 0 * 46066198 * 46066199Por eso, para ver solo las conexiones TCP, añade -t. Los sockets Unix desaparecen y, en lugar del número de puerto, aparecen nombres de servicio como ssh y https.
ss -tState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:ssh 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:https
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:httpsSi añades también -n, los números de puerto aparecen tal cual, sin convertirse en nombres de servicio.
ss -tnState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:22 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Las columnas Recv-Q y Send-Q significan cosas distintas según el estado del socket. En un socket conectado, Recv-Q es el número de bytes recibidos que el programa aún no ha leído, y Send-Q es el número de bytes enviados cuya recepción el otro extremo aún no ha confirmado.
En un socket en escucha, Recv-Q es el número de conexiones acumuladas en la cola y Send-Q es el tamaño máximo de la cola. Estos significados proceden de la página man netstat(8) de net-tools.
2️⃣ Comprobar puertos en Linux (-tln, -uln, -tulpn)
La salida sin opciones no incluye los puertos que esperan conexiones, así que para comprobar los puertos abiertos añade -l, que selecciona solo los sockets en escucha. [ss -tln] muestra los puertos TCP en escucha como números.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Si Local Address es 0.0.0.0, acepta conexiones que llegan a cualquier dirección IPv4 del servidor; si es 127.0.0.1, solo se puede conectar desde dentro del servidor. [::] significa todas las direcciones IPv6, así que los puertos 22, 80 y 443 están abiertos tanto en IPv4 como en IPv6.
Sin -n, los números de puerto se convierten en nombres de servicio. El puerto 8080 aparece como http-alt.
ss -tlState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 511 0.0.0.0:http 0.0.0.0:*
LISTEN 0 511 0.0.0.0:https 0.0.0.0:*
LISTEN 0 511 127.0.0.1:http-alt 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*
LISTEN 0 511 [::]:http [::]:*
LISTEN 0 511 [::]:https [::]:*UDP no establece conexiones, así que ni siquiera sus sockets en escucha tienen el estado LISTEN. En la salida de [ss -uln], la columna de estado mostraba UNCONN en todas las líneas. El puerto 68 (bootpc) es el cliente DHCP y el 123 (ntp) es el puerto de sincronización horaria.
ss -ulnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
UNCONN 0 0 [::1]:123 [::]:*
UNCONN 0 0 [::]:123 [::]:*Para ver TCP y UDP a la vez, junta las opciones como en [ss -tulpn]. Cuando hay más de un tipo, se añade una columna Netid al principio.
ss -tulpnNetid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
udp UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
udp UNCONN 0 0 [::1]:123 [::]:*
udp UNCONN 0 0 [::]:123 [::]:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 511 [::]:80 [::]:*
tcp LISTEN 0 511 [::]:443 [::]:*3️⃣ Comprobar procesos con el comando ss (-p)
-p es la opción que muestra en la columna Process el programa que usa cada socket. Sin embargo, al ejecutar [ss -tlnp] desde una cuenta normal del servidor de pruebas, la columna Process quedó vacía, como se ve abajo, como si la opción no se hubiera aplicado.
ss -tlnpState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*ss encuentra el proceso que usa un socket leyendo la carpeta fd de cada proceso bajo /proc. Una cuenta normal no puede abrir la carpeta fd de un proceso iniciado por otra cuenta, así que el nombre de ese programa no entra en la columna. Si abres desde una cuenta normal la carpeta del proceso 1, iniciado por root, obtienes un error de permisos.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedLos programas iniciados con tu propia cuenta sí aparecen en la columna Process, incluso desde una cuenta normal. Lo comprobamos iniciando el servidor web sencillo de python3 en el puerto 8000 de 127.0.0.1.
python3 -m http.server 8000 --bind 127.0.0.1 &Una vez iniciado, añade [sport = :8000] para consultar solo la línea del puerto 8000.
ss -tlnp sport = :8000State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 127.0.0.1:8000 0.0.0.0:* users:(("python3",pid=343015,fd=3))Entre los paréntesis que siguen a users aparecen, por orden, el nombre del programa, el pid y el número de descriptor de archivo (fd).
Cuando termines la comprobación, detén el servidor web sencillo con [kill %1]. Si vuelves a ejecutar [ss -tln sport = :8000] después, solo queda la línea de encabezado y ya no aparece la línea del puerto 8000.
Desde la cuenta root, ss puede leer la información de todos los procesos, así que la columna Process se rellena. Si varios procesos escuchan juntos en un mismo puerto, dentro de los paréntesis de users aparece una entrada por cada uno. Los nombres de programa y los pid de la salida de root de abajo son valores de ejemplo.
ss -tlnp sport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("app",pid=2101,fd=6),("app",pid=2100,fd=6))
LISTEN 0 511 [::]:443 [::]:* users:(("app",pid=2101,fd=7),("app",pid=2100,fd=7))Para encontrar un programa por su número de puerto, también puedes usar el comando lsof con la forma [lsof -i :443].
En el diagrama de abajo puedes cambiar de cuenta para comparar cómo cambia la columna Process según la cuenta.
4️⃣ Opciones de filtro de estado y puerto en ss
Aun después de comprobar los puertos abiertos, tienes que filtrar aparte quién está conectado a ellos ahora mismo. ss deja solo las líneas que quieres cuando añades condiciones de filtro después de las opciones.
Si escribes el nombre de un estado después de state, solo quedan los sockets en ese estado. La salida de [ss -tn state established] no tiene la columna State y empieza por la columna Recv-Q.
ss -tn state establishedRecv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114
0 0 203.0.113.10:26676 192.0.2.15:443
0 0 203.0.113.10:29714 192.0.2.16:443Los puertos se filtran con dport (puerto del otro extremo) y sport (puerto propio). Las conexiones que salen del servidor hacia servidores https externos se seleccionan con [dport = :443].
ss -tn dport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Si usas sport junto con -l, puedes comprobar solo si ese puerto está en escucha.
ss -tln sport = :22State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*Agrupa varias condiciones con paréntesis y or, y enciérralas entre comillas simples para que la shell no interprete antes los paréntesis. Abajo está el resultado de seleccionar solo las conexiones ssh siguiendo el ejemplo de la página man.
ss -tn state established '( dport = :ssh or sport = :ssh )'Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114TIME-WAIT es el estado en que queda una conexión durante un rato después de cerrarse. No aparece en la salida predeterminada, así que para verla tienes que seleccionarla aparte con [state time-wait].
ss -tn state time-waitRecv-Q Send-Q Local Address:Port Peer Address:PortProcess
0 0 127.0.0.1:28750 127.0.0.1:80
0 0 127.0.0.1:57698 127.0.0.1:8080
0 0 [::1]:31936 [::1]:80Si escribes mal el nombre de un estado, el comando termina en el acto dejando solo una línea de error [wrong state name]. Abajo está el resultado de poner foo a propósito. Los nombres que puedes usar aparecen en la línea TCP-STATES de la salida de [ss -h].
ss -tn state fooss: wrong state name: foo📌 Opciones principales: resultados de este artículo
| Opción | Tarea | Resultado en este artículo | |
|---|---|---|---|
| -t | Muestra solo sockets TCP | Desaparecen los sockets Unix y en el lugar del puerto aparecen nombres de servicio como ssh y https | |
| -n | Muestra números de puerto en lugar de nombres de servicio | En ss -tn, ssh aparece como 22 y https como 443 | |
| -l | Muestra solo sockets en escucha (LISTEN) | ss -tln muestra puertos en escucha como el 22, el 80 y el 443 | |
| -u | Muestra solo sockets UDP | La columna de estado de ss -uln es UNCONN en todas las líneas | |
| -p | Muestra en la columna Process el programa que usa cada socket | Desde una cuenta normal, solo el python3 iniciado por mi cuenta muestra nombre y pid; los programas de otras cuentas quedan en blanco | |
| -s | Resume la cantidad por tipo en lugar de listar los sockets | El estab 9 de la línea TCP coincide con las 9 líneas de la salida de state established sin el encabezado | |
| -4 | Muestra solo sockets IPv4 | En ss -t4ln desaparecen las líneas que empiezan por [::] | |
| -6 | Muestra solo sockets IPv6 | En ss -t6ln desaparecen las líneas que empiezan por 0.0.0.0 y 127.0.0.1 | |
| -H | Muestra solo las líneas de sockets, sin encabezado | El recuento de líneas de ss -H -tln | wc -l no incluye el encabezado | |
| state ESTADO | Deja solo los sockets en ese estado | La salida de state established empieza por Recv-Q sin la columna State; un nombre inexistente da [wrong state name: foo] | |
| dport = :PUERTO | Filtra por el puerto del otro extremo | dport = :443 muestra dos líneas de conexiones salientes hacia servidores https externos | |
| sport = :PUERTO | Filtra por el puerto propio | sport = :22 junto con -l muestra dos líneas en escucha del puerto 22, IPv4 e IPv6 | |
| src DIRECCIÓN | Deja solo los sockets de esa dirección | ss -tln src 127.0.0.1 muestra solo los puertos de 127.0.0.1, que aceptan conexiones únicamente desde dentro del servidor |
📎 Otras opciones: según el manual oficial
| Opción | Tarea | |
|---|---|---|
| -a, --all | Muestra juntos los sockets en escucha y los conectados | |
| -r, --resolve | Resuelve direcciones y números de puerto a nombres | |
| -e, --extended | Muestra información detallada de cada socket, como uid e inode | |
| -o, --options | Muestra información de temporizadores, como la retransmisión TCP y keepalive | |
| -m, --memory | Muestra la memoria que usa cada socket | |
| -i, --info | Muestra información interna de TCP (rtt, cwnd, etc.) | |
| -x, --unix | Muestra solo sockets de dominio Unix | |
| -w, --raw | Muestra solo sockets RAW | |
| -f FAMILIA | Selecciona por familia de socket, como unix, inet, inet6, link o netlink | |
| -Q, --no-queues | Muestra la salida sin las columnas Recv-Q y Send-Q | |
| -K, --kill | Cierra a la fuerza los sockets que coinciden con el filtro; los que el kernel no admite se omiten | |
| -E, --events | Sigue mostrando los sockets a medida que se cierran | |
| -V, --version | Muestra la información de versión |
🔲 Simulador del comando ss
En el simulador de abajo puedes escribir tú mismo las opciones y los filtros vistos hasta ahora y comparar la salida con [netstat -tln].
5️⃣ Resumen de sockets con ss (-s)
-s muestra un resumen de la cantidad por tipo en lugar de la lista de sockets. Según la página man, no cuenta la lista uno por uno, sino que reúne las cifras de varias estadísticas.
ss -sTotal: 340
TCP: 48 (estab 9, closed 15, orphaned 0, timewait 13)
Transport Total IP IPv6
RAW 0 0 0
UDP 8 4 4
TCP 33 25 8
INET 41 29 12
FRAG 0 0 0El estab de la línea TCP es el número de conexiones establecidas en este momento. Por eso puedes compararlo con el número de líneas que muestra [state established] en el mismo instante.
ss -tn state established | wc -l10Al quitar la línea de encabezado de las 10 líneas de salida quedan 9, igual que el estab 9 de -s. timewait 13 es el número de sockets TIME-WAIT, que solo se veían al seleccionarlos con [state time-wait].
6️⃣ Comando ss comparado con netstat
netstat viene en el paquete net-tools, cuya página man describe netstat como un programa casi en desuso (mostly obsolete) e indica que se use ss en su lugar. Eso sí, los scripts escritos para el formato de salida de netstat no pueden leer la salida de ss tal cual, porque cambian el orden de las columnas y la notación de las direcciones.
Al mostrar los puertos TCP en escucha del mismo servidor con los dos comandos, netstat puso el estado al final y escribió las direcciones IPv6 como :::22.
netstat -tlnActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::443 :::* LISTENEn ss, el estado va al principio y las direcciones IPv6 van entre corchetes, como [::]:22.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Las opciones de netstat más usadas equivalen a estos comandos ss e ip.
| netstat | Comando sustituto / qué muestra |
|---|---|
| netstat -tln | ss -tlnPuertos TCP en escucha, como números |
| netstat -tulpn | ss -tulpnPuertos TCP y UDP en escucha y sus programas |
| netstat -tan | ss -tanTodos los sockets TCP, como números |
| netstat -r | ip routeTabla de enrutamiento |
| netstat -i | ip -s linkEstadísticas de interfaces de red |
🔢 FAQ & contenido recomendado











ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.