90 votes

Quel est le moyen le plus simple de renifler les données du trafic TCP sous Linux ?

Je veux un moyen simple de montrer toutes les données TCP (pas les en-têtes TCP ou autre chose) passant par n'importe quelle interface sur ma boîte Linux.

Par exemple, je veux une commande magique qui, si je fais :

magic_commmand_I_want port=1234

alors s'il y avait un serveur écoutant sur le port 1234 sur ma machine, et que quelqu'un le faisait :

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

Alors la commande magique s'imprimerait simplement :

hello

J'ai essayé "tcpdump", "ethereal", "tethereal", "tshark", et d'autres, mais il n'est pas évident de savoir comment les faire fonctionner :

  • ne pas montrer les adresses IP ou autres métadonnées
  • ne montrent que les "données" envoyées, et non les paquets individuels et leurs en-têtes.
  • imprimer les données telles quelles, pas en hexadécimal, et pas avec des marqueurs de décalage de paquet
  • renifler tous le trafic réseau (que ce soit sur eth0 o eth1 o lo etc...)

Oui, vous pourriez probablement enchaîner un ensemble de commandes unix pour faire cela, mais ce n'est pas très facile à retenir pour la prochaine fois :)

Si vous avez un exemple simple d'une ligne de commande exacte qui fait cela, c'est ce que j'aimerais.

120voto

Dustin Boswell Points 2231

Mise à jour :

Comme l'a souligné Michal dans les commentaires : Depuis la version 1.3 de tcpflow, l'option -e est utilisée pour spécifier le nom du scanner. Ainsi, l'erreur "Invalid scanner name '8983'" est imprimée. La commande correcte est

sudo tcpflow -i any -C -J port 1234

(également -J a été modifié en -g dans la dernière version)


Merci à Yves de m'avoir indiqué " tcpflow ". Voici la ligne de commande :

tcpflow -i any -C -e port 1234  # as root, or with sudo

Cela fait tout ce que je veux

  • affiche les données octet par octet au fur et à mesure qu'elles arrivent.
  • n'affiche pas d'autres métadonnées
  • écoute sur toutes les interfaces (il capture donc les données provenant de l'intérieur de la machine et de l'extérieur)

Le " -C " indique qu'il faut envoyer les données à la console plutôt qu'à un fichier. L'option " -e "permet d'activer des couleurs afin que client->serveur et serveur->client soient visuellement distincts.

J'ai installé tcpflow en faisant simplement

sudo apt-get install tcpflow

33voto

yves Baumes Points 437

Socat est l'outil que vous demandez. Il peut agir comme un proxy :

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

alors votre application doit se connecter au port 4444 au lieu de se connecter directement à 1234

L'option -v permet à socat d'imprimer tout ce qu'il reçoit sur l'erreur standard (stderr).

Mise à jour :

Si socat n'est pas disponible sur votre machine, vous pouvez toujours l'émuler de cette manière avec netcat :

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

caveats : cette option est unidirectionnelle. la seconde instance de netcat imprimera toute réponse de votre serveur sur la sortie standard. Vous pouvez toujours le faire :

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo

19voto

bjwbell Points 192

Essayez Wireshark . Il s'agit d'un excellent analyseur de protocole destiné à la fois à Linux et à Windows.

14voto

yves Baumes Points 437

Tcpflow est ce que vous voulez. Extrait de la page de manuel :

DESCRIPTION
tcpflow est un programme qui capture les données transmises dans le cadre de connexions TCP (flux), et stocke les données d'une manière qui est pratique pour l'analyse ou le débogage du protocole. A Un programme comme tcpdump(4) affiche un résumé des paquets vus sur le fil, mais ne stocke généralement pas les données qui sont réellement transmises. Sur En revanche, tcpflow reconstruit les flux de données réels et stocke chaque flux dans un fichier séparé pour une analyse ultérieure. tcpflow comprend les numéros de séquence et reconstruira correctement reconstruira correctement les flux de données sans tenir compte des des retransmissions ou des livraisons d'ordre.

tcpflow stocke toutes les données capturées dans fichiers dont les noms sont de la forme

192.168.101.102.02345-010.011.012.013.45103

où le contenu du fichier ci-dessus serait des données transmises de l'hôte 192.168.101.102 port 2345, vers l'hôte 10.11.12.13 port 45103.

Établissez une connexion entre votre application et votre serveur. Lorsque la connexion est active, tcpflow est toujours capable de capturer des données à partir de celle-ci. Par exemple :

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Toutes les données seront stockées dans un fichier nommé 127.000.000.001.48842-127.000.000.001.05555.

Vous pouvez toujours rediriger ceci sur la sortie standard avec l'option -Cs . Lisez la page de manuel pour jouer avec l'expression afin d'ajuster les paquets que vous voulez que tcpflow capture.

3voto

hobbs Points 1145

ngrep est très bien pour cela. Il prend une chaîne BPF et une chaîne optionnelle à rechercher dans les paquets, puis affiche le contenu des paquets à l'écran dans un format assez utile. De manière optionnelle, il dépose également le contenu dans un fichier pcap_dump que vous pourrez examiner de plus près dans Wireshark plus tard.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X