Tcpdump to wyjątkowo użyteczne narzędzie, działające w wierszu poleceń, służące do monitorowania ruchu sieciowego. Jest ono powszechnie uznawane za standard w dziedzinie przechwytywania oraz analizowania pakietów w protokole TCP/IP.
Aplikacja tcpdump okazuje się nieoceniona podczas diagnozowania problemów związanych z siecią. Zebrane dane, w postaci pakietów, można zapisać do pliku, a następnie poddać szczegółowej analizie. Regularne korzystanie z tego narzędzia pozwala na bieżąco monitorować stan i kondycję sieci.
Analiza wyjścia tcpdump
Tcpdump umożliwia wgląd w nagłówki pakietów TCP/IP. Dla każdego przechwyconego pakietu wyświetla on pojedynczy wiersz. Praca polecenia trwa do momentu, gdy użytkownik ręcznie ją zakończy, naciskając kombinację klawiszy Ctrl + C.
Przyjrzyjmy się przykładowemu wierszowi wygenerowanemu przez to narzędzie:
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żdy wiersz zawiera następujące elementy:
- Znacznik czasu systemowego w formacie Unix (20:58:26.765637)
- Protokół (IP)
- Adres IP lub nazwa hosta źródłowego, a także numer portu (10.0.0.50.80)
- Adres IP lub nazwa hosta docelowego wraz z numerem portu (10.0.0.1.53181)
- Flagi TCP (w tym przypadku [F.]). Flagi odzwierciedlają aktualny status połączenia. Jedno pole może zawierać więcej niż jedną wartość, np. [F.], oznaczające FIN-ACK. Możliwe wartości to:
- S – SYN. Jest to pierwszy krok w procesie nawiązywania połączenia.
- F – FIN. Informuje o zakończeniu połączenia.
- . – ACK. Potwierdzenie pomyślnego odbioru pakietu.
- P – PUSH. Nakazuje odbiorcy niezwłoczne przetworzenie pakietu bez buforowania.
- R – RST. Oznacza zerwanie komunikacji.
- Numer sekwencyjny danych zawartych w pakiecie (seq 1)
- Numer potwierdzenia (ack 2)
- Rozmiar okna (win 453) – ilość bajtów dostępnych w buforze odbiorczym. Następnie podawane są opcje TCP.
- Długość danych (payload) w pakiecie (length 0)
Proces instalacji
W dystrybucjach systemu Linux opartych na Debianie, tcpdump można zainstalować za pomocą menedżera pakietów APT, wydając następujące polecenie:
# apt install tcpdump -y
Dla systemów opartych na RPM, takich jak Fedora, CentOS, instalacja odbywa się za pomocą menedżera pakietów YUM:
# yum install tcpdump -y
W systemie RHEL 8 (Red Hat Enterprise Linux 8), wykorzystujemy DNF:
# dnf install tcpdump -y
Opcje uruchomienia tcpdump
Aby móc korzystać z tcpdump, użytkownik musi mieć uprawnienia administratora (root). Narzędzie to oferuje bogaty zestaw opcji i filtrów. Bez wprowadzenia dodatkowych parametrów, tcpdump zacznie przechwytywać wszystkie pakiety przechodzące przez domyślny interfejs sieciowy.
Aby zobaczyć listę dostępnych interfejsów sieciowych, na których tcpdump może przechwytywać pakiety, należy wydać poniższe polecenie:
# tcpdump -D
Lub:
# 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]
Jest to szczególnie użyteczne w sytuacjach, gdy standardowe polecenia systemowe nie wyświetlają listy interfejsów.
Aby przechwycić ruch sieciowy z konkretnego interfejsu, użyj flagi -i, po której następuje nazwa interfejsu. Jeśli flaga -i nie zostanie podana, tcpdump automatycznie wybierze pierwszy dostępny interfejs sieciowy.
# 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
Flaga -v zwiększa ilość informacji wyświetlanych o pakietach, a -vv powoduje wyświetlanie jeszcze większej ilości szczegółów.
Domyślnie, tcpdump usiłuje tłumaczyć adresy IP na nazwy hostów oraz używa nazw usług zamiast numerów portów. Aby uniknąć tych operacji, które mogą być problematyczne w przypadku problemów z DNS, lub gdy nie chcemy, aby tcpdump wykonywał wyszukiwanie nazw, należy użyć opcji -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
Aby ograniczyć liczbę wyświetlonych linii, na przykład do 5, można użyć flagi -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
Domyślnie tcpdump prezentuje znaczniki czasu w formacie Unix. Aby zamiast tego wyświetlić znaczniki czasu w formacie czytelnym dla człowieka, użyj flagi -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
Wyrażenia filtrujące w tcpdump
Wyrażenia filtrujące pozwalają na selektywne wyświetlanie nagłówków pakietów. Bez filtrów wyświetlane są wszystkie przechwycone nagłówki. Do najczęściej stosowanych filtrów należą: port, host, src, dst, tcp, udp, oraz icmp.
Filtr portu
Filtr portów pozwala na wyświetlenie jedynie pakietów docierających do określonego portu:
# 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 hosta
Aby śledzić cały ruch, który przychodzi lub wychodzi z hosta o adresie IP 10.0.2.15, użyj:
# 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
Aby przechwycić pakiety konkretnego typu, na przykład icmp, na interfejsie 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
Kombinowanie filtrów
Filtry można łączyć za pomocą operatorów AND, OR i NOT. Pozwala to na precyzyjne definiowanie warunków filtrowania pakietów.
Aby zobaczyć pakiety pochodzące z określonego adresu IP, a kierowane do konkretnego portu, użyj:
# 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
Aby wykluczyć pakiety ICMP, użyj operatora NOT:
# tcpdump -i eth1 not icmp
Zapisywanie nagłówków pakietów do pliku
Ze względu na to, że dane wyjściowe tcpdump mogą szybko przewijać się poza ekran, można je zapisać do pliku za pomocą flagi -w. Pliki z zapisanymi danymi mają format pcap i rozszerzenie .pcap.
PCAP to skrót od Packet Capture (przechwytywanie pakietów). Poniższe polecenie zapisze 10 linii danych wyjściowych z interfejsu eth1 do pliku 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
Zapisany plik można odczytać za pomocą flagi -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
Wyświetlanie szczegółów pakietu
Do tej pory prezentowane były jedynie nagłówki pakietów. Aby zobaczyć zawartość pakietu, należy użyć opcji -A. Spowoduje to wyświetlenie zawartości pakietu w formacie ASCII, co może być przydatne w diagnozowaniu problemów sieciowych. Alternatywnie, można skorzystać z flagi -X, która wyświetli dane wyjściowe w formacie szesnastkowym. Może to nie być zbyt pomocne, jeśli połączenie jest szyfrowane.
# 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
Podsumowanie
Tcpdump jest narzędziem łatwym w konfiguracji. Po zapoznaniu się z formatem danych wyjściowych, dostępnymi flagami i filtrami, staje się ono niezastąpione w procesie rozwiązywania problemów sieciowych oraz zabezpieczania infrastruktury IT.
newsblog.pl