tcpdump Wie verwende ich es, um alle Verkehrskopfzeilen zu erfassen?

9

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 den gesamten Datenverkehr in einer Datei im PCAP-Format. Die Datei sollte enthalten

  1. Nur ausgehender oder eingehender Verkehr ist interessiert. Datenverkehr, der nur innerhalb des Subnetzes übertragen wird, wird nicht benötigt und sollte nach Möglichkeit nicht protokolliert werden.
  2. Der gesamte Multicast- und Broadcast-Verkehr ist nicht interessiert und sollte nach Möglichkeit ignoriert werden
  3. Ich brauche nur Ethernet -> IPv4 -> TCP, UDP und ICMP. Andere sind nicht interessiert und sollten nach Möglichkeit vernachlässigt werden
  4. Ich brauche keinen Nachrichtentext. Header (Ethernet, IP und TCP / UDP / ICMP) reichen aus. Daher sollte der Körper nach Möglichkeit nicht protokolliert werden

Der Datenverkehr würde tagsüber ~ 100 MByte / s betragen, und für meine Arbeit ist ein Paketverlust nicht tolerierbar (er muss 24 Stunden lang ununterbrochen sein ).
Wie oben erwähnt, brauche ich sowieso nicht alles.

Frage:

  1. Wie kann ich den Job machen?
  2. Worauf sollte ich achten, damit alle Daten (fast) reibungslos und verlustfrei erfasst werden.

Vielen Dank.

Haozhun
quelle
1
Es liest sich so, als würden Sie versuchen, Flussdaten über den Switch-Uplink zu erfassen. Ist das eine faire Einschätzung?
Scott Pack
# 4 ist wirklich schwer zu machen. Sie wissen nie, wie viele weitere Pakettypen im Paket enthalten sind. Bevor Sie dies tun, müssen Sie jedoch TCP und IP wieder zusammensetzen. Libnids ist die einzige Bibliothek, die ich gefunden habe und die IP-Defragmenierung und TCP-Stream-Neuzusammenstellung durchführt. Sie müssen also zuerst alle Streams separat neu erstellen, dann ermitteln, wie viele Kapselungsebenen vorhanden sind, dann entscheiden, welche davon Sie nicht benötigen, und diese herausfiltern.
Marcin
@ Scott Ich bin mir nicht sicher. Mir wurde gesagt, dass der Switch so konfiguriert ist, dass der gesamte Datenfluss auf diesen Port gespiegelt wird. Würden Sie bitte erklären, warum dies wichtig ist? Ich kenne ein paar über Netzwerke, aber hauptsächlich aus Lehrbüchern, RFCs und Papieren, und nicht aus der Praxis. Vielen Dank!
Haozhun
@Marcin Da ich nicht viel über tcpdump weiß, ist es für mich am einfachsten, ein C / C ++ - Programm zu schreiben und libpcap zu verwenden, um bestimmte Regeln zu erfassen, zu überprüfen und dann zu speichern. Aber ich bin wirklich besorgt über die Leistung, da dies 100 MByte / Sek. Ist. Ich vermutete jedoch, dass tcpdump dies großartig machen könnte. Was ist die Lösung, wenn wir uns nicht für # 4 interessieren? Vielen Dank!
Haozhun
Wenn Sie tatsächlich volle 100 MBit / s verwenden (oder meinen Sie wirklich 100 MBit / s?), ist das erste, was Sie sich ansehen müssen, das Laufwerk, auf das Sie es ausgeben. Ich mache oft Dumps direkt auf einem externen Laufwerk und stoße dann immer wieder auf USB-Bandbreitenbeschränkungen (22-30 MByte / Sek.), Also habe ich angefangen, eSATA zu verwenden, und das hat dieses Problem behoben, aber es ist immer noch nicht vollständig beseitigt. Wenn Sie viel Verkehr haben, müssen Sie möglicherweise ein RAID erstellen (nicht RAID5, das ist für Schreibvorgänge sehr langsam!), Um die Erfassung mit voller Geschwindigkeit zu unterstützen. Der Grund, warum das Scrubben von Nutzdaten sinnvoll wäre, besteht darin, den Schreibdurchsatz zu minimieren.
Marcin

Antworten:

10

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

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

Wo der "knifflige" Teil darin besteht, einen korrekten Wert für den Parameter "-s" (snaplen) zu wählen (snaplen ist die maximale Länge des Pakets, das tcpdump erfasst).

Aus den Manpages von tcpdump:

Snarf snaplen Datenbytes von jedem Paket anstatt der Standardeinstellung von 68 (mit NIT beträgt das Minimum tatsächlich 96). 68 Byte sind für IP, ICMP, TCP und UDP ausreichend, können jedoch Protokollinformationen von Nameserver- und NFS-Paketen abschneiden (siehe unten). Pakete, die aufgrund eines begrenzten Snapshots abgeschnitten wurden, werden in der Ausgabe mit "[| proto]" angezeigt, wobei proto der Name der Protokollebene ist, auf der die Kürzung erfolgt ist. Beachten Sie, dass das Erstellen größerer Snapshots sowohl die Zeit zum Verarbeiten von Paketen verlängert als auch die Menge der Paketpufferung verringert. Dies kann dazu führen, dass Pakete verloren gehen. Sie sollten snaplen auf die kleinste Anzahl beschränken, die die Protokollinformationen erfasst, an denen Sie interessiert sind.

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

Wenn Ihr Datenverkehr über IP- oder TCP-Optionen (dh Zeitstempel) verfügt und Sie diese Informationen auch erfassen möchten, müssen Sie mit dem Parameter snaplen spielen (dh ihn erhöhen / verringern).

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

Zum Lesen des erfassten Datenverkehrs würde ich Folgendes verwenden:

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

Wo der wichtige Teil ist, verwenden Sie die Option "-e", damit Sie die Ethernet-Header drucken können.

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

jliendo
quelle
1
Vielen Dank, dass Sie so viel geduldig für mich gepostet haben. Du hast wirklich geholfen! Sorry, aber trotzdem möchte ich deine Meinung hören. Was ist der übliche Engpass, der den Paketverlust beeinflusst? Woher soll ich wissen, ob es passiert ist? Kann ich etwas tun, um dies zu vermeiden (bei ausreichender Hardwareressource), dh kann ich eine Konfiguration vornehmen, um die Leistung von tcpdump zu steigern?
Haozhun