GNU/Linux >> Tutoriales Linux >  >> Linux

Uso de la herramienta SS para la resolución de problemas de red

Introducción:

El siguiente artículo ha sido copiado completamente 1 a 1 (¡plagio total!) del siguiente sitio para poder consultarlo aquí en caso de que el artículo desaparezca del acceso a Internet o se mueva de ubicación.
http:// www.linux-magazine.com/Issues/2015/181/Querying-Sockets-with-ss

Revista Linux. Artículo del número 181/2015
Autor(es):Chris Binnie

El modesto ss La utilidad es fácil de entender y escribir, pero agrega algunas opciones poderosas a su kit de herramientas de administración.

Los nombres de algunas utilidades de Linux son tan pequeños que los inicia inesperadamente al ingresar un error tipográfico en la línea de comando. ¿Por qué molestarse en escribir palabras largas cuando una abreviatura perfectamente adecuada será suficiente? Un comando minúsculo (tanto en nombre como en tamaño de bolsillo en su disco duro) es una pequeña utilidad llamada ss .

Ss golpea varios niveles por encima de su clase de peso mosca. Si está familiarizado con alguna de las herramientas populares utilizadas por los administradores de sistemas para verificar los enlaces de red, estoy seguro de que le alegrará saber que su funcionalidad no será demasiado difícil de comprender.

Para los curiosos entre nosotros, el “ss Aparentemente, la abreviatura es para las palabras "estadísticas de socket". Ss se incluye con el paquete iproute2. Si, por alguna razón muy inusual, no encuentra ss en su sistema similar a Debian, siempre puede instalarlo ejecutando:

sudo apt-get install iproute2

Un socket, es un puerto y una dirección IP. Puede pensar en un socket como la identificación de un servicio que escucha en un número de puerto específico de una computadora específica. Un par de sockets, en este caso, consta de una dirección IP de cliente, un número de puerto de cliente, una dirección IP de servidor y un número de puerto de servidor. Por lo tanto, consultar información por socket le permite concentrarse rápidamente en un servicio específico que se ejecuta en una dirección IP específica.

Sería negligente si no mencionara los sockets de dominio de Unix. Los sockets de dominio de Unix, que facilitan la comunicación entre los procesos que se ejecutan en una máquina local, tienen una serie de propósitos útiles, como habilitar los permisos necesarios para acceder a los recursos entre los procesos que, de otro modo, no tendrían privilegios.
Primeros pasos con ss

En la mayoría de los escenarios, ss se ejecutará desde una cuenta de usuario normal. En mi sistema, ss reside en /usr/sbin/ss directorio. Comenzaré con algunos usos básicos de ss. El siguiente comando muestra la salida para redes IPv4:
# ss -4
La salida abreviada (Listado 1) muestra la comunicación entre el cliente y el servidor. Tenga en cuenta que un cliente también puede ser un servidor, y viceversa, dependiendo de la dirección del flujo de información.

Listado 1
Salida ss básica
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:37564 192.168.0.100:www
ESTAB 0 0 192.168.0.2:47592 192.168.0.156:smtp
ESTAB 0 0 192.168.0.2:ssh 192.168.0.49:64009

Reemplace la opción -4 con -6 para generar información sobre las conexiones IPv6.

Como puede ver en el Listado 1, 192.168.0.2 es la dirección IP de la máquina local y la útil utilidad /etc/services ha convertido algunos números de puerto en nombres (como ssh, www y smtp).

El excelente ss también ofrece información sobre TCP, UDP, sockets de dominio Unix locales y sockets remotos. Como describiré más adelante, lo que hace que ss sea excepcionalmente poderoso es su capacidad para lidiar con el estado de las conexiones.

A menudo uso ss para consultar qué puertos abren los demonios instalados en la computadora. Use la opción l para verificar los puertos de escucha (Listado 2):

Listado 2

Visualización de los puertos de escucha
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:ssh *:*
LISTEN 0 100 127.0.0.1:smtp *:*
LISTEN 0 128 *:sunrpc *:*
LISTEN 0 128 127.0.0.1:http *:*

