Existe-t-il un outil en ligne de commande simple pour renifler les paquets d'une seule commande sous Linux?

11

J'adorerais qu'il y ait un seul outil en ligne de commande pour renifler les paquets d'une seule commande sous Linux. quelque chose comme sniff dumpfile commandpour que vous puissiez simplement exécuter la commande que vous souhaitez renifler les paquets dans le terminal et obtenir un vidage des paquets ailleurs.

Je voudrais vider / enregistrer / voir uniquement le trafic réseau de la seule commande que j'entre, pas tout le trafic TCP sur mon interface réseau unique. Donc, si j'étais connecté à mon ordinateur et que IRC fonctionnait en arrière-plan, et je l'ai fait sniff somefile wget http://www.google.com, je voudrais voir tout le trafic réseau que la commande wget a fait pour télécharger http://www.google.com . Je ne veux pas que 'somefile' ait le trafic du réseau IRC source de confusion.

Il existe de nombreuses commandes linux / unix qui acceptent une commande différente et font quelque chose de différent. Depuis sudo(exécuter en tant que superutilisateur), nicechangez le niveau agréable, trickle(limitez la bande passante d'une commande)

Rory
la source
1
Qu'est-ce que tu veux faire exactement? Voulez-vous vérifier si une certaine commande est exécutée? Voulez-vous renifler le trafic réseau? Parce que l'utilisation de l'expression «paquet reniflant une commande» n'a aucun sens pour moi ...
wzzrd
wzzrd, voir la question élargie
Rory

Réponses:

10

Il n'y en a pas que je sache, mais en théorie, il ne devrait pas être difficile d'obtenir quelque chose de similaire. Strace peut être utilisé pour intercepter les appels système en réseau.

# strace -f -e trace=network -s 10000 /usr/bin/command arguments

Cela vous donnera des informations sur les données envoyées entre le noyau et le processus. La sortie de strace n'est pas exactement ce que vous souhaitez. Cependant, strace utilise l'appel système ptrace pour intercepter les appels système. Il pourrait être possible d'écrire un programme pour sortir les données un peu plus utilement.

Alternativement, vous pouvez également intercepter les jolis syscalls utiles de socket, bind et listen. Il peut être possible d'écrire un petit programme qui utilise ptrace sur ces appels et libpcap pour changer dynamiquement le filtre de capture chaque fois qu'un nouveau socket est ouvert.

David Pashley
la source
Ce serait formidable s'il produisait quelque chose que Wireshark pouvait lire.
Brad Gilbert
Gardez à l'esprit que la strace décrite ci-dessus est exacte pour Solaris (et éventuellement d'autres Unices commerciaux). Sous Linux, strace est un traceur d'appels système, similaire en fonctionnement et en sortie à truss sur Solaris ou tusc sur HP-UX.
James F
1
J'ai décrit strace sous Linux.
David Pashley
8

Tracedump

Tracedump est un renifleur de paquets IP à application unique, qui capture tous les paquets TCP et UDP d'un même processus Linux.

Téléchargez et description ici: http://mutrics.iitis.pl/tracedump

pjf
la source
1
Ce devrait être la bonne réponse maintenant.
h0tw1r3
4

Essayez Wireshark - la commande sera tshark

  • tshark vous permet de sélectionner des filtres sur le trafic capturé depuis une interface
  • utilisez d'autres utilitaires comme debian lsof pour identifier le type de communication effectuée par votre application d'intérêt.

Ou, voulez-vous vraiment juste LSOF?


Je ne pense pas qu'il existe un outil qui continuera à filtrer dynamiquement toutes les communications associées à un processus. Cependant, vous pouvez essayer de suivre les communications du processus avec des outils comme lsofet une fois que vous avez un bon filtre qui peut isoler la communication de ce processus de tout autre trafic en cours d'exécution sur votre système, vous pouvez obtenir la capture correcte.

Par exemple, avec wgetgénéralement l'adresse IP de destination est distincte du trafic lié aux autres processus. Même si vous prenez quelque chose comme skypela plage de ports de destination est généralement fixée pour une instance.


C'est un peu comme le principe d'incertitude. Vous pouvez généralement savoir ce qui passe par un ensemble de voies de communication (avec un filtrage de renifleur sur un groupe de flux identifié), ou différents liens de communication sont établis (avec lsof).

J'aimerais vraiment savoir si les deux peuvent être faites pour une application. Je pense que cela devrait être faisable. Mais, je n'ai encore vu aucun outil faire cela.

nik
la source
lsof est génial, mais je préfère voir ce qu'il fait / envoie / reçoit.
Rory
4

Apprenez à utiliser des expressions de filtre.

Bien que cela ne fasse pas les trucs fantaisistes que vous demandez.

Il vous permettra de supprimer presque tous les "trucs déroutants comme IRC" de la capture.

