tcpdump---dump the traffic on a network
說明:tcpdump根據使用者的定義對網絡上的數據包進行截獲的包分析工具。
tcpdump可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,並提供and、or、not等邏輯語句。普通用戶不能正常執行,需具備root權限的用戶纔可以直接執行它。
格式:tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ] [ -i 網絡接口 ] [ -r 文件名] [ -s snaplen ] [ -T 類型 ] [ -w 文件名 ] [表達式 ]
表達式說明:表達式是一個正則表達式,tcpdump利用它作爲過濾報文的條件,如果一個報文滿足表達式的條件,則這個報文將會被捕獲。如果沒有給出任何條件,則網絡上所有的信息包將會被截獲。表達式中常見的關鍵字有以下幾種:
類型關鍵字:主要包括host,net,port, 例如 host 210.27.48.2,指明210.27.48.2是一臺主機,net 202.0.0.0 指明 202.0.0.0是一個網絡地址,port 23指明端口號是23。如果沒有指定類型,缺省的類型是host
傳輸方向關鍵字:主要包括src , dst ,dst or src, dst and src,這些關鍵字指明瞭傳輸的方向。舉例說明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net202.0.0.0 指明目的網絡地址是202.0.0.0 。如果沒有指明方向關鍵字,則缺省是src or dst關鍵字
協議關鍵字:主要包括fddi,ip,arp,rarp,tcp,udp等類型。Fddi指明是在FDDI(分佈式光纖數據接口網絡)上的特定的網絡協議,實際上它是"ether"的別名,fddi和ether具有類似的源地址和目的地址,所以可以將fddi協議包當作ether的包進行處理和分析。其他的幾個關鍵字就是指明瞭監聽的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的信息包。tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據報的類型
其他關鍵字:gateway, broadcast,less, greater
邏輯運算符:非運算 'not ' '! ' ;與運算 'and' '&&' ;或運算 'or' '││'
options:
-i 指定監聽的網絡接口;如果不指定網卡,默認tcpdump只會監視第一個網絡接口,一般是eth0
-c 在收到指定數目的包後,tcpdump就會停止;-c 100 : 只抓取100個數據包
-w 直接將包寫入文件中,並不分析和打印出來;-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析,wireshark的使用參考Wireshark抓包工具基礎教程
-r 從指定的文件中讀取包(這些包一般通過-w選項產生);
-F 從指定的文件中讀取表達式,忽略其它的表達式;
-t 在輸出的每一行不打印時間戳;
-n 不把網絡地址轉換成名字;
-nn 直接以 IP 及 Port Number 顯示,而非主機名與服務名稱;
-v 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息;
-vv 輸出詳細的報文信息;
-T 將監聽到的包直接解釋爲指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議;)
-a 將網絡地址和廣播地址轉變成名字;
-d 將匹配信息包的代碼以人們能夠理解的彙編格式給出;
-dd 將匹配信息包的代碼以c語言程序段的格式給出;
-ddd 將匹配信息包的代碼以十進制的形式給出;
-e 在輸出行打印出數據鏈路層的頭部信息;
-f 將外部的Internet地址以數字的形式打印出來;
-l 使標準輸出變爲緩衝行形式;
-s 抓取數據包時默認抓取長度爲68字節。加上-S 0 後可以抓到完整的數據包
輸出結果介紹:
1) 數據鏈路層頭信息
ICE主機的MAC地址是0:90:27:58:AF:1A ,H219主機的MAC地址是8:0:20:79:5B:46。
[root@justin ~]# tcpdump -e host ICE tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 13:21:55.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ICE. telne t 0:0(0) ack 22535 win 8760 (DF) ...... 2 packets captured 1984 packets received by filter 1933 packets dropped by kernel [root@justin ~]#
13:21:55是顯示的時間, 847509是ID號,eth0 <表示從網絡接口eth0接收該分組, eth0 >表示從網絡接口設備發送分組, 8:0:20:79:5b:46是主機H219的MAC地址, 它表明是從源地址H219發來的分組. 0:90:27:58:af:1a是主機ICE的MAC地址, 表示該分組的目的地址是ICE。 ip 是表明該分組是IP分組,60 是分組的長度, h219.33357 > ICE. telnet 表明該分組是從主機H219的33357端口發往主機ICE的 TELNET(23)端口。 ack 22535 表明對序列號是222535的包進行響應。 win 8760表明發送窗口的大小是8760。
2) ARP包的tcpdump輸出信息
[root@justin ~]# tcpdump arp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 14:18:21.802509 eth0 > arp who-has route tell ICE (0:90:27:58:af:1a) 14:18:21.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a) ...... 7 packets captured 35 packets received by filter 0 packets dropped by kernel [root@justin ~]#
14:18:21是時間戳, 802509是ID號, eth0 >表明從主機發出該分組,arp表明是ARP請求包, who-has route tell ICE表明是主機ICE請求主機route的MAC地址。 0:90:27:58:af:1a是主機 ICE的MAC地址。
實例:
1)截獲主機10.15.72.73 和主機10.15.72.74或10.15.72.75的通信(在命令行中使用括號時,一定要添加'\')
[root@justin ~]# tcpdump host 10.15.72.73 and \(10.15.72.74 or 10.15.72.75 \)
2)獲取主機210.15.72.73除了和主機10.15.72.74之外所有主機通信的ip包
[root@justin ~]# tcpdump host 10.15.72.73 and not 10.15.72.74 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 15:01:17.895735 IP 10.15.72.73.58375 > 210.51.22.240.viziblebrowser: Flags [P.], seq 246661844:246662084, ack 3304727012, win 16425, length 240 .... 4 packets captured 2275 packets received by filter 2240 packets dropped by kernel [root@justin ~]# tcpdump host 10.15.72.73 and ! 10.15.72.74
3)對本機的udp 123 端口進行監視 123 爲ntp的服務端口
[root@justin ~]# tcpdump udp port 123
4)對名爲10.15.72.74的主機的通信數據包進行監視
[root@justin ~]# tcpdump -i eth0 src host 10.15.72.74 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 15:22:40.359246 IP 10.15.72.74.15718 > 255.255.255.255.vce: UDP, length 83 ...... 4 packets captured 6 packets received by filter 0 packets dropped by kernel [root@justin ~]#
5)監視所有送到主機10.15.72.74的數據包
[root@justin ~]# tcpdump -i eth0 dst host 10.15.72.74
6)過濾源主機10.15.72.74和目的端口不是telnet的報頭,並導入到/home/tcpdump文件中:
[root@justin ~]# touch /home/ tcpdump [root@justin ~]# tcpdump src host 10.15.72.74 and dst port ! telnet -l > /home/tcpdump
7)監聽來自eth0適配卡且通信協議爲port 22,目標來源爲10.15.72.74的數據包資料
[root@justin ~]# tcpdump -i eth0 -nn port 22 and src host 10.15.72.74
8)抓取訪問eth0適配卡且訪問端口爲tcp 9080
[root@justin ~]# tcpdump -i eth0 dst 10.15.72.74 and tcp port 9080
9)抓取所有經過 eth1,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 數據
[root@justin ~]# tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host192.168.1.200)))'
10)抓取所有經過 eth1,目標 MAC 地址是 00:01:02:03:04:05 的 ICMP 數據
[root@justin ~]# tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
11)抓取所有經過 eth1,目的網絡是 192.168,但目的主機不是 192.168.1.200 的 TCP 數據
[root@justin ~]# tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
12)抓 SYN 包
[root@justin ~]# tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
13)用tcpdump嗅探80端口的訪問看看誰最高
[root@justin ~]# tcpdump -tnn dst port 80 -c 10 | grep -i "^ip"|awk '{print $2}'|cut -d '.' -f 1-4|sort|uniq -c|tail -10