Analizar las conexiones de red con el comando ss, el reemplazo de netstat
El otro día estaba escribiendo un artículo en el que mostraba como obtener información de la tarjeta de red en sistemas operativos Windows, algo que no suelo hacer con mucha frecuencia, ya que generalmente gestiono sistemas basados en Linux. Esto me trajo la idea de escribir un artículo sobre el análisis de las conexiones de red en Linux, pero conociendo que netstat
pronto será reemplazado por ss
, he decidido usar directamente el comando ss
.
¿Qué es eso de las net-tools y la suite iproute2?
Para los que estén algo perdidos, el comando netstat
pertenece a la suite de herramientas de análisis de redes net-tools, la cual nació en el año 2001. Esta suite fue diseñada para trabajar con kernels antiguos, por eso en muchas distribuciones Linux ya se ha reemplazado net-tools con la nueva suite iproute2.
La suite iproute2 ofrece ciertas ventajas sobre net-tools, en las que no vamos a profundizar con detalles técnicos, pero si aclararemos que ofrecen un mejor rendimiento, tienen un uso más intuitivo y su desarrollo es activo.
Como estamos todavía en una fase de transición a iproute2, son muchas las distribuciones que incluyen ambas, aunque en otras ya se ha eliminado net-tools y marcado el paquete como obsoleto.
Para hacer un tutorial sencillo, sólo vamos a centrarnos en el uso del comando ss
, que forma parte de la suite iproute2. Este comando sirve para analizar las conexiones de red, ya que reemplaza al viejo comando netstat
.
Analizando las conexiones de red en Linux con el comando ss.
El comando ss
hace referencia a «Socket Statuts» y sirve para obtener información de las conexiones de red, puertos abiertos y otras estadísticas.
El uso más básico es ss -a
, el cual mostrará en pantalla toda la información de todas las conexiones. A partir de aquí podemos ir añadiendo diferentes modificadores para obtener la información que buscamos. Recomiendo leer la ayuda con el comando man ss
o consultar los diferentes modificadores con el comando ss -h
.
Ejemplos de uso del comando ss para obtener información de las conexiones.
En primer lugar, si lo que queremos es listar las conexiones en función de si usan el protocolo TCP o UDP, tendremos que usar los siguientes comandos:
- Listar las conexiones TCP:
ss -ta
- Listar conexiones del protocolo UDP:
ss -ua
También podemos filtrar la lista en función de si usan el protocolo de internet IPv4 o IPv6:
- Conexiones bajo IPv4:
ss -4
- Conexiones bajo IPv6:
ss -6
Ahora vamos a afinar un poco más y listar sólo las conexiones cuyo estado es «LISTEN», es decir, que permanecen a la escucha. El comando más básico en este caso sería ss -l
, el cual muestra todos los sockets a la escucha, pero podemos combinarlo con otras opciones para:
- Listar sockets TCP a la escucha:
ss -tl
o también podemos emplear el comandoss -t state listening
- Listar sockets UDP a la escucha:
ss -ul
o el comandoss -u state listening
En ocasiones me gusta añadir a los comandos anteriores la opción -n
para que no se resuelvan los nombres de los servicios. Puedes ver la diferencia en la siguiente imagen.
Ejemplos de cómo filtrar las conexiones en función del protocolo (HTTP, FTP, SMTP o SSH) o en función del puerto.
Ahora voy a mostraros unos ejemplos para listar las conexiones pero filtrando en función de algunos de los protocolos más usados:
- Para listar el tráfico HTTP:
ss state established '( dport = :http or sport = :http )'
- Ver conexiones activas del protocolo FTP:
ss state established '( dport = :ftp or sport = :ftp )'
- Listar conexiones activas SMTP:
ss state established '( dport= :smtp or sport= :smtp )'
- Ver si hay conexiones SSH:
ss state established '( dport = :ssh or sport = :ssh )'
Dentro de este apartado debo añadir la posibilidad de listar las conexiones en función del puerto, por ejemplo podemos emplear ss -nt dst :80
para listar las conexiones cuyo puerto de destino es el puerto 80. Cuando lo que queremos listar son las conexiones cuyo puerto de origen es el 80, usaremos el comando ss -nt src :80
.
Podemos monitorizar varios puertos de forma simultánea, por ejemplo con el comando ss -nt '( dst :443 or dst :80 )'
.
Por último, añadir un pequeño truco que consiste en emplear ss
conjuntamente con el comando watch
, para así monitorizar en tiempo real las conexiones. Podríamos usar por ejemplo: watch ss -ta
Espero que os haya servido de ayuda este pequeño tutorial y os sirva como punto de partida para solucionar algún problema de conexión, monitorizar las conexiones vuestros servidores, etc.