# ss -l
Es posible que desee verificar los puertos de escucha durante su rutina diaria de administración del sistema para asegurarse de que los servicios inesperados y potencialmente inseguros no se hayan dejado habilitados. O bien, es posible que desee buscar rootkits menos sofisticados que no oculten sus puertos abiertos de manera efectiva.

Cualquiera de los comandos
lsof -i
netstat -tulpn

lo ayudará a determinar qué procesos (PID) están abriendo sus puertos, para que pueda eliminarlos si es necesario.
Simplemente ejecutando el comando ss sin ninguna opción, se obtiene una lista de las "conexiones" actuales ( tenga en cuenta que en realidad son "enchufes"), como se muestra en el Listado 3.

Listado 3
ss sin adornos

# ss
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:37564 192.168.0.49:tcpmux
ESTAB 0 64 192.168.0.2:ssh 192.168.0.143:64009
ESTAB 0 0 192.168.0.2:47609 192.168.0.88:gopher

PID

Si no puede obtener acceso a lsof y no le gusta netstat (no soy un gran fan), la utilidad super-duper ss también puede informar sobre los PID pertinentes a sus puertos abiertos. Para ver qué procesos están usando sockets directamente, solo agrega una -p a la mezcla:
# ss -p
Una advertencia es que necesito iniciar sesión como root para obtener la información ampliada. El Listado 4 muestra un ejemplo de lo que puede esperar.

Listado 4
ss -p
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.10.10.20:ssh 10.10.10.10:52918 users:(("sshd",31195,3),("sshd",31204,3))

Trabajando hacia atrás desde el nombre de la aplicación, que es sshd en este caso, puede ver los PID 31195 y 31204; 31204 pertenece a un usuario sin privilegios (mi usuario de inicio de sesión) y 31195 parece ser el resultado de la inteligente separación de privilegios empleada por sshd.

SSH está diseñado para minimizar las posibilidades de errores de programación que causen problemas sistémicos muy graves al limitar el acceso y restringir el servicio a una cárcel chroot para el proceso SSH orientado a la red. Para lograr este objetivo, SSH utiliza dos procesos. El proceso de propiedad raíz supervisa el progreso del proceso sin privilegios, que tiene un UID y un GID que no se han utilizado anteriormente.
Mirando más a fondo

Puede usar ss -s para recuperar capas de estadísticas relacionadas con cuántos sockets están abiertos y qué protocolos están usando (Listado 5).

Listado 5

ss -s
Total: 201 (kernel 218)
TCP: 6 (estab 2, closed 0,
orphaned 0, synrecv 0,
timewait 0/0), ports 5
Transport Total IP IPv6
* 218 - -
RAW 0 0 0
UDP 5 5 0
TCP 6 6 0
INET 11 1 0
FRAG 0 0 0

No es la mejor de las comparaciones, pero podría obtener un resultado vagamente similar usando el siguiente comando netstat:
# netstat -tan | grep -v "Proto" | grep -v "Active" | awk '{print $6}' | uniq -c
Definitivamente vale la pena mencionar que la utilidad super ss tiene la costumbre de superar a otras herramientas de red en las pruebas comparativas. Comparado con netstat ampliamente utilizado, por ejemplo, ss entrega sus resultados muy rápidamente. Sin embargo, tenga en cuenta que ss no está diseñado para responder a todas las preguntas posibles, sino que refleja la filosofía de Unix de que cada componente del sistema debe "hacer una cosa bien". Los usuarios experimentados a menudo combinan ss con herramientas como netstat y luego reducen la salida usando herramientas como grep, awk y sed.

Por ejemplo, si desea ver qué aplicación está ocupando un puerto específico, puede usar ss con grep, de la siguiente manera:
# ss | grep 58620

Ser específico

