Hvordan fanger og analyserer man netværkstrafik med tcpdump?

tcpdump er et fantastisk kommandolinjeværktøj til netværkssniffing. Det er en industristandard til at fange og analysere TCP/IP-pakker.

tcpdump-værktøjet kan være til stor hjælp, når du skal løse netværksproblemer. Pakkerne kan gemmes i en fil og senere analyseres. Det er en god idé at køre dette værktøj af og til for at holde øje med dit netværk.

Hvordan ser tcpdump-outputtet ud?

tcpdump giver dig mulighed for at undersøge headerne på TCP/IP-pakkerne. Den udskriver en linje for hver pakke, og kommandoen fortsætter med at køre, indtil du trykker på Ctrl+C for at afslutte.

Lad os undersøge en linje fra et eksempel output:

20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0

Hver linje indeholder

  • Unix-tidsstempel (20:58:26.765637)
  • protokol (IP)
  • kildeværtsnavnet eller IP-adressen og portnummeret (10.0.0.50.80)
  • destinationsværtsnavn eller IP og portnummer (10.0.0.1.53181)
  • TCP-flag (flag [F.]). Flag angiver forbindelsens tilstand. Dette kan omfatte mere end én værdi, som i dette eksempel [F.] til FIN-ACK. Dette felt kan have følgende værdier:
    • S – SYN. Det første trin i etableringen af ​​forbindelsen.
    • F – FIN. Afslutning af forbindelse.
    • . – ACK. Kvitteringspakke modtaget.
    • P – SKUB. Beder modtageren om at behandle pakker i stedet for at buffere dem.
    • R – RST. Kommunikationen stoppede.
  • Sekvensnummeret for dataene i pakken. (sek. 1)
  • Kvitteringsnummer (ack 2)
  • Vinduesstørrelse (vind 453). Antallet af tilgængelige bytes i den modtagende buffer. Dette efterfølges af TCP-indstillinger.
  • Længden af ​​datanyttelasten. (længde 0)

Installation

På Debian-baserede distributioner kan tcpdump installeres med APT-kommandoen:

# apt install tcpdump -y

På RPM-baserede distributioner kan tcpdump installeres med YUM:

# yum install tcpdump -y

Eller brug DNF hvis RHEL 8

# dnf install tcpdump -y

tcpdump kommando muligheder

Du skal være root for at køre tcpdump. Den indeholder mange muligheder og filtre. At køre tcpdump uden nogen muligheder vil fange alle pakker, der flyder gennem standardgrænsefladen.

For at se listen over tilgængelige netværksgrænseflader på systemet, og som tcpdump kan fange pakker på.

# tcpdump -D

Eller

# Tcpdump --list-interfaces
1.eth0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.eth1
5.any (Pseudo-device that captures on all interfaces)
6.lo [Loopback]

Dette er især nyttigt på systemer, der ikke har en kommando til at vise grænseflader.

  Sådan finder du ud af, om nogen har en Tinder-profil

For at fange pakker, der flyder gennem en specifik grænseflade, skal du bruge flaget -i med grænsefladenavnet. Uden -i-grænsefladen vil tcpdump opfange den første netværksgrænseflade, den støder på.

# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
01:06:09.278817 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 1, length 64
01:06:09.279374 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 4761, seq 1, length 64
01:06:10.281142 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 2, length 64

-v-flaget øger den information, du ser om pakkerne, -vv giver dig endnu flere detaljer.

Som standard løser tcpdump IP-adresser til værtsnavne og bruger også tjenestenavne i stedet for portnumre. Hvis DNS er brudt, eller du ikke ønsker, at tcpdump skal udføre navneopslag, skal du bruge -n muligheden.

# tcpdump -n
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100

For kun at fange et sæt linjer, f.eks. 5, skal du bruge flaget -c:

#tcpdump -c 5
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100
5 packets captured

Standard tcpdump output bruger Unix tidsstempler. Sådan fanger du pakker med tidsstempel, der kan læses af mennesker:

# tcpdump -tttt
2020-07-06 04:30:12.203638 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186734102:2186734138, ack 204107103, win 37232, length 36
2020-07-06 04:30:12.203910 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
2020-07-06 04:30:12.204292 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 36:72, ack 1, win 37232, length 36
2020-07-06 04:30:12.204524 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0
2020-07-06 04:30:12.204658 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 72:108, ack 1, win 37232, length 36

tcpdump filterudtryk

Filterudtryk vælger, hvilke pakkeoverskrifter der skal vises. Hvis der ikke anvendes nogen filtre, vises alle pakkeoverskrifter. Ofte brugte filtre er port, host, src, dst, tcp, udp, icmp.

  Sådan fjerner du dit nummer fra Truecaller

port filter

