tcpdump
je nástroj příkazového řádku, který můžete použít k zachycení a kontrole síťového provozu směřujícího do az vašeho systému. Je to nejběžněji používaný nástroj mezi správci sítě pro odstraňování problémů se sítí a testování zabezpečení.
Navzdory svému názvu s tcpdump
můžete také zachytit provoz bez protokolu TCP, jako je UDP, ARP nebo ICMP. Zachycené pakety lze zapsat do souboru nebo na standardní výstup. Jedna z nejvýkonnějších funkcí tcpdump
je jeho schopnost používat filtry a zachytit pouze data, která chcete analyzovat.
V tomto článku se budeme zabývat základy používání tcpdump
příkaz v Linuxu.
Instalace tcpdump
#
tcpdump
je standardně nainstalován na většině distribucí Linuxu a macOS. Chcete-li zkontrolovat, zda tcpdump
příkaz je k dispozici na vašem typu systému:
tcpdump --version
Výstup by měl vypadat nějak takto:
tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b 26 Feb 2019
Pokud tcpdump
není ve vašem systému přítomen, příkaz výše vypíše „tcpdump:příkaz nenalezen“. Můžete snadno nainstalovat tcpdump
pomocí správce balíčků vaší distribuce.
Instalace tcpdump
na Ubuntu a Debianu #
sudo apt update && sudo apt install tcpdump
Instalace tcpdump
na CentOS a Fedora #
sudo yum install tcpdump
Instalace tcpdump
na Arch Linuxu #
sudo pacman -S tcpdump
Zachycování paketů pomocí tcpdump
#
Obecná syntaxe pro tcpdump
příkaz je následující:
tcpdump [options] [expression]
- Příkaz
options
umožňují ovládat chování příkazu. - Filtr
expression
definuje, které pakety budou zachyceny.
Pouze root nebo uživatel s sudo
oprávnění lze spustit tcpdump
. Pokud se pokusíte spustit příkaz jako neprivilegovaný uživatel, zobrazí se chyba:„Na tomto zařízení nemáte oprávnění k zachycení“.
Nejjednodušší případ použití je vyvolat tcpdump
bez jakýchkoli možností a filtrů:
sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
... Long output suppressed
23116 packets captured
23300 packets received by filter
184 packets dropped by kernel
tcpdump
bude pokračovat v zachycování paketů a zápisu na standardní výstup, dokud neobdrží signál přerušení. Použijte Ctrl+C
kombinace kláves pro odeslání signálu přerušení a zastavení příkazu.
Pro podrobnější výstup předejte -v
volba nebo -vv
pro ještě podrobnější výstup:
sudo tcpdump -vv
Počet paketů, které mají být zachyceny, můžete zadat pomocí -c
volba. Chcete-li například zachytit pouze deset paketů, zadejte:
sudo tcpdump -c 10
Po zachycení paketů tcpdump
zastaví.
Pokud není zadáno žádné rozhraní, tcpdump
používá první rozhraní, které najde, a vypíše všechny pakety procházející tímto rozhraním.
Použijte -D
možnost vytisknout seznam všech dostupných síťových rozhraní, ze kterých může tcpdump sbírat pakety:
sudo tcpdump -D
Pro každé rozhraní příkaz vytiskne název rozhraní, krátký popis a přidružený index (číslo):
1.ens3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
Výše uvedený výstup ukazuje, že ens3
je první rozhraní nalezené tcpdump
a používá se, když příkazu není poskytnuto žádné rozhraní. Druhé rozhraní any
je speciální zařízení, které vám umožní zachytit všechna aktivní rozhraní.
Chcete-li určit rozhraní, na kterém chcete zachytit provoz, vyvolejte příkaz s -i
možnost následovaná názvem rozhraní nebo přidruženým indexem. Chcete-li například zachytit všechny pakety ze všech rozhraní, zadejte any
rozhraní:
sudo tcpdump -i any
Ve výchozím nastavení tcpdump
provádí reverzní překlad DNS na IP adresách a převádí čísla portů na názvy. Použijte -n
možnost zakázat překlad:
sudo tcpdump -n
Přeskočením vyhledávání DNS se vyhnete generování provozu DNS a výstup bude čitelnější. Doporučuje se použít tuto volbu při každém vyvolání tcpdump
.
Místo zobrazení výstupu na obrazovce jej můžete přesměrovat do souboru pomocí operátorů přesměrování >
a >>
:
sudo tcpdump -n -i any > file.out
Data můžete také sledovat při ukládání do souboru pomocí tee
příkaz:
sudo tcpdump -n -l | tee file.out
-l
volba v příkazu výše říká tcpdump
aby byl výstupní řádek vyrovnávací paměti. Není-li tato možnost použita, výstup se při vygenerování nového řádku nezapíše na obrazovku.
Vysvětlení tcpdump
Výstup #
tcpdump
vypíše informace pro každý zachycený paket na novém řádku. Každý řádek obsahuje časové razítko a informace o tomto paketu v závislosti na protokolu.
Typický formát linky protokolu TCP je následující:
[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]
Pojďme pole po poli a vysvětleme následující řádek:
15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
-
15:47:24.248737
– Časové razítko zachyceného paketu je v místním čase a používá následující formát:hours:minutes:seconds.frac
, kdefrac
je zlomek sekundy od půlnoci. -
IP
- Paketový protokol. V tomto případě IP znamená internetový protokol verze 4 (IPv4). -
192.168.1.185.22
– Zdrojová IP adresa a port oddělené tečkou (.
). -
192.168.1.150.37445
– Cílová IP adresa a port oddělené tečkou (.
). -
Flags [P.]
- Pole TCP Flags. V tomto příkladu[P.]
znamená Push Acknowledgment paket, který se používá k potvrzení předchozího paketu a odeslání dat. Další typické hodnoty pole příznaku jsou následující:- [.] - ACK (Potvrzení)
- [S] – SYN (Zahájit připojení)
- [P] – PSH (Push Data)
- [F] – FIN (Dokončit připojení)
- [R] – RST (Resetovat připojení)
- [S.] – SYN-ACK (paket SynAcK)
-
seq 201747193:201747301
- Pořadové číslo je vfirst:last
notový zápis. Ukazuje počet dat obsažených v paketu. Kromě prvního paketu v datovém toku, kde jsou tato čísla absolutní, všechny následující pakety používají jako relativní pozice bajtů. V tomto příkladu je číslo201747193:201747301
, což znamená, že tento paket obsahuje bajty 201747193 až 201747301 datového toku. Použijte-S
možnost tisku absolutních pořadových čísel. -
ack 1226568763
Číslo potvrzení je pořadové číslo dalších dat očekávaných na druhém konci tohoto připojení. -
win 402
- Číslo okna je počet dostupných bajtů v přijímací vyrovnávací paměti. -
options [nop,nop,TS val 1051794587 ecr 2679218230]
- Možnosti TCP.nop
, nebo „žádná operace“ je výplň používaná k tomu, aby hlavička TCP byla násobkem 4 bajtů.TS val
je časové razítko TCP aecr
znamená echo odpověď. Další informace o možnostech TCP naleznete v dokumentaci IANA. -
length 108
- Délka dat užitečného zatížení
tcpdump
Filtry #
Když tcpdump
je vyvolán bez filtrů, zachycuje veškerý provoz a vytváří obrovské množství výstupu, což velmi ztěžuje nalezení a analýzu zájmových paketů.
Filtry jsou jednou z nejvýkonnějších funkcí tcpdump
příkaz. Protože vám umožňují zachytit pouze ty pakety, které odpovídají výrazu. Například při odstraňování problémů souvisejících s webovým serverem můžete použít filtry k získání pouze HTTP provozu.
tcpdump
používá syntaxi Berkeley Packet Filter (BPF) k filtrování zachycených paketů pomocí různých parametrů obrábění, jako jsou protokoly, zdrojové a cílové IP adresy a porty atd.
V tomto článku se podíváme na některé z nejběžnějších filtrů. Seznam všech dostupných filtrů naleznete na stránce pcap-filtermanpage.
Filtrování podle protokolu č.
Chcete-li omezit sběr na konkrétní protokol, zadejte protokol jako filtr. Chcete-li například zachytit pouze provoz UDP, spustili byste:
sudo tcpdump -n udp
Dalším způsobem, jak definovat protokol, je použít proto
kvalifikátor následovaný číslem protokolu. Následující příkaz vyfiltruje protokol číslo 17 a vytvoří stejný výsledek jako výše:
sudo tcpdump -n proto 17
Další informace o číslech naleznete v seznamu čísel protokolu IP.
Filtrování podle hostitele #
Chcete-li zachytit pouze pakety související s konkrétním hostitelem, použijte host
kvalifikátor:
sudo tcpdump -n host 192.168.1.185
Hostitel může být IP adresa nebo jméno.
Můžete také filtrovat výstup na daný rozsah IP pomocí net
kvalifikátor. Chcete-li například vypsat pouze pakety související s 10.10.0.0/16
byste použili:
sudo tcpdump -n net 10.10
Filtrování podle portu #
Chcete-li omezit zachycování pouze na pakety z nebo na konkrétní port, použijte port
kvalifikátor. Níže uvedený příkaz zachycuje pakety související se službou SSH (port 22) pomocí tohoto příkazu:
sudo tcpdump -n port 23
portrange
kvalifikátor umožňuje zachytit provoz v řadě portů:
sudo tcpdump -n portrange 110-150
Filtrování podle zdroje a cíle #
Pakety můžete také filtrovat na základě zdrojového nebo cílového portu nebo hostitele pomocí src
, dst
, src and dst
a src or dst
kvalifikátory.
Následující příkaz zachycuje přicházející pakety od hostitele s IP 192.168.1.185:
sudo tcpdump -n src host 192.168.1.185
Chcete-li najít provoz přicházející z jakéhokoli zdroje na port 80, použijte:
sudo tcpdump -n dst port 80
Komplexní filtry #
Filtry lze kombinovat pomocí and
(&&
), or
(||
) a nop
(!
) operátory.
Například pro zachycení veškerého HTTP provozu přicházejícího ze zdrojové IP adresy 192.168.1.185 byste použili tento příkaz:
sudo tcpdump -n src 192.168.1.185 and tcp port 80
K seskupování a vytváření složitějších filtrů můžete také použít závorky:
sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'
Chcete-li se vyhnout chybám analýzy při použití speciálních znaků, uzavřete filtry do jednoduchých uvozovek.
Zde je další příklad příkazu pro zachycení veškerého provozu kromě SSH ze zdrojové IP adresy 192.168.1.185:
sudo tcpdump -n src 192.168.1.185 and not dst port 22
Kontrola paketů #
Ve výchozím nastavení tcpdump
, zachycuje pouze hlavičky paketů. Někdy však může být nutné zkontrolovat obsah paketů.
tcpdump
umožňuje tisknout obsah paketů v ASCII a HEX.
-A
volba říká tcpdump
vytisknout každý paket v ASCII a -x
v HEX:
sudo tcpdump -n -A
Chcete-li zobrazit obsah paketu v HEX i ASCII, použijte -X
možnost:
sudo tcpdump -n -X
Čtení a zápis snímků do souboru #
Další užitečná funkce tcpdump
je zapsat pakety do souboru. To je užitečné, když zachycujete velké množství paketů nebo zachycujete pakety pro pozdější analýzu.
Chcete-li zahájit zápis do souboru, použijte -w
možnost následovaná výstupním zachyceným souborem:
sudo tcpdump -n -w data.pcap
Tento příkaz výše uloží zachycení do souboru s názvem data.pcap
. Soubor můžete pojmenovat, jak chcete, ale je běžnou konvencí používat .pcap
rozšíření (zachycení paketů).
Když -w
Pokud je použita volba, výstup se na obrazovce nezobrazí. tcpdump
zapisuje nezpracované pakety a vytváří binární soubor, který nelze přečíst běžným textovým editorem.
Chcete-li zkontrolovat obsah souboru, vyvolejte tcpdump
pomocí -r
možnost:
sudo tcpdump -r data.pcap
Pokud chcete spustit tcpdump
na pozadí přidejte symbol ampersand (&
) na konci příkazu.
Zachycený soubor lze také zkontrolovat pomocí jiných nástrojů pro analýzu paketů, jako je Wireshark.
Při zachycování paketů po dlouhou dobu můžete povolit rotaci souborů. tcpdump
umožňuje vytvářet nové soubory a otáčet soubor výpisu v zadaném časovém intervalu nebo pevné velikosti. Následující příkaz vytvoří až deset 200 MB souborů s názvem file.pcap0
, file.pcap1
a tak dále:před přepsáním starších souborů.
sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap
Po vygenerování deseti souborů budou starší soubory přepsány.
Pamatujte, že byste měli spouštět pouze tcpdump
pouze při odstraňování problémů.
Pokud chcete spustit tcpdump
v určitý čas můžete použít cronjob. tcpdump
nemá možnost po určité době odejít. Můžete použít timeout
příkaz k zastavení tcpdump
po určité době. Například pro ukončení po 5 minutách byste použili:
sudo timeout 300 tcpdump -n -w data.pcap
Závěr č.
tcpdump
je nástroj příkazového řádku pro analýzu a řešení problémů souvisejících se sítí.
Tento článek vás seznámil se základy tcpdump
použití a syntaxe. Pro podrobnější dokumentaci navštivte webovou stránku tcpdump.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.