2022-11-26 08:04 Doba čtení: 15 min

Jak zachytit a analyzovat síťový provoz pomocí tcpdump?

tcpdump je mimořádně užitečný nástroj pro analýzu síťového provozu, který se ovládá pomocí příkazové řádky. Je považován za standard v oblasti zachytávání a rozboru datových paketů protokolu TCP/IP.

Tento nástroj může být neocenitelným pomocníkem při odstraňování problémů v síťovém prostředí. Získaná data lze uložit do souboru pro pozdější detailní analýzu. Je doporučeno pravidelně používat tcpdump pro monitorování a sledování aktivity ve vaší síti.

Jak vypadá výstup z tcpdump?

tcpdump umožňuje detailně prozkoumat hlavičky paketů TCP/IP. Pro každý zachycený paket vypíše jeden řádek na standardní výstup a program běží, dokud ho uživatel neukončí stiskem kombinace kláves Ctrl+C.

Podívejme se na příklad jednoho takového řádku:

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

Každý řádek obsahuje následující informace:

  • Časové razítko události v Unixovém formátu (20:58:26.765637)
  • použitý protokol (IP)
  • zdrojová IP adresa nebo název hostitele a číslo portu (10.0.0.50.80)
  • cílová IP adresa nebo název hostitele a číslo portu (10.0.0.1.53181)
  • TCP příznaky (Flags [F.]). Příznaky indikují aktuální stav spojení. Může se jednat o kombinaci hodnot, jako je v tomto příkladu [F.] pro FIN-ACK. Toto pole může obsahovat tyto hodnoty:
    • S – SYN. Označuje počáteční krok pro navázání spojení.
    • F – FIN. Ukončení stávajícího spojení.
    • . – ACK. Potvrzení úspěšného přijetí paketu.
    • P – PUSH. Instrukce pro příjemce, aby okamžitě zpracoval pakety, namísto jejich ukládání do vyrovnávací paměti.
    • R – RST. Označuje, že komunikace byla náhle ukončena.
  • Pořadové číslo dat v paketu (1)
  • Potvrzovací číslo (2)
  • Velikost okna (win 453). Určuje, kolik bajtů je k dispozici v přijímací vyrovnávací paměti. Následují volitelné TCP možnosti.
  • Délka přenášených dat (length 0)

Instalace tcpdump

Na distribucích operačního systému Linux, které vycházejí z Debianu, lze tcpdump nainstalovat pomocí nástroje APT:

# apt install tcpdump -y

Na systémech, které používají správce balíčků RPM, je možné tcpdump instalovat prostřednictvím YUM:

# yum install tcpdump -y

Nebo pomocí DNF na systémech RHEL 8 a novějších:

# dnf install tcpdump -y

Možnosti příkazu tcpdump

Pro spuštění tcpdump je potřeba mít oprávnění uživatele root. Příkaz disponuje velkým množstvím voleb a filtrů. Pokud tcpdump spustíte bez jakýchkoliv parametrů, bude zachytávat veškerý provoz procházející výchozím síťovým rozhraním.

Chcete-li zobrazit seznam dostupných síťových rozhraní v systému, na kterých může tcpdump zachytávat pakety, použijte následující příkaz:

# tcpdump -D

Nebo alternativně:

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

Tato možnost je obzvláště užitečná v případech, kdy systém nemá standardní příkaz pro výpis síťových rozhraní.

Pro zachycení paketů procházejících konkrétním síťovým rozhraním použijte parametr `-i` následovaný názvem rozhraní. Pokud tento parametr neuvedete, tcpdump si automaticky vybere první nalezené síťové rozhraní.

# 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

Použitím parametru `-v` zvýšíte množství informací, které se o paketech zobrazují. Parametr `-vv` poskytne ještě podrobnější výstup.

Ve výchozím nastavení tcpdump převádí IP adresy na názvy hostitelů a také používá názvy služeb místo čísel portů. Pokud je DNS nefunkční, nebo nechcete, aby tcpdump prováděl vyhledávání jmen, použijte volbu `-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

Pro zachycení pouze určitého počtu řádků, například 5, použijte parametr `-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

Standardní výstup tcpdump používá časová razítka v Unixovém formátu. Pro zachycení paketů s časovým razítkem čitelným pro člověka použijte parametr `-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

Filtrační výrazy v tcpdump

Filtrační výrazy slouží k výběru, které hlavičky paketů se mají zobrazit. Bez použití filtrů se zobrazí hlavičky všech zachycených paketů. Nejčastěji používané filtry jsou: port, host, src, dst, tcp, udp, icmp.

Filtr portů

Filtr portů se používá pro zobrazení paketů, které směřují na konkrétní 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

Filtr hostitele

Pro zachycení všech paketů přicházejících na nebo odcházejících z hostitele s IP adresou 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

Pro zachycení paketů určitého protokolu, například ICMP, na rozhraní eth1:

# 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

Kombinování filtrovacích výrazů

Filtrovací výrazy je možné kombinovat pomocí operátorů AND, OR a NOT, což umožňuje vytvářet složitější filtry pro přesnější výběr požadovaných paketů.

Například, pakety z konkrétní IP adresy a určené pro konkrétní 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

Pro zachycení všech paketů kromě ICMP použijte operátor NOT:

# tcpdump -i eth1 not icmp

Ukládání hlaviček paketů do souboru

Vzhledem k tomu, že výstup z tcpdump může rychle procházet obrazovkou, lze hlavičky paketů uložit do souboru pomocí parametru `-w`. Soubory pro uložení výstupu používají formát pcap s příponou .pcap.

PCAP znamená Packet Capture. Následující příkaz uloží 10 řádků výstupu z rozhraní eth1 do souboru `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

Pro čtení tohoto souboru se používá parametr `-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

Zobrazení detailů paketů

Doposud jsme se zabývali pouze hlavičkami paketů. Pro zobrazení obsahu paketů použijte volbu `-A`. Tím se vypíše obsah paketu v ASCII formátu, což může být užitečné při řešení síťových problémů. Alternativně, parametr `-X` zobrazí výstup v hexadecimálním formátu. Je ovšem třeba počítat s tím, že v případě šifrovaného spojení vám tyto informace nemusejí být příliš užitečné.

# 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

Závěr

tcpdump je nástroj, který se snadno nastavuje a ovládá. Jakmile pochopíte jeho výstup, různé parametry a filtrovací možnosti, můžete ho efektivně používat k řešení problémů v síti a při zajišťování její bezpečnosti.

Tomáš Dvořák
Autor
Czechia

Píše o bezpečnosti, webu a chytrých službách s důrazem na srozumitelnost.

Předchozí článek
9 způsobů, jak opravit chybu 963 obchodu Google Play
Další článek
Oprava Kodi se nemůže připojit k síťovému serveru