Linux tcpdump Command Tutorial für Anfänger (8 Beispiele)

Jedes Mal, wenn Sie eine Webseite auf Ihrem Computer öffnen, werden Datenpakete über Ihre Netzwerkschnittstelle gesendet und empfangen. Manchmal wird die Analyse dieser Pakete aus vielen Gründen wichtig. Glücklicherweise bietet Linux ein Befehlszeilenprogramm, das Informationen über diese Datenpakete in die Ausgabe überträgt.

In diesem Artikel werden wir die Grundlagen des betreffenden Tools – tcpdump – besprechen. Aber bevor wir das tun, ist es erwähnenswert, dass alle Beispiele hier auf einer Ubuntu 18.04 LTS Maschine getestet wurden.

Linux tcpdump Befehl

Mit dem Befehl tcpdump unter Linux können Sie den Datenverkehr in einem Netzwerk verlagern. Nachfolgend ist die Syntax kurz gesagt:

tcpdump [OPTIONS]

Hier ist die detaillierte Syntax:

tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
               [ -c count ]
               [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
               [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
               [ --number ] [ -Q in|out|inout ]
               [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
               [ -W filecount ]
               [ -E spi@ipaddr algo:secret,...  ]
               [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
               [ --time-stamp-precision=tstamp_precision ]
               [ --immediate-mode ] [ --version ]
               [ expression ]

Und so erklärt es die Man Page des Tools:

Tcpdump prints out a description of the contents of packets on a network interface that match the 
boolean expression; the description is preceded by a time stamp, printed, by default, as hours, 
minutes, seconds, and fractions of a second  since  midnight.

It can  also  be  run with the -w flag, which causes it to save the packet data to a file for
later analysis, and/or with the -r flag, which causes it to read from a saved packet file rather
than to read packets from a network interface.  It can also be run with the -V  flag,  which causes
it to read a list of saved packet files.

In all cases, only packets that match expression will be processed by tcpdump.

Im Folgenden finden Sie einige Beispiele im Q&A-Stil, die Ihnen eine bessere Vorstellung davon vermitteln sollen, wie der Befehl tcpdump funktioniert.

Q1. Wie benutze ich tcpdump?

Bevor Sie tcpdump zum Schnüffeln von Datenpaketen verwenden, sollten Sie idealerweise wissen, an welcher Netzwerkschnittstelle das Tool arbeiten soll. Eine Liste der auf dem System verfügbaren Netzwerkschnittstellen erhalten Sie mit der Kommandozeilenoption -D mit tcpdump.

tcpdump -D

So erklärt die Man Page diese Option:

Print the list of the network interfaces available on the system and on which tcpdump can capture 
packets. For each network interface, a number and an interface name, possibly followed by a text 
description of the interface, is printed. The interface name or the number can be supplied to the 
-i flag to specify an interface on which to capture.

This can be useful on systems that don’t have a command to list them (e.g., Windows systems, or
UNIX systems lacking  ifconfig -a); the number can be useful on Windows 2000 and later systems,
where the interface name is a somewhat complex string.

The  -D  flag  will not be supported if tcpdump was built with an older version of libpcap that
lacks the pcap_findalldevs() function.

In meinem Fall zum Beispiel wurde die folgende Ausgabe erzeugt:

1.wlx18a6f713679b [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.enp3s0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)
9.usbmon3 (USB bus number 3)
10.usbmon4 (USB bus number 4)

Nun, da Sie eine Liste von Interfaces haben, können Sie eine auswählen und ihren Namen als Eingabe an die Kommandozeilenoption -i von tcpdump übergeben. Zum Beispiel:

tcpdump -i wlx18a6f713679b

Folgendes ist ein Teil der Ausgabe, die durch diesen Befehl in meinem Fall erzeugt wird:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
11:53:11.408964 IP 192.168.2.132.52898 > 239.255.255.250.3702: UDP, length 656
11:53:11.409492 IP himanshu.57383 > one.one.one.one.domain: 8572+ [1au] PTR? 250.255.255.239.in-addr.arpa. (57)
11:53:11.409588 IP 192.168.2.140.49690 > 239.255.255.250.1900: UDP, length 174
11:53:11.409954 IP 192.168.2.147.mdns > 224.0.0.251.mdns: 1 [2q] PTR (QU)? _%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. PTR (QU)? _googlecast._tcp.local. (94)
11:53:11.499220 IP one.one.one.one.domain > himanshu.57383: 8572 NXDomain 0/1/1 (114)
11:53:11.499950 IP himanshu.34201 > one.one.one.one.domain: 12068+ [1au] PTR? 132.2.168.192.in-addr.arpa. (55)
11:53:11.591291 IP one.one.one.one.domain > himanshu.34201: 12068 NXDomain* 0/1/2 (278)
11:53:11.592195 IP himanshu.55501 > one.one.one.one.domain: 31630+ [1au] PTR? 1.1.1.1.in-addr.arpa. (49)
11:53:11.842603 IP himanshu.57253 > one.one.one.one.domain: 16905+ [1au] PTR? 140.2.168.192.in-addr.arpa. (55)
11:53:11.951226 IP himanshu.52662 > one.one.one.one.domain: 52377+ [1au] PTR? 251.0.0.224.in-addr.arpa. (53)
11:53:12.428931 IP 192.168.2.140.49690 > 239.255.255.250.1900: UDP, length 174
11:53:12.437905 IP 192.168.2.147.mdns > 224.0.0.251.mdns: 2 [2q] PTR (QM)? _%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. PTR (QM)? _googlecast._tcp.local. (94)
11:53:12.438730 IP6 fe80::eccc:59f2:fc78:9e07.52899 > ff02::c.3702: UDP, length 656
11:53:12.439017 IP himanshu.33194 > one.one.one.one.domain: 15679+ [1au] PTR? c.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.f.f.ip6.arpa. (101)
11:53:12.572386 IP one.one.one.one.domain > himanshu.33194: 15679 NXDomain 0/1/1 (165)
11:53:12.642129 IP 192.168.2.11.mdns > 224.0.0.251.mdns: 0*- [0q] 1/0/3 PTR Google-Home-Mini-e3a3ae72a03e3d1c60d24653d4666ca6._googlecast._tcp.local. (356)
...
...

Q2. Wie kann man tcpdump nach dem Empfangen einer bestimmten Anzahl von Paketen verlassen?

Dies kann mit der Kommandozeilenoption -c erreicht werden. Wenn Sie beispielsweise möchten, dass tcpdump nur Informationen anzeigt, die sich auf 10 Pakete beziehen, können Sie dies auf folgende Weise tun:

tcpdump -c 10

In meinem Fall habe ich beispielsweise den folgenden Befehl ausgeführt:

tcpdump -c 10 -i wlx18a6f713679b

Es folgt die Ausgabe, die produziert wurde:

Wie man den tcpdump nach dem Empfangen einer bestimmten Anzahl von Paketen beendet.

So können Sie sehen, dass 10 Pakete erfasst wurden.

Q3. Wie kann man erreichen, dass tcpdump den Link-Level-Header in der Ausgabe anzeigt?

Dies kann mit der Kommandozeilenoption -e erfolgen. Zum Beispiel:

tcpdump -e -i wlx18a6f713679b

Und hier ist der Output:

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
12:14:07.951396 3c:a8:2a:a7:7b:c1 (oui Unknown) > Broadcast, ethertype IPv4 (0x0800), length 197: 192.168.2.55.17500 > 255.255.255.255.17500: UDP, length 155
12:14:07.952111 3c:a8:2a:a7:7b:c1 (oui Unknown) > Broadcast, ethertype IPv4 (0x0800), length 197: 192.168.2.55.17500 > 192.168.2.255.17500: UDP, length 155
...
...

So können Sie sehen, dass in der Ausgabe Link-Level-Header erzeugt wurden.

Q4. Wie kann man erreichen, dass tcpdump fremde IP-Adressen numerisch anzeigt?

Dies kann mit der Kommandozeilenoption -f erreicht werden.

tcpdump -f -i [INTERFACE]

Die Tatsache, dass tcpdump fremde IPv4-Adressen nicht symbolisch, sondern numerisch anzeigt, hat in bestimmten Situationen seine Vorteile. Ein solches Beispiel wird in der Man Page des Tools erwähnt:

this option is intended to get around serious brain damage in Sun's NIS server — usually it hangs 
forever translating non-local internet numbers

Q5. Wie lässt man tcpdump Paketnummern in der Ausgabe produzieren?

Um tcpdump dazu zu bringen, Paketnummern in der Ausgabe zu produzieren, verwenden Sie die Befehlszeilenoption –number.

Zum Beispiel habe ich den folgenden Befehl ausgeführt:

tcpdump --number -i wlx18a6f713679b

Und hier ist ein Teil der Produktion, die produziert wurde:

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
    1  12:38:35.522944 ARP, Request who-has 192.168.2.196 tell _gateway, length 46
    2  12:38:35.523265 IP6 fe80::8ab4:a6ff:fe9d:a6bb > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28
    3  12:38:35.523578 IP6 fe80::8ab4:a6ff:fe9d:a6bb > ip6-allrouters: ICMP6, router solicitation, length 16
    4  12:38:35.523861 ARP, Request who-has 192.168.2.15 tell 192.168.2.170, length 28
...
...
...

So können Sie sehen, dass jede Zeile nun mit einer Zahl beginnt.

Q6. Wie kann man den tcpdump-Druck verkürzen?

Dies kann mit der Kommandozeilenoption -q erfolgen. So erklärt es die Man Page des Tools:

Quick (quiet?) output.  Print less protocol information so output lines are shorter.

Nachfolgend ein Beispiel für diese Option:

Wie man den tcpdump-Druck kürzer macht

So können Sie sehen, dass diesmal weniger Informationen in der Ausgabe produziert wurden.

Q7. Wie kann man Zeitstempel-Informationen aus der tcpdump-Ausgabe auslassen?

Verwenden Sie dazu die Kommandozeilenoption -t. Hier ist ein Beispiel für einen Befehl:

tcpdump -t -i wlx18a6f713679b

Und nachfolgend ist sein Output:

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
IP himanshu.56992 > mails11.telegram.org.https: Flags [.], ack 3090054317, win 965, options [nop,nop,TS val 226976758 ecr 3781653930], length 0
IP himanshu.41122 > one.one.one.one.domain: 12755+ [1au] PTR? 22.171.154.149.in-addr.arpa. (56)
IP mails11.telegram.org.https > himanshu.56824: Flags [.], ack 273652159, win 1001, options [nop,nop,TS val 3781656472 ecr 226966324], length 0
ARP, Request who-has 192.168.2.48 tell _gateway, length 46
ARP, Request who-has 192.168.2.135 tell _gateway, length 46
...
...

So können Sie sehen, dass Zeitstempelinformationen (die sich normalerweise am Anfang jeder Zeile befinden) jetzt nicht mehr in der Ausgabe vorhanden sind.

Q8. Wie lässt man tcpdump detaillierte Ausgaben erzeugen?

Sie können in diesem Fall die Kommandozeilenoption -v verwenden. Im Folgenden wird in der Man Page des Tools diese Option erläutert:

tcpdump -v -i [INTERFACE]
When parsing and printing, produce (slightly more) verbose output. For example, the time to live,
identification, total length and options in an IP packet are printed. Also enables additional 
packet integrity checks such as verifying the IP and ICMP header checksum.

When writing to a file with the -w option, report, every 10 seconds, the number of packets captured

Fazit

Wir haben hier gerade die Oberfläche zerkratzt, da der Befehl tcpdump viele Befehlszeilenoptionen bietet. Sobald du damit fertig bist, diese zu üben, kannst du auf die Man Page des Tools gehen, um mehr darüber zu erfahren.

Das könnte dich auch interessieren …