1、抓取回環網口的包:tcpdump -i lo
2、防止包截斷:tcpdump -s0
3、以數字顯示主機及端口:tcpdump -n
第一種是關于類型的關鍵字,主要包括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 net 202.0.0.0 指明目的網絡位址是202.0.0.0 。如果沒有指明方向關鍵字,則預設是src or dst關鍵字。
第三種是協定的關鍵字,主要包括fddi,ip,arp,rarp,tcp,udp等類型。Fddi指明是在FDDI(分布式光纖資料接口網絡)上的特定 的網絡協定,實際上它是"ether"的别名,fddi和ether具有類似的源位址和目的位址,是以可以将fddi協定包當作ether的包進行處理和 分析。其他的幾個關鍵字就是指明了監聽的包的協定内容。如果沒有指定任何協定,則tcpdump将會監聽所有協定的資訊包。
除了這三種類型的關鍵字之外,其他重要的關鍵字如下:gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&;或運算 是'or' ,'||';這些關鍵字可以組合起來構成強大的組合條件來滿足人們的需要,下面舉幾個例子來說明。
普通情況下,直接啟動tcpdump将監視第一個網絡界面上所有流過的資料包。
# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
使用-i參數指定tcpdump監聽的網絡界面,這在計算機具有多個網絡界面時非常有用,
使用-c參數指定要監聽的資料包數量,
使用-w參數指定将監聽到的資料包寫入檔案中儲存
A想要截獲所有210.27.48.1 的主機收到的和發出的所有的資料包:
#tcpdump host 210.27.48.1
B想要截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通信,使用指令:(在指令行中适用 括号時,一定要
#tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)
C如果想要擷取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用指令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D如果想要擷取主機210.27.48.1接收或發出的telnet包,使用如下指令:
#tcpdump tcp port 23 host 210.27.48.1
E 對本機的udp 123 端口進行監視 123 為ntp的服務端口
# tcpdump udp port 123
F 系統将隻對名為hostname的主機的通信資料包進行監視。主機名可以是本地主機,也可以是網絡上的任何一台計算機。下面的指令可以讀取主機hostname發送的所有資料:
#tcpdump -i eth0 src host hostname
G 下面的指令可以監視所有送到主機hostname的資料包:
#tcpdump -i eth0 dst host hostname
H 我們還可以監視通過指定網關的資料包:
#tcpdump -i eth0 gateway Gatewayname
I 如果你還想監視編址到指定端口的TCP或UDP資料包,那麼執行以下指令:
#tcpdump -i eth0 host hostname and port 80
J 如果想要擷取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包
,使用指令:
K 想要截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通信,使用指令
:(在指令行中适用 括号時,一定要
L 如果想要擷取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用指令:
M 如果想要擷取主機210.27.48.1接收或發出的telnet包,使用如下指令:
第三種是協定的關鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型
除了這三種類型的關鍵字之外,其他重要的關鍵字如下:gateway, broadcast,less,
greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'o
r' ,'||';
第二種是确定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,
如果我們隻需要列出送到80端口的資料包,用dst port;如果我們隻希望看到傳回80端口的資料包,用src port。
#tcpdump –i eth0 host hostname and dst port 80 目的端口是80
或者
#tcpdump –i eth0 host hostname and src port 80 源端口是80 一般是提供http的服務的主機
如果條件很多的話 要在條件之前加and 或 or 或 not
#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80
如果在ethernet 使用混雜模式 系統的日志将會記錄
May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode
tcpdump對截獲的資料并沒有進行徹底解碼,資料包内的大部分内容是使用十六進制的形式直接列印輸出的。顯然這不利于分析網絡故障,通常的解決辦法是先使用帶-w參數的tcpdump 截獲資料并儲存到檔案中,然後再使用其他程式進行解碼分析。當然也應該定義過濾規則,以避免捕獲的資料包填滿整個硬碟。
# tcpdump -i eth1 src host 211.167.237.199
00:02:03.096713 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010208:2010352(144) ack 33377 win 8576
00:02:03.096951 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010352:2010496(144) ack 33377 win 8576
00:02:03.100928 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010496:2010640(144) ack 33377 win 8576
00:02:03.101165 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010640:2010784(144) ack 33377 win 8576
00:02:03.102554 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010784:2010928(144) ack 33425 win 8576
表明在00:02:03點的時候,211.167.237.199通過ssh源端口連接配接到221.216.165.189的1467端口
#tcpdump -i eth1 src host 211.167.237.199 and dst port 1467
00:09:27.603075 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180400:180544(144) ack 2833 win 8576
00:09:27.605631 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180544:180688(144) ack 2881 win 8576
截獲所有由eth0進入、源位址(src)為192.168.0.5的主機(host),并且(and)目标(dst)端口(port)為80的資料包
觀看網卡傳送、接收資料包的狀态
$ netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 14639 0 0 0 5705 119 0 0 BMRU
Iface: 網卡
RX-OK RX-ERR RX-DRP RX-OVR : 網卡正确接收資料包的數量以及發生錯誤、流失、碰撞的總數
TX-OK TX-ERR TX-DRP TX-OVR : 網卡正确發送資料包的數量以及發生錯誤、流失、碰撞的總數
01:33:40.41:這個是此封包被擷取的時間,『時:分:秒』的單位;
IP:透過的通訊協定是 IP ;
192.168.1.100.22 > :傳送端是 192.168.1.100 這個 IP,而傳送的 port number 為 22,您必須要瞭解的是,那個大於 (>) 的符號指的是封包的傳輸方向喔!
192.168.1.11.1190:接收端的 IP 是 192.168.1.11, 且該主機開啟 port 1190 來接收;
P 116:232(116):這個封包帶有 PUSH 的資料傳輸標誌, 且傳輸的資料為整體資料的 116~232 byte,是以這個封包帶有 116 bytes 的資料量;
ack 1 win 9648:ACK與 Window size 的相關資料。
再來,一個網路狀態很忙的主機上面,你想要取得某部主機對你連線的封包資料而已時, 使用 tcpdump 配合管線指令與正規表示法也可以,不過,畢竟不好捉取! 我們可以透過 tcpdump 的表示法功能,就能夠輕易的將所需要的資料獨立的取出來。 在上面的範例一當中,我們僅針對 eth0 做監聽,是以整個 eth0 介面上面的資料都會被顯示到螢幕上, 不好分析啊!那麼我們可以簡化嗎?例如隻取出 port 21 的連線封包,可以這樣做:
瞧!這樣就僅提出 port 21 的資訊而已,且仔細看的話,你會發現封包的傳遞都是雙向的, client 端發出『要求』而 server 端則予以『回應』,是以,當然是有去有回啊! 而我們也就可以經過這個封包的流向來瞭解到封包運作的過程。 舉例來說:
我們先在一個終端機視窗輸入『 tcpdump -i lo -nn 』 的監聽,
再另開一個終端機視窗來對本機 (127.0.0.1) 登入『ssh localhost』
那麼輸出的結果會是如何?
上表顯示的頭兩行是 tcpdump 的基本說明,然後:
第 3 行顯示的是『來自 client 端,帶有 SYN 主動連線的封包』,
第 4 行顯示的是『來自 server 端,除了回應 client 端之外(ACK),還帶有 SYN 主動連線的標誌;
第 5 行則顯示 client 端回應 server 確定連線建立 (ACK)
第 6 行以後則開始進入資料傳輸的步驟。
更神奇的使用要來啦!如果我們使用 tcpdump 在 router 上面監聽『明碼』的傳輸資料時, 例如 FTP 傳輸協定,你覺得會發生什麼問題呢? 我們先在主機端下達『 tcpdump -i lo port 21 -nn -X 』然後再以 ftp 登入本機,並輸入帳號與密碼, 結果你就可以發現如下的狀況:
上面的輸出結果已經被簡化過了,你必須要自行在你的輸出結果當中搜尋相關的字串才行。 從上面輸出結果的特殊字體中,我們可以發現『該 FTP 軟體使用的是 vsftpd ,並且使用者輸入 dmtsai 這個帳號名稱,且密碼是 mypasswordisyou』 嘿嘿!你說可不可怕啊!如果使用的是明碼的方式來傳輸你的網路資料? 是以我們才常常在講啊,網路是很不安全低!
另外你得瞭解,為了讓網路介面可以讓 tcpdump 監聽,是以執行 tcpdump 時網路介面會啟動在 『錯亂模式 (promiscuous)』,是以你會在 /var/log/messages 裡面看到很多的警告訊息, 通知你說你的網路卡被設定成為錯亂模式!別擔心,那是正常的。 至於更多的應用,請參考 man tcpdump 囉!
例題:如何使用 tcpdump 監聽 (1)來自 eth0 介面卡且 (2)通訊協定為 port 22 ,(3)目標來源為 192.168.1.100 的封包資料?
答:
tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.100'
本文轉自 運維小當家 51CTO部落格,原文連結:http://blog.51cto.com/solin/1888849,如需轉載請自行聯系原作者