ss: usas netstat? Es hora de actualizarse! :)
Ya hemos hablado en un artículo anterior sobre el paquete iproute2 y cómo viene a reemplazar, en sistemas Linux, al paquete net-tools. En esta oportunidad vamos a analizar una nueva herramienta, el comando «ss», que viene a cubrir las funcionalidades del querido netstat, la navaja suiza de análisis de sockets y conexiones de red, y que pertenece, como ifconfig, al paquete net-tools.
¿Para qué sirve ss?
ss es un comando que nos permite analizar las estadísticas de los sockets en el sistema operativo. De hecho, «ss» proviene de «socket statistics«.
Puede mostrar estadísticas de paquetes, sockets TCP, sockets UDP, DCCP, sockets raw, incluso sockets del dominio Unix y más.
Las salidas y la información mostrada son similares a las del comando netstat, pero actualizadas. Tengamos en cuenta que en la última versión de la página oficial del manual de netstat puede leerse:
This program is obsolete. Replacement for netstat is ss. Replacement for netstat -r is ip route. Replacement for netstat -i is ip -s link. Replacement for netstat -g is ip maddr.
Traducido:
Este programa es osboleto. El reemplazo para netstat es ss. El reemplazo para netstat -r es ip route. El reemplazo para netstat -i es ip link. El reemplazo para netstat -g es ip maddr.
Información que puede ser corroborada en la wiki de la Linux Foundation.
ss, en fin, puede proveernos información exhaustiva sobre:
- Todos los sockets TCP
- Todos los sockets UDP
- Todas las conexiones establecidas para http, https, ftp o ssh
- Todos los procesos locales conectados al servidor X
- Filtros por estado de conexión, tales como conectado, sincronizado, SYN-RECV, SYN-SENT, TIME-WAIT, direcciones y puertos
- Todos los sockets tcp en estado FIN-WAIT-1
- y mucho mas!
Muchas distribuciones hoy incluyen el comando ss y varias herramientas de monitoreo de redes. Estar familiarizado con ss ayuda al sysadmin a entender y comprender cómo funcionan los sockets en el sistema, y ayuda también a encontrar posibles causas de problemas en las comunicaciones.
Algunas opciones interesantes
- -s | –summary: muestra un resumen (summary) de los sockets abiertos
- -t | –tcp: muestra sockets TCP
- -u | –udp: muestra sockets UDP
- -w | –raw: muestra sockets raw
- -a | –all: muestra sockets en cualquier estado, listening o no
- -x | –unix: muestra sockets de familia UNIX
- -p | –processes: a la salida le agrega el proceso que está utilizando el socket
- -l | –listening: muestra los sockets en estado «listening», escuchando conexiones
- -n | –numeric: no resuelve servicio de nombres
- -r | –resolve: resuelve hostnames a ip
- -e | –extended: muestra información extendida del socket (timer, keepalive, etc.)
- -4 | –ipv4 : muestra información de sockets ipv4
- -6 | –ipv6 : muestra información de sockets ipv6
Algunos ejemplos útiles
Mostrando sockets tcp escuchando conexiones, y los procesos que atienden:
diego@cryptos:~$ sudo ss -tlp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:17603 *:* users:(("dropbox",pid=699,fd=104)) LISTEN 0 100 *:freeciv *:* users:(("openshot-qt",pid=26503,fd=21)) LISTEN 0 128 127.0.0.1:17600 *:* users:(("dropbox",pid=699,fd=98))
Mostrando todos los sockets TCP y UDP escuchando conexiones, procesos, y omitiendo resolución de nombres y puertos:
Este comando es similar al clásico «netstat -npltu«, solo que en ss la salida agrega algo más de información.
admin@ip-172-31-23-221:~$ sudo ss -npltu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=378,fd=3)) tcp LISTEN 0 100 *:25 *:* users:(("master",pid=26781,fd=12)) tcp LISTEN 0 50 *:3306 *:* users:(("mysqld",pid=8003,fd=10)) tcp LISTEN 0 128 :::80 :::* users:(("apache2",pid=32349,fd=4),("apache2",pid=28798,fd=4),("apache2",pid=27077,fd=4),("apache2",pid=25243,fd=4),("apache2",pid=25242,fd=4),("apache2",pid=22929,fd=4),("apache2",pid=22928,fd=4),("apache2",pid=22919,fd=4),("apache2",pid=22916,fd=4),("apache2",pid=22913,fd=4),("apache2",pid=22911,fd=4),("apache2",pid=22909,fd=4),("apache2",pid=22905,fd=4),("apache2",pid=21641,fd=4),("apache2",pid=20728,fd=4),("apache2",pid=19086,fd=4)) tcp LISTEN 0 128 :::22 :::* users:(("sshd",pid=378,fd=4)) tcp LISTEN 0 128 :::443 :::* users:(("apache2",pid=32349,fd=6),("apache2",pid=28798,fd=6),("apache2",pid=27077,fd=6),("apache2",pid=25243,fd=6),("apache2",pid=25242,fd=6),("apache2",pid=22929,fd=6),("apache2",pid=22928,fd=6),("apache2",pid=22919,fd=6),("apache2",pid=22916,fd=6),("apache2",pid=22913,fd=6),("apache2",pid=22911,fd=6),("apache2",pid=22909,fd=6),("apache2",pid=22905,fd=6),("apache2",pid=21641,fd=6),("apache2",pid=20728,fd=6),("apache2",pid=19086,fd=6))
Usando query’s
La opción «-A» o «–query» nos permite especificar una query consultando algún tipo de socket particular, como alternativa a algunas de las opciones anteriores.
Por ejemplo, para poder ver todos los sockets Unix en el sistema podemos usar:
ss -x
O podemos hacer uso de la query «unix» de esta forma:
ss -A unix
o
ss –query=unix
Las query’s disponibles son: all (todos los sockets), tcp, udp, packet, raw, unix, o netlink.
Filtros y más opciones!
Además, ss permite varias expresiones de filtro que le dan al administrador del sistema mucha flexibilidad a la hora de analizar las conexiones!
Ampliaremos en otro artículo estos parámetros, pero para ir generando expectativa, veamos algunas de sus increíbles posibilidades!
listando todas las conexiones cuyo puerto origen es el tcp 22 (ssh) en nuestro equipo local:
sudo ss sport == :22 -t
O, por ejemplo, listar todos los sockets cuyo estado de conexión sea «ESTABLISHED» en IPv4:
sudo ss -t state established
En una próxima entrega ampliaremos en detalle estas opciones!
No olviden seguirnos en Facebook, Twitter o Google+ para enterarse de las novedades, y por supuesto, quedan invitados a suscribirse a nuestra lista semanal de difusión dejando su mail en el sidebar del sitio! GRACIAS!!
Además, ampliaremos esta información en nuestro canal de youtube próximamente, asi que no dejen de sumarse a la comunidad #JuncoTIC en youtube también!!