¿Cómo rastrear la actividad de red de un comando?

13

Quiero rastrear la actividad de red de un comando, probé tcpdump y strace sin éxito.

Por ejemplo, si estoy instalando un paquete o utilizando cualquier comando que intente acceder a algún sitio, quiero ver esa actividad de red (el sitio al que intenta acceder).

Supongo que podemos hacer esto usando tcpdump. Lo intenté pero está rastreando toda la actividad de red de mi sistema. Supongamos que si ejecuto múltiples comandos relacionados con la red y quiero rastrear solo la actividad particular de la red de comandos, esa vez es difícil encontrar la solución exacta.

¿Hay una manera de hacer eso?

ACTUALIZAR:

No quiero rastrear todo lo que pasa en mi interfaz de red. Solo quiero hacer un seguimiento de la actividad de red del comando (por ejemplo, #yum install -y vim). Como el sitio al que intenta llegar.

Buvanesh Kumar
fuente
1
Coloque la aplicación en un espacio de nombres de red, luego use tcpdump / wireshark. Ver, por ejemplo, aquí .
dirkt

Respuestas:

17

netstat por simplicidad

Usando netstaty grepping en el PID o el nombre del proceso:

# netstat -np --inet | grep "thunderbird"
tcp        0      0 192.168.134.142:45348   192.168.138.30:143      ESTABLISHED 16875/thunderbird
tcp        0      0 192.168.134.142:58470   192.168.138.30:443      ESTABLISHED 16875/thunderbird

Y podría usar watchpara actualizaciones dinámicas:

watch 'netstat -np --inet | grep "thunderbird"'

Con:

  • -n: Muestra direcciones numéricas en lugar de intentar determinar nombres de host, puerto o usuario simbólicos
  • -p: Muestra el PID y el nombre del programa al que pertenece cada socket.
  • --inet: Solo muestra los sockets de protocolo raw, udp y tcp.

luchar por la verbosidad

Dijiste que probaste la straceherramienta, pero ¿intentaste la opción trace=network? Tenga en cuenta que el resultado puede ser bastante detallado, por lo que es posible que necesite un poco de grepping. Podrías comenzar haciendo grepping en "sin_addr".

 strace -f -e trace=network <your command> 2>&1 | grep sin_addr

O, para un proceso que ya se está ejecutando, use el PID:

 strace -f -e trace=network -p <PID> 2>&1 | grep sin_addr
Gohu
fuente
+1 para el netstatcual es IMHO la solución más simple y ordenada.
dr01
@Gohu hice lo mismo para dnf. Pero sin suerte. Intenté instalar algunos paquetes usando dnf, luego veo que el proceso dnf se está ejecutando (nombre del proceso: dnf según el comando top y ps aux). Lamentablemente, no obtuve ningún resultado de netstat -np --inet | grep "dnf".
Buvanesh Kumar
+1 para strace. Se resolvió mi problema. Puedo obtener las direcciones IP. Muchas gracias por tu respuesta :) @Gohu. Supongo que está dando todas las direcciones IP que alcanza a través de la red (por ejemplo, IP del enrutador y otras IP). Si lo sabe, ¿es posible rastrear solo la IP de destino?
Buvanesh Kumar
Puede intentar filtrar la stracesalida un poco más, solo manteniendo las connectllamadas al sistema y eliminando las dnssolicitudes (puerto 53) con:| grep connect | grep -v 'sin_port=htons(53)'
Gohu
+1 para la opción de red de rastreo en strace
phreed
5

Crearía un nuevo espacio de nombres de red , lo conectaría a la red real y luego monitorearía el puente con tcpdump.

Simon Richter
fuente
1
gracias por la respuesta. Sería genial si me dijeras cómo :).
Buvanesh Kumar
5

sysdig le permite monitorear toda la actividad del núcleo o de varios comandos que se ejecutan en su sistema de una vez, incluidos, entre otros, la actividad de la red.

Como el resultado puede ser grande, debe crear filtros, la página predeterminada para los filtros más básicos es bastante comprensible.

También tiene la ventaja de que no se usa como envoltorio de aplicaciones como en strace, y puede ser bastante potente.

De ejemplos de Sysdig

Redes

Vea los principales procesos en términos de uso de ancho de banda de red

sysdig -c topprocs_net 

Mostrar los datos de red intercambiados con el host 192.168.0.1

Como binario:

sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1   

Como ASCII:

sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1 

Consulte los principales puertos del servidor local:

En términos de conexiones establecidas:

sysdig -c fdcount_by fd.sport "evt.type=accept"   

En términos de bytes totales:

sysdig -c fdbytes_by fd.sport 

Ver las principales IP del cliente

En términos de conexiones establecidas

sysdig -c fdcount_by fd.cip "evt.type=accept"   

En términos de bytes totales

sysdig -c fdbytes_by fd.cip 

Lista todas las conexiones entrantes que no son atendidas por apache.

sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
Rui F Ribeiro
fuente
1

Puede usar wireshark para detectar todo el tráfico de entrada y salida de una interfaz de red. En caso de que necesite una opción sin GUI, puede usar tshark.

Con ambas opciones puede ver todo el tráfico de la red y guardarlo para luego analizar todas las conexiones establecidas.

Ricard Molins
fuente
1
Como dije anteriormente, si ejecuto múltiples comandos relacionados con la red, ¿cómo puedo saber qué comando está obteniendo qué sitio?
Buvanesh Kumar
Esta es una respuesta más genérica. Que ya sé que podemos rastrear la actividad de red de una interfaz de red :). Estoy buscando el seguimiento de un comando particular de la red estática.
Buvanesh Kumar
Si sabe qué puertos usa el comando, puede filtrar el sniff para limitarlo al comando que desee. Sin embargo, esto puede no ser factible en su situación.
Ricard Molins