Program tcpdump jest oczywiście szczegółowo opisany w manualu man tcpdump (pinfo tcpdump). Tu jedynie najbardziej potrzebne opcje.
Tcpdump może pracować w 'on-line' (przetwarzając pakiety pozyskane z z interfejsu sieciowego) lub 'off-line'(przetwarzając pakiety, a właściwie ich początkowe n bajtów - gdzie n jest parametrem - zapisane w pliku zwanym zrzutem). Oczywiście zrzuty można tworzyć także za pomocą tcpdump-a. By korzystać z tcpdump-a 'on-line', pod Linuxem zasadniczo trzeba być rootem.
Po uruchomieniu tcpdump 'on-line' uzyskuje się wynik podobny w formie do poniższego
$ sudo /usr/sbin/tcpdump tcpdump: listening on eth0 14:14:20.694588 7.00:00:5a:99:cd:38.453 > 7.ff:ff:ff:ff:ff:ff.453:ipx-rip-resp 9/1.1 6/1.1 5/1.1 18/1.1 14:14:21.246301 dhcp2-213.mimuw.edu.pl.32782 > intra-ns.mimuw.edu.pl.domain: 11712+ AAAA? duch.mimuw.edu.pl. (35) (DF) 14:14:21.247657 intra-ns.mimuw.edu.pl.domain > dhcp2-213.mimuw.edu.pl.32782: 11712* 0/1/0 (91) (DF) 14:14:21.247832 dhcp2-213.mimuw.edu.pl.32782 > intra-ns.mimuw.edu.pl.domain: 11713+ AAAA? duch. (22) (DF) 14:14:21.248907 intra-ns.mimuw.edu.pl.domain > dhcp2-213.mimuw.edu.pl.32782: 11713 NXDomain 0/1/0 (97) (DF) 14:14:21.257564 dhcp2-213.mimuw.edu.pl.32782 > intra-ns.mimuw.edu.pl.domain: 11714+ A? duch.mimuw.edu.pl. (35) (DF) 14:14:21.259651 intra-ns.mimuw.edu.pl.domain > dhcp2-213.mimuw.edu.pl.32782: 11714* 1/4/4 A duch.mimuw.edu.pl (199) (DF) 14:14:21.259936 dhcp2-213.mimuw.edu.pl.33884 > duch.mimuw.edu.pl.ssh: S 1439770130:1439770130(0) win 5840 <mss 1460,sackOK,timestamp 1090123 0,nop,wscale 0> (DF) 14:14:21.261134 duch.mimuw.edu.pl.ssh > dhcp2-213.mimuw.edu.pl.33884: S 3678305061:3678305061(0) ack 1439770131 win 5792 <mss 1460,sackOK,timestamp 198279237 1090123,nop,wscale 0> (DF) 14:14:21.261180 dhcp2-213.mimuw.edu.pl.33884 > duch.mimuw.edu.pl.ssh: . ack 1 win 5840 <nop,nop,timestamp 1090123 198279237> (DF) 14:14:21.266405 duch.mimuw.edu.pl.ssh > dhcp2-213.mimuw.edu.pl.33884: P 1:26(25) ack 1 win 5792 <nop,nop,timestamp 198279237 1090123> (DF) 14:14:21.266490 dhcp2-213.mimuw.edu.pl.33884 > duch.mimuw.edu.pl.ssh: . ack 26 win 5840 <nop,nop,timestamp 1090123 198279237> (DF) 12 packets received by filter 0 packets dropped by kernel
Można odczytać następujące informacje:
tcpdump -i lo
może nasłuchiwać na loop-ie).
ssh duch
.
Wypisywanie nazw wymaga konwersji (korzystania z DNS), można tego uniknąć za pomocą opcji -n (-nn wypisze numery protokołów zamiast ich nazw) Za pomocą opcji -vvv dostajemy więcej informacji, za pomocą opcji -c n wypisujemy n pakietów. Tak więc w poprzednim przypadku otrzymalibyśmy:
[kedar@dhcp2-213 kedar]$ sudo /usr/sbin/tcpdump -n -vvv -c 12 14:14:20.694588 7.00:00:5a:99:cd:38.453 > 7.ff:ff:ff:ff:ff:ff.453:ipx-rip-resp 9/1.1 6/1.1 5/1.1 18/1.1 14:14:21.246301 10.1.2.213.32782 > 10.1.3.1.domain: [udp sum ok] 11712+ AAAA? duch.mimuw.edu.pl. (35) (DF) (ttl 64, id 41545, len 63) 14:14:21.247657 10.1.3.1.domain > 10.1.2.213.32782: 11712* q: AAAA? duch.mimuw.edu.pl. 0/1/0 ns: mimuw.edu.pl. SOA[|domain] (DF) (ttl 63, id 0, len 119) 14:14:21.247832 10.1.2.213.32782 > 10.1.3.1.domain: [udp sum ok] 11713+ AAAA? duch. (22) (DF) (ttl 64, id 41545, len 50) 14:14:21.248907 10.1.3.1.domain > 10.1.2.213.32782: 11713 NXDomain q: AAAA? duch. 0/1/0 ns: . SOA[|domain] (DF) (ttl 63, id 0, len 125) 14:14:21.257564 10.1.2.213.32782 > 10.1.3.1.domain: [udp sum ok] 11714+ A? duch.mimuw.edu.pl. (35) (DF) (ttl 64, id 41546, len 63) 14:14:21.259651 10.1.3.1.domain > 10.1.2.213.32782: 11714* q: A? duch.mimuw.edu.pl. 1/4/4 duch.mimuw.edu.pl. A 10.1.3.2 ns: mimuw.edu.pl.[|domain] (DF) (ttl 63, id 0, len 227) 14:14:21.259936 10.1.2.213.33884 > 10.1.3.2.ssh: S [tcp sum ok] 1439770130:1439770130(0) win 5840 <mss 1460,sackOK,timestamp 1090123 0,nop,wscale 0> (DF) (ttl 64, id 33881, len 60) 14:14:21.261134 10.1.3.2.ssh > 10.1.2.213.33884: S [tcp sum ok] 3678305061:3678305061(0) ack 1439770131 win 5792 <mss 1460,sackOK,timestamp 198279237 1090123,nop,wscale 0> (DF) (ttl 63, id 0, len 60) 14:14:21.261180 10.1.2.213.33884 > 10.1.3.2.ssh: . [tcp sum ok] 1:1(0) ack 1 win 5840 <nop,nop,timestamp 1090123 198279237> (DF) (ttl 64, id 33882, len 52) 14:14:21.266405 10.1.3.2.ssh > 10.1.2.213.33884: P [tcp sum ok] 1:26(25) ack 1 win 5792 <nop,nop,timestamp 198279237 1090123> (DF) (ttl 63, id 64355, len 77) 14:14:21.266490 10.1.2.213.33884 > 10.1.3.2.ssh: . [tcp sum ok] 1:1(0) ack 26 win 5840 <nop,nop,timestamp 1090123 198279237> (DF) (ttl 64, id 33883, len 52)
Za pomocą opcji -w zapisujemy zrzut do pliku, a za pomocą -r czytamy zrzut z pliku zamiast z interfejsu (to ostatnie nie wymaga praw root-a)
/usr/sbin/tcpdump -n -vvv -c 12 -r zrzut15031004.06da powyższy rezultat.
Opcja -S daje na wyjściu absolutne, czyli takie jak zapisano w nagłówku TCP numery sekwencyjne (a nie od 2 pakietu tcpdump liczonym od 0 - dodawanie pozostawiając nam).
Domyślnie przechwytywanych jest 68 bajtów z początku pakietu, to czasem za mało (np. znacznik [|domain] wskazuje, że nie wszystko z dnsa się zmieściło) i można to zmienić za pomocą -s liczba bajtów.
Można wpisywać wyrażenia filtrujące np.
tcpdump dst port 80zwróci nam tylko pakiety tcp i udp, których portem docelowym jest port 80 (zazwyczaj http), a
tcpdump 'dst host 216.239.37.99 && port 80'pozwoli nam obejrzeć część ruchu HTTP skierowanego z sieci lokalnej do Googla. Nawiasy są konieczne przez wzgląd na basha i znaczki && (można pisać and).