tcpdump介紹
tcpdump 是一個運行在命令列下的抓包工具。它允許使用者攔截和顯示發送或收到過網路連接到該電腦的TCP/IP和其他資料包。tcpdump 適用於
大多數的類Unix系統作業系統(如linux,BSD等)。類Unix系統的 tcpdump 需要使用libpcap這個捕捉資料的庫就像 windows下的WinPcap。
在學習tcpdump前最好對基本網路的網路知識有一定的認識。
tcpdump命令格式及常用參數
Tcpdump的大概形式如下:
例:tcpdump –i eth0 ’port 1111‘ -X -c 3
tcpdump採用命令列方式,它的命令格式為:
tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 檔案名稱 ]
[ -i 網路介面 ] [ -r 檔案名稱] [ -s snaplen ]
[ -T 類型 ] [ -w 檔案名稱 ] [運算式 ]
tcpdump的選項介紹
-a 將網路地址和廣播位址轉變成名字;
-d 將匹配資訊包的代碼以人們能夠理解的彙編格式給出;
-dd 將匹配資訊包的代碼以c語言程式段的格式給出;
-ddd 將匹配資訊包的代碼以十進位的形式給出;
-e 在輸出行列印出資料連結層的頭部資訊;
-f 將外部的Internet地址以數位形式列印出來;
-l 使標準輸出變為緩衝行形式;
-n 不把網路位址轉譯成名字;
-t 在輸出的每一行不列印時間戳記;
-v 輸出一個稍微詳細的資訊,例如在ip包中可以包括ttl和服務類型的資訊;
-vv 輸出詳細的報文資訊;
-c 在收到指定的包的數目後,tcpdump就會停止;
-F 從指定的檔案中讀取運算式,忽略其它的運算式;
-i 指定監聽的網路介面;
-r 從指定的檔案中讀取包(這些包一般通過-w選項產生);
-w 直接將包寫入檔案中,並不分析和列印出來;
-T 將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠端程序呼叫)和snmp(簡易網路管理通訊協定;)
如鍵入命令: tcpdump –i eth0 ‘port 1111’ -X -c 3
-i 是interface的含義,是指我們有義務告訴tcpdump希望他去監聽哪一個網卡,
-X告訴tcpdump命令,需要把協議頭和包內容都原原本本的顯示出來(tcpdump會以16進位和ASCII的形式顯示),這在進行協議分析時是絕對的利器。
port 1111我們只關心源連接埠或目的連接埠是1111的資料包.
-c 是Count的含義,這設定了我們希望tcpdump幫我們抓幾個包。
其中還有另外一個比較重要的參數– l 使得輸出變為行緩衝
-l選項的作用就是將tcpdump的輸出變為“行緩衝”方式,這樣可以確保tcpdump遇到的內容一旦是分行符號即將緩衝的內容輸出到標準輸出,以便於利用管道
或重新導向方式來進行後續處理。
Linux/UNIX的標準I/O提供了全緩衝、行緩衝和無緩衝三種緩衝方式。標準錯誤是不帶緩衝的,終端裝置常為行緩衝,而其他情況預設都是全緩衝的。
例如我們只想提取包的每一行的第一個域(時間域),這種情況下我們就需要-l將預設的全緩衝變為行緩衝了。
參數–w -r
-w 直接將包寫入檔案中(即原始包,如果使用 重新導向 > 則只是儲存顯示的結果,而不是原始檔案),即所謂的“流量儲存”---就是把抓到的網路包能儲存到磁碟上,
儲存下來,為後續使用。參數-r 達到“流量回放”---就是把曆史上的某一時間段的流量,重新類比回放出來,用於流量分析。
通過-w選項將流量都儲存在cp.pcap(二進位格式)檔案中了.可以通過 –r 讀取raw packets檔案 cp.pcap.
如:sudo tcpdump i- eth0 'port 1111' -c 3 -r cp.pcap 即可進行流量回放。
tcpdump的輸出結果介紹
鍵入命令:sudo tcpdump -i eth0 -e -nn -X -c 2 'port1111' 所截獲包內容如下:
第一行:“tcpdump: verbose output suppressed, use -v or -vv for fullprotocol decode”
提示使用選項-v和-vv,可以看到更全的輸出內容。
第二行“listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes”
我們監聽的是通過eth0這個NIC裝置的網路包,且它的鏈路層是基於乙太網路的,要抓的包大小限制是65535位元組。包大小限制值可以通過-s選項來設定。
第三行”12:40:33.569037 00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4, ethertypeIPv4 (0x0800),”
12:40:33.569037 分別對應著這個包被抓到的“時”、“分”、“秒”、“微妙”。
00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4 表示MAC地址00:19:e0:b5:10:94發送到MAC地址為00:1a:a0:31:39:d4的主機,ethertype IPv4 (0x0800)表示
Ethernet幀的協議類型為ipv4(即代碼為0x0800)。
第四行”length 66: 210.45.123.249.27236 > 172.16.0.11.1111: Flags [S],seq 1624463808,
length 66表示以太幀長度為66。 210.45.123.249.27236表示這個包的源IP為210.45.123.249,源連接埠為27236,’>’表示資料包的傳輸方向, 172.16.0.11.1111,
表示這個資料包的目的端ip為172.16.0.11,目標連接埠為1111,1111連接埠是我的一個web伺服器監聽連接埠。Flags是[S],表明是syn建立串連包(即三向交握的第一次
握手),seq1624463808 序號為1624463808,這個其實就是TCP三向交握的第一次握手:client(210.45.123.249)發送syn請求建立串連包。
第五行” win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0”
win 8192 表示視窗大小為8192位元組。options[mss 1460,nop,wscale 2,nop,nop,sackOK]為tcp首部可選欄位mss 1460表示mss是發送端(用戶端)通告的最大
報文段長度,發送端將不接收超過這個長度的TCP報文段(這個值和MTU有一定關係)。nop是一個空操作選項, wscale指出發送端使用的視窗擴大因子為2, sackOK
表示發送端支援並同意使用SACK選。
下面幾行分別是IP,TCP首部 ,這裡不再敷述。
tcpdump過濾語句介紹
可以給tcpdump傳送“過濾運算式”來起到網路包過濾的作用,而且可以支援傳入單個或多個過濾運算式。
可以通過命令 man pcap-filter 來參考過濾運算式的協助文檔
過濾運算式大體可以分成三種過濾條件,“類型”、“方向”和“協議”,這三種條件的搭配組合就構成了我們的過濾運算式。
關於類型的關鍵字,主要包括host,net,port, 例如 host 210.45.114.211,指定主機 210.45.114.211,net 210.11.0.0 指明210.11.0.0是一個網路地址,port 21 指明
連接埠號碼是21。如果沒有指定類型,預設的類型是host.
關於傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,
這些關鍵字指明了傳輸的方向。舉例說明,src 210.45.114.211 ,指明ip包中源地址是210.45.114.211, dst net 210.11.0.0 指明目的網路地址是210.11.0.0 。如果沒有指明
方向關鍵字,則預設是srcor dst關鍵字。
關於協議的關鍵字,主要包括 ether,ip,ip6,arp,rarp,tcp,udp等類型。這幾個關鍵字指明了監聽的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的
資訊包。
如我們只想抓tcp的包命令為: sudo tcpdump -i eth0 -nn -c1 'tcp'
除了這三種類型的關鍵字之外,其他重要的關鍵字如下:
gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算是'or' ,'||';
可以利用這些關鍵字進行組合,從而組合為比較強大的過濾條件。下面舉例說明
(1)只想查目標機器連接埠是21或80的網路包,其他連接埠的我不關註:
sudo tcpdump -i eth0 -c 10 'dst port 21 or dst port 80'
(2) 想要截獲主機172.16.0.11 和主機210.45.123.249或 210.45.123.248的通訊,使用命令(注意括弧的使用):
sudo tcpdump -i eth0 -c 3 'host 172.16.0.11 and (210.45.123.249 or210.45.123.248)'
(3)想擷取使用ftp連接埠和ftp資料連接埠的網路包
sudo tcpdump 'port ftp or ftp-data'
這裡 ftp、ftp-data到底對應哪個連接埠? linux系統下 /etc/services這個檔案裡面,就儲存著所有知名服務和傳輸層連接埠的對應關係。如果你直接把/etc/services裡
的ftp對應的連接埠值從21改為了3333,那麼tcpdump就會去抓連接埠含有3333的網路包了。
(4) 如果想要擷取主機172.16.0.11除了和主機210.45.123.249之外所有主機通訊的ip包,使用命令:
sudo tcpdump ip ‘host 172.16.0.11 and ! 210.45.123.249’
(5) 抓172.16.0.11的80連接埠和110和25以外的其他連接埠的包
sudo tcpdump -i eth0 ‘host 172.16.0.11 and! port 80 and ! port 25 and ! port 110’
下面介紹一些tcpdump中過濾語句比較進階的用法
想擷取172.16.10.11和google.com之間建立TCP三向交握中帶有SYN標記位的網路包.
命令為:sudo tcpdump -i eth0 'host 172.16.0.11 andhost google.com and tcp[tcpflags]&tcp-syn!=0' -c 3 -nn
上面的命令是不是看著有點暈的感覺,下面詳細介相關知識。
其實我們理解這種文法: proto [ expr : size] ,就不難理解上面的語句了。
下面詳細介紹proto [ expr : size]
Proto即protocol的縮寫,它表示這裡要指定的是某種協議名稱,如ip,tcp,udp等。總之可以指定的協議有十多種,如鏈路層協議 ether,fddi,tr,wlan,ppp,slip,link,
網路層協議ip,ip6,arp,rarp,icmp傳輸層協議tcp,udp等。
expr用來指定資料報位元組單位的位移量,該位移量相對於指定的協議層,預設的起始位置是0;而size表示從位移量的位置開始提取多少個位元組,可以設定為
1、2、4,預設為1位元組。如果只設定了expr,而沒有設定size,則預設提取1個位元組。比如ip[2:2],就表示提取出第3、4個位元組;而ip[0]則表示提取ip協議頭的
第一個位元組。在我們提取了特定內容之後,我們就需要設定我們的過濾條件了,我們可用的“比較操作符”包括:>,<,>=,<=,=,!=,總共有6個。
舉例:想截取每個TCP會話的起始和結束報文(SYN 和 FIN 報文), 而且會話方中有一個遠程主機.
sudo tcpdump 'tcp[13] & 3 != 0 and not(src and dst net 172.16.0.0)' -nn
如果熟悉tcp首部報文格式可以比較容易理解這句話,因為tcp便宜13位元組的位置為2位保留位和6位標誌位(URG,ACK,PSH,RST,SYN,FIN), 所以與3相與就可以得出
SYN,FIN其中是否一個置位1.
從上面可以看到在寫過濾運算式時,需要我們對協議格式比較理解才能把運算式寫對。這個比較有難度的..。為了讓tcpdump工具更人性化一些,有一些常用的位移量,
可以通過一些名稱來代替,比如icmptype表示ICMP協議的類型域、icmpcode表示ICMP的code域,tcpflags 則表示TCP協議的標誌欄位域。
更進一步的,對於ICMP的類型域,可以用這些名稱具體指代:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect,icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob,icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq,icmp-maskreply。
而對於TCP協議的標誌欄位域,則可以細分為tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg。
對於tcpdump 只能通過經常操作來熟練這些語句了。也可以把網路包用tcpdump截獲儲存到指定檔案,然後用wireshark等可視化軟體分析網路包。