GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Tcpdump-Befehl unter Linux

tcpdump ist ein Befehlszeilendienstprogramm, mit dem Sie den Netzwerkverkehr zu und von Ihrem System erfassen und untersuchen können. Es ist das von Netzwerkadministratoren am häufigsten verwendete Tool zur Behebung von Netzwerkproblemen und Sicherheitstests.

Trotz seines Namens mit tcpdump , können Sie auch Nicht-TCP-Datenverkehr wie UDP, ARP oder ICMP erfassen. Die erfassten Pakete können in eine Datei oder Standardausgabe geschrieben werden. Eines der mächtigsten Features von tcpdump Befehl ist seine Fähigkeit, Filter zu verwenden und nur die Daten zu erfassen, die Sie analysieren möchten.

In diesem Artikel behandeln wir die Grundlagen zur Verwendung von tcpdump Befehl unter Linux.

Installation von tcpdump #

tcpdump wird standardmäßig auf den meisten Linux-Distributionen und macOS installiert. Um zu prüfen, ob die tcpdump Befehl ist auf Ihrem Systemtyp verfügbar:

tcpdump --version

Die Ausgabe sollte in etwa so aussehen:

tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b  26 Feb 2019

Wenn tcpdump auf Ihrem System nicht vorhanden ist, gibt der obige Befehl „tcpdump:command not found“ aus. Sie können einfach tcpdump installieren Verwenden Sie den Paketmanager Ihrer Distribution.

Installation von tcpdump auf Ubuntu und Debian #

sudo apt update && sudo apt install tcpdump

Installation von tcpdump auf CentOS und Fedora #

sudo yum install tcpdump

Installation von tcpdump auf Arch Linux #

sudo pacman -S tcpdump

Erfassen von Paketen mit tcpdump #

Die allgemeine Syntax für tcpdump Befehl lautet wie folgt:

tcpdump [options] [expression]
  • Der Befehl options ermöglichen es Ihnen, das Verhalten des Befehls zu steuern.
  • Der Filter expression definiert, welche Pakete erfasst werden.

Nur root oder Benutzer mit sudo Privilegien können tcpdump ausführen . Wenn Sie versuchen, den Befehl als nicht privilegierter Benutzer auszuführen, erhalten Sie eine Fehlermeldung:„Sie haben keine Berechtigung zum Aufnehmen auf diesem Gerät“.

Der einfachste Anwendungsfall ist der Aufruf von tcpdump ohne Optionen und Filter:

sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108

... Long output suppressed

23116 packets captured
23300 packets received by filter
184 packets dropped by kernel

tcpdump wird weiterhin Pakete erfassen und auf die Standardausgabe schreiben, bis es ein Interrupt-Signal empfängt. Verwenden Sie Ctrl+C Tastenkombination, um ein Unterbrechungssignal zu senden und den Befehl zu stoppen.

Für eine ausführlichere Ausgabe übergeben Sie -v Option oder -vv für eine noch ausführlichere Ausgabe:

sudo tcpdump -vv

Sie können die Anzahl der zu erfassenden Pakete mit -c angeben Möglichkeit. Um beispielsweise nur zehn Pakete zu erfassen, würden Sie Folgendes eingeben:

sudo tcpdump -c 10

Nach dem Erfassen der Pakete, tcpdump wird aufhören.

Wenn keine Schnittstelle angegeben ist, tcpdump verwendet die erste Schnittstelle, die es findet, und gibt alle Pakete aus, die diese Schnittstelle passieren.

Verwenden Sie das -D Option zum Drucken einer Liste aller verfügbaren Netzwerkschnittstellen, von denen tcpdump Pakete sammeln kann:

sudo tcpdump -D

Für jede Schnittstelle gibt der Befehl den Schnittstellennamen, eine kurze Beschreibung und einen zugehörigen Index (Nummer) aus:

1.ens3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]

Die obige Ausgabe zeigt, dass ens3 ist die erste Schnittstelle, die von tcpdump gefunden wird und verwendet, wenn dem Befehl keine Schnittstelle bereitgestellt wird. Die zweite Schnittstelle any ist ein spezielles Gerät, mit dem Sie alle aktiven Schnittstellen erfassen können.

