¿Cómo puedo capturar el tráfico de red de un solo proceso?

93

Me gustaría examinar el tráfico de red manejado por un solo proceso, pero las capturas de red simples no funcionarán ya que estoy lidiando con un sistema tan ocupado (hay mucho tráfico al mismo tiempo). ¿Hay alguna manera de aislar tcpdumpo wiresharkcapturar el tráfico de red de un solo proceso específico? (El uso netstates insuficiente).

Kees Cook
fuente

Respuestas:

21

De hecho, hay una manera, utilizando los filtros Wireshark . Pero no puede filtrar directamente por nombre de proceso o PID (porque no son cantidades de red).

Primero debe averiguar los protocolos y los puertos utilizados por su proceso (el comando netstat en el comentario anterior funciona bien).

Luego use Wireshark para filtrar el puerto entrante (o saliente) con el que acaba de recuperar. Eso debería aislar el tráfico entrante y saliente de su proceso.

OpenNingia
fuente
66
Para una conexión simple, esto es posible, pero necesito rastrear DNS, HTTP, etc., que están pasando rápidamente, por lo que no hay una manera simple de usar netstaty simples filtros de captura de red en una máquina ocupada.
Kees Cook, el
Ok, los puertos públicos HTTP y DNS son utilizados por muchas aplicaciones, pero el puerto privado correspondiente es único. Entonces, ¿por qué no intentas filtrar por el puerto privado?
OpenNingia el
Porque las pequeñas solicitudes rápidas no serán vistas por netstat; Solo podré atrapar conexiones duraderas. :(
Kees Cook
¿Qué pasa si el proceso usa puertos dinámicos en tiempo de ejecución, entonces no podrá usar filtros de puerto estático?
The Unix Janitor
Creo que tienes la mejor respuesta ... Lamentablemente, una herramienta de detección de red funciona en el nivel más bajo de la pila de red, tratando de atrapar todo, no es consciente de los procesos que se ejecutan en el sistema operativo. Sería extremadamente difícil averiguar qué originó una determinada llamada. Un sniffer de paquetes eventualmente podría descubrir (a través del número de puerto) una ID de proceso, pero no puede determinar qué proceso realizó una búsqueda de DNS, ya que esto es completamente independiente (probablemente sea la pila de red del núcleo que activó la llamada). Pero con el filtrado y la detención de otros procesos, debería ser capaz de lograr su objetivo.
Huygens
136

Para iniciar y monitorear un nuevo proceso:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Para monitorear un proceso existente con un PID conocido:

strace -p $PID -f -e trace=network -s 10000
  • -f es para "seguir nuevos procesos"
  • -e define un filtro
  • -s establece el límite de cadenas a más de 32
  • -p toma la identificación del proceso para adjuntar a
Clausi
fuente
2
Esto es útil porque se puede usar sin tener acceso de root o permisos especiales (en algunas distribuciones de Linux, de todos modos, en Ubuntu puede necesitar permisos especiales).
Robin Green
1
Esto también es útil, ya que puede ejecutarse contra un proceso ya iniciado y está disponible en prácticamente cualquier caja de Linux.
zakmck
53

Sé que este hilo es un poco viejo, pero creo que esto podría ayudar a algunos de ustedes:

Si su kernel lo permite, la captura del tráfico de red de un solo proceso se realiza muy fácilmente ejecutando dicho proceso en un espacio de nombre de red aislado y utilizando Wirehark (u otras herramientas de red estándar) en dicho espacio de nombre también.

La configuración puede parecer un poco compleja, pero una vez que la comprenda y se familiarice con ella, facilitará mucho su trabajo.

Para hacerlo:

  • crear un espacio de nombres de red de prueba:

    ip netns add test
    
  • cree un par de interfaces de red virtuales (veth-a y veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • cambiar el espacio de nombres activo de la interfaz veth-a:

    ip link set veth-a netns test
    
  • configurar las direcciones IP de las interfaces virtuales:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • configurar el enrutamiento en el espacio de nombres de prueba:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • active ip_forward y establezca una regla NAT para reenviar el tráfico que ingresa desde el espacio de nombres que creó (debe ajustar la interfaz de red y la dirección IP de SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (También puede usar la regla MASQUERADE si lo prefiere)

  • Finalmente, puede ejecutar el proceso que desea analizar en el nuevo espacio de nombres, y Wirehark también:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Tendrás que controlar la interfaz veth-a.

felahdab
fuente
44
Gran idea, pero cuidado con las "limitaciones". Dado que este es un espacio de nombres separado, no puede comunicarse con procesos locales en el espacio de nombres predeterminado utilizando la (s) dirección (es) de bucle invertido o los sockets de dominio UNIX. Esto último afecta la comunicación a través de D-Bus.
Lekensteyn
@Lekensteyn aún puede usar sockets de dominio Unix en todos los espacios de nombres de red afaik. El sistema de archivos no está aislado por ellos.
randunel
1
@randunel Debería haber sido más preciso al respecto. Lo que quise decir es que no se puede acceder directamente a los sockets de dominio Unix en el "espacio de nombres de socket abstracto" (que no usa el sistema de archivos) entre espacios de nombres de red. Como solución alternativa, puede usar un proxy comosocat .
Lekensteyn
¿A qué dirección IP utilizas con el --to-sourceargumento iptables? ¿Es esta la dirección IP de la interfaz que pasa a la -oopción, una dirección IP que crea, o ??? Probé la versión enmascarada que no necesita --to-source, como se describe aquí , ¡y funcionó!
ntc2
3
Todo esto parece requerir acceso de root.
simplegamer
15
netstat -taucp | grep <pid or process name>

Eso mostrará las conexiones que está haciendo una aplicación, incluido el puerto que se está utilizando.

Oli
fuente
8
Esto mostraría las conexiones que existen para ese instante, pero no proporcionará un registro del tráfico en sí.
Kees Cook, el
1
No estoy seguro sobre el comentario de Kees Cook. Un simple netstat muestra información sobre las conexiones por un instante, pero con la bandera -c obtienes una instantánea de ese estado cada segundo (ver 'man netstat'). Quizás no tiene todo el tráfico, pero no es una instantánea única de las conexiones.
tremendows
3
Pues estoy seguro. Esto no capturará todo el tráfico de red de un proceso.
Reinier Post
Esto fue útil para determinar qué número de puerto estaba siendo bloqueado por un firewall interno. Mostraba los SYN TCP (junto con la dirección de destino y el número de puerto) enviados por el comando que estaba ejecutando.
Anthony Geoghegan
11

Solo una idea: ¿es posible vincular su aplicación a una dirección IP diferente? Si es así, puede usar los sospechosos habituales ( tcpdump , etc.)

Herramientas para aplicaciones que no pueden vincularse a otra dirección IP:

http://freshmeat.net/projects/fixsrcip

fixsrcipes una herramienta para vincular zócalos de cliente TCP y UDP salientes ( IPv4 ) a direcciones IP de origen específicas en hosts con alojamiento múltiple

http://freshmeat.net/projects/force_bind

force_bindle permite forzar el enlace en una IP y / o puerto específico. Funciona tanto con IPv4 como con IPv6 .

Clausi
fuente
La mayoría de las aplicaciones no admiten la especificación de su IP de origen, pero esto en realidad podría ser posible utilizando un contenedor con CLONE_NEWNET pero no CLONE_NEWNS.
Kees Cook, el
Alternativamente, puede crear un espacio de nombres de red y ejecutar su aplicación dentro de él www.evolware.org/?p=293
Flint
9

He encontrado un problema similar y pude resolverlo en base a esta respuesta por ioerror , usando NFLOG como se describe aquí :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

Luego puede crear, ejecutar el proceso en cuestión desde una cuenta de usuario que no hace nada más, y listo, acaba de aislar y capturar el tráfico de un solo proceso.

Solo quería publicar de nuevo en caso de que ayude a alguien.

szymon
fuente
6

¡Escribí una aplicación C que hace lo que se describe en la gran respuesta anterior de felahdab!

Ver aquí: nsntrace github repo

Jonas Danielsson
fuente
Eso es genial, pero creo que sería bueno incluir algunos detalles más sobre cómo obtenerlo y usarlo :)
Zanna
¡Gracias! ¡Proporcioné un enlace al repositorio de github que contiene un archivo README.md que tiene uso y ejemplos, y las instrucciones de descarga!
Jonas Danielsson
5

Este es un truco sucio, pero sugeriría un objetivo de desvío o de registro con iptables para un UID dado. p.ej:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

También podría valer la pena investigar algo como '--log-tcp-secuencia', '--log-tcp-options', '--log-ip-options', '--log-uid' para ese objetivo de registro . Aunque sospecho que eso solo lo ayudará a publicar un proceso de pcap que incluye una tonelada de otros datos.

El objetivo NFLOG puede ser útil si desea marcar paquetes y luego ciertos paquetes etiquetados se enviarán a través de un socket de enlace de red a un proceso de su elección. Me pregunto si eso sería útil para hackear algo con wireshark y su aplicación específica ejecutándose como un usuario específico.

ioerror
fuente
pero esto funciona solo para salientes, ¿qué pasa con el ingreso?
resultados
5

Puedes probar tracedump - http://mutrics.iitis.pl/tracedump

Hace exactamente lo que desea, puede darle una ID de proceso o un programa para que se ejecute.

pjf
fuente
1
Buen proyecto, pero ... "Tracedump actualmente solo se ejecuta en hosts Linux de 32 bits", por desgracia, me mata.
gertvdijk
4

Intente ejecutar el proceso que le interesa debajo de strace :

strace ping www.askubuntu.com

Le dará información muy detallada sobre lo que está haciendo su proceso. Como un proceso puede abrir cualquier puerto que desee en cualquier lugar, usando un filtro predefinido puede perder algo.

Otro enfoque sería utilizar una máquina virtual simplificada o una máquina de prueba en su red, y colocar su proceso de forma aislada en esto. Entonces puedes usar Wireshark para atrapar todo desde esa máquina. Estarás bastante seguro de que el tráfico que captures será relevante.

El conserje de Unix
fuente
Agregar un "-e trace = network" reduce parte de la salida, a costa de perder los datos que realmente se escriben en la red. Si solo le importa el "número de tomas abiertas" o similar, esto facilita las cosas.
dannysauer
3

Sobre la base de la respuesta de ioerror , sospecho que puede usar iptables --uid-ownerpara establecer un marcador en el tráfico, y luego puede pedirle a Wirehark que capture solo el tráfico con ese marcador. Es posible que pueda usar un DSCP (marcador de servicios diferenciales), id de flujo o un marcador de calidad de servicio.

O, de hecho, podría usar esto para enviar esos paquetes a una interfaz diferente y luego capturar solo en esa interfaz.

billar
fuente
-1

tal vez iptables y ulog pueden funcionar? No es que tenga una receta exacta, pero creo que iptables puede coincidir con los procesos, una vez que coincida podría usar ulog.


fuente
3
Desafortunadamente, iptables -m owner --pid-owner $PIDse eliminó en Linux 2.6.14: ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Kees Cook el
-1

Creo que puede crear un script de shell para recorrer la ejecución de netstat y registrarlo en un archivo de texto. Algo así (pasos muy difíciles):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

No soy programador, así que no puedo refinar esto. Pero alguien aquí puede comenzar desde donde lo dejé y crear un script de trabajo para usted.

estañado
fuente
No es suficiente. La pregunta es capturar todo el tráfico de red, no solo lo que esté activo en el momento en que lo verifique.
Reinier Post