tcpdump采用指令行方式對接口的資料包進行篩選抓取,其豐富特性表現在靈活的表達式上。
不帶任何選項的tcpdump,預設會抓取第一個網絡接口,且隻有将tcpdump程序終止才會停止抓包。
例如:
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">shell> tcpdump -nn -i eth0 icmp</pre>
下面是詳細的tcpdump用法。
1.1 tcpdump選項
它的指令格式為:
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]
[ -s snaplen ] [ -w file ] [ expression ]
抓包選項: -c:指定要抓取的包數量。注意,是最終要擷取這麼多個包。例如,指定"-c 10"将擷取10個包,但可能已經處理了100個包,隻不過隻有10個包是滿足條件的包。 -i interface:指定tcpdump需要監聽的接口。若未指定該選項,将從系統接口清單中搜尋編号最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),
:一旦找到第一個符合條件的接口,搜尋馬上結束。可以使用'any'關鍵字表示所有網絡接口。 -n:對位址以數字方式顯式,否則顯式為主機名,也就是說-n選項不做主機名解析。 -nn:除了-n的作用外,還把端口顯示為數值,否則顯示端口服務名。 -N:不列印出host的域名部分。例如tcpdump将會列印'nic'而不是'nic.ddn.mil'。 -P:指定要抓取的包是流入還是流出的包。可以給定的值為"in"、"out"和"inout",預設為"inout"。 -s len:設定tcpdump的資料包抓取長度為len,如果不設定預設将會是65535位元組。對于要抓取的資料包較大時,長度設定不夠可能會産生包截斷,若出現包截斷,
:輸出行中會出現"[|proto]"的标志(proto實際會顯示為協定名)。但是抓取len越長,包的處理時間越長,并且會減少tcpdump可緩存的資料包的數量,
:進而會導緻資料包的丢失,是以在能抓取我們想要的包的前提下,抓取長度越小越好。
輸出選項: -e:輸出的每行中都将包括資料鍊路層頭部資訊,例如源MAC和目标MAC。 -q:快速列印輸出。即列印很少的協定相關資訊,進而輸出行都比較簡短。 -X:輸出包的頭部資料,會以16進制和ASCII兩種方式同時輸出。 -XX:輸出包的頭部資料,會以16進制和ASCII兩種方式同時輸出,更詳細。 -v:當分析和列印的時候,産生詳細的輸出。 -vv:産生比-v更詳細的輸出。 -vvv:産生比-vv更詳細的輸出。
其他功能性選項: -D:列出可用于抓包的接口。将會列出接口的數值編号和接口名,它們都可以用于"-i"後。 -F:從檔案中讀取抓包的表達式。若使用該選項,則指令行中給定的其他表達式都将失效。 -w:将抓包資料輸出到檔案中而不是标準輸出。可以同時配合"-G time"選項使得輸出檔案每time秒就自動切換到另一個檔案。可通過"-r"選項載入這些檔案以進行分析和列印。 -r:從給定的資料封包件中讀取資料。使用"-"表示從标準輸入中讀取。</pre>
是以常用的選項也就這幾個:
- tcpdump -D
- tcpdump -c num -i int -nn -XX -vvv
1.2 tcpdump表達式
表達式用于篩選輸出哪些類型的資料包,如果沒有給定表達式,所有的資料包都将輸出,否則隻輸出表達式為true的包。在表達式中出現的shell元字元建議使用單引号包圍。
tcpdump的表達式由一個或多個"單元"組成,每個單元一般包含ID的修飾符和一個ID(數字或名稱)。有三種修飾符:
(1).type:指定ID的類型。
可以給定的值有host/net/port/portrange。例如"host foo","net 128.3","port 20","portrange 6000-6008"。預設的type為host。
(2).dir:指定ID的方向。
可以給定的值包括src/dst/src or dst/src and dst,預設為src or dst。例如,"src foo"表示源主機為foo的資料包,"dst net 128.3"表示目标網絡為128.3的資料包,"src or dst port 22"表示源或目的端口為22的資料包。
(3).proto:通過給定協定限定比對的資料包類型。
常用的協定有tcp/udp/arp/ip/ether/icmp等,若未給定協定類型,則比對所有可能的類型。例如"tcp port 21","udp portrange 7000-7009"。
是以,一個基本的表達式單元格式為"proto dir type ID"

