webentwicklung-frage-antwort-db.com.de

Was ist der einfachste Weg, um zu schnuppern TCP Verkehrsdaten unter Linux?

Ich möchte auf einfache Weise alle TCP Daten (nicht die TCP Header oder irgendetwas anderes) anzeigen, die über eine Schnittstelle auf meiner Linux-Box laufen.

Zum Beispiel möchte ich einen magischen Befehl, der, wenn ich es tue:

magic_commmand_I_want port=1234

wenn dann auf meinem Computer ein Server auf Port 1234 lauschte und jemand dies tat:

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

Dann würde der magische Befehl einfach ausdrucken:

hello

Ich habe "tcpdump", "Ethereal", "tethereal", "tshark" und andere ausprobiert, aber es ist nicht klar, wie man sie dazu bringt:

  • iP-Adressen oder andere Metadaten werden nicht angezeigt
  • zeigen nur die "Daten", die gesendet werden, nicht einzelne Pakete und deren Header
  • drucken Sie die Daten wie sie sind, nicht hexadezimal und nicht mit Paket-Offset-Markierungen
  • sniff all Netzwerkverkehr (egal ob auf eth0 oder eth1 oder lo , etc ...)

Ja, Sie könnten wahrscheinlich eine Reihe von Unix-Befehlen aneinander reihen, um dies zu tun, aber das ist beim nächsten Mal nicht so einfach zu merken :)

Wenn Sie ein einfaches Beispiel für eine genaue Befehlszeile haben, die dies ausführt, dann ist es das, was ich möchte.

77
Dustin Boswell

Update:

Michal hat in den Kommentaren darauf hingewiesen: Ab der tcpflow-Version 1.3 wird die Option -e zur Angabe des Scannernamens verwendet. Daher wird der Fehler "Ungültiger Scannername '8983'" gedruckt. Der richtige Befehl lautet

Sudo tcpflow -i any -C -J port 1234

(auch -J wurde in der neuesten Version in -g geändert)


Vielen Dank an yves für den Hinweis auf " tcpflow ". Hier ist die Kommandozeile:

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

Das macht alles was ich will

  • zeigt die eingehenden Daten Byte für Byte an
  • zeigt keine anderen Metadaten an
  • lauscht auf allen Schnittstellen (erfasst also Daten von innerhalb und außerhalb der Maschine)

Der "-C" weist ihn an, anstelle einer Datei einen Speicherauszug auf die Konsole zu erstellen. Der "-e" aktiviert Farben, sodass Client-> Server und Server-> Client optisch voneinander getrennt sind.

Ich habe tcpflow einfach so installiert

Sudo apt-get install tcpflow
104
Dustin Boswell

socat ist das Werkzeug, nach dem Sie fragen. Es kann als Proxy fungieren:

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

dann muss Ihre Anwendung den Port 4444 verbinden, anstatt sich direkt mit 1234 zu verbinden

Mit der Option -v gibt socat alles aus, was beim Standardfehler (stderr) ausgegeben wird.

Aktualisieren:

Wenn socat auf Ihrem Computer nicht verfügbar ist, können Sie es mit netcat trotzdem so emulieren:

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

vorsichtsmaßnahmen: Diese Option ist unidirektional. Die zweite Netcat-Instanz druckt alle Antworten von Ihrem Server auf die Standardausgabe. Sie können dann noch tun:

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

Versuchen Sie Wireshark . Es ist ein hervorragender Protokollanalysator, der sowohl für Linux als auch für Windows geeignet ist.

20
Kevin Boyd

tcpflow ist was du willst. Auszug aus der Manpage:

BESCHREIBUNG
tcpflow ist ein Programm, das Daten erfasst, die im Rahmen von TCP -Verbindungen (Flows) übertragen werden, und die Daten auf eine Weise speichert, die für die Protokollanalyse oder das Debuggen geeignet ist. Ein Programm wie tcpdump (4) zeigt eine Zusammenfassung der auf der Leitung gesehenen Pakete an, speichert jedoch normalerweise nicht die tatsächlich übertragenen Daten. Im Gegensatz dazu rekonstruiert tcpflow die tatsächlichen Datenströme und speichert jeden Datenfluss zur späteren Analyse in einer separaten Datei. tcpflow versteht TCP Sequenznummern und rekonstruiert Datenströme korrekt, unabhängig von erneuten Übertragungen oder nicht ordnungsgemäßen Zustellungen.

tcpflow speichert alle erfassten Daten in Dateien, die Namen des Formulars haben

192.168.101.102.02345-010.011.012.013.45103

wobei der Inhalt der obigen Datei Daten wären, die vom Host 192.168.101.102-Port 2345 zum Host 10.11.12.13-Port 45103 übertragen werden.

Richten Sie eine Verbindung von Ihrer Anwendungs-App zu Ihrem Server ein. Wenn die Verbindung aktiv ist, kann tcpflow weiterhin Daten von ihr erfassen. Beispiel:

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

Alle Daten werden in einer Datei mit dem Namen 127.000.000.001.48842-127.000.000.001.05555 gespeichert.

Sie können dies weiterhin auf der Standardausgabe mit der Option -Cs umleiten. Lesen Sie die Handbuchseite, um mit dem Ausdruck zu spielen und die Paquets abzustimmen, die von tcpflow erfasst werden sollen.

13
yves Baumes

ngrep ist dafür sehr nett. Die Suche in den Paketen erfordert eine BPF-Zeichenfolge und eine optionale Zeichenfolge. Anschließend werden die Paketinhalte in einem recht nützlichen Format auf dem Bildschirm abgelegt. Optional wird auch ein Speicherauszug in eine pcap_dump-Datei erstellt, die Sie später in Wireshark genauer untersuchen können.

2
hobbs

Schauen Sie sich Chaosreader an. Obwohl es ein bisschen mehr tut, als Sie verlangen, und etwas anders, könnten Sie wahrscheinlich den Code ändern, um das zu tun, was Sie wollen.

0
Andrew Y