ss - estadísticas de socket
En un tutorial anterior, vimos cómo usar el comando netstat para obtener detalles sobre las conexiones de red/socket. Sin embargo, el comando netstat ha quedado en desuso durante mucho tiempo y se reemplazó por el comando ss del conjunto de herramientas iproute.
El comando ss es capaz de mostrar detalles sobre las conexiones de red con más información que el comando netstat y es más rápido. El comando netstat lee varios archivos /proc para recopilar información. Sin embargo, este enfoque es más lento cuando hay muchas conexiones para mostrar.
El comando ss obtiene su información directamente del espacio del kernel. Las opciones utilizadas con los comandos ss son muy similares a netstat, lo que lo convierte en un reemplazo fácil.
Entonces, en este tutorial, veremos algunos ejemplos de cómo usar el comando ss para verificar las conexiones de red y las estadísticas de socket.
1. Listar todas las conexiones
El comando más simple es listar todas las conexiones.
$ ss | less Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str ESTAB 0 0 * 15545 * 15544 u_str ESTAB 0 0 * 12240 * 12241 u_str ESTAB 0 0 @/tmp/dbus-2hQdRvvg49 12726 * 12159 u_str ESTAB 0 0 * 11808 * 11256 u_str ESTAB 0 0 * 15204 * 15205 .....
Estamos canalizando la salida a menos para que la salida sea desplazable. La salida contendrá todos los detalles de conexión de socket tcp, udp y unix.
2. Filtrar conexiones tcp,udp o unix
Para ver solo las conexiones tcp, udp o unix, use la opción t, u o x.
$ ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:http ESTAB 0 0 192.168.1.2:43622 199.59.149.201:https ESTAB 0 0 192.168.1.2:33141 83.170.73.249:ircd ESTAB 0 0 192.168.1.2:54028 74.125.135.125:xmpp-client
$ ss -t OR $ ss -A tcp
De forma predeterminada, la opción "t" solo informará solo aquellas conexiones que están "establecidas" o CONECTADAS". No informa los sockets tcp que están "ESCUCHANDO". Use la opción '-a' junto con t, para informar todos a la vez.
Listar todas las conexiones upp
$ ss -ua State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 192.168.1.2:48268 *:* UNCONN 0 0 192.168.1.2:56575 *:* UNCONN 0 0 *:40309 *:* UNCONN 0 0 192.168.1.2:56879 *:* UNCONN 0 0 *:49014 *:* UNCONN 0 0 192.168.1.2:53124 *:* UNCONN 0 0 127.0.1.1:domain *:*
$ ss -a -A udp
The a option tells ss to report both "CONNECTED" and "LISTENING" sockets. Since UDP is a connection-less protocol, just "ss -u" will not report anything in most cases. Therefore we use the "a" option report all UDP connections (connected and listening).
Del mismo modo, use la opción x para enumerar todas las conexiones de socket de Unix.
3. No resolver el nombre de host
Para obtener la salida más rápido, use la opción "n" para evitar que ss resuelva las direcciones IP en nombres de host. Pero esto también evitará la resolución de los números de puerto.
$ ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:80 ESTAB 0 0 192.168.1.2:51350 74.125.200.84:443 ESTAB 0 0 192.168.1.2:33141 83.170.73.249:6667 ESTAB 0 0 192.168.1.2:54028 74.125.135.125:5222 ESTAB 0 0 192.168.1.2:48156 66.196.120.44:5050
4. Mostrar solo enchufes de escucha
Esto mostrará una lista de todos los enchufes de escucha. Por ejemplo, el servidor web apache abre una conexión de socket en el puerto 80 para escuchar las conexiones entrantes.
$ ss -ltn State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 5 127.0.1.1:53 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 128 ::1:631 :::*
El comando anterior enumera todas las conexiones "tcp" que "escuchan". La opción n deshabilita la resolución del nombre de host de las direcciones IP, lo que proporciona una salida más rápida.
Para enumerar todas las conexiones UDP que escuchan, reemplace t por u
$ ss -lun State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.1.1:53 *:* UNCONN 0 0 *:68 *:* UNCONN 0 0 192.168.1.2:123 *:* UNCONN 0 0 127.0.0.1:123 *:* UNCONN 0 0 *:123 *:* UNCONN 0 0 *:5353 *:* UNCONN 0 0 *:47799 *:* UNCONN 0 0 *:25322 *:* UNCONN 0 0 :::54310 :::* .....
5. Imprimir nombre de proceso y pid
Para imprimir el nombre del proceso/pid que posee la conexión, use la opción p
$ ss -ltp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 127.0.0.1:9050 *:* LISTEN 0 128 *:90 *:* LISTEN 0 128 *:db-lsp *:* users:(("dropbox",3566,32)) LISTEN 0 5 127.0.0.1:6600 *:* LISTEN 0 128 127.0.0.1:9000 *:* users:(("php5-fpm",1620,0),("php5-fpm",1619,0))
En el resultado anterior, la última columna contiene el nombre del proceso y el pid. En este ejemplo, dnsmasq es el nombre del proceso y 1299 es el pid.
$ sudo ss -ltp [sudo] password for enlightened: State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* users:(("master",2051,12)) LISTEN 0 128 *:90 *:* users:(("nginx",1701,6),("nginx",1700,6),("nginx",1699,6),("nginx",1697,6),("nginx",1696,6)) LISTEN 0 5 127.0.0.1:6600 *:* users:(("mpd",2392,5)) LISTEN 0 128 127.0.0.1:9000 *:* users:(("php5-fpm",1620,0),("php5-fpm",1619,0),("php5-fpm",1616,7)) LISTEN 0 16 *:2633 *:* users:(("oned",1853,16)) LISTEN 0 50 127.0.0.1:mysql *:* users:(("mysqld",1095,10)) LISTEN 0 5 127.0.1.1:domain *:* users:(("dnsmasq",1347,5)) LISTEN 0 32 *:ftp *:* users:(("vsftpd",1051,3)) LISTEN 0 128 *:ssh *:* users:(("sshd",1015,3)) LISTEN 0 128 127.0.0.1:ipp *:* users:(("cupsd",688,11)) LISTEN 0 128 :::http :::* users:(("apache2",5322,4),("apache2",5321,4),("apache2",5317,4),("apache2",5316,4),("apache2",5313,4),("apache2",2505,4)) LISTEN 0 128 :::ssh :::* users:(("sshd",1015,4)) LISTEN 0 128 ::1:ipp :::* users:(("cupsd",688,10))
6. Imprimir resumen de estadísticas
La opción s imprime las estadísticas.
$ ss -s Total: 526 (kernel 0) TCP: 10 (estab 7, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 0 - - RAW 0 0 0 UDP 15 9 6 TCP 10 9 1 INET 25 18 7 FRAG 0 0 0
7. Mostrar información del temporizador
Con la opción '-o' se mostraría la información horaria de cada conexión. La información del temporizador indica cuánto tiempo con
$ ss -tn -o State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:80 ESTAB 0 0 192.168.1.2:36335 204.144.140.26:80 timer:(keepalive,26sec,0) ESTAB 0 0 192.168.1.2:33141 83.170.73.249:6667 ESTAB 0 0 192.168.1.2:58857 74.121.141.84:80 timer:(keepalive,23sec,0) ESTAB 0 0 192.168.1.2:42794 173.194.40.239:80 timer:(keepalive,32sec,0)
8. Mostrar solo conexiones de socket IPv4 o IPv6
Para mostrar solo las conexiones de socket IPv4, use la opción '-finet' o '-4'.
$ ss -tl -f inet State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 127.0.0.1:9050 *:* LISTEN 0 128 *:90 *:* LISTEN 0 128 *:db-lsp *:* LISTEN 0 5 127.0.0.1:6600 *:*
Para mostrar solo las conexiones IPv6, use la opción '-finet6' o '-6'.
$ ss -tl6 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 ::1:smtp :::* LISTEN 0 128 :::12865 :::* LISTEN 0 128 :::http :::* LISTEN 0 128 :::ssh :::* LISTEN 0 128 ::1:ipp :::*
9. Filtrado de conexiones por estado tcp
El comando ss admite filtros que se pueden usar para mostrar solo conexiones específicas. La expresión de filtro debe tener un sufijo después de todas las opciones. El comando ss acepta el filtro en el siguiente formato.
$ ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]
Ahora, aquí hay algunos ejemplos de cómo filtrar las conexiones de socket por estado de socket.
Para mostrar todos los sockets IPv4 tcp que están en estado "conectado".
$ ss -t4 state established Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.1.2:54436 165.193.246.23:https 0 0 192.168.1.2:43386 173.194.72.125:xmpp-client 0 0 192.168.1.2:38355 199.59.150.46:https 0 0 192.168.1.2:56198 108.160.162.37:http
Mostrar sockets con estado de tiempo de espera
$ ss -t4 state time-wait Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.1.2:42261 199.59.150.39:https 0 0 127.0.0.1:43541 127.0.0.1:2633
El estado puede ser cualquiera de los siguientes
1. established 2. syn-sent 3. syn-recv 4. fin-wait-1 5. fin-wait-2 6. time-wait 7. closed 8. close-wait 9. last-ack 10. closing 11. all - All of the above states 12. connected - All the states except for listen and closed 13. synchronized - All the connected states except for syn-sent 14. bucket - Show states, which are maintained as minisockets, i.e. time-wait and syn-recv. 15. big - Opposite to bucket state.
Tenga en cuenta que muchos estados como syn-sent, syn-recv no mostrarían ningún socket la mayor parte del tiempo, ya que los sockets permanecen en dichos estados por un tiempo muy corto. Sería ideal utilizar el comando watch para detectar dichos estados de socket en tiempo real.
Aquí hay un ejemplo
$ watch -n 1 "ss -t4 state syn-sent"
Después de ejecutar el comando anterior, intente abrir algún sitio web en un navegador o descargue algo de alguna URL. Inmediatamente debería ver las conexiones de los sockets que aparecen en la salida, pero por muy poco tiempo.
Every 1.0s: ss -t4 state syn-sent Tue Apr 1 10:07:33 2014 Recv-Q Send-Q Local Address:Port Peer Address:Port 0 1 192.168.1.2:55089 202.79.210.121:https 0 1 192.168.1.2:33733 203.84.220.80:https 0 1 192.168.1.2:36240 106.10.198.33:https
10. Filtrar conexiones por dirección y número de puerto
Además de los estados del socket tcp, el comando ss también admite el filtrado según la dirección y el número de puerto del socket. Los siguientes ejemplos lo demuestran.
Muestra todas las conexiones de socket con el puerto de origen o destino de ssh.
$ ss -at '( dport = :ssh or sport = :ssh )' State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:ssh *:* LISTEN 0 128 :::ssh :::*
Tomas con puerto de destino 443 o 80
$ ss -nt '( dst :443 or dst :80 )' State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:58844 199.59.148.82:443 ESTAB 0 0 192.168.1.2:55320 165.193.246.23:443 ESTAB 0 0 192.168.1.2:56198 108.160.162.37:80 ESTAB 0 0 192.168.1.2:54889 192.241.177.148:443 ESTAB 0 0 192.168.1.2:39893 173.255.230.5:80 ESTAB 0 0 192.168.1.2:33440 38.127.167.38:443
La siguiente sintaxis también funcionaría
$ ss -nt dst :443 or dst :80
Más ejemplos
# Filter by address $ ss -nt dst 74.125.236.178 # CIDR notation is also supported $ ss -nt dst 74.125.236.178/16 # Address and Port combined $ ss -nt dst 74.125.236.178:80
Los puertos también se pueden filtrar con las opciones dport/sport. Los números de puerto deben tener un prefijo ":".
$ ss -nt dport = :80 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:56198 108.160.162.37:80 ESTAB 0 0 192.168.1.2:39893 173.255.230.5:80 ESTAB 0 0 192.168.1.2:55043 74.125.236.178:80
Lo anterior es lo mismo que> ss -nt dst :80
Algunos ejemplos más de filtrado
# source address is 127.0.0.1 and source port is greater than 5000 $ ss -nt src 127.0.0.1 sport gt :5000 # local smtp (port 25) sockets $ sudo ss -ntlp sport eq :smtp # port numbers greater than 25 $ sudo ss -nt sport gt :1024 # sockets with remote ports less than 100 $ sudo ss -nt dport \< :100 # connections to remote port 80 $ sudo ss -nt state connected dport = :80
Los siguientes operadores son compatibles al comparar números de puerto
<= or le : Less than or equal to port >= or ge : Greater than or equal to port == or eq : Equal to port != or ne : Not equal to port < or gt : Less than to port > or lt : Greater than to port
Resumen
Los ejemplos anteriores cubren la mayor parte de lo que admite el comando ss. Para obtener más información, consulte las páginas man.
La documentación de la sintaxis del filtro se puede encontrar en el paquete iproute2-doc que se puede instalar en los sistemas debian/ubuntu
$ sudo apt-get install iproute2-doc
El archivo /usr/share/doc/iproute2-doc/ss.html contiene detalles sobre la sintaxis del filtro del comando ss.