Um die Schnittstelle anzugeben, auf der Sie Datenverkehr erfassen möchten, rufen Sie den Befehl mit -i auf Option, gefolgt vom Schnittstellennamen oder dem zugehörigen Index. Um beispielsweise alle Pakete von allen Schnittstellen zu erfassen, würden Sie any angeben Schnittstelle:

sudo tcpdump -i any

Standardmäßig tcpdump führt eine umgekehrte DNS-Auflösung für IP-Adressen durch und übersetzt Portnummern in Namen. Verwenden Sie das -n Option zum Deaktivieren der Übersetzung:

sudo tcpdump -n

Das Überspringen der DNS-Suche vermeidet das Generieren von DNS-Datenverkehr und macht die Ausgabe besser lesbar. Es wird empfohlen, diese Option immer dann zu verwenden, wenn Sie tcpdump aufrufen .

Anstatt die Ausgabe auf dem Bildschirm anzuzeigen, können Sie sie mit den Umleitungsoperatoren > in eine Datei umleiten und >> :

sudo tcpdump -n -i any > file.out

Sie können die Daten auch während des Speicherns in einer Datei mit dem tee ansehen Befehl:

sudo tcpdump -n -l | tee file.out

Das -l Option im obigen Befehl sagt tcpdump um die Ausgangsleitung gepuffert zu machen. Wenn diese Option nicht verwendet wird, wird die Ausgabe nicht auf den Bildschirm geschrieben, wenn eine neue Zeile generiert wird.

Verstehen des tcpdump Ausgabe #

tcpdump gibt Informationen für jedes erfasste Paket in einer neuen Zeile aus. Jede Zeile enthält je nach Protokoll einen Zeitstempel und Informationen zu diesem Paket.

Das typische Format einer TCP-Protokollzeile ist wie folgt:

[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]

Gehen wir Feld für Feld vor und erklären die folgende Zeile:

15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
  • 15:47:24.248737 - Der Zeitstempel des erfassten Pakets ist Ortszeit und verwendet das folgende Format:hours:minutes:seconds.frac , wobei frac ist Sekundenbruchteile seit Mitternacht.

  • IP - Das Paketprotokoll. IP bedeutet in diesem Fall das Internetprotokoll Version 4 (IPv4).

  • 192.168.1.185.22 - Die Quell-IP-Adresse und der Port, getrennt durch einen Punkt (. ).

  • 192.168.1.150.37445 - Die Ziel-IP-Adresse und der Port, getrennt durch einen Punkt (. ).

  • Flags [P.] - Feld TCP-Flags. In diesem Beispiel [P.] bedeutet Push-Acknowledgement-Paket, das verwendet wird, um das vorherige Paket zu bestätigen und Daten zu senden. Andere typische Flag-Feldwerte sind wie folgt:

    • [.] - ACK (Bestätigung)
    • [S] - SYN (Verbindung starten)
    • [P] - PSH (Push-Daten)
    • [F] - FIN (Verbindung beenden)
    • [R] - RST (Verbindung zurücksetzen)
    • [S.] - SYN-ACK (SynAcK-Paket)
  • seq 201747193:201747301 - Die Sequenznummer steht im first:last Notation. Es zeigt die Anzahl der im Paket enthaltenen Daten. Mit Ausnahme des ersten Pakets im Datenstrom, wo diese Zahlen absolut sind, werden alle nachfolgenden Pakete als relative Byte-Positionen verwendet. In diesem Beispiel lautet die Nummer 201747193:201747301 , was bedeutet, dass dieses Paket die Bytes 201747193 bis 201747301 des Datenstroms enthält. Verwenden Sie das -S Option zum Drucken absoluter Sequenznummern.

  • ack 1226568763 Die Bestätigungsnummer ist die Sequenznummer der nächsten Daten, die von der anderen Seite dieser Verbindung erwartet werden.

  • win 402 - Die Fensternummer ist die Anzahl der verfügbaren Bytes im Empfangspuffer.

  • options [nop,nop,TS val 1051794587 ecr 2679218230] - TCP-Optionen. nop , oder „no operation“ ist ein Padding, das verwendet wird, um den TCP-Header zu einem Vielfachen von 4 Bytes zu machen. TS val ist ein TCP-Zeitstempel und ecr steht für eine Echo-Antwort. Weitere Informationen zu TCP-Optionen finden Sie in der IANA-Dokumentation.

  • length 108 - Die Länge der Nutzdaten

