2016-11-11 3 views
5

Ich habe pcap Dateien kontinuierlich generiert für mich. Es möchte sie kontinuierlich einem "ewig laufenden" tshark/wireshark zuführen. Hier ist, was ich habe versucht (OSX)Kontinuierliche Fütterung pcap Dateien zu tshark/wireshark

mkfifo tsharkin 
tail -f -c +0 tsharkin | tshark -l -i - > tsharkout 2>stderr & 
cat file1.pcap > tsharkin 

Die oben funktioniert gut, bekomme ich erwartete Ausgabe file1.pcap in tsharkout

cat file2.pcap > tsharkin 

Die oben nicht funktioniert, habe ich nichts in tsharkout, aber ich erhalte "1 Paket fallen gelassen" + "3 Pakete eingefangen" in stderr

cat file2.pcap > tsharkin 

der Versuch, wieder macht die tail/tshark Prozesse stoppen/crash

Ich versuchte es noch einmal, aber diesmal mit file2.pcap zuerst und dann file1.pcap. Dieses mal wird file2.pcap gut verarbeitet und file1.pcap macht tail/tshark processes stop/crash. Also werde ich zu dem Schluss kommen, dass mit den beiden pcap-Dateien nichts falsch ist, aber es scheint, dass es tshark nicht gefällt, wenn mehr als eine pcap-Datei darauf geworfen wird.

Nur um es zu testen, habe ich versucht file1.pcap und file2.pcap verschmelzenden mergecap unter Verwendung eines ersten und Futtermittel, die in tshark

mergecap -F pcap -w file1_2.pcap file1.pcap file2.pcap 
cat file1_2.pcap > tsharkin 

Dies funktioniert gut, ich erwartete Ausgabe erhalten sowohl von file1.pcap und file2 .pcap in tsharkout

Problem ist, dass meine pcap-Dateien auf dem Weg ankommen, so dass ich sie nicht alle zusammenfassen kann, bevor ich an tshark füttere. Ich muss in der Lage sein, die PCAP-Dateien, wenn sie ankommen, zu einem "immer laufenden" Tshark zu füttern. Wie kann ich das machen?

+0

Warum wickle ich diesen Code nicht auf einen Knotenserver und spawne jedes Mal einen neuen Hash, wenn eine Datei empfangen wird. der High-Level-Algorithmus, - Receive pcap in einer neu erstellten Pipe. (möglicherweise benennen Sie es auf Timestamp) - Machen Sie Knoten app Abfrage das Verzeichnis nach neu erstellten Named Pipes zu überprüfen. - Sobald ein pcap für eine Named Pipe empfangen wurde, spawnen Sie einen Child-Prozess mit tshark. - Ergebnisse in ein gemeinsames Verzeichnis schreiben. – Himanshu97

+0

@ Himanshu97 Es wird es nicht tun. Zwei aufeinanderfolgende pcap-Dateien können Daten enthalten, die zu derselben Sitzung gehören. Z.B. Ein HTML-Dokument wurde über die Leitung über mehrere IP-Pakete übertragen. Die erste Hälfte dieser IP-Pakete könnte in file1.pcap sein, während die letzte Hälfte dieser IP-Pakete in file2.pcap sein könnte. Ich möchte, dass das HTML-Dokument rekonstruiert wird, und das wird nur passieren, wenn file1.pcap und file2.pcap, wenn sie in die gleiche tshark-Instanz eingegeben werden. –

+0

In diesem Fall können Sie einfach die Datei in Ihre Unix-Leitung wie diese, "cat '| tsharkin" pipe und machen Tshark immer aus der Leitung lesen. Also, was passieren wird, werden Sie Ihre Dateien Inhalt an die Rohrleitung anhängen. und Named Pipe funktioniert als FIFO, so sollte es funktionieren. – Himanshu97

Antwort

1

TL; DR. libpcap-Dateien haben a header. Sie müssen es für die zweite und die folgenden Capture-Dateien entfernen:

cat file2.pcap | tail -c +25 > tsharkin 

Meine Ausgabe, bei der Fütterung tshark zweimal die gleiche Datei:

1 0.000000 10.0.0.1 → 10.0.0.2 TLSv1.2 246 Application Data 
2 0.058816 10.0.0.2 → 10.0.0.1 TCP 66 443 → 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499 

3 0.000000 10.0.0.1 → 10.0.0.2 TLSv1.2 246 [TCP Spurious Retransmission] , Application Data 
4 0.058816 10.0.0.2 → 10.0.0.1 TCP 66 443 → 58616 [ACK] Seq=1 Ack=181 Win=1701 Len=0 TSval=3578216450 TSecr=5878499 

Einzelheiten

Wie erklärt In the documentation for the libpcap format, haben libpcap Dateien eine 24 Bytes globalen Header. Diesem globalen Header folgen direkt Pakete (mit their own libpcap header) ohne Auffüllung.

Daher, wenn libpcap Dateien zu tshark füttern, funktioniert die erste Datei gut, weil tshark einen globalen Header erwartet. Es wird jedoch nicht für die nachfolgende Datei, die Sie es füttern, erwartet. Dies führt wahrscheinlich dazu, dass tshark den Anfang der zweiten Datei (die tatsächlich wieder ein globaler Header ist) als ein fehlerhaftes Paket sieht und es fallen lässt ("1 Paket gelöscht"). Ich weiß nicht, warum tshark mit der dritten Datei aufhört.

Wenn Sie sicher sind, dass alle Ihre Capture-Dateien (Vorsicht pcapng-Dateien) und die gleichen Header, können Sie dann sicher entfernen, den globalen Header der zweiten Datei (und nachfolgende Dateien das gleiche Format haben), bevor Sie sie an Ihre Named Pipe senden.Eine Möglichkeit, dies zu tun, ist der Schwanz Syntax verwenden Sie bereits in Ihrer Frage verwendet:

tail -c +startoffset file 

Die globale Header 24 Bytes lang sein, wir wollen auf dem 25. Byte Lesen Capture-Dateien starten.

Hinweis auf die gleichen Header. Wenn alle Capture-Dateien auf die gleiche Weise abgerufen werden, haben sie wahrscheinlich den gleichen globalen Header. Insbesondere muss das Protokoll der physikalischen Schicht (z. B. Ethernet) gleich sein. Dieser globale Header enthält auch die Version des Formats (z. B. 2.4), die Zeitzone und die maximale Erfassungslänge für Pakete.

+0

Verstehe nicht, warum ich selbst nicht daran gedacht habe. Ich habe es nicht getestet, aber ich bin sicher, es wird funktionieren. Vielen Dank! –