web-dev-qa-db-fra.com

Quel est le moyen le plus facile de renifler TCP données de trafic sous Linux?

Je veux un moyen simple d'afficher toutes les données TCP (pas les en-têtes TCP ou autre) passant par n'importe quelle interface de ma machine Linux.

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

magic_commmand_I_want port=1234

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

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

Ensuite, la commande magique afficherait simplement:

hello

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

  • ne pas afficher les adresses IP ou autres métadonnées
  • affiche uniquement les "données" envoyées, pas les paquets individuels et leurs en-têtes
  • affiche les données telles quelles, pas en hexadécimal, ni avec des marqueurs de décalage de paquet
  • sniff all trafic réseau (que ce soit sur eth0 ou eth1 ou lo , etc ...)

Oui, vous pouvez probablement enchaîner un ensemble de commandes unix canalisées 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 je voudrais.

77
Dustin Boswell

Mise à jour:

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

Sudo tcpflow -i any -C -J port 1234

(-J a également été remplacé par -g dans la dernière version)


Merci à yves de m'avoir dirigé vers " 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 l'octet de données à l'octet à l'entrée
  • n'affiche aucune autre métadonnée
  • écoute sur toutes les interfaces (il capture donc les données provenant de la machine et de l'extérieur)

Le "-C" lui dit de sauvegarder sur la console au lieu d'un fichier. Le "-e" active les couleurs afin que client-> serveur et serveur-> client soient visuellement distincts.

J'ai installé tcpflow simplement en faisant

Sudo apt-get install tcpflow
104
Dustin Boswell

socat est l'outil que vous demandez. Il peut agir en tant que proxy:

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

alors votre application doit connecter le 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).

Mettre à jour:

Si socat n'est pas disponible sur votre machine, vous pouvez toujours l'émuler de cette façon avec netcat:

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

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

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

Essayez Wireshark . C'est un excellent analyseur de protocole destiné à Linux et Windows.

20
Kevin Boyd

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

LA DESCRIPTION
tcpflow est un programme qui capture les données transmises dans le cadre de TCP connexions (flux) et les stocke de manière pratique pour l'analyse de protocole ou le débogage. Un programme tel que tcpdump (4) affiche un résumé des paquets vus sur le réseau, mais ne stocke généralement pas les données réellement transmises. 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 TCP numéros de séquence et reconstruira correctement les flux de données indépendamment des retransmissions ou des livraisons non conformes.

tcpflow stocke toutes les données capturées dans des fichiers portant le nom du formulaire

192.168.101.102.02345-010.011.012.013.45103

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

Configurez une connexion de votre application à votre serveur. Lorsque la connexion est opérationnelle, 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 expression et syntoniser les paquets que vous souhaitez capturer.

13
yves Baumes

ngrep est très gentil pour cela. Il faut une chaîne BPF et une chaîne facultative pour effectuer une recherche dans les paquets, puis afficher le contenu du paquet à l'écran dans un format très utile. En option, il copie également un fichier pcap_dump que vous pourrez examiner de plus près dans Wireshark ultérieurement.

2
hobbs

Jetez un oeil à Chaosreader . Bien que cela fasse un peu plus que ce que vous demandez et légèrement différemment, vous pourriez probablement en modifier le code pour faire ce que vous voulez.

0
Andrew Y