So verarbeiten / leiten Sie TCPDUMPs-Ausgaben in Echtzeit

27

Wenn ich DNS-Anfragen von Clients (auf einem OpenWrt 10.04-Router) tcpdumpen möchte, dann habe ich

root@ROUTER:/etc# tcpdump -n -i br-lan dst port 53 2>&1       
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br-lan, link-type EN10MB (Ethernet), capture size 96 bytes
22:29:38.989412 IP 192.168.1.200.55919 > 192.168.1.1.53: 5697+ A? foo.org. (25)
22:29:39.538981 IP 192.168.1.200.60071 > 192.168.1.1.53: 17481+ PTR? 150.33.87.208.in-addr.arpa. (44)
^C
2 packets captured
3 packets received by filter
0 packets dropped by kernel

Das ist völlig in Ordnung. Aber. Warum kann ich die Ausgabe von tcpdumps nicht in Echtzeit leiten?

root@ROUTER:/etc# tcpdump -n -i br-lan dst port 53 2>&1 | awk '/\?/ {print $3}'
^C
root@ROUTER:/etc# 

Wenn ich nach tcpdump etwas achte, bekomme ich KEINE Ausgabe. Warum das? Warum kann ich die Ausgabe von tcpdump nicht in Echtzeit mit Pipelining verarbeiten? (so dass zB im Beispiel in nur die 3. Spalte ausgegeben wird)

Gibt es dafür irgendwelche Lösungen?

LanceBaynes
quelle

Antworten:

35

Direkt raus aus man tcpdump

-l     Make stdout line buffered.  Useful if you want to see the data while 
       capturing it.  E.g.,

              tcpdump -l | tee dat

       or

              tcpdump -l > dat & tail -f dat

       Note that on Windows,``line buffered'' means ``unbuffered'', so that 
       WinDump will write each character individually if -l is specified.

       -U is similar to -l in its behavior, but it will cause output to be 
       ``packet-buffered'', so that the output is written to stdout at the 
       end of each packet rather than at the end of each line; this is 
       buffered on all platforms, including Windows.
Marcin
quelle
7

Verwenden Sie die Option -Uin Kombination mit, -wdamit tcpdump sofort Pakete schreibt.

Julius Junghans
quelle
3

Der tcpdump puffert anscheinend die Ausgabe, wenn er in eine Pipe schreibt. Es wird nicht bei jedem Schreibvorgang die Ausgabe gelöscht, daher schreibt das System die Ausgabe in etwa 4-KByte-Blöcken. Ihr Filter hat eine begrenzte Ausgabe, sodass Sie nichts sehen, bis dieser Filter genügend Ausgabe geschrieben hat. Sobald es genug gesammelt hat, wird es in einen Block geschrieben, und Sie sollten dann mehrere ausgegebene Zeilen sehen.

Versuchen Sie mehrmals, DNS-Lookups auszulösen, und sehen Sie, was dann passiert.

Keith
quelle
1

expecthat einen unbufferBefehl, um Befehle in die Annahme zu täuschen, dass sie in ein tty schreiben, damit sie nicht puffern.

Ninjalj
quelle
1

Ich erstelle einen Echtzeitüberwachungs-Wrapper um tcpdump, der Pakete sehen muss, sobald sie verfügbar sind. Trotzdem -lgibt es eine gewisse Verzögerung.

tcpdump hat jetzt --immediate-modedas Problem für mich gelöst. Um es zum Laufen zu bringen, habe ich es in Verbindung mit verwendet -l.

Siehe diese Antwort .

anderspitman
quelle