tcpdump Filter #

Wenn tcpdump ohne Filter aufgerufen wird, erfasst es den gesamten Datenverkehr und erzeugt eine riesige Menge an Ausgabe, die es sehr schwierig macht, die interessierenden Pakete zu finden und zu analysieren.

Filter sind eine der mächtigsten Funktionen von tcpdump Befehl. Sie, da sie Ihnen erlauben, nur die Pakete zu erfassen, die dem Ausdruck entsprechen. Wenn Sie beispielsweise Probleme mit einem Webserver beheben, können Sie Filter verwenden, um nur den HTTP-Datenverkehr zu erhalten.

tcpdump verwendet die Berkeley Packet Filter (BPF)-Syntax, um die erfassten Pakete unter Verwendung verschiedener Verarbeitungsparameter wie Protokolle, Quell- und Ziel-IP-Adressen und Ports usw. zu filtern.

In diesem Artikel werfen wir einen Blick auf einige der gängigsten Filter. Eine Liste aller verfügbaren Filter finden Sie auf der pcap-filtermanpage.

Filterung nach Protokoll #

Um die Erfassung auf ein bestimmtes Protokoll zu beschränken, geben Sie das Protokoll als Filter an. Um beispielsweise nur den UDP-Datenverkehr zu erfassen, würden Sie Folgendes ausführen:

sudo tcpdump -n udp

Eine andere Möglichkeit, das Protokoll zu definieren, ist die Verwendung von proto Qualifizierer, gefolgt von der Protokollnummer. Der folgende Befehl filtert das Protokoll Nummer 17 und erzeugt das gleiche Ergebnis wie das obige:

sudo tcpdump -n proto 17

Weitere Informationen zu den Nummern finden Sie in der Nummernliste des IP-Protokolls.

Filterung nach Hostnummer

Um nur Pakete zu erfassen, die sich auf einen bestimmten Host beziehen, verwenden Sie den host Qualifizierer:

sudo tcpdump -n host 192.168.1.185

Der Host kann entweder eine IP-Adresse oder ein Name sein.

Sie können die Ausgabe auch mithilfe von net auf einen bestimmten IP-Bereich filtern Qualifikation. Zum Beispiel, um nur Pakete auszugeben, die sich auf 10.10.0.0/16 beziehen Sie würden verwenden:

sudo tcpdump -n net 10.10

Filterung nach Portnummer

Um die Erfassung nur auf Pakete von oder zu einem bestimmten Port zu beschränken, verwenden Sie den port Qualifikation. Der folgende Befehl erfasst Pakete, die sich auf den SSH-Dienst (Port 22) beziehen, indem er diesen Befehl verwendet:

sudo tcpdump -n port 23

Der portrange Mit dem Qualifizierer können Sie Datenverkehr in einer Reihe von Ports erfassen:

sudo tcpdump -n portrange 110-150

Filtern nach Quelle und Ziel #

Sie können Pakete auch anhand des Quell- oder Zielports oder -hosts filtern, indem Sie are src verwenden , dst , src and dst , und src or dst Qualifizierer.

Der folgende Befehl erfasst eingehende Pakete von einem Host mit der IP 192.168.1.185:

sudo tcpdump -n src host 192.168.1.185

Um den Verkehr zu finden, der von einer beliebigen Quelle zu Port 80 kommt, würden Sie Folgendes verwenden:

sudo tcpdump -n dst port 80

Komplexe Filter #

Filter können mit and kombiniert werden (&& ), or (|| ) und not (! ) Operatoren.

Um beispielsweise den gesamten HTTP-Datenverkehr von einer Quell-IP-Adresse 192.168.1.185 zu erfassen, würden Sie diesen Befehl verwenden:

sudo tcpdump -n src 192.168.1.185 and tcp port 80

Sie können auch Klammern verwenden, um komplexere Filter zu gruppieren und zu erstellen:

sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'

Um Parsing-Fehler bei der Verwendung von Sonderzeichen zu vermeiden, schließen Sie die Filter in einfache Anführungszeichen ein.

Hier ist ein weiterer Beispielbefehl zum Erfassen des gesamten Datenverkehrs außer SSH von einer Quell-IP-Adresse 192.168.1.185:

