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

93

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 chargé (de nombreux autres flux se produisent en même temps). Existe-t-il un moyen d'isoler tcpdumpou de wiresharkcapturer le trafic réseau d'un processus spécifique? (L'utilisation netstatest insuffisante.)

Kees Cook
la source

Réponses:

21

En effet, il existe un moyen d’utiliser les filtres de 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.

OpenNingia
la source
6
Pour une connexion simple, cela est possible, mais je dois suivre DNS, HTTP, etc., qui sont tous passé précipitait, donc il n'y a pas un moyen simple d'utiliser simplement netstatet simples filtres de capture du réseau sur une machine occupée.
Kees Cook
Ok, les ports publics HTTP et DNS sont utilisés par de nombreuses applications, mais le port privé correspondant est unique. Alors, pourquoi ne pas essayer de filtrer par le port privé?
OpenNingia
Parce que les petites demandes rapides ne seront pas vues par netstat; Je ne pourrai attraper que des relations de longue vie. :(
Kees Cook
que se passe-t-il si le processus utilise des ports dynamiques au moment de l'exécution, votre filtre de ports statiques ne sera pas utilisable
The Unix Janitor
Je pense que vous avez ici la meilleure réponse ... Malheureusement, un outil de détection de réseau fonctionne au niveau le plus bas de la pile, essayant de tout capturer, il ignore totalement les processus en cours d'exécution sur le système d'exploitation. Il serait extrêmement difficile de trouver l'origine d'un certain appel. Un renifleur de paquet pourrait éventuellement trouver (via le numéro de port) un identifiant de processus, mais ne peut pas savoir quel processus a effectué une recherche DNS car il est complètement indépendant (c'est probablement la pile réseau du noyau qui a déclenché l'appel). Mais avec le filtrage et l'arrêt d'autres processus, vous devriez pouvoir atteindre votre objectif.
Huygens
136

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 de 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
Clausi
la source
2
Ceci est utile car il peut être utilisé sans accès root ni autorisations spéciales (sur certaines distributions Linux, de toute façon - sur Ubuntu, vous aurez peut-être besoin d'autorisations spéciales).
Robin Green
1
Ceci est également utile, car il peut être exécuté sur un processus déjà lancé et est disponible sur pratiquement n'importe quelle machine Linux.
Zakmck
53

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 comprenez et que vous vous y familiarisez, 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.

Felahdab
la source
4
Excellente idée, mais méfiez-vous des "limitations". S'agissant d'un espace de noms séparé, vous ne pouvez pas communiquer avec les processus locaux de l'espace de noms par défaut à l'aide de la ou des adresses de bouclage ou des sockets de domaine UNIX. Ce dernier affecte la communication via D-Bus.
Lekensteyn
@Lekensteyn, vous pouvez toujours utiliser les sockets de domaine unix sur les espaces de noms réseau autant que vous le souhaitez. Le système de fichiers n'est pas isolé par eux.
Randunel
1
@randunel j'aurais dû être plus précis à ce sujet. Ce que je voulais dire, c'est que les sockets de domaine Unix de "l'espace de noms abstrait" (qui n'utilise pas le système de fichiers) ne sont pas directement accessibles entre les espaces de noms réseau. Pour contourner le problème, vous pouvez utiliser un proxy tel quesocat .
Lekensteyn
À quelle adresse IP utilisez-vous l' --to-sourceargument iptables? Est-ce l'adresse IP de l'interface que vous passez à l' -ooption, une adresse IP que vous créez ou ??? J'ai essayé la version masquerade qui n'a pas besoin --to-source, comme décrit ici , et cela a fonctionné!
ntc2
3
Tout cela semble nécessiter un accès root.
Simplegamer
15
netstat -taucp | grep <pid or process name>

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

Oli
la source
8
Cela montrerait les connexions qui existent pour cet instant, mais cela ne fournira pas un journal du trafic lui-même.
Kees Cook
1
Pas sûr du commentaire de Kees Cook. Un simple netstat affiche les informations sur les connexions un instant, mais avec l'indicateur -c, vous obtenez un instantané de cet état toutes les secondes (voir 'man netstat'). Peut-être qu’il n’a pas tout le trafic, mais n’est pas un instantané unique des connexions.
énormes
3
Eh bien, j'en suis sûr. Cela ne capturera pas tout le trafic réseau d'un processus.
Reinier Post
Cela était utile pour déterminer quel numéro de port était bloqué par un pare-feu interne. Il montrait que les SYN TCP (avec l'adresse de destination et le numéro de port) étaient envoyés par la commande que j'exécutais.
Anthony G - justice pour Monica le
11

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

fixsrcipest un outil permettant de lier les sockets clients TCP et UDP sortants ( IPv4 ) à des adresses IP source spécifiques sur des hôtes multi-hébergés

http://freshmeat.net/projects/force_bind

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

Clausi
la source
La plupart des applications ne prennent pas en charge la spécification de leur adresse IP source, mais cela pourrait être possible en utilisant un conteneur avec CLONE_NEWNET mais pas CLONE_NEWNS.
Kees Cook
Vous pouvez également créer un espace de nom réseau et y faire fonctionner votre application www.evolware.org/?p=293
Flint
9

Je suis arrivé à un problème similaire et j'ai pu résoudre ce problème en me basant sur cette réponse d'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 utilisateur qui ne fait rien d’autre - et le tour est joué, vous venez d’isoler et de capturer le trafic d’un processus unique.

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

szymon
la source
6

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

Jonas Danielsson
la source
C'est cool, mais je pense que ce serait bien d'inclure quelques détails supplémentaires sur la façon de l'obtenir et de l'utiliser :)
Zanna
Merci! J'ai fourni un lien vers le dépôt github qui contient un fichier README.md qui contient des exemples d'utilisation et des instructions de téléchargement!
Jonas Danielsson
5

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 suspecte 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 pourrait être utile pour pirater quelque chose avec Wirehark et votre application spécifique exécutée en tant qu'utilisateur spécifique?

ioerror
la source
mais cela ne fonctionne que pour les sorties, qu'en est-il des entrées?
résultatsway
5

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.

pjf
la source
1
Beau projet, mais ... "Tracedump ne fonctionne actuellement que sur des hôtes Linux 32 bits" le tue, malheureusement.
gertvdijk
4

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 consiste à utiliser une machine virtuelle simplifiée ou une machine de test sur votre réseau et à y placer votre processus de manière isolée. Ensuite, vous pouvez simplement utiliser Wireshark pour tout capturer à partir de cette machine. Vous serez certain que le trafic que vous capturez sera pertinent.

Le concierge d'Unix
la source
L'ajout d'un "-e trace = network" élimine une partie de la sortie, au détriment de la perte des données réellement écrites sur le réseau. Si vous vous souciez seulement du "nombre de sockets ouverts" ou similaire, cela facilite les choses.
dannysauer
3

En me basant sur la réponse de ioerror, je suppose que vous pouvez utiliser iptables --uid-ownerun marqueur de 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.

poolie
la source
-1

peut-être que iptables et ulog peuvent fonctionner? Ce n’est pas que j’ai une recette exacte, mais je pense que iptables peut correspondre aux processus; une fois la correspondance obtenue, vous pouvez utiliser ulog.


la source
3
Malheureusement, a iptables -m owner --pid-owner $PIDété supprimé sous Linux 2.6.14: ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Kees Cook
-1

Je pense que vous pouvez créer un script shell à exécuter en exécutant netstat et en le journalisant dans un fichier texte. Quelque chose comme (étapes très difficiles):

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

Je ne suis pas un programmeur, je ne peux donc pas affiner cela. Mais quelqu'un ici peut commencer là où je me suis arrêté et créer un script de travail pour vous.

étamé
la source
Pas assez bon. La question est de capturer tout le trafic réseau, pas seulement ce qui est actif au moment où vous vérifiez.
Reinier Post