tcpdump to klasyczny sniffer pakietów działający w terminalu. Podsłuchuje ruch na wybranym interfejsie sieciowym, rozkłada nagłówki na czynniki pierwsze i wypisuje je na ekran albo zapisuje do pliku. Używasz go, gdy chcesz zobaczyć, co realnie leci po kablu, a nie co wydaje ci się, że leci: sprawdzić czy pakiety w ogóle dochodzą, zdiagnozować niedziałające połączenie, złapać podejrzany ruch albo zrzucić sesję do pliku i obejrzeć ją później w Wiresharku. Filtry BPF pozwalają wyłuskać dokładnie to, co cię interesuje, zamiast tonąć w tysiącach linijek.
Składnia i najważniejsze opcje
Podstawowa forma to tcpdump [-i iface] [-n] [-c liczba] [-w plik] [wyrażenie]. Wyrażenie na końcu to filtr BPF, np. port 443 albo host 10.0.0.1.
-i— wybiera interfejs do nasłuchu (np.-i eth0);-i anyłapie ze wszystkich naraz.-n— nie tłumaczy adresów IP na nazwy (a-nnpomija też mapowanie portów na nazwy usług). Szybciej i bez zbędnych zapytań DNS.-c— kończy po przechwyceniu podanej liczby pakietów, np.-c 20.-w— zapisuje surowe pakiety do pliku (format pcap) zamiast je wypisywać.-r— czyta z zapisanego pliku pcap zamiast z interfejsu.-A— pokazuje zawartość pakietów w ASCII (wygodne przy HTTP i tekstowych protokołach).-X— wypisuje dane pakietu w hex i ASCII, przydatne przy grzebaniu w nieznanym protokole.-e— dokłada nagłówek warstwy łącza, czyli adresy MAC źródła i celu.
Przykłady użycia
tcpdump -i eth0 -n— nasłuch naeth0bez rozwiązywania nazw, wypisuje ruch na żywo.tcpdump -i any -n port 443— łapie tylko ruch HTTPS na wszystkich interfejsach.tcpdump -i eth0 -n host 8.8.8.8 and icmp— pokazuje wyłącznie pingi do i od 8.8.8.8, idealne do diagnozy łączności.tcpdump -i eth0 -c 100 -w zrzut.pcap port 53— zapisuje 100 pakietów DNS do pliku, który potem otworzysz w Wiresharku.tcpdump -r zrzut.pcap -nn -A— czyta wcześniej zapisany plik i pokazuje treść pakietów w ASCII.
Częste błędy i pułapki
tcpdump zwykle wymaga sudo albo uprawnień roota, bo grzebie w trybie promiscuous. Bez -n potrafi wisieć na odwrotnych zapytaniach DNS i mylić cię opóźnionym outputem, więc przy diagnozie sieci prawie zawsze dawaj -n. Nie myl filtra host z port ani nie wpisuj wyrażenia BPF przed opcjami z argumentem, bo shell się pogubi. Uważaj z -w na produkcji: zrzut całego ruchu na obciążonym serwerze urośnie do gigabajtów w kilka minut, dlatego łącz go z -c lub wąskim filtrem. Domyślnie starsze wersje ucinały pakiet do 68 bajtów przez snaplen; dziś -s 0 (pełny pakiet) jest zachowaniem domyślnym, ale w archaicznych systemach warto to jawnie ustawić. I pamiętaj, że -A pokaże ci treść, ale HTTPS i tak jest zaszyfrowany, więc nie licz na czytanie haseł.
Powiązane komendy: wireshark, tshark, ngrep, ss, netstat, ip, iftop, nmap.