Како ухватити и анализирати мрежни саобраћај помоћу тцпдумп-а?

tcpdump je izvanredan alat komandne linije namenjen za analizu mrežnog saobraćaja. Predstavlja industrijski standard za hvatanje i ispitivanje TCP/IP paketa.

Ovaj alat može biti od velike pomoći u dijagnostici problema sa umrežavanjem. Uhvaćeni paketi se mogu sačuvati u datoteku za kasniju detaljnu analizu. Preporučljivo je povremeno pokretati tcpdump kako biste pratili aktivnost na vašoj mreži.

Kako izgleda izlaz tcpdump-a?

tcpdump omogućava vam da detaljno pregledate zaglavlja TCP/IP paketa. Ispisuje jednu liniju za svaki paket koji uhvati i nastavlja sa radom sve dok ga ručno ne zaustavite pritiskom na Ctrl+C.

Pogledajmo sada jedan primer linije iz izlaza:

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

Svaka linija izlaza sadrži sledeće informacije:

  • Vremenska oznaka u Unix formatu (20:58:26.765637)
  • Protokol (IP)
  • Izvorna IP adresa ili ime hosta i broj porta (10.0.0.50.80)
  • Odredišna IP adresa ili ime hosta i broj porta (10.0.0.1.53181)
  • TCP zastavice (Flags [F.]). Zastavice pokazuju trenutno stanje veze. Mogu sadržati više od jedne vrednosti, kao u ovom slučaju [F.] za FIN-ACK. Ovo polje može imati sledeće vrednosti:
    • S – SYN. Prvi korak u uspostavljanju veze.
    • F – FIN. Prekidanje veze.
    • . – ACK. Paket potvrde je uspešno primljen.
    • P – PUSH. Govori primaocu da obradi pakete odmah umesto da ih privremeno skladišti.
    • R – RST. Komunikacija je prekinuta.
  • Redni broj podataka u paketu (seq 1)
  • Broj potvrde (ack 2)
  • Veličina prozora (win 453). Broj bajtova dostupnih u prijemnom baferu. Nakon toga slede TCP opcije.
  • Dužina korisnog sadržaja podataka (length 0).

Instalacija

Na Debian distribucijama, tcpdump se instalira pomoću APT komande:

# apt install tcpdump -y

Na RPM distribucijama, tcpdump se instalira sa YUM-om:

# yum install tcpdump -y

Ili koristite DNF ako je RHEL 8

# dnf install tcpdump -y

Opcije komande tcpdump

Za pokretanje tcpdump-a neophodne su administratorske privilegije (root). Alat poseduje brojne opcije i filtere. Ako se pokrene bez dodatnih opcija, tcpdump će snimati sve pakete koji prolaze kroz podrazumevani mrežni interfejs.

Za pregled liste dostupnih mrežnih interfejsa na sistemu preko kojih tcpdump može da hvata pakete, koristite sledeću komandu:

# tcpdump -D

ili

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

Ovo može biti posebno korisno na sistemima koji nemaju komandu za listanje interfejsa.

Za snimanje paketa koji prolaze kroz određeni interfejs, koristite oznaku -i zajedno sa imenom interfejsa. Bez -i specifikacije, tcpdump će automatski odabrati prvi mrežni interfejs na koji naiđe.

# 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

Oznaka -v povećava nivo detalja u prikazu paketa, dok -vv pruža još više informacija.

Po default-u, tcpdump pokušava da razreši IP adrese u imena hostova i koristi imena servisa umesto brojeva portova. Ukoliko DNS servis ne radi ili ne želite da tcpdump vrši traženje imena, možete koristiti opciju -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

Da biste ograničili broj linija koje će tcpdump ispisati, recimo 5, koristite oznaku -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

Standardni izlaz tcpdump-a koristi Unix vremenske oznake. Da biste dobili čitljiv format vremenske oznake, koristite oznaku -tttt:

# 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 filter izrazi

Filter izrazi služe za odabir paketa čija će zaglavlja biti prikazana. Ako se ne koriste filteri, prikazuju se zaglavlja svih paketa. Najčešće korišćeni filteri su: port, host, src, dst, tcp, udp, icmp.

Filter port

Filter port se koristi za prikazivanje paketa koji stižu na određeni 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

Filter host

Za prikaz svih paketa koji dolaze sa ili idu prema hostu sa IP adresom 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

Za prikaz paketa određenog tipa protokola, na primer ICMP, na eth1 interfejsu:

# 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

Kombinovanje filter izraza

Možete kombinovati ove filter izraze koristeći AND, OR i NOT operatore. To vam omogućava da kreirate komande koje preciznije izoluju željene pakete.

Paketi sa određene IP adrese koji su namenjeni određenom portu:

# 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

Da biste snimili sve pakete osim ICMP, koristite NOT operator:

# tcpdump -i eth1 not icmp

Čuvanje zaglavlja paketa u datoteku

Kako izlaz tcpdump-a može brzo da prolazi pored ekrana, možete sačuvati zaglavlja paketa u datoteku koristeći oznaku -w. Datoteke za čuvanje izlaza koriste pcap format i imaju ekstenziju .pcap.

PCAP je skraćenica za packet capture. Sledeća komanda čuva 10 linija izlaza sa eth1 interfejsa u datoteku 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

Ovu datoteku možete pročitati pomoću oznake -r:

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

Pregled detalja paketa

Do sada smo videli samo zaglavlja paketa. Za pregled sadržaja paketa koristite opciju -A. Ona štampa sadržaj paketa u ASCII formatu, što može biti od pomoći pri dijagnostici problema sa mrežom. Oznaka -X se može koristiti za prikaz izlaza u heksadecimalnom formatu. Ovo možda neće biti od velike pomoći ako je veza šifrovana.

# 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

Zaključak

tcpdump je jednostavan za konfigurisanje, a kada razumete izlaz, različite oznake i filtere, možete ga koristiti za rešavanje problema sa umrežavanjem i obezbeđivanje vaše mreže.