本文目錄:
1.1 tcpdump選項
1.2 tcpdump表示式
1.3 tcpdump範例
tcpdump採用命令列方式對介面的封包進行篩選抓取,其豐富特性表現在靈活的表示式上。不帶任何選項的tcpdump,預設會抓取第一個網路介面,且只有將tcpdump進程終止才會停止抓包。
例如:
shell> tcpdump -nn -i eth0 icmp
下面是詳細的tcpdump用法。
1.1 tcpdump選項
它的命令格式為:
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:從給定的封包檔案中讀取資料。使用"-"表示從標準輸入中讀取。
所以常用的選項也就這幾個:
- 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"
除了使用修飾符和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範例
(1).預設啟動
預設情況下,直接啟動tcpdump將監視第一個網路介面(非lo口)上所有流通的封包。這樣抓取的結果會非常多,捲動非常快。
(2).監視指定網路介面的封包
如果不指定網絡卡,預設tcpdump只會監視第一個網路介面,如eth0。
(3).監視指定主機的封包,例如所有進入或離開longshuai的封包
(4).列印helios<-->hot或helios<-->ace之間通訊的封包
tcpdump host helios and ( hot or ace )
(5).列印ace與任何其他主機之間通訊的IP封包,但不包括與helios之間的封包
tcpdump ip host ace and not helios
(6).截獲主機hostname傳送的所有資料
tcpdump src host hostname
(7).監視所有傳送到主機hostname的封包
tcpdump dst host hostname
(8).監視指定主機和埠的封包
tcpdump tcp port 22 and host hostname
(9).對本機的udp 123埠進行監視(123為ntp的伺服器端口)
(10).監視指定網路的封包,如本機與192.168網段通訊的封包,"-c 10"表示只抓取10個包
tcpdump -c 10 net 192.168
(11).列印所有通過閘道器snup的ftp封包(注意,表示式被單引號括起來了,這可以防止shell對其中的括號進行錯誤解析)
shell> tcpdump 'gateway snup and (port ftp or ftp-data)'
(12).抓取ping包
[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
如果明確要抓取主機為192.168.100.70對本機的ping,則使用and操作符。
[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
注意不能直接寫icmp src 192.168.100.70,因為icmp協定不支援直接應用host這個type。
(13).抓取到本機22埠包
[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
(14).解析包資料
[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@.@.....d...
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@.@.....d...
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
總的來說,tcpdump對基本的封包抓取方法還是較簡單的。只要掌握有限的幾個選項(-nn -XX -vvv -i -c -q),再組合表示式即可。
姊妹篇:網路掃描工具nmap
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-06/145099.htm