De plus, il est très utile de connaître la syntaxe du filtre pour une référence rapide à l'avenir.

Dan Carley
la source
2

Spécifiquement pour un navigateur Web / une page Web, quelque chose comme le plug-in Firebug pour Firefox peut vous donner certaines des informations que vous recherchez: http://getfirebug.com/net.html

Pour les applications plus générales, vous devrez peut-être utiliser netstat pour identifier les ports utilisés par l'application, puis Wireshark / tshark / dtrace avec un filtre pour capturer uniquement ce trafic. Pas la réponse à une ligne que vous cherchiez cependant ...

Peter
la source
1

Une idée, essayez VMWare

-configurer un vm
-configurer ce vm pour utiliser une interface particulière
-sniff sur cette interface à partir de l'hôte (c'est comme un homme dans l'attaque du milieu)

Si vous isolez les applications réseau qui s'exécutent sur ce VM, vous pourriez avoir votre réponse

Une solution plus idéale, je suppose, est de faire ce que VMWare fait en termes de façon dont il spécifie comment il choisit une interface pour parler. Je pense que sa magie vient des modules du noyau qu'il utilise, dans ce cas, probablement le module du noyau vmnet.

À ma connaissance, les applications ne savent pas de quelle interface elles parlent et je pense que c'est par conception; ils ne devraient pas avoir à se soucier de telles choses.

De plus,
Peut-être qu'un programme existe déjà, je ne sais pas. Mais si l'un a été écrit, vous pouvez l'appeler nettrace (par exemple) et l'utilisation pourrait être comme

interface du programme nettrace

puis renifler l'interface qu'il utilise et ajouter des routes (peut-être qu'il le fait automatiquement) à votre interface réelle

tour
la source
oui ce serait possible. Cependant, ce serait génial s'il y avait un outil simple et rapide pour le faire.
Rory
Peut-être qu'il est temps pour cet outil simple? Je me demande si ce serait si difficile, probablement le mod vmnet pourrait être un bon point de départ (même si je ne sais pas s'il y aurait des problèmes de licence). Peut-être (un hack) utilisez simplement le mod vmnet. Je sais que je m'intéresse souvent à de telles questions.
rev
1

En supposant que vous êtes la seule personne sur la boîte à essayer de se connecter à Google à l'époque, je pense que quelque chose comme ça devrait faire l'affaire:

tcpdump -w <outfile> -i <interface> tcp dst host www.google.com and dst port 80

Si vous n'êtes pas la seule connexion qui tente de se connecter à Google sur la boîte, alors si vous pouvez identifier l'IP / port à partir duquel vous vous connectez, vous pouvez également spécifier le port src / ip src.

L'identification du port src peut être un problème à moins que vous ne puissiez le spécifier sur le client que vous utilisez. Je ne sais pas si tu peux avec wget.

Je soupçonne fortement que vous pouvez spécifier les ports src et dst avec netcatdonc si c'était vraiment google qui vous intéressait, vous pourriez faire votre GET (manuellement) via netcat.

Bien sûr, la page de manuel vous donnera des détails

Jason Tan
la source
1

La page de manuel tcpdump et de nombreux sites Web fournissent des exemples détaillés de filtres, et il existe même quelques référentiels en ligne d'expressions de filtre tcpdump. Il devrait être capable de faire presque tout ce dont vous pouvez rêver, en supposant que vous savez quelque chose sur le trafic réseau (source, destination, ports, protocoles, etc.) au-delà du programme qui le génère.

Si vous travaillez sur un serveur ou un boîtier sans tête, vous pouvez toujours demander à tcpdump d'écrire un fichier de vidage puis de l'ouvrir dans Wireshark sur votre poste de travail et d'obtenir un filtrage avancé et une interface graphique.

Jason Antman
la source
Euh, quel commutateur à la commande tcpdump la limiterait à une seule application qui génère le trafic?
Milan Babuškov le
1

Peut-être que ce script fera ce que vous voulez avec les modifications appropriées à la commande tshark:

#!/bin/bash

# Start tshark in the background before we run the commsnd to be sniffed.
# Add more options to tshark, as appropriate to your command....
setsid tshark  -w dump -i eth0 tcp port 8080 >/dev/null 2>&1  &

sleep 2

wget www.google.com

# tshark keeps running if you don't kill it. 
# This kills all other tsharks that may be running.
pkill -9 tshark

Lisez le fichier de vidage plus tard:

tshark -r dump
Pas maintenant
la source
Vous capturez le port 8080 mais générez du trafic sur le port 80; cela ne fera pas tout à fait ce que vous envisagez.
James F
James: Mon proxy se connecte au 8080, c'est ainsi que j'ai exécuté le script. J'aurais dû le changer 80 pour les besoins de ce poste.
Pas maintenant
0

Dtrace devrait permettre cela, bien que je ne sache pas encore s'il est tout à fait arrivé à Linux.

Toto
la source