Was ist der einfachste Weg, um TCP-Verkehrsdaten unter Linux aufzuspüren?

79

Ich möchte auf einfache Weise alle TCP-Daten (nicht die TCP-Header oder andere) anzeigen, die über eine beliebige Schnittstelle auf meiner Linux-Box übertragen werden.

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

magic_commmand_I_want port=1234

Wenn dann ein Server an Port 1234 auf meinem Computer 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 nicht anzeigen
  • 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
  • den gesamten Netzwerkverkehr abhören (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.

Dustin Boswell
quelle
2
tcpdump ist der von Ihnen gewünschte Zauberbefehl. Wireshark ist eine nette GUI über die Bibliothek tcpdump verwendet
Vinko Vrsalovic
3
Ich weiß, dass dies eine alte Frage ist, aber ich bin gespannt, warum die Verwendung von nc auch für die "Serverseite" keine Option war. "nc -l 1234" erstellt einen Server, der Port 1234 abhört und alles ausgibt, was an ihn gesendet wird, und die Verbindung schließt. Wenn Sie die Verbindung am Leben erhalten und nicht trennen möchten, können Sie die Option "-k" hinzufügen.
StFS
2
@StFS weil er einen laufenden Port schnüffeln will und nc sich beschweren würde.
Infoclogged

Antworten:

106

Aktualisieren:

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

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


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)

Das " -C" weist es an, statt einer Datei einen Speicherauszug auf die Konsole zu erstellen. Das " -e" aktiviert Farben, damit Client -> Server und Server -> Client optisch voneinander getrennt sind.

Ich habe tcpflow einfach so installiert

sudo apt-get install tcpflow
Dustin Boswell
quelle
2
Beeindruckend. tcpflow ist super, danke! Rettete mir eine TONNE Schmerzen, die ich mit Drahthai hatte. Wireshark, tcpdump usw. haben viel zu viele Informationen und tun nicht wirklich, was die ursprüngliche Frage verlangt. Dann bist du bei tcpflow genau richtig.
Russ
10
Ab tcpflow Version 1.3 wird die -eOption zur Angabe des Scannernamens verwendet. Daher wird der Fehler "Ungültiger Scannername '8983'" gedruckt. Der richtige Befehl lautetsudo tcpflow -i any -C -J port 1234
Michal Kováč
6
Beachten Sie, dass in den neuesten Versionen -Jgeändert wurde -g.
13.
2
Jemand muss den Autoren des Tools erklären, was der Begriff "Abwärtskompatibilität" bedeutet!
Sridhar Sarnobat
Es druckt "Dinge" zweimal für mich. Warum ist das so ? lpaste.net/3984129577801744384
user1198559
29

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
yves Baumes
quelle
Angenommen, ich habe keine Kontrolle über den Client und den Server (oder möchte ihn nicht stoppen), sodass ich nicht ändern kann, welcher Port beteiligt ist, oder den Datenverkehr abfangen kann. Dann was?
20

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

Kevin Boyd
quelle
3
Meine Erfahrung ist, dass das Interface unter Linux wirklich zum Kotzen ist.
Joe Phillips
verdammt, hast du vor mir, +1 auf wireshark
Können Sie ein Beispiel für eine Befehlszeile geben?
Schauen Sie sich diesen Link an wiki.wireshark.org/Tools Hier finden Sie eine Liste der Kommandozeilen-Tools für wireshark. Achten Sie auf Dumpcap.
Kevin Boyd
13

tcpflow ist was du willst. Auszug aus der Manpage:

BESCHREIBUNG
tcpflow ist ein Programm , das Daten übertragen als Teil der TCP - Verbindungen (Ströme), und speichert die Daten in einer Weise erfasst , die für die Protokollanalyse oder Debuggen bequem ist. Ein Programm wie tcpdump (4) zeigt eine Zusammenfassung der auf der Leitung angezeigten 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 unabhängig von erneuten Übertragungen oder Zustellungen außerhalb der Reihenfolge.

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.

Yves Baumes
quelle
2

ngrepist sehr schön dafür. 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.

hobbs
quelle
0

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

Andrew Y.
quelle
-1

Vielleicht können Sie einen Wrapper für tcpdump schreiben, der alle redundanten Informationen entfernt

dimba
quelle