In meiner Erfahrung als Systemadministrator habe ich oft festgestellt, dass Probleme mit der Netzwerkverbindung schwierig zu beheben sind. In diesen Situationen ist tcpdump ein großartiger Verbündeter.
Das Linux-Terminal
- Die 7 besten Terminalemulatoren für Linux
- 10 Befehlszeilentools für die Datenanalyse unter Linux
- Jetzt herunterladen:SSH-Spickzettel
- Spickzettel für fortgeschrittene Linux-Befehle
- Linux-Befehlszeilen-Tutorials
Tcpdump ist ein Befehlszeilendienstprogramm, mit dem Sie den Netzwerkverkehr erfassen und analysieren können, der durch Ihr System fließt. Es wird häufig zur Behebung von Netzwerkproblemen sowie als Sicherheitstool verwendet.
tcpdump ist ein leistungsstarkes und vielseitiges Werkzeug, das viele Optionen und Filter enthält und in einer Vielzahl von Fällen verwendet werden kann. Da es sich um ein Befehlszeilentool handelt, ist es ideal, um es auf Remote-Servern oder Geräten auszuführen, für die keine GUI verfügbar ist, um Daten zu sammeln, die später analysiert werden können. Es kann auch im Hintergrund oder als geplanter Job mit Tools wie cron gestartet werden.
In diesem Artikel sehen wir uns einige der häufigsten Funktionen von tcpdump an.
1. Installation unter Linux
Tcpdump ist in mehreren Linux-Distributionen enthalten, also haben Sie es wahrscheinlich bereits installiert. Prüfen Sie mit folgendem Befehl, ob tcpdump auf Ihrem System installiert ist:
$ which tcpdump
/usr/sbin/tcpdump
Wenn tcpdump nicht installiert ist, können Sie es installieren, indem Sie den Paketmanager Ihrer Distribution verwenden. Unter CentOS oder Red Hat Enterprise Linux beispielsweise so:
$ sudo dnf install -y tcpdump
Tcpdump erfordert libpcap
, eine Bibliothek zur Erfassung von Netzwerkpaketen. Wenn es nicht installiert ist, wird es automatisch als Abhängigkeit hinzugefügt.
Sie können nun mit der Erfassung einiger Pakete beginnen.
2. Pakete mit tcpdump erfassen
Um Pakete zur Fehlerbehebung oder Analyse zu erfassen, benötigt tcpdump erhöhte Berechtigungen, daher wird den meisten Befehlen in den folgenden Beispielen sudo
vorangestellt .
Verwenden Sie zu Beginn den Befehl tcpdump --list-interfaces
(oder -D
kurz), um zu sehen, welche Schnittstellen für die Erfassung verfügbar sind:
$ sudo tcpdump -D
1.eth0
2.virbr0
3.eth1
4.any (Pseudo-device that captures on all interfaces)
5.lo [Loopback]
Im obigen Beispiel sehen Sie alle in meiner Maschine verfügbaren Schnittstellen. Die spezielle Schnittstelle any
ermöglicht die Erfassung in jeder aktiven Schnittstelle.
Lassen Sie uns damit beginnen, einige Pakete zu erfassen. Erfassen Sie alle Pakete in jeder Schnittstelle, indem Sie diesen Befehl ausführen:
$ sudo tcpdump --interface any
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3770820720:3770820916, ack 3503648727, win 309, options [nop,nop,TS val 76577898 ecr 510770929], length 196
09:56:18.293794 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 391, options [nop,nop,TS val 510771017 ecr 76577898], length 0
09:56:18.295058 IP rhel75.59883 > gateway.domain: 2486+ PTR? 1.64.168.192.in-addr.arpa. (43)
09:56:18.310225 IP gateway.domain > rhel75.59883: 2486 NXDomain* 0/1/0 (102)
09:56:18.312482 IP rhel75.49685 > gateway.domain: 34242+ PTR? 28.64.168.192.in-addr.arpa. (44)
09:56:18.322425 IP gateway.domain > rhel75.49685: 34242 NXDomain* 0/1/0 (103)
09:56:18.323164 IP rhel75.56631 > gateway.domain: 29904+ PTR? 1.122.168.192.in-addr.arpa. (44)
09:56:18.323342 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 196:584, ack 1, win 309, options [nop,nop,TS val 76577928 ecr 510771017], length 388
09:56:18.323563 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 584, win 411, options [nop,nop,TS val 510771047 ecr 76577928], length 0
09:56:18.335569 IP gateway.domain > rhel75.56631: 29904 NXDomain* 0/1/0 (103)
09:56:18.336429 IP rhel75.44007 > gateway.domain: 61677+ PTR? 98.122.168.192.in-addr.arpa. (45)
09:56:18.336655 IP gateway.domain > rhel75.44007: 61677* 1/0/0 PTR rhel75. (65)
09:56:18.337177 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 584:1644, ack 1, win 309, options [nop,nop,TS val 76577942 ecr 510771047], length 1060
---- SKIPPING LONG OUTPUT -----
09:56:19.342939 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 1752016, win 1444, options [nop,nop,TS val 510772067 ecr 76578948], length 0
^C
9003 packets captured
9010 packets received by filter
7 packets dropped by kernel
$
Tcpdump erfasst weiterhin Pakete, bis es ein Interrupt-Signal empfängt. Sie können die Aufnahme unterbrechen, indem Sie Ctrl+C
drücken . Wie Sie in diesem Beispiel sehen können, tcpdump
erfasst mehr als 9.000 Pakete. In diesem Fall, da ich mit ssh
mit diesem Server verbunden bin , tcpdump hat alle diese Pakete erfasst. Um die Anzahl der erfassten Pakete zu begrenzen und tcpdump
zu stoppen verwenden Sie den -c
(für Zählung ) Option:
$ sudo tcpdump -i any -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
11:21:30.242740 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3772575680:3772575876, ack 3503651743, win 309, options [nop,nop,TS val 81689848 ecr 515883153], length 196
11:21:30.242906 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 1443, options [nop,nop,TS val 515883235 ecr 81689848], length 0
11:21:30.244442 IP rhel75.43634 > gateway.domain: 57680+ PTR? 1.64.168.192.in-addr.arpa. (43)
11:21:30.244829 IP gateway.domain > rhel75.43634: 57680 NXDomain 0/0/0 (43)
11:21:30.247048 IP rhel75.33696 > gateway.domain: 37429+ PTR? 28.64.168.192.in-addr.arpa. (44)
5 packets captured
12 packets received by filter
0 packets dropped by kernel
$
In diesem Fall tcpdump
stoppte die automatische Erfassung nach der Erfassung von fünf Paketen. Dies ist in verschiedenen Szenarien nützlich, z. B. wenn Sie die Konnektivität beheben und das Erfassen einiger anfänglicher Pakete ausreicht. Dies ist sogar noch nützlicher, wenn wir Filter anwenden, um bestimmte Pakete zu erfassen (siehe unten).
Standardmäßig löst tcpdump IP-Adressen und Ports in Namen auf, wie im vorherigen Beispiel gezeigt. Bei der Behebung von Netzwerkproblemen ist es oft einfacher, die IP-Adressen und Portnummern zu verwenden; Deaktivieren Sie die Namensauflösung mit der Option -n
und Portauflösung mit -nn
:
$ sudo tcpdump -i any -c5 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 166198580:166198776, ack 2414541257, win 309, options [nop,nop,TS val 615664 ecr 540031155], length 196
23:56:24.292357 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 196, win 1377, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292570 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 372
23:56:24.292655 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 568, win 1400, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292752 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 568:908, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 340
5 packets captured
6 packets received by filter
0 packets dropped by kernel
Wie oben gezeigt, zeigt die Erfassungsausgabe jetzt die IP-Adressen und Portnummern an. Dies verhindert auch, dass tcpdump DNS-Lookups erstellt, was dazu beiträgt, den Netzwerkverkehr zu verringern und gleichzeitig Netzwerkprobleme zu beheben.
Nun, da Sie in der Lage sind, Netzwerkpakete zu erfassen, wollen wir untersuchen, was diese Ausgabe bedeutet.
3. Verständnis des Ausgabeformats
Tcpdump ist in der Lage, viele verschiedene Protokolle wie TCP, UDP, ICMP und viele mehr zu erfassen und zu decodieren. Wir können hier zwar nicht alle behandeln, aber um Ihnen den Einstieg zu erleichtern, lassen Sie uns das TCP-Paket untersuchen. Weitere Details zu den verschiedenen Protokollformaten finden Sie in den Manpages von tcpdump. Ein typisches TCP-Paket, das von tcpdump erfasst wird, sieht folgendermaßen aus:
08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372
Die Felder können je nach Art des gesendeten Pakets variieren, aber dies ist das allgemeine Format.
Das erste Feld, 08:41:13.729687,
stellt den Zeitstempel des empfangenen Pakets gemäß der lokalen Uhr dar.
Als nächstes IP
stellt das Netzwerkschichtprotokoll dar – in diesem Fall IPv4
. Für IPv6
Pakete, der Wert ist IP6
.
Das nächste Feld, 192.168.64.28.22
, ist die Quell-IP-Adresse und der Port. Darauf folgen die Ziel-IP-Adresse und der Port, dargestellt durch 192.168.64.1.41916
.
Nach Quelle und Ziel finden Sie die TCP-Flags Flags [P.]
. Typische Werte für dieses Feld sind:
Wert | Flagtyp | Beschreibung |
S | SYN | Verbindungsstart |
F | FIN | Verbindung beendet |
P | DRÜCKEN | Daten-Push |
R | RST | Verbindung zurückgesetzt |
. | ACK | Bestätigung |
Dieses Feld kann auch eine Kombination dieser Werte sein, z. B. [S.]
für ein SYN-ACK
Paket.
Als nächstes folgt die Sequenznummer der im Paket enthaltenen Daten. Für das erste erfasste Paket ist dies eine absolute Zahl. Nachfolgende Pakete verwenden eine relative Nummer, um die Verfolgung zu erleichtern. In diesem Beispiel ist die Sequenz seq 196:568,
was bedeutet, dass dieses Paket die Bytes 196 bis 568 dieses Flusses enthält.
Darauf folgt die Ack-Nummer:ack 1
. In diesem Fall ist es 1, da dies die Seite ist, die Daten sendet. Für die Seite, die Daten empfängt, stellt dieses Feld das nächste erwartete Byte (Daten) in diesem Fluss dar. Beispielsweise wäre die Bestätigungsnummer für das nächste Paket in diesem Fluss 568.
Das nächste Feld ist die Fenstergröße win 309
, das die Anzahl der im Empfangspuffer verfügbaren Bytes darstellt, gefolgt von TCP-Optionen wie MSS (Maximum Segment Size) oder Window Scale. Einzelheiten zu den TCP-Protokolloptionen finden Sie unter TCP-Parameter (Transmission Control Protocol).
Schließlich haben wir die Paketlänge, length 372
, die die Länge der Nutzdaten in Bytes darstellt. Die Länge ist die Differenz zwischen dem letzten und ersten Byte in der Sequenznummer.
Lassen Sie uns nun lernen, wie Pakete gefiltert werden, um die Ergebnisse einzugrenzen und die Behebung bestimmter Probleme zu erleichtern.
4. Pakete filtern
Wie oben erwähnt, kann tcpdump zu viele Pakete erfassen, von denen einige nicht einmal mit dem Problem zusammenhängen, das Sie beheben. Wenn Sie beispielsweise ein Verbindungsproblem mit einem Webserver beheben, interessieren Sie sich nicht für den SSH-Verkehr. Wenn Sie also die SSH-Pakete aus der Ausgabe entfernen, ist es einfacher, an dem eigentlichen Problem zu arbeiten.
Eine der leistungsstärksten Funktionen von tcpdump ist seine Fähigkeit, die erfassten Pakete anhand einer Vielzahl von Parametern zu filtern, wie z. B. Quell- und Ziel-IP-Adressen, Ports, Protokolle usw. Schauen wir uns einige der häufigsten an.
Protokoll
Um Pakete basierend auf dem Protokoll zu filtern, geben Sie das Protokoll in der Befehlszeile an. Erfassen Sie beispielsweise ICMP-Pakete nur mit diesem Befehl:
$ sudo tcpdump -i any -c5 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
Versuchen Sie in einem anderen Terminal, einen anderen Computer anzupingen:
$ ping opensource.com
PING opensource.com (54.204.39.132) 56(84) bytes of data.
64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 ms
Beachten Sie in der tcpdump-Erfassung, dass tcpdump nur die ICMP-bezogenen Pakete erfasst und anzeigt. In diesem Fall zeigt tcpdump keine Namensauflösungspakete an, die beim Auflösen des Namens opensource.com
generiert wurden :
09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64
09:34:20.176402 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 1, length 64
09:34:21.140230 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 2, length 64
09:34:21.180020 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 2, length 64
09:34:22.141777 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 3, length 64
5 packets captured
5 packets received by filter
0 packets dropped by kernel
Host
Beschränken Sie die Erfassung auf nur Pakete, die sich auf einen bestimmten Host beziehen, indem Sie den host
verwenden filtern:
$ sudo tcpdump -i any -c5 -nn host 54.204.39.132
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:54:20.042023 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [S], seq 1375157070, win 29200, options [mss 1460,sackOK,TS val 122350391 ecr 0,nop,wscale 7], length 0
09:54:20.088127 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [S.], seq 1935542841, ack 1375157071, win 28960, options [mss 1460,sackOK,TS val 522713542 ecr 122350391,nop,wscale 9], length 0
09:54:20.088204 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122350437 ecr 522713542], length 0
09:54:20.088734 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122350438 ecr 522713542], length 112: HTTP: GET / HTTP/1.1
09:54:20.129733 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [.], ack 113, win 57, options [nop,nop,TS val 522713552 ecr 122350438], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
In diesem Beispiel erfasst tcpdump nur Pakete von und zu Host 54.204.39.132
und zeigt sie an .
Anschluss
Um Pakete basierend auf dem gewünschten Dienst oder Port zu filtern, verwenden Sie den port
Filter. Erfassen Sie beispielsweise Pakete, die sich auf einen Webdienst (HTTP) beziehen, indem Sie diesen Befehl verwenden:
$ sudo tcpdump -i any -c5 -nn port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:58:28.790548 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [S], seq 1745665159, win 29200, options [mss 1460,sackOK,TS val 122599140 ecr 0,nop,wscale 7], length 0
09:58:28.834026 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [S.], seq 4063583040, ack 1745665160, win 28960, options [mss 1460,sackOK,TS val 522775728 ecr 122599140,nop,wscale 9], length 0
09:58:28.834093 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122599183 ecr 522775728], length 0
09:58:28.834588 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122599184 ecr 522775728], length 112: HTTP: GET / HTTP/1.1
09:58:28.878445 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [.], ack 113, win 57, options [nop,nop,TS val 522775739 ecr 122599184], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
Quell-IP/Hostname
Sie können Pakete auch basierend auf der Quell- oder Ziel-IP-Adresse oder dem Hostnamen filtern. Zum Beispiel, um Pakete von Host 192.168.122.98
zu erfassen :
$ sudo tcpdump -i any -c5 -nn src 192.168.122.98
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32)
10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32)
10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0
10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0
10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1
5 packets captured
5 packets received by filter
0 packets dropped by kernel
Beachten Sie, dass tcpdumps erfasste Pakete mit der Quell-IP-Adresse 192.168.122.98
ausgibt für mehrere Dienste wie Namensauflösung (Port 53) und HTTP (Port 80). Die Antwortpakete werden nicht angezeigt, da ihre Quell-IP unterschiedlich ist.
Umgekehrt können Sie den dst
verwenden Filter zum Filtern nach Ziel-IP/Hostname:
$ sudo tcpdump -i any -c5 -nn dst 192.168.122.98
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:05:03.572931 IP 192.168.122.1.53 > 192.168.122.98.47049: 2248 1/0/0 A 54.204.39.132 (48)
10:05:03.572944 IP 192.168.122.1.53 > 192.168.122.98.47049: 33770 0/0/0 (32)
10:05:03.621833 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [S.], seq 3474204576, ack 3256851264, win 28960, options [mss 1460,sackOK,TS val 522874425 ecr 122993922,nop,wscale 9], length 0
10:05:03.667767 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [.], ack 113, win 57, options [nop,nop,TS val 522874436 ecr 122993972], length 0
10:05:03.672221 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 522874437 ecr 122993972], length 642: HTTP: HTTP/1.1 302 Found
5 packets captured
5 packets received by filter
0 packets dropped by kernel
Komplexe Ausdrücke
Sie können Filter auch kombinieren, indem Sie die logischen Operatoren and
verwenden und or
um komplexere Ausdrücke zu erstellen. Zum Beispiel, um Pakete von der Quell-IP-Adresse 192.168.122.98
zu filtern und nur HTTP verwenden, verwenden Sie diesen Befehl:
$ sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:08:00.472696 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [S], seq 2712685325, win 29200, options [mss 1460,sackOK,TS val 123170822 ecr 0,nop,wscale 7], length 0
10:08:00.516118 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 268723504, win 229, options [nop,nop,TS val 123170865 ecr 522918648], length 0
10:08:00.516583 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 123170866 ecr 522918648], length 112: HTTP: GET / HTTP/1.1
10:08:00.567044 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 123170916 ecr 522918661], length 0
10:08:00.788153 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [F.], seq 112, ack 643, win 239, options [nop,nop,TS val 123171137 ecr 522918661], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
Sie können komplexere Ausdrücke erstellen, indem Sie Filter mit Klammern gruppieren. Schließen Sie in diesem Fall den gesamten Filterausdruck in Anführungszeichen ein, damit die Shell ihn nicht mit Shell-Ausdrücken verwechselt:
$ sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:10:37.602214 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [S], seq 871108679, win 29200, options [mss 1460,sackOK,TS val 123327951 ecr 0,nop,wscale 7], length 0
10:10:37.650651 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [S.], seq 854753193, ack 871108680, win 28960, options [mss 1460,sackOK,TS val 522957932 ecr 123327951,nop,wscale 9], length 0
10:10:37.650708 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 0
10:10:37.651097 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 112: HTTP: GET / HTTP/1.1
10:10:37.692900 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [.], ack 113, win 57, options [nop,nop,TS val 522957942 ecr 123328000], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
In diesem Beispiel filtern wir Pakete nur für den HTTP-Dienst (Port 80) und Quell-IP-Adressen 192.168.122.98
oder 54.204.39.132
. Dies ist eine schnelle Möglichkeit, beide Seiten desselben Flusses zu untersuchen.
5. Paketinhalt prüfen
In den vorherigen Beispielen überprüfen wir nur die Header der Pakete auf Informationen wie Quelle, Ziele, Ports usw. Manchmal ist dies alles, was wir brauchen, um Probleme mit der Netzwerkverbindung zu beheben. Manchmal müssen wir jedoch den Inhalt des Pakets überprüfen, um sicherzustellen, dass die von uns gesendete Nachricht das enthält, was wir benötigen, oder dass wir die erwartete Antwort erhalten haben. Um den Paketinhalt zu sehen, bietet tcpdump zwei zusätzliche Flags:-X
um den Inhalt in Hex und ASCII oder -A
zu drucken um den Inhalt in ASCII zu drucken.
Untersuchen Sie beispielsweise den HTTP-Inhalt einer Webanforderung wie folgt:
$ sudo tcpdump -i any -c10 -nn -A port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0
E..<..@[email protected].'[email protected]............
............................
13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0
E..<..@./..a6.'...zb.P..o..&...A..q a..........
.R.W....... ................
13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0
E..4..@[email protected].'....P...Ao..'...........
.....R.W................
13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1
E.....@[email protected].'....P...Ao..'...........
.....R.WGET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: opensource.com
Connection: Keep-Alive
................
13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0
E..4.F@./.."6.'...zb.P..o..'.......9.2.....
.R.a....................
13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found
E....G@./...6.'...zb.P..o..'.......9.......
.R.b....HTTP/1.1 302 Found
Server: nginx
Date: Sun, 23 Sep 2018 17:02:14 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 207
X-Content-Type-Options: nosniff
Location: https://opensource.com/
Cache-Control: max-age=1209600
Expires: Sun, 07 Oct 2018 17:02:14 GMT
X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d
X-Varnish: 632951979
Age: 0
Via: 1.1 varnish (Varnish/5.2)
X-Cache: MISS
Connection: keep-alive
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://opensource.com/%3C/span%3Ehttps%3A%3Cspan%20class%3D"sy0">//opensource.com/">here</a>.</p>
</body></html>
................
13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0
E..4..@[email protected].'....P....o..............
.....R.b................
13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0
E..4..@[email protected].'....P....o..............
.....R.b................
13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0
E..4.H@./.. 6.'...zb.P..o..........9.I.....
.R......................
13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0
E..4..@[email protected].'....P....o..............
.....R..................
10 packets captured
10 packets received by filter
0 packets dropped by kernel
Dies ist hilfreich bei der Behebung von Problemen mit API-Aufrufen, vorausgesetzt, die Aufrufe verwenden einfaches HTTP. Bei verschlüsselten Verbindungen ist diese Ausgabe weniger sinnvoll.
6. Captures in einer Datei speichern
Eine weitere nützliche Funktion von tcpdump ist die Möglichkeit, die Erfassung in einer Datei zu speichern, damit Sie die Ergebnisse später analysieren können. So können Sie beispielsweise über Nacht Pakete im Batch-Modus erfassen und morgens die Ergebnisse verifizieren. Es hilft auch, wenn zu viele Pakete analysiert werden müssen, da die Echtzeiterfassung zu schnell erfolgen kann.
Um Pakete in einer Datei zu speichern, anstatt sie auf dem Bildschirm anzuzeigen, verwenden Sie die Option -w
(für schreiben ):
$ sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80
[sudo] password for ricardo:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel
Dieser Befehl speichert die Ausgabe in einer Datei namens webserver.pcap
. Die .pcap
Die Erweiterung steht für "packet capture" und ist die Konvention für dieses Dateiformat.
Wie in diesem Beispiel gezeigt, wird nichts auf dem Bildschirm angezeigt und die Erfassung endet nach der Erfassung von 10 Paketen gemäß der Option -c10
. Wenn Sie eine Rückmeldung wünschen, um sicherzustellen, dass Pakete erfasst werden, verwenden Sie die Option -v
.
Tcpdump erstellt eine Datei im Binärformat, sodass Sie sie nicht einfach mit einem Texteditor öffnen können. Um den Inhalt der Datei zu lesen, führen Sie tcpdump mit -r
aus (für lesen ) Option:
$ tcpdump -nn -r webserver.pcap
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.679494 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [S], seq 3709732619, win 29200, options [mss 1460,sackOK,TS val 135708029 ecr 0,nop,wscale 7], length 0
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.719005 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 0
13:36:57.719186 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 112: HTTP: GET / HTTP/1.1
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:57.760182 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 135708109 ecr 526052959], length 0
13:36:57.977602 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 135708327 ecr 526052959], length 0
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
13:36:58.022132 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 135708371 ecr 526053025], length 0
$
Da Sie die Pakete nicht mehr direkt von der Netzwerkschnittstelle erfassen, sudo
ist nicht erforderlich, um die Datei zu lesen.
Sie können auch jeden der besprochenen Filter verwenden, um den Inhalt aus der Datei zu filtern, genau wie Sie es mit Echtzeitdaten tun würden. Untersuchen Sie beispielsweise die Pakete in der Erfassungsdatei von der Quell-IP-Adresse 54.204.39.132
indem Sie diesen Befehl ausführen:
$ tcpdump -nn -r webserver.pcap src 54.204.39.132
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
Was kommt als nächstes?
Diese grundlegenden Funktionen von tcpdump helfen Ihnen beim Einstieg in dieses leistungsstarke und vielseitige Tool. Weitere Informationen finden Sie auf der tcpdump-Website und den Manpages.
The tcpdump command line interface provides great flexibility for capturing and analyzing network traffic. If you need a graphical tool to understand more complex flows, look at Wireshark.
One benefit of Wireshark is that it can read .pcap
files captured by tcpdump. You can use tcpdump to capture packets in a remote machine that does not have a GUI and analyze the result file with Wireshark, but that is a topic for another day.
This article was originally published in October 2018 and has been updated by Seth Kenlon.