image
除了使用修飾符和ID組成的表達式單元,還有關鍵字表達式單元:gateway,broadcast,less,greater以及算術表達式。
表達式單元之間可以使用操作符" and / && / or / || / not / ! "進行連接配接,進而組成複雜的條件表達式。如"host foo and not port ftp and not port ftp-data",這表示篩選的資料包要滿足"主機為foo且端口不是ftp(端口21)和ftp-data(端口20)的包",常用端口和名字的對應關系可在linux系統中的/etc/service檔案中找到。
另外,同樣的修飾符可省略,如"tcp dst port ftp or ftp-data or domain"與"tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain"意義相同,都表示包的協定為tcp且目的端口為ftp或ftp-data或domain(端口53)。
使用括号"()"可以改變表達式的優先級,但需要注意的是括号會被shell解釋,是以應該使用反斜線""轉義為"()",在需要的時候,還需要包圍在引号中。
1.3 tcpdump示例
注意,tcpdump隻能抓取流經本機的資料包。
(1).預設啟動
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump</pre>
預設情況下,直接啟動tcpdump将監視第一個網絡接口(非lo口)上所有流通的資料包。這樣抓取的結果會非常多,滾動非常快。
(2).監視指定網絡接口的資料包
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump -i eth1</pre>
如果不指定網卡,預設tcpdump隻會監視第一個網絡接口,如eth0。
(3).監視指定主機的資料包,例如所有進入或離開longshuai的資料包
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump host longshuai</pre>
(4).列印helios<-->hot或helios<-->ace之間通信的資料包
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump host helios and ( hot or ace )</pre>
(5).列印ace與任何其他主機之間通信的IP資料包,但不包括與helios之間的資料包
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump ip host ace and not helios</pre>
(6).截獲主機hostname發送的所有資料
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump src host hostname</pre>
(7).監視所有發送到主機hostname的資料包
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump dst host hostname</pre>
(8).監視指定主機和端口的資料包
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump tcp port 22 and host hostname</pre>
(9).對本機的udp 123端口進行監視(123為ntp的服務端口)
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump udp port 123</pre>
(10).監視指定網絡的資料包,如本機與192.168網段通信的資料包,"-c 10"表示隻抓取10個包
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">tcpdump -c 10 net 192.168</pre>
(11).列印所有通過網關snup的ftp資料包(注意,表達式被單引号括起來了,這可以防止shell對其中的括号進行錯誤解析)
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">shell> tcpdump 'gateway snup and (port ftp or ftp-data)'</pre>
(12).抓取ping包
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">[root@server2 ~]# tcpdump -c 5 -nn -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:11:23.273638 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16422, seq 10, length 64
12:11:23.273666 IP 192.168.100.62 > 192.168.100.70: ICMP echo reply, id 16422, seq 10, length 64
12:11:24.356915 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16422, seq 11, length 64
12:11:24.356936 IP 192.168.100.62 > 192.168.100.70: ICMP echo reply, id 16422, seq 11, length 64
12:11:25.440887 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16422, seq 12, length 64
5 packets captured 6 packets received by filter 0 packets dropped by kernel</pre>
如果明确要抓取主機為192.168.100.70對本機的ping,則使用and操作符。
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">[root@server2 ~]# tcpdump -c 5 -nn -i eth0 icmp and src 192.168.100.62 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:09:29.957132 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 1, length 64
12:09:31.041035 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 2, length 64
12:09:32.124562 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 3, length 64
12:09:33.208514 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 4, length 64
12:09:34.292222 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 5, length 64
5 packets captured 5 packets received by filter 0 packets dropped by kernel</pre>
注意不能直接寫icmp src 192.168.100.70,因為icmp協定不支援直接應用host這個type。
(13).抓取到本機22端口包
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">[root@server2 ~]# tcpdump -c 10 -nn -i eth0 tcp dst port 22 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:06:57.574293 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 535528834, win 2053, length 0
12:06:57.629125 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 193, win 2052, length 0
12:06:57.684688 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 385, win 2051, length 0
12:06:57.738977 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 577, win 2050, length 0
12:06:57.794305 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 769, win 2050, length 0
12:06:57.848720 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 961, win 2049, length 0
12:06:57.904057 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1153, win 2048, length 0
12:06:57.958477 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1345, win 2047, length 0
12:06:58.014338 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1537, win 2053, length 0
12:06:58.069361 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1729, win 2052, length 0
10 packets captured 10 packets received by filter 0 packets dropped by kernel</pre>
(14).解析包資料
<pre style="margin: 0px; padding: 0px; box-sizing: border-box; white-space: pre-wrap; overflow-wrap: break-word; background-color: rgb(248, 248, 248); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 12px !important; line-height: normal; font-family: "Courier New" !important; border: 1px solid rgb(204, 204, 204); border-radius: 4px; display: block; overflow-x: auto;">[root@server2 ~]# tcpdump -c 2 -q -XX -vvv -nn -i eth0 tcp dst port 22 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:15:54.788812 IP (tos 0x0, ttl 64, id 19303, offset 0, flags [DF], proto TCP (6), length 40) 192.168.100.1.5788 > 192.168.100.62.22: tcp 0
0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E. 0x0010: 0028 4b67 4000 4006 a5d8 c0a8 6401 c0a8 .(Kg@[email protected]... 0x0020: 643e 169c 0016 2426 5fd6 1fec 2b62 5010 d>....><...+bP. 0x0030: 0803 7844 0000 0000 0000 0000 ..xD........ 12:15:54.842641 IP (tos 0x0, ttl 64, id 19304, offset 0, flags [DF], proto TCP (6), length 40) 192.168.100.1.5788 > 192.168.100.62.22: tcp 0
0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E. 0x0010: 0028 4b68 4000 4006 a5d7 c0a8 6401 c0a8 .(Kh@[email protected]... 0x0020: 643e 169c 0016 2426 5fd6 1fec 2d62 5010 d>....><...-bP. 0x0030: 0801 7646 0000 0000 0000 0000 ..vF........ 2 packets captured 2 packets received by filter 0 packets dropped by kernel</pre>
總的來說,tcpdump對基本的資料包抓取方法還是較簡單的。隻要掌握有限的幾個選項(-nn -XX -vvv -i -c -q),再組合表達式即可。