Puede mirar solo los sockets TCP con:
# ss -t
Alternativamente, puede escribir la opción –tcp. Aumente el nivel de detalle con el interruptor -a (para "todos"):
# ss -t -a
Alterar ese comando ligeramente genera una salida para incluir sockets UDP, Raw y Unix. Para obtener una vista detallada de todos los sockets UDP, ingrese
# ss -u -a
y para ver todos los sockets sin procesar, ingrese:
# ss -w -a
Si realmente debe disfrutar de varias pantallas de texto alucinante, puede optar por ver todos los sockets de dominio de Unix con:
# ss -x -a

También se incluye en la caja de herramientas aparentemente sin fondo proporcionada por la utilidad ss la capacidad de vigilar los sockets DCCP; DCCP es un protocolo de red menos común que tiene las características de verificación de errores y orientadas a la conexión de TCP con las características de tipo de transmisión de UDP. El protocolo DCCP se usa a menudo para la transmisión de medios. Verifique el tráfico DCCP con este pequeño e ingenioso comando:
# ss -d -a
También puede monitorear el estado de las conexiones a su computadora ampliando el nivel de detalle usando la opción -e (Listado 6).

Listado 6
# ss -e
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:ssh 192.168.0.88:58302 timer:(keepalive,40min,0) ino:2184870 sk:ffff880138d26700
ESTAB 0 0 192.168.0.2:48246 192.1680.56:ntp timer:(keepalive,105min,0) ino:2187726 sk:ffff880138d2748

El Listado 6 muestra opciones de temporizador que ofrecen una idea del estado actual de cualquier actividad de mantenimiento en una conexión. Esta función puede ser útil para servicios como HTTP o SSH, que tienden a emplear keepalives (consulte el cuadro titulado "Notas de Keepalive"). El Listado 7 muestra un resultado similar usando el comando netstat -to.

Notas de Keepalive

Un paquete keepalive generalmente tiene un TCP ACK configurado con un número de secuencia establecido en uno menos que el número actual utilizado en la conexión. Cualquier máquina que reciba un empujón de dicho paquete simplemente responderá con el número de secuencia correcto y, aparte de las bromas de Frankenstein, anunciará que efectivamente está vivo.

Este tipo de paquetes a veces están vacíos y generalmente tienen tres parámetros asociados. El parámetro de reintento declarará cuántas veces enviar un paquete antes de llegar a la conclusión de que el otro extremo de la conexión se ha rendido. La configuración de tiempo se configura como la frecuencia de las comprobaciones y, finalmente, el intervalo dicta el tiempo entre dos paquetes enviados si no se recibe respuesta.

Dentro del núcleo, puede modificar esta configuración editando estos valores en el pseudo-sistema de archivos llamativo conocido y amado como /proc . Un archivo, en este caso, es /proc/sys/net/ipv4/tcp_keepalive_time , y puede editarlo de la siguiente manera:
# echo 75 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 9 > /proc/sys/net/ipv4/tcp_keepalive_probes

Listado 7
# netstat -to
Proto Recv-Q Send-Q Local Address Foreign Address State Timer
tcp 0 0 host-one:48340 host-four:45358 ESTABLISHED keepalive (6830.00/0/0)
tcp 0 64 host-two:ssh host-three:58302 ESTABLISHED on (0.45/0/0)

