web-dev-qa-db-fra.com

Comment puis-je capturer le trafic réseau d'un processus unique?

J'aimerais examiner le trafic réseau géré par un processus unique, mais les captures réseau simples ne fonctionneront pas, car je suis confronté à un système aussi occupé (de nombreux autres flux se produisent en même temps). Existe-t-il un moyen d'isoler une capture tcpdump ou wireshark dans le trafic réseau d'un processus spécifique? (Utiliser netstat est insuffisant.)

87
Kees Cook

En effet, il existe un moyen d’utiliser les filtres Wireshark . Mais vous ne pouvez pas filtrer directement par nom de processus ou par PID (car ils ne sont pas des quantités de réseau).

Vous devez d’abord comprendre les protocoles et les ports utilisés par votre processus (la commande netstat dans le commentaire précédent fonctionne bien).

Utilisez ensuite Wireshark pour filtrer le port entrant (ou sortant) avec celui que vous venez de récupérer. Cela devrait isoler le trafic entrant et sortant de votre processus.

18
OpenNingia

Pour démarrer et surveiller un nouveau processus:

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

Pour surveiller un processus existant avec un PID connu:

strace -p $PID -f -e trace=network -s 10000
  • -f est pour "suivre les nouveaux processus"
  • -e définit un filtre
  • -s définit la limite de chaînes à plus de 32
  • -p prend l'identifiant du processus auquel s'attacher
124
Clausi

Je sais que ce fil est un peu vieux mais je pense que cela pourrait aider certains d'entre vous:

Si votre noyau le permet, il est très facile de capturer le trafic réseau d'un processus unique en exécutant ledit processus dans un espace de noms de réseau isolé et en utilisant Warshark (ou d'autres outils de réseau standard) dans ledit espace de noms.

La configuration peut sembler un peu complexe, mais une fois que vous la comprendrez et la maîtriserez, cela facilitera beaucoup votre travail.

Pour le faire:

  • créer un espace de noms réseau de test:

    ip netns add test
    
  • créer une paire d'interfaces réseau virtuelles (veth-a et veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • changez l'espace de nom actif de l'interface veth-a:

    ip link set veth-a netns test
    
  • configurez les adresses IP des interfaces virtuelles:

    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
    
  • configurez le routage dans l'espace de noms de test:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • activez ip_forward et établissez une règle NAT pour transférer le trafic provenant de l'espace de noms que vous avez créé (vous devez ajuster l'interface réseau et l'adresse IP 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>
    

    (Vous pouvez également utiliser la règle MASQUERADE si vous préférez)

  • enfin, vous pouvez exécuter le processus que vous souhaitez analyser dans le nouvel espace de noms, et Wharshark également:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Vous devrez surveiller l'interface veth-a.

51
felahdab
netstat -taucp | grep <pid or process name>

Cela montrera les connexions effectuées par une application, y compris le port utilisé.

15
Oli

Juste une idée: Est-il possible de lier votre application à une adresse IP différente? Si oui, vous pouvez utiliser les suspects habituels ( tcpdump , etc.)

Outils pour les applications qui ne sont pas capables de se lier à une autre adresse IP:

http://freshmeat.net/projects/fixsrcip

fixsrcip est un outil permettant de lier les sockets clients sortants TCP et UDP ( IPv4 ) à des adresses IP sources spécifiques sur des hôtes à hébergement multiple.

http://freshmeat.net/projects/force_bind

force_bind vous permet de forcer la liaison sur une adresse IP et/ou un port spécifique. Cela fonctionne avec IPv4 et IPv6 .

10
Clausi

Je suis arrivé à un problème similaire et j'ai pu le résoudre en fonction de cette réponse par ioerror , en utilisant NFLOG comme décrit ici :

# 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

Ensuite, vous pouvez créer, exécuter le processus en question à partir d'un compte d'utilisateur qui ne fait rien d'autre - et voilà, vous venez d'isoler et de capturer le trafic d'un seul processus.

Je voulais juste renvoyer au cas où cela pourrait aider quelqu'un.

9
szymon

Vous pouvez essayer tracedump - http://mutrics.iitis.pl/tracedump

Il fait exactement ce que vous voulez, vous pouvez lui attribuer un ID de processus ou un programme à exécuter.

5
pjf

C'est un sale bidouillage, mais je suggérerais soit un renvoi, soit une cible de journal avec iptables pour un UID donné. par exemple:

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 

Cela pourrait également valoir la peine d’examiner quelque chose comme "--log-tcp-sequence", "--log-tcp-options", "--log-ip-options", "--log-uid" pour cette cible de journal . Bien que je suppose que cela ne vous aidera qu'à post-traiter un pcap qui inclut une tonne d'autres données.

La cible NFLOG peut être utile si vous souhaitez marquer les paquets. Par la suite, certains paquets marqués seront envoyés via un socket netlink à un processus de votre choix. Je me demande si cela serait utile pour pirater quelque chose avec Wirehark et votre application spécifique exécutée en tant qu'utilisateur spécifique?

5
ioerror

J'ai écrit une application C qui fait ce qui est décrit dans l'excellente réponse ci-dessus par felahdab!

Voir ici: nsntrace github repo

5
Jonas Danielsson

Essayez de lancer le processus qui vous intéresse sous strace :

strace ping www.askubuntu.com

Cela vous donnera des informations très détaillées sur ce que fait votre processus. En tant que processus, vous pouvez ouvrir n'importe quel port de votre choix, en utilisant un filtre prédéfini, vous risquez de rater quelque chose.

Une autre approche consisterait à utiliser une machine virtuelle ou une machine de test dépourvue d’importance sur votre réseau et à placer votre processus dessus en isolation. Ensuite, vous pouvez simplement utiliser Wireshark pour tout capturer à partir de cette machine. Vous serez certain que le trafic que vous capturez sera pertinent.

4
The Unix Janitor

Construire sur la réponse de ioerror Je suppose que vous pouvez utiliser iptables --uid-owner pour définir un marqueur sur le trafic, puis vous pouvez demander à Wireshark de ne capturer que le trafic avec ce marqueur. Vous pourrez peut-être utiliser un marqueur de services différentiels (DSCP), un identifiant de flux ou un marqueur de qualité de service.

Vous pouvez également utiliser cette option pour envoyer ces paquets sur une interface différente, puis capturer uniquement sur cette interface.

3
poolie

bogue Wireshark # 1184 est cette fonctionnalité. Ce n'est pas encore implémenté.
Copié de l'utilisateur cmanynard à ask.wireshark.org

2
JamesThomasMoon1979