Frage tcpdump Wie verwende ich es, um alle Traffic-Header zu erfassen


Ich bin ziemlich neu bei tcpdump. Ich habe es nie benutzt, außer für sehr triviale Aufgaben.

Kürzlich wurde ich gebeten, den folgenden Job zu erledigen.

Was ich habe: Ein Server mit einer Netzwerkschnittstelle, die mit einem Switch verbunden ist. Der gesamte Datenverkehr auf diesem Switch wird auf diesen Server gespiegelt. Was ich brauche: Speichern Sie all diese Daten in einer PCAP-Datei. Die Datei sollte enthalten

  1. Nur ausgehenden oder eingehenden Verkehr sind interessiert. Datenverkehr, der nur innerhalb des Subnetzes läuft, wird nicht benötigt und sollte möglichst nicht protokolliert werden.
  2. Der gesamte Multicast- und Broadcast-Verkehr ist nicht interessiert und sollte wenn möglich ignoriert werden
  3. Alles, was ich brauche, ist Ethernet -> IPv4 -> TCP, UDP und ICMP. Andere sind nicht interessiert und sollten wenn möglich vernachlässigt werden
  4. Ich brauche keinen Nachrichtentext. Header (Ethernet, IP und TCP / UDP / ICMP) sind genug. So sollte der Körper wenn möglich nicht protokolliert werden

Der Verkehr würde ~ 100MByte / s während des Tages und für meine Arbeit, Paketverlust ist nicht tolerierbar (es muss sein kontinuierlich für 24 Stunden).
Jedenfalls brauche ich, wie oben erwähnt, nicht alles.

Frage:

  1. Wie kann ich den Job machen?
  2. Worauf sollte ich achten, damit alle Daten problemlos (fast) ohne Verlust gesammelt werden.

Vielen Dank.


6
2018-03-30 11:29


Ursprung


Es liest sich so, als ob Sie Flussdaten auf dem Switch-Uplink erfassen möchten. Ist das eine faire Einschätzung? - Scott Pack
# 4 ist Ja wirklich schwer zu machen. Sie wissen nie, wie viele weitere Pakettypen in dem Paket eingekapselt sind. Aber bevor Sie das tun, müssen Sie die TCP- und IP-Reassemblierung durchführen. Libnids ist die einzige Bibliothek, die ich IP-Defragmentierung und TCP-Stream Reassembly findet. Zuerst müssen Sie alle Streams einzeln neu erstellen, dann die Anzahl der Verkapselungsstufen ermitteln, dann entscheiden, welche nicht benötigt werden, und diese herausfiltern. - Marcin
@ Scott Ich bin mir nicht sicher. Mir wurde gesagt, dass der Switch so konfiguriert ist, dass der gesamte Fluss auf diesen Port gespiegelt wird. Würdest du bitte erklären, warum das wichtig ist? Ich kenne ein paar Netzwerke, aber hauptsächlich aus Lehrbüchern, RFCs und Papieren, anstatt aus der realen Erfahrung. Vielen Dank! - Haozhun
@Marcin Eigentlich, da ich nicht viel über tcpdump weiß, wäre der einfachste Weg für mich, ein C / C ++ - Programm zu schreiben und libpcap zu verwenden, um bestimmte Regeln zu erfassen und dann zu speichern. Aber ich bin wirklich besorgt über die Leistung, da dies 100MByte / sec ist. Ich vermutete, dass tcpdump das großartig machen könnte. Wie auch immer, was ist die Lösung, wenn uns Nummer 4 egal ist? Vielen Dank! - Haozhun
Wenn Sie tatsächlich volle 100MBit / Sek. verwenden (oder meinen Sie wirklich 100MByte / Sek.?), sollten Sie sich als Erstes das Laufwerk ansehen, auf dem Sie es ablegen. Ich mache oft direkt Dumps auf ein externes Laufwerk, und dann stoße ich immer wieder auf USB-Bandbreitenbeschränkungen (22-30 MB / s), also habe ich angefangen, eSATA zu verwenden, und dieses Problem wurde behoben, aber es ist immer noch nicht vollständig beseitigt. Wenn Sie viel Verkehr haben, müssen Sie möglicherweise ein RAID (nicht RAID5, das ist wirklich langsam für Schreibvorgänge!) Erstellen, um Full-Speed-Captures zu unterstützen. Der Grund, warum Payload Scrubbing wäre schön, ist es würde den Schreibdurchsatz minimieren. - Marcin


Antworten:


Meine beste Wette wäre, etwas zu verwenden wie:

 tcpdump -ieth0 -s96 -w traffic.dump 'ip or icmp or tcp or udp'

Der "schwierige" Teil wird darin bestehen, einen korrekten Wert für den Parameter "-s" (snaplen) zu wählen (snaplen ist die maximale Länge des Pakets, das tcpdump erfassen wird).

Von den tcpdump man-Seiten:

Snarf knackt Datenbytes von jedem   Paket statt den Standardwert von 68   (mit NIT ist das Minimum eigentlich   96). 68 Bytes sind ausreichend für IP,   ICMP, TCP und UDP können jedoch abgeschnitten werden   Protokollinformationen vom Nameserver   und NFS-Pakete (siehe unten). Pakete   wegen einer begrenzten abgeschnitten   Snapshot wird in der Ausgabe angezeigt   mit `` [| proto] '', wobei proto das ist   Name der Protokollstufe bei welcher   Die Kürzung ist aufgetreten. Beachten Sie, dass   größere Schnappschüsse nehmen beide zu   die Zeit, die für die Verarbeitung benötigt wird   Pakete und effektiv verringert   die Menge der Paketpufferung. Diese   kann dazu führen, dass Pakete verloren gehen. Sie   sollte Snaplen auf den kleinsten begrenzen   Nummer, die das Protokoll erfassen wird   Informationen, an denen Sie interessiert sind.

In diesem Beispiel verwende ich 96, um "fast" sicher zu sein, dass ich 100% der Header-Werte von ethernet + ip + (icmp || udp || tcp) erfassen würde.

Falls Ihr Verkehr IP- oder TCP-Optionen hat (d. H. Zeitstempel) und Sie diese Informationen ebenfalls erfassen möchten, müssen Sie mit dem snaplen-Parameter spielen (d. H. Erhöhen / verringern).

Falls die Länge der Header Ihres Pakets kleiner als snaplen ist, können Sie auch einen Teil der Payload erfassen.

Um schließlich den erfassten Verkehr zu lesen, würde ich Folgendes verwenden:

tcpdump -e -nn -vv -r traffic.dump   

Bei dem die wichtig Teil ist die Verwendung der Option "-e", damit Sie die Ethernet-Header drucken können.

Diese Seite gibt Ihnen eine Vorstellung über die Größe der Ethernet / TCP / UDP-Header unter verschiedenen Umständen und kann Ihnen helfen, zu einem "richtigen" Wert für den snaplen-Parameter zu gelangen.


7
2018-03-30 15:09



Danke für die Geduld, die so viel für mich gepostet hat. Du hast wirklich geholfen! Sorry, aber trotzdem möchte ich noch deine Meinung hören. Was ist der übliche Engpass, der den Paketverlust beeinflusst? Woher soll ich wissen, ob es passiert ist? Gibt es etwas, das ich tun kann, um dies zu vermeiden (vorausgesetzt, genügend Hardware-Ressourcen), d. H. Gibt es irgendeine Konfiguration, die ich machen kann, um die tcpdump-Leistung zu steigern? - Haozhun