Netstat también le permite anteponer el versátil comando watch y ver actualizaciones en tiempo real:
# watch netstat -to
Está cerca, pero debo admitir que, en este caso, netstat mantiene su salida agradable y sucinta y se ve tan bien como la salida de la utilidad ss.
Origen y destino
La El siguiente comando le permite encontrar información sobre cualquier socket con un destino (dst) dirigido a una dirección IP específica:
# ss dst 192.168.0.1
Por el contrario, no va a tomar un gran salto considerar que el uso de la opción src revela información en el lado fuente del socket:
# ss src 192.168.0.2
Práctico, ¿eh? Esta sintaxis es fácil de recordar si está apurado, salvando el día cuando un jefe irritable está respirando sobre su nuca durante un apagón.
Incluso puede usar notaciones de red CIDR en la leyenda de la dirección:
# ss dst 192.168.0.1/24
Agregue dos puntos al final y podrá buscar un puerto muy específico y un rango de direcciones IP muy amplio al mismo tiempo:
# 192.168.0.1/24:53
Realmente aprecio esta funcionalidad en situaciones con mucho tráfico y numerosos puertos abiertos. Por ejemplo, esta opción le permite monitorear toda la actividad relacionada con DNS en una subred /24 completa con un simple comando ss.
Expresiones regulares
Además de nombres DNS y direcciones IP, también puede usar expresiones regulares (regex) operadores en su sintaxis ss. Echa un vistazo a esta pequeña pepita:
# ss dport != :53
Este comando excluye el dport de destino en el puerto DNS 53.
Si necesita conservar la cordura y evitar mirar solo los números, también puede traducir los puertos al formato /etc/services:
# ss 192.168.0.1:http
Si está listo para quedar impresionado, también puede incluir mayor que, menor que, menor que o igual a, etc.:
# ss dport > :53
También son posibles otros caracteres especiales, aunque a veces los caracteres especiales necesitan escaparse. Los equivalentes alfabéticos, como eq (igual), ne (diferente), gt (mayor que) y le (menor que) también funcionan. Su kilometraje puede variar con diferentes versiones de la utilidad ss.

Estado de conexión

Puede utilizar la –consulta o -A consulta adicional para volcar una tabla de sockets. La palabra mágica autoenlace comprueba los puertos efímeros a los que se han conectado los sockets. Prepárese para reglas de salida, incluso en un sistema silencioso. En el Listado 8 se muestra una versión abreviada del resultado.

Listado 8

# ss -a -A all autobound
01 u_str ESTAB 0 0 * 11984 * 0
02 u_str ESTAB 0 0 * 11996 * 0
03 u_str ESTAB 0 0 * 12003 * 0
04 u_str ESTAB 0 0 * 12005 * 0
05 u_str ESTAB 0 0 * 12010 * 0

También puede filtrar por estados de TCP; por ejemplo, el siguiente comando filtra el tráfico sFTP:
# ss state connected dport = :sftp
Todo lo que se trata como "actual" en relación con el puerto sFTP se muestra rápidamente.
Puede complicar el comando un poco más con un operador booleano:
# ss ( sport = :ftp or dport = :http )
Incluso puede usar ss para encontrar conexiones que se encuentran en un estado TCP específico, incluido el establecido, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, cerrar-esperar, último-reconocimiento, escuchar y cerrar.

Los parámetros de estado de TCP le permiten realizar consultas muy potentes. Por ejemplo, verificar los estados FIN–WAIT–1 le permite identificar si su aplicación ha cerrado su lado de una conexión, pero un host remoto no ha cerrado su lado, ocupando así los preciados puertos de su máquina:

ss -o state fin-wait-1 '( sport = \
:ftp or sport = :http )' \
dst 10.10.3.3/24:22

Iniciar sesión hasta que termine

El ss La utilidad es una herramienta poderosa que lo ayudará a consultar su red con gran detalle. Ss tiene un rendimiento extremadamente alto tanto para consultas manuales como automáticas, y requiere muy pocas pulsaciones de teclas para ejecutar comandos comunes.

Esta pequeña pero heroica herramienta ayuda a flexionar los músculos de cualquier administrador de sistemas. Si desea aumentar el poder de su kit de herramientas de administración, intente practicar algunos de los comandos más complejos en su trabajo diario.


Linux
  1. Comience a usar systemd como una herramienta de solución de problemas

  2. Desarrolle aplicaciones de red para ESP8266 usando Mongoose en Linux

  3. 10 comandos de Linux para diagnóstico de red

  4. Nutty:una herramienta de diagnóstico de red para Ubuntu

  5. Ejemplos del uso del comando tcpdump para solucionar problemas de red

Una guía para principiantes sobre la resolución de problemas de red en Linux

Uso de ifstat para estadísticas de red de Linux

Consejos para usar tmux

Consejos para usar la pantalla

¿Usando Xdg-open para acceder a la red con Normal Explorer?

Las 10 mejores herramientas de prueba de penetración para Linux