Brug portfilter til at se pakker, der ankommer til en bestemt port:

# Tcpdump -i eth1 -c 5 port 80
23:54:24.978612 IP 10.0.0.1.53971 > 10.0.0.50.80: Flags [SEW], seq 53967733, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978650 IP 10.0.0.50.80 > 10.0.0.1.53971: Flags [S.E], seq 996967790, ack 53967734, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0
23:54:24.978699 IP 10.0.0.1.53972 > 10.0.0.50.80: Flags [SEW], seq 226341105, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978711 IP 10.0.0.50.80 > 10.0.0.1.53972: Flags [S.E], seq 1363851389, ack 226341106, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0

værtsfilter

For at fange alle pakker, der ankommer til eller forlader værten med IP-adressen 10.0.2.15:

# tcpdump host 10.0.2.15
03:48:06.087509 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 3862934963:3862934999, ack 65355639, win 37232, length 36
03:48:06.087806 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
03:48:06.088087 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 36:72, ack 1, win 37232, length 36
03:48:06.088274 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0
03:48:06.088440 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 72:108, ack 1, win 37232, length 36

For at fange pakker af en bestemt protokoltype, for eksempel icmp, på eth1-grænsefladen:

# tcpdump -i eth1 icmp
04:03:47.408545 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 75, length 64
04:03:47.408999 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 75, length 64
04:03:48.408697 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 76, length 64
04:03:48.409208 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 76, length 64
04:03:49.411287 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 77, length 64

Kombination af filterudtryk

Du kan kombinere disse filterudtryk med AND-, OR- og NOT-operatorer. Dette vil give dig mulighed for at skrive kommandoer, der kan isolere pakker mere præcist:

Pakker fra en specifik IP og bestemt til en specifik port:

# tcpdump -n -i eth1 src 10.0.0.1 and dst port 80
00:18:17.155066 IP 10.0.0.1.54222 > 10.0.0.50.80: Flags [F.], seq 500773341, ack 2116767648, win 4117, options [nop,nop,TS val 257786173 ecr 5979014], length 0
00:18:17.155104 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [S], seq 904045691, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 257786173 ecr 0,sackOK,eol], length 0
00:18:17.157337 IP 10.0.0.1.54221 > 10.0.0.50.80: Flags [P.], seq 4282813257:4282813756, ack 1348066220, win 4111, options [nop,nop,TS val 257786174 ecr 5979015], length 499: HTTP: GET / HTTP/1.1
00:18:17.157366 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [.], ack 1306947508, win 4117, options [nop,nop,TS val 257786174 ecr 5983566], length 0

For at fange alle pakker undtagen ICMP, skal du bruge NOT-operatoren:

# tcpdump -i eth1 not icmp

Gemmer pakkeoverskrifter til en fil

Da outputtet af tcpdump kan rulle forbi skærmen ret hurtigt, kan du gemme pakkeoverskrifter til en fil med flaget -w. Filerne til at gemme output bruger pcap-format og har en udvidelse af .pcap.

  Stryg til venstre, højre eller fra bunden for at få adgang til apps og kontakter Snype

PCAP står for packet capture. Følgende kommando gemmer 10 linjers output på eth1-grænsefladen til icmp.pcap.

# tcpdump -i eth1 -c 10 -w icmp.pcap
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Du kan læse denne fil med -r flag:

tcpdump -r icmp.pcap
reading from file icmp.pcap, link-type EN10MB (Ethernet)
05:33:20.852732 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 33, length 64
05:33:20.853245 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 33, length 64
05:33:21.852586 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 34, length 64
05:33:21.853104 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 34, length 64
05:33:22.852615 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 35, length 64

Viser pakkedetaljer

Indtil videre har vi kun set pakkehovederne, for at se pakkeindhold skal du bruge -A option. Dette udskriver pakkeindholdet i ASCII, hvilket kan være en hjælp til netværksfejlfinding. Også -X flag kan bruges til at vise output i hex-format. Dette er måske ikke til meget hjælp, hvis forbindelsen er krypteret.

# tcpdump -c10 -i eth1 -n -A port 80
23:35:53.109306 IP 10.0.0.1.53916 > 10.0.0.50.80: Flags [P.], seq 2366590408:2366590907, ack 175457677, win 4111, options [nop,nop,TS val 255253117 ecr 5344866], length 499: HTTP: GET / HTTP/1.1
E..'[email protected]@.%.
...
..2...P..M.
uE............
.6.}.Q.bGET / HTTP/1.1
Host: 10.0.0.50
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
If-Modified-Since: Tue, 04 Mar 2014 11:46:45 GMT

Konklusion

tcpdump er let at sætte op, og når du først forstår outputtet, de forskellige flag og filtre, kan det bruges til at løse netværksproblemer og sikre dit netværk.