Comando ss: comprobar puertos y procesos en Linux, comparado con netstat

Entorno de pruebaFamilia DebianDebian 12iproute2 6.1.0cuenta de usuario normalVerificado el 2026-11-04
Comandos de redssUbicación/usr/bin/ss

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 5
Netid 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              * 46066199

Por 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 -t
State 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:https

Si añades también -n, los números de puerto aparecen tal cual, sin convertirse en nombres de servicio.

ss -tn
State 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:443

Las 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 -tln
State  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 -tl
State  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 -uln
State  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 -tulpn
Netid 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 -tlnp
State  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/fd
ls: cannot open directory '/proc/1/fd': Permission denied

Los 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 = :8000
State  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 = :443
State  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.

🧭 ss -p y las cuentas: cuándo se rellena la columna Process
Diagrama explicativo
👤 Cuenta
$# ss -tlnp
Socket en escuchaInformación del procesoColumna Process
0.0.0.0:22LISTEN
➜
/proc/812/fdPropietario: root
➜
Procesos de otras cuentas: no se leenroot: lee todos los procesosColumna Process vacíausers:(("sshd",pid=812,fd=3))
127.0.0.1:8080LISTEN
➜
/proc/2100/fdPropietario: root
➜
Procesos de otras cuentas: no se leenroot: lee todos los procesosColumna Process vacíausers:(("app",pid=2100,fd=3))
127.0.0.1:8000LISTEN
➜
/proc/343015/fdPropietario: user
➜
Procesos de mi cuenta: se leenroot: lee todos los procesosusers:(("python3",pid=343015,fd=3))
Una cuenta normal no puede leer la información de /proc de los procesos iniciados por otras cuentas, así que la columna Process de esas líneas queda vacía y solo se rellena la línea de python3 iniciada con tu propia cuenta.
root puede leer la información de todos los procesos, así que el nombre del programa y el pid de cada socket en escucha aparecen en la columna Process.

4️⃣ Opciones de filtro de estado y puerto en ss

  • ↪️ state, dport, sport

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 established
Recv-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:443

Los 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 = :443
State 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:443

Si usas sport junto con -l, puedes comprobar solo si ese puerto está en escucha.

ss -tln sport = :22
State  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:51114

TIME-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-wait
Recv-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]:80

Si 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 foo
ss: wrong state name: foo

📌 Opciones principales: resultados de este artículo

OpciónTareaResultado en este artículo
-tMuestra solo sockets TCPDesaparecen los sockets Unix y en el lugar del puerto aparecen nombres de servicio como ssh y https
-nMuestra números de puerto en lugar de nombres de servicioEn ss -tn, ssh aparece como 22 y https como 443
-lMuestra solo sockets en escucha (LISTEN)ss -tln muestra puertos en escucha como el 22, el 80 y el 443
-uMuestra solo sockets UDPLa columna de estado de ss -uln es UNCONN en todas las líneas
-pMuestra en la columna Process el programa que usa cada socketDesde una cuenta normal, solo el python3 iniciado por mi cuenta muestra nombre y pid; los programas de otras cuentas quedan en blanco
-sResume la cantidad por tipo en lugar de listar los socketsEl estab 9 de la línea TCP coincide con las 9 líneas de la salida de state established sin el encabezado
-4Muestra solo sockets IPv4En ss -t4ln desaparecen las líneas que empiezan por [::]
-6Muestra solo sockets IPv6En ss -t6ln desaparecen las líneas que empiezan por 0.0.0.0 y 127.0.0.1
-HMuestra solo las líneas de sockets, sin encabezadoEl recuento de líneas de ss -H -tln | wc -l no incluye el encabezado
state ESTADODeja solo los sockets en ese estadoLa salida de state established empieza por Recv-Q sin la columna State; un nombre inexistente da [wrong state name: foo]
dport = :PUERTOFiltra por el puerto del otro extremodport = :443 muestra dos líneas de conexiones salientes hacia servidores https externos
sport = :PUERTOFiltra por el puerto propiosport = :22 junto con -l muestra dos líneas en escucha del puerto 22, IPv4 e IPv6
src DIRECCIÓNDeja solo los sockets de esa direcciónss -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ónTarea
-a, --allMuestra juntos los sockets en escucha y los conectados
-r, --resolveResuelve direcciones y números de puerto a nombres
-e, --extendedMuestra información detallada de cada socket, como uid e inode
-o, --optionsMuestra información de temporizadores, como la retransmisión TCP y keepalive
-m, --memoryMuestra la memoria que usa cada socket
-i, --infoMuestra información interna de TCP (rtt, cwnd, etc.)
-x, --unixMuestra solo sockets de dominio Unix
-w, --rawMuestra solo sockets RAW
-f FAMILIASelecciona por familia de socket, como unix, inet, inet6, link o netlink
-Q, --no-queuesMuestra la salida sin las columnas Recv-Q y Send-Q
-K, --killCierra a la fuerza los sockets que coinciden con el filtro; los que el kernel no admite se omiten
-E, --eventsSigue mostrando los sockets a medida que se cierran
-V, --versionMuestra 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].

Simulador del comando ssiproute2 6.1.0
[root@server work]#
Es una pantalla de cuenta normal (user) que funciona solo dentro del navegador; con ↑↓ recuperas los comandos que escribiste antes.

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 -s
Total: 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         0

El 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 -l
10

Al 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 -tln
Active 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                  :::*                    LISTEN

En ss, el estado va al principio y las direcciones IPv6 van entre corchetes, como [::]:22.

ss -tln
State  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.

netstatComando sustituto / qué muestra
netstat -tlnss -tlnPuertos TCP en escucha, como números
netstat -tulpnss -tulpnPuertos TCP y UDP en escucha y sus programas
netstat -tanss -tanTodos los sockets TCP, como números
netstat -rip routeTabla de enrutamiento
netstat -iip -s linkEstadísticas de interfaces de red
Los comandos ip que sustituyen a netstat -r y netstat -i aparecen en el apartado NOTES de la página man netstat(8) de net-tools.

🔢 FAQ & contenido recomendado

Con -4 quedan solo los sockets IPv4 y con -6, solo los IPv6. En [ss -t4ln] desaparecieron las líneas que empiezan por [::], y en [ss -t6ln], las que empiezan por 0.0.0.0 y 127.0.0.1.

Si escribes una dirección después de src, solo quedan los sockets en escucha de esa dirección. [ss -tln src 127.0.0.1] mostró solo los puertos de 127.0.0.1, a los que no se puede conectar desde fuera del servidor.

Con -H aparecen solo las líneas de sockets, sin encabezado. Al contar líneas, como en [ss -H -tln | wc -l], la línea de encabezado no se cuenta con ellas.

🧭 Contenido recomendado sobre comandos de red 13 artículos · 3 referencias
🗂️ Comandos de red
📄 Comando ip 📄 Comandos netstat · ifconfig 📄 Comando nmtui 📄 Comando ss
📄 Comando SSH 📄 Comando rsync 📄 Comando wget 📄 Comandos rz · sz
📄 Comando host 📄 Comando nslookup
📄 Comando iptables 📄 Comando firewall-cmd 📄 Comando certbot

ℹ️ 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Demuestra que eres humano: 6   +   5   =