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

tcpdump je úžasný nástroj příkazového řádku pro síťové sniffing. Jedná se o průmyslový standard pro zachycování a analýzu paketů TCP/IP.

Nástroj tcpdump může být velkou pomocí při řešení problémů se sítí. Pakety lze uložit do souboru a později analyzovat. Je vhodné tento nástroj občas spustit, abyste mohli sledovat svou síť.

Jak vypadá výstup tcpdump?

tcpdump umožňuje prozkoumat hlavičky paketů TCP/IP. Pro každý paket vytiskne jeden řádek a příkaz běží, dokud nestisknete Ctrl+C pro ukončení.

Podívejme se na jeden řádek z příkladu výstupu:

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

  • Unix časové razítko (20:58:26.765637)
  • protokol (IP)
  • název hostitele nebo IP adresa zdroje a číslo portu (10.0.0.50.80)
  • název cílového hostitele nebo IP a číslo portu (10.0.0.1.53181)
  • TCP Flags (Vlajky [F.]). Příznaky označují stav připojení. To může zahrnovat více než jednu hodnotu, jako v tomto příkladu [F.] pro FIN-ACK. Toto pole může mít následující hodnoty:
    • S – SYN. První krok k navázání spojení.
    • F – FIN. Ukončení spojení.
    • . – ACK. Paket potvrzení byl úspěšně přijat.
    • P – PUSH. Říká přijímači, aby zpracovával pakety namísto jejich ukládání do vyrovnávací paměti.
    • R – RST. Komunikace se zastavila.
  • Pořadové číslo dat v paketu. (následující 1)
  • Číslo potvrzení (2. potvrzení)
  • Velikost okna (win 453). Počet bajtů dostupných v přijímací vyrovnávací paměti. Poté následují možnosti TCP.
  • Délka užitečného zatížení dat. (délka 0)

Instalace

Na distribucích založených na Debianu lze tcpdump nainstalovat pomocí příkazu APT:

# apt install tcpdump -y

Na distribucích založených na RPM lze tcpdump nainstalovat s YUM :

# yum install tcpdump -y

Nebo pomocí DNF, pokud RHEL 8

# dnf install tcpdump -y

možnosti příkazu tcpdump

Chcete-li spustit tcpdump, musíte být root. Obsahuje mnoho možností a filtrů. Spuštění tcpdump bez jakýchkoli voleb zachytí všechny pakety procházející výchozím rozhraním.

Chcete-li zobrazit seznam síťových rozhraní dostupných v systému a na kterých může tcpdump zachytávat pakety.

# tcpdump -D

Nebo

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

To je užitečné zejména na systémech, které nemají příkaz k výpisu rozhraní.

  Jak přimět okna, aby zvonilo každou hodinu

Chcete-li zachytit pakety procházející konkrétním rozhraním, použijte parametr -i s názvem rozhraní. Bez rozhraní -i tcpdump vybere první síťové rozhraní, na které narazí.

# 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

Parametr -v zvyšuje informace, které vidíte o paketech, -vv vám poskytuje ještě více podrobností.

Ve výchozím nastavení tcpdump překládá IP adresy na názvy hostitelů a místo čísel portů také používá názvy služeb. 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

Chcete-li zachytit pouze sadu řádků, řekněme 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

Výchozí výstup tcpdump používá časová razítka Unixu. Chcete-li zachytit pakety s člověkem čitelným časovým razítkem:

# 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

výrazy filtru tcpdump

Výrazy filtru vybírají, která záhlaví paketů se zobrazí. Pokud nejsou použity žádné filtry, zobrazí se záhlaví všech paketů. Běžně používané filtry jsou port, host, src, dst, tcp, udp, icmp.

  Jak zrušit událost Kalendáře Google

filtr portu

Použijte filtr portů k zobrazení paketů přicházejících 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

hostitelský filtr

Chcete-li zachytit všechny pakety přicházející nebo odcházející 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

Chcete-li zachytit pakety určitého typu 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í výrazů filtru

Tyto výrazy filtru můžete kombinovat s operátory AND, OR a NOT. To vám umožní psát příkazy, které mohou izolovat pakety přesněji:

Pakety z konkrétní IP 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

Chcete-li zachytit všechny pakety 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 tcpdump může procházet přes obrazovku poměrně rychle, můžete uložit hlavičky paketů do souboru s parametrem -w. Soubory k uložení výstupu používají formát pcap a mají příponu .pcap.

  7 nejlepších online kurzů pro analýzu sportovních dat

PCAP znamená zachycení paketů. Následující příkaz uloží 10 řádků výstupu na rozhraní eth1 do 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

Tento soubor můžete číst s příznakem -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í podrobností o paketu

Doposud jsme viděli pouze hlavičky paketů, pro zobrazení obsahu paketů použijte volbu -A. Tím se vytiskne obsah paketu v ASCII, což může pomoci při řešení problémů se sítí. Příznak -X lze také použít k zobrazení výstupu v hexadecimálním formátu. To nemusí moc pomoci, pokud je připojení šifrované.

# 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 se snadno nastavuje, a jakmile pochopíte výstup, různé příznaky a filtry, lze jej použít k řešení problémů se sítí a zabezpečení sítě.