Hoe netwerkverkeer vastleggen en analyseren met tcpdump?

tcpdump is een geweldige opdrachtregeltool voor netwerksnuffelen. Het is een industriestandaard voor het vastleggen en analyseren van TCP/IP-pakketten.

De tcpdump-tool kan een grote hulp zijn bij het oplossen van netwerkproblemen. De pakketten kunnen in een bestand worden opgeslagen en later worden geanalyseerd. Het is een goed idee om deze tool af en toe uit te voeren om uw netwerk in de gaten te houden.

Hoe ziet de tcpdump-uitvoer eruit?

tcpdump stelt u in staat de headers van de TCP/IP-pakketten te onderzoeken. Het drukt één regel af voor elk pakket en de opdracht blijft actief totdat u op Ctrl+C drukt om te beëindigen.

Laten we één regel uit een voorbeelduitvoer bekijken:

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

Elke regel bevat

  • Unix-tijdstempel (20:58:26.765637)
  • Protocol (IP)
  • de bronhostnaam of IP en poortnummer (10.0.0.50.80)
  • bestemming hostnaam of IP, en poortnummer (10.0.0.1.53181)
  • TCP-vlaggen (Flags [F.]). Vlaggen geven de status van de verbinding aan. Dit kan meer dan één waarde bevatten, zoals in dit voorbeeld [F.] voor FIN-ACK. Dit veld kan de volgende waarden hebben:
    • S – SYN. De eerste stap bij het tot stand brengen van de verbinding.
    • F – FIN. Beëindiging van de verbinding.
    • . – AK. Bevestigingspakket succesvol ontvangen.
    • P – DUWEN. Vertelt de ontvanger om pakketten te verwerken in plaats van ze te bufferen.
    • R – RST. Communicatie gestopt.
  • Volgnummer van de gegevens in het pakket. (vervolg 1)
  • Bevestigingsnummer (ack 2)
  • Venstergrootte (win 453). Het aantal beschikbare bytes in de ontvangende buffer. Dit wordt gevolgd door TCP-opties.
  • Lengte van de datalading. (lengte 0)

Installatie

Op op Debian gebaseerde distributies kan tcpdump worden geïnstalleerd met het APT-commando:

# apt install tcpdump -y

Op RPM-gebaseerde distributies kan tcpdump worden geïnstalleerd met YUM:

# yum install tcpdump -y

Of gebruik DNF als RHEL 8

# dnf install tcpdump -y

tcpdump-opdrachtopties

Je moet root zijn om tcpdump uit te voeren. Het bevat veel opties en filters. Als u tcpdump uitvoert zonder opties, worden alle pakketten vastgelegd die door de standaardinterface stromen.

Om de lijst met netwerkinterfaces te zien die beschikbaar zijn op het systeem en waarop tcpdump pakketten kan vastleggen.

# tcpdump -D

Of

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

Dit is vooral handig op systemen die geen opdracht hebben om interfaces weer te geven.

  Hoe gefilterde gegevens in Excel automatisch te vernieuwen wanneer deze worden bijgewerkt

Gebruik de vlag -i met de interfacenaam om pakketten vast te leggen die door een specifieke interface stromen. Zonder de -i interface zal tcpdump de eerste netwerkinterface oppikken die het tegenkomt.

# 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

De vlag -v vergroot de informatie die u ziet over de pakketten, -vv geeft u nog meer details.

Standaard zet tcpdump IP-adressen om in hostnamen en gebruikt het ook servicenamen in plaats van poortnummers. Als de DNS is verbroken of als u niet wilt dat tcpdump de naam opzoekt, gebruikt u de optie -n.

# 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

Gebruik de vlag -c om alleen een reeks regels vast te leggen, bijvoorbeeld 5:

#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

De standaard tcpdump-uitvoer gebruikt Unix-tijdstempels. Om pakketten vast te leggen met een voor mensen leesbare tijdstempel:

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

Filterexpressies selecteren welke pakketkoppen worden weergegeven. Als er geen filters worden toegepast, worden alle pakketkoppen weergegeven. Veelgebruikte filters zijn port, host, src, dst, tcp, udp, icmp.

  Hoe u de fout kunt oplossen "Uw in-browseropslag voor MEGA is vol"

poortfilter

Gebruik poortfilter om pakketten te bekijken die aankomen op een specifieke poort:

# 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

host-filter

Om alle pakketten vast te leggen die aankomen op of vertrekken van de host met IP-adres 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

Om pakketten van een specifiek protocoltype vast te leggen, bijvoorbeeld icmp, op de eth1-interface:

# 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

Filterexpressies combineren

U kunt deze filterexpressies combineren met AND-, OR- en NOT-operatoren. Dit stelt u in staat om commando’s te schrijven die pakketten nauwkeuriger kunnen isoleren:

Pakketten van een specifiek IP en bestemd voor een specifieke poort:

# 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

Gebruik de NOT-operator om alle pakketten behalve ICMP vast te leggen:

# tcpdump -i eth1 not icmp

Pakketkoppen opslaan in een bestand

Aangezien de uitvoer van tcpdump vrij snel langs het scherm kan scrollen, kunt u pakketkoppen opslaan in een bestand met de vlag -w. De bestanden om de uitvoer op te slaan gebruiken het pcap-formaat en hebben de extensie .pcap.

  Optimalisatie van SQL-query's is eenvoudig met deze 7 tools voor DBA en ontwikkelaars

PCAP staat voor pakketopname. De volgende opdracht slaat 10 regels uitvoer op de eth1-interface op in 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

Je kunt dit bestand lezen met -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

Pakketdetails bekijken

Tot nu toe hebben we alleen de pakketkoppen gezien, om de inhoud van pakketten te bekijken, gebruikt u de optie -A. Hiermee wordt de inhoud van het pakket afgedrukt in ASCII, wat kan helpen bij het oplossen van netwerkproblemen. Ook kan de vlag -X worden gebruikt om uitvoer in hex-formaat weer te geven. Dit helpt misschien niet veel als de verbinding versleuteld is.

# 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

Conclusie

tcpdump is eenvoudig in te stellen en als u eenmaal de uitvoer, de verschillende vlaggen en filters begrijpt, kan het worden gebruikt om netwerkproblemen op te lossen en uw netwerk te beveiligen.

gerelateerde berichten