Hvordan fange opp og analysere nettverkstrafikk med tcpdump?

tcpdump er et fantastisk kommandolinjeverktøy for nettverkssniffing. Det er en industristandard for å fange og analysere TCP/IP-pakker.

tcpdump-verktøyet kan være til stor hjelp når du skal løse nettverksproblemer. Pakkene kan lagres i en fil og senere analyseres. Det er en god idé å kjøre dette verktøyet av og til for å holde øye med nettverket ditt.

Hvordan ser tcpdump-utgangen ut?

tcpdump lar deg undersøke overskriftene til TCP/IP-pakkene. Den skriver ut en linje for hver pakke, og kommandoen fortsetter å kjøre til du trykker Ctrl+C for å avslutte.

La oss undersøke en linje fra et eksempelutgang:

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 inkluderer

  • Unix-tidsstempel (20:58:26.765637)
  • protokoll (IP)
  • kildevertsnavnet eller IP-en, og portnummeret (10.0.0.50.80)
  • destinasjonsvertsnavn eller IP, og portnummer (10.0.0.1.53181)
  • TCP-flagg (flagg [F.]). Flagg indikerer tilstanden til forbindelsen. Dette kan inkludere mer enn én verdi, som i dette eksemplet [F.] for FIN-ACK. Dette feltet kan ha følgende verdier:
    • S – SYN. Det første trinnet i å etablere forbindelsen.
    • F – FIN. Tilkoblingsavslutning.
    • . – ACK. Bekreftelsespakke mottatt.
    • P – SKYV. Ber mottakeren om å behandle pakker i stedet for å bufre dem.
    • R – RST. Kommunikasjonen stoppet.
  • Sekvensnummeret til dataene i pakken. (seq 1)
  • Bekreftelsesnummer (akk 2)
  • Vindusstørrelse (vinn 453). Antall byte tilgjengelig i mottaksbufferen. Dette etterfølges av TCP-alternativer.
  • Lengden på datanyttelasten. (lengde 0)

Installasjon

På Debian-baserte distribusjoner kan tcpdump installeres med APT-kommandoen:

# apt install tcpdump -y

På RPM-baserte distribusjoner kan tcpdump installeres med YUM:

# yum install tcpdump -y

Eller bruk DNF hvis RHEL 8

# dnf install tcpdump -y

tcpdump kommandoalternativer

Du må være root for å kjøre tcpdump. Den inkluderer mange alternativer og filtre. Å kjøre tcpdump uten noen alternativer vil fange opp alle pakker som strømmer gjennom standardgrensesnittet.

For å se listen over nettverksgrensesnitt tilgjengelig på systemet og som tcpdump kan fange opp 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 spesielt nyttig på systemer som ikke har en kommando for å liste grensesnitt.

For å fange opp pakker som flyter gjennom et spesifikt grensesnitt, bruk -i-flagget med grensesnittnavnet. Uten -i-grensesnittet vil tcpdump plukke opp det første nettverksgrensesnittet det kommer over.

# 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-flagget øker informasjonen du ser om pakkene, -vv gir deg enda flere detaljer.

  Slik presenterer du på Google Meet

Som standard løser tcpdump IP-adresser til vertsnavn og bruker også tjenestenavn i stedet for portnumre. Hvis DNS er ødelagt eller du ikke vil at tcpdump skal utføre navneoppslag, bruk -n-alternativet.

# 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 å fange bare et sett med linjer, si 5, bruk -c-flagget:

#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-utdata bruker Unix-tidsstempler. Slik fanger du pakker med menneskelig lesbart tidsstempel:

# 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 filteruttrykk

Filteruttrykk velger hvilke pakkehoder som skal vises. Hvis ingen filtre brukes, vises alle pakkeoverskrifter. Vanlige brukte filtre er port, host, src, dst, tcp, udp, icmp.

  Slik laster du ned apper som ikke lenger er i telefonens App Store

portfilter

Bruk portfilter for å se pakker som kommer 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

vertsfilter

For å fange opp alle pakker som ankommer eller går fra verten 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 å fange opp pakker av en bestemt protokolltype, for eksempel icmp, på eth1-grensesnittet:

# 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

Kombinere filteruttrykk

Du kan kombinere disse filteruttrykkene med AND-, OR- og NOT-operatorer. Dette vil gjøre deg i stand til å skrive kommandoer som kan isolere pakker mer presist:

Pakker fra en spesifikk IP og destinert for en spesifikk 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 å fange opp alle pakker unntatt ICMP, bruk NOT-operatoren:

# tcpdump -i eth1 not icmp

Lagre pakkehoder til en fil

Siden utdataene til tcpdump kan rulle forbi skjermen ganske raskt, kan du lagre pakkehoder til en fil med flagget -w. Filene for å lagre utdataene bruker pcap-format og har en forlengelse på .pcap.

  11 beste tekst til tale-løsninger for forretnings- og personlig bruk

PCAP står for pakkefangst. Følgende kommando lagrer 10 linjer med utdata på eth1-grensesnittet 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 lese denne filen med -r flagg:

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

Så langt har vi bare sett pakkehodene, for å se pakkeinnhold bruk -A-alternativet. Dette skriver ut pakkeinnholdet i ASCII, som kan være til hjelp ved nettverksfeilsøking. Også -X-flagg kan brukes til å vise utdata i hex-format. Dette er kanskje ikke til mye hjelp hvis tilkoblingen er kryptert.

# 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

Konklusjon

tcpdump er enkel å sette opp, og når du først forstår utdataene, de forskjellige flaggene og filtrene, kan den brukes til å løse nettverksproblemer og sikre nettverket ditt.