sudo tcpdump -n src 192.168.1.185 and not dst port 22

Paketinspektion #

Standardmäßig tcpdump , erfasst nur die Paketheader. Manchmal müssen Sie jedoch den Inhalt der Pakete überprüfen.

tcpdump ermöglicht es Ihnen, den Inhalt der Pakete in ASCII und HEX auszudrucken.

Das -A Option teilt tcpdump mit um jedes Paket in ASCII und -x zu drucken in HEX:

sudo tcpdump -n -A

Um den Inhalt des Pakets sowohl in HEX als auch in ASCII anzuzeigen, verwenden Sie -X Möglichkeit:

sudo tcpdump -n -X

Lesen und Schreiben von Captures in eine Datei #

Eine weitere nützliche Funktion von tcpdump ist, die Pakete in eine Datei zu schreiben. Dies ist praktisch, wenn Sie eine große Anzahl von Paketen erfassen oder Pakete für eine spätere Analyse erfassen.

Um mit dem Schreiben in eine Datei zu beginnen, verwenden Sie -w Option gefolgt von der Ausgabe-Capture-Datei:

sudo tcpdump -n -w data.pcap

Dieser obige Befehl speichert die Erfassung in einer Datei mit dem Namen data.pcap . Sie können die Datei nach Belieben benennen, aber es ist eine übliche Konvention, .pcap zu verwenden Erweiterung (Paketerfassung).

Wenn das -w Option verwendet wird, wird die Ausgabe nicht auf dem Bildschirm angezeigt. tcpdump schreibt Rohpakete und erstellt eine Binärdatei, die nicht mit einem normalen Texteditor gelesen werden kann.

Um den Inhalt der Datei zu untersuchen, rufen Sie tcpdump auf mit dem -r Möglichkeit:

sudo tcpdump -r data.pcap

Wenn Sie tcpdump ausführen möchten Fügen Sie im Hintergrund das kaufmännische Und-Symbol hinzu (& ) am Ende des Befehls.

Die Capture-Datei kann auch mit anderen Packet-Analyzer-Tools wie Wireshark untersucht werden.

Wenn Sie Pakete über einen längeren Zeitraum erfassen, können Sie die Dateirotation aktivieren. tcpdump ermöglicht es Ihnen, neue Dateien zu erstellen und die Dump-Datei in einem bestimmten Zeitintervall oder einer festen Größe zu rotieren. Der folgende Befehl erstellt bis zu zehn 200-MB-Dateien mit dem Namen file.pcap0 , file.pcap1 , und so weiter:bevor ältere Dateien überschrieben werden.

sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap

Sobald zehn Dateien generiert sind, werden die älteren Dateien überschrieben.

Bitte beachten Sie, dass Sie nur tcpdump ausführen sollten nur während der Fehlerbehebung.

Wenn Sie tcpdump starten möchten Zu einem bestimmten Zeitpunkt können Sie einen Cronjob verwenden. tcpdump hat keine Möglichkeit, nach einer bestimmten Zeit zu beenden. Sie können das timeout verwenden Befehl zum Stoppen von tcpdump nach einiger Zeit. Um beispielsweise nach 5 Minuten zu beenden, würden Sie Folgendes verwenden:

sudo timeout 300 tcpdump -n -w data.pcap

Schlussfolgerung #

tcpdump ist ein Befehlszeilentool zum Analysieren und Beheben von Netzwerkproblemen.

Dieser Artikel hat Sie in die Grundlagen von tcpdump eingeführt Verwendung und Syntax. Eine ausführlichere Dokumentation finden Sie auf der tcpdump-Website.

Wenn Sie Fragen oder Feedback haben, können Sie gerne einen Kommentar hinterlassen.


Linux
  1. So erfassen und analysieren Sie Pakete mit dem Befehl tcpdump unter Linux

  2. Linux-mv-Befehl

  3. Linux-Du-Befehl

  4. Linux-IP-Befehl

  5. Linux-cd-Befehl

W-Befehl unter Linux

Tcpdump-Befehl unter Linux

Bei Befehl unter Linux

Df-Befehl unter Linux

Linux-tcpdump-Befehl

Packet Analyzer:15 Beispiele für TCPDUMP-Befehle