El comando ss
es un moderno sustituto del clásico netstat
. Puedes utilizarlo en Linux para obtener estadísticas sobre tus conexiones de red. A continuación se explica cómo trabajar con esta práctica herramienta.
El comando ss frente a netstat
Sustituto del obsoleto comando netstat
, ss
le ofrece información detallada sobre la forma en que su ordenador se comunica con otros ordenadores, redes y servicios.
ss
muestra estadísticas para el Protocolo de Control de Transmisión (TCP), el Protocolo de Datagramas de Usuario (UDP), Unix (interproceso) y los sockets sin procesar. Los sockets sin procesar operan en el nivel OSI de la red, lo que significa que las cabeceras TCP y UDP tienen que ser manejadas por el software de la aplicación, no por la capa de transporte. Los mensajes del Protocolo de Control de Mensajes de Internet (ICMP) y la utilidad ping utilizan sockets sin procesar.
Usando ss
No es necesario instalar ss
, ya que forma parte de una distribución de Linux actualizada. Su salida, sin embargo, puede ser muy larga-hemos tenido resultados que contienen más de 630 líneas. Los resultados también son muy amplios.
Debido a esto, hemos incluido representaciones de texto de los resultados que obtuvimos, ya que no cabrían en una captura de pantalla. Los hemos recortado para hacerlos más manejables.
Listando las conexiones de red
Usando ss
sin opciones en la línea de comandos se listan los sockets que no están escuchando. Es decir, lista los sockets que no están en estado de escucha.
Para ver esto, escriba lo siguiente:
ss
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Processu_str ESTAB 0 0 * 41826 * 41827u_str ESTAB 0 0 /run/systemd/journal/stdout 35689 * 35688u_str ESTAB 0 0 * 35550 * 35551...u_str ESTAB 0 0 * 38127 * 38128u_str ESTAB 0 0 /run/dbus/system_bus_socket 21243 * 21242u_str ESTAB 0 0 * 19039 * 19040u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885 u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306icmp6 UNCONN 0 0 *:ipv6-icmp *:*udp ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps
Las columnas son las siguientes:
- Netid: El tipo de socket. En nuestro ejemplo, tenemos «u_str», un flujo Unix, un «udp», y «icmp6», un socket IP versión 6 ICMP. Puede encontrar más descripciones de los tipos de socket de Linux en las páginas man de Linux.
- Estado: El estado en el que se encuentra el socket.
- Recv-Q: El número de paquetes recibidos.
- Send-Q: El número de paquetes enviados.
- Local Address:Port: La dirección local y el puerto (o valores equivalentes para sockets Unix).
- Peer Address:Port: La dirección remota y el puerto (o valores equivalentes para sockets Unix).
Para sockets UDP la columna «State» suele estar en blanco. Para los sockets TCP puede ser uno de los siguientes:
- LISTEN: Sólo del lado del servidor. El socket está esperando una solicitud de conexión.
- SYN-SENT: Sólo del lado del cliente. Este socket ha hecho una petición de conexión y está esperando a ver si es aceptada.
- SYN-RECEIVED: Sólo del lado del servidor. Este socket está esperando un reconocimiento de conexión después de aceptar una solicitud de conexión.
- ESTABLISHED: Servidor y clientes. Se ha establecido una conexión de trabajo entre el servidor y el cliente, permitiendo la transferencia de datos entre ambos.
- FIN-WAIT-1: Servidor y clientes. Este socket está esperando una solicitud de terminación de conexión desde el socket remoto, o un acuse de recibo de una solicitud de terminación de conexión que fue enviada previamente desde este socket.
- FIN-WAIT-2: Servidor y clientes. Este socket está esperando una solicitud de terminación de conexión desde el socket remoto.
- CLOSE-WAIT: Servidor y cliente. Este socket está esperando una solicitud de terminación de conexión del usuario local.
- CLOSING: Servidor y clientes. Este socket está esperando un acuse de recibo de la solicitud de terminación de la conexión desde el socket remoto.
- LAST-ACK: Servidor y cliente. Este socket está esperando un acuse de recibo de la solicitud de terminación de conexión que envió al socket remoto.
- TIME-WAIT: Servidor y clientes. Este socket envió un acuse de recibo al socket remoto para hacerle saber que recibió la solicitud de terminación del socket remoto. Ahora está esperando para asegurarse de que ese acuse de recibo fue recibido.
- CERRADO: No hay conexión, así que el socket ha sido terminado.
Listado de sockets de escucha
Para ver los sockets de escucha añadiremos la opción -l
(listening), así:
ss -l
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process nl UNCONN 0 0 rtnl:NetworkManager/535 * nl UNCONN 0 0 rtnl:evolution-addre/2987 * ...u_str LISTEN 0 4096 /run/systemd/private 13349 * 0 u_seq LISTEN 0 4096 /run/udev/control 13376 * 0 u_str LISTEN 0 4096 /tmp/.X11-unix/X0 33071 * 0 u_dgr UNCONN 0 0 /run/systemd/journal/syslog 13360 * 0 u_str LISTEN 0 4096 /run/systemd/fsck.progress 13362 * 0 u_dgr UNCONN 0 0 /run/user/1000/systemd/notify 32303 * 0
Estos sockets están todos desconectados y escuchando. El «rtnl» significa enrutamiento netlink, que se utiliza para transferir información entre el núcleo y los procesos de espacio de usuario.
Listando todos los sockets
Para listar todos los sockets, puede utilizar la opción -a
(all):
ss -a
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process nl UNCONN 0 0 rtnl:NetworkManager/535 * nl UNCONN 0 0 rtnl:evolution-addre/2987 * ...u_str LISTEN 0 100 public/showq 23222 * 0 u_str LISTEN 0 100 private/error 23225 * 0 u_str LISTEN 0 100 private/retry 23228 * 0 ...udp UNCONN 0 0 0.0.0.0:631 0.0.0.0:* udp UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* ...tcp LISTEN 0 128 :ssh :* tcp LISTEN 0 5 :ipp :* tcp LISTEN 0 100 :smtp :*
La salida contiene todos los sockets, independientemente del estado.
Listado de sockets TCP
También puedes aplicar un filtro para que sólo se muestren los sockets que coincidan. Utilizaremos la opción -t
(TCP), para que sólo aparezcan los sockets TCP:
ss -a -t
Listado de sockets UDP
La opción -u
(UDP) realiza el mismo tipo de acción de filtrado. Esta vez, sólo veremos los sockets UDP:
ss -a -u
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process UNCONN 0 0 0.0.0.0:631 0.0.0.0:* UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* UNCONN 0 0 0.0.0.0:60734 0.0.0.0:* UNCONN 0 0 127.0.0.53%lo:domain 0.0.0.0:* ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps UNCONN 0 0 :mdns :* UNCONN 0 0 :51193 :*
Listado de sockets Unix
Para ver sólo los sockets Unix, puede incluir la opción -x
(Unix), como se muestra a continuación:
ss -a -x
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process u_str ESTAB 0 0 * 41826 * 41827 u_str ESTAB 0 0 * 23183 * 23184 u_str ESTAB 28 0 @/tmp/.X11-unix/X0 52640 * 52639 ...u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885 u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306
Listando sockets crudos
El filtro para sockets crudos es la opción -w
(raw):
ss -a -w
Listado de sockets IP versión 4
Los sockets que usan el protocolo TCP/IP versión 4 pueden ser listados usando la opción -4
(IPV4):
ss -a -4
Listado de sockets IP versión 6
Se puede activar el filtro de coincidencia de la versión 6 de IP con la opción -6
(IPV6), así:
ss -a -6
Listado de sockets por estado
Puede listar los sockets por el estado en el que se encuentran con la opción state
. Esto funciona con estados establecidos, de escucha o cerrados. También utilizaremos la opción de resolución (-r
), que trata de resolver las direcciones de red a los nombres, y los puertos a los protocolos.
El siguiente comando buscará conexiones TCP establecidas, y ss
tratará de resolver los nombres:
ss -t -r state established
Se listan cuatro conexiones que están en el estado establecido. El nombre de host, ubuntu20-04, se ha resuelto y se muestra «ssh» en lugar de 22 para la conexión SSH en la segunda línea.
Podemos repetir esto para buscar sockets en estado de escucha:
ss -t -r state listening
Recv-Q Send-Q Local Address:Port Peer Address:Port Process 0 128 localhost:5939 0.0.0.0:* 0 4096 localhost%lo:domain 0.0.0.0:* 0 128 0.0.0.0:ssh 0.0.0.0:* 0 5 localhost:ipp 0.0.0.0:* 0 100 localhost:smtp 0.0.0.0:* 0 128 :ssh :* 0 5 ip6-localhost:ipp :* 0 100 ip6-localhost:smtp :*
Listando sockets por protocolo
Puede listar los sockets que usan un protocolo particular con las opciones dport
y sport
, que representan los puertos de destino y origen, respectivamente.
Escribimos lo siguiente para listar los sockets que utilizan el protocolo HTTPS en una conexión established
(nótese el espacio después del paréntesis de apertura y antes del de cierre):
ss -a state established '( dport = :https or sport = :https )'
Podemos utilizar el nombre del protocolo o el puerto habitualmente asociado a ese protocolo. El puerto por defecto para Secure Shell (SSH) es el puerto 22.
Usaremos el nombre del protocolo en un comando, y luego lo repetiremos usando el número de puerto:
ss -a '( dport = :ssh or sport = :ssh )'
ss -a '( dport = :22 or sport = :22 )'
Como era de esperar, obtenemos los mismos resultados.
Listando conexiones a una dirección IP específica
Con la opción dst
(destino), podemos listar las conexiones a una dirección IP de destino concreta.
Escribimos lo siguiente:
ss -a dst 192.168.4.25
Identificación de procesos
Para ver qué procesos están utilizando los sockets, se puede utilizar la opción de procesos (-p
), como se muestra a continuación (tenga en cuenta que debe utilizar sudo
):
sudo ss -t -p
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.168.4.28:57650 54.218.19.119:https users:(("firefox",pid=3378,fd=151)) ESTAB 0 0 192.168.4.28:ssh 192.168.4.25:43946 users:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))
Esto nos muestra que las dos conexiones establecidas en sockets TCP están siendo utilizadas por el demonio SSH y Firefox.
Un digno sucesor
El comando ss
proporciona la misma información suministrada anteriormente por netstat
, pero de una forma más sencilla y accesible. Puede consultar la página man para ver más opciones y consejos.