1. 程式人生 > >tcpdump簡介及使用

tcpdump簡介及使用

NIDS
=========================================================================
網路嗅探器
linux: tcpdump,wireshark
windows: sniffer

tcpdump可以將網路中傳送的資料包的“頭”完全截獲下來提供分析。它支援針對網路層、協議、主機、網路或埠的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的資訊
tos type of service
#tcpdump -i eth0 -nn

tcpdump [ -eflnNOpqStvx ] [ -c 數量 ] [ -F 檔名 ]
          [ -i 網路介面 ] [ -r 檔名] [ -s snaplen ]
          [ -T 型別 ] [ -w 檔名 ] [表示式 ]
   -e    在輸出行打印出資料鏈路層的頭部資訊包括源mac和目的mac,以及網路層的協議;
   -f    將外部的Internet地址以數字的形式打印出來;
   -l    使標準輸出變為緩衝行形式;
   -n    不把網路地址轉換成名字;
-nn 不把ip和port轉換成名字 一個n不要ip解析到域名,一個n不要port解析到協議 (有些時候解析會很慢)
   -t    在輸出的每一行不列印時間戳;
   -v    輸出一個稍微詳細的資訊,例如在ip包中可以包括ttl和服務型別的資訊;
   -vv    輸出詳細的報文資訊;
   -c    在收到指定的包的數目後,tcpdump就會停止;
   -F    從指定的檔案中讀取表示式,忽略其它的表示式;
   -i     指定監聽的網路介面;
   -w    直接將包寫入檔案中,並不分析和打印出來;
   -r    從指定的檔案中讀取包(這些包一般通過-w選項產生);   
   -T    將監聽到的包直接解釋為指定的型別的報文,常見的型別有rpc(遠端過程
呼叫)和snmp(簡單網路管理協議);
-S 指定列印每個監聽到的資料包的TCP絕對序列號而非相對序列號
-s 從每個報文中擷取snaplen位元組的資料,而不是預設的68(如果是SunOS的NIT,最小值是96).68個位元組適用於IP,ICMP,TCP和UDP,但是有可能截掉名字伺服器和NFS報文的協議資訊 ,採用更大的捕捉範圍既增加了處理報文的時間,又相應的減少了報文的緩衝數量,可能導致報文的丟失.你應該把snaplen設的儘量小,只要能夠容納你需要的協議資訊就可以了.
# tcpdump -i br1 -s 60 指定抓60個位元組長度,結果如下
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br1, link-type EN10MB (Ethernet), capture size 60 bytes

三種邏輯運算
取非運算 'not ' '! '
與運算 'and','&&'
或運算 'or' ,'||'
#tcpdump 'port 80 and (host 192.168.1.10 or host 192.168.1.11)'
第一種型別關鍵字 包括host ,net,port 定義捕獲資料包的範圍
如:截獲192.168.116.100 主機通訊所有資料包
# tcpdump host 192.168.116.100

如:截獲192.168.116.0/24該網路內資料包
# tcpdump net 192.168.116.0/24

如:截獲主機192.168.116.100 和 192.168.116.1 或者和 192.168.116.150通訊的資料包 注意'()' 轉譯括號
# tcpdump -nn host 192.168.116.100 and '(192.168.116.1 or 192.168.116.150)'

如 : 截獲主機192.168.116.100和 除了192.168.116.1通訊的資料
# tcpdump -nn host 192.168.116.100 and ! 192.168.116.1

如: 截獲192.168.116.100主機80埠收到和發出的所有資料包
#tcpdump host 192.168.116.100 and port 80

第二種是確定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,這些關鍵字指明瞭傳輸的方向 預設是src和dst

如:截獲源ip為192.168.116.100 並且 目標ip為192.168.116. 150的資料包
#tcpdump -nn src 192.168.116.100 and dst 192.168.116.150

如:截獲源ip為192.168.116.100 源埠 80 並且 目標ip為192.168.116. 150 目標埠 22 的資料包
#tcpdump -nn src 192.168.116.100 and src port 80 and dst 192.168.116.1 and dst port 22


第三種是協議的關鍵字,主要包括fddi,ip,arp,rarp,tcp,udp,icmp等型別。Fddi指明是在FDDI(分散式光纖資料介面網路)上的特定 的網路協議,實際上它是"ether"的別名,fddi和ether具有類似的源地址和目的地址,所以可以將fddi協議包當作ether的包進行處理和 分析。其他的幾個關鍵字就是指明瞭監聽的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的資訊包

截獲主機192.168.116.100 埠22 並且是tcp協議的資料包
#tcpdump -nn host 192.168.116.100 and port 22 and tcp

抓取網口eth0上192.168.116.250與除192.168.116.74外的其他主機之間的icmp報文
#tcpdump -i eth0 -s 1400 -nn host 192.168.116.250 and ! 192.168.116.74 and icmp -e

Wireshark(前稱Ethereal)是一個網路封包分析軟體。網路封包分析軟體的功能是擷取網路封包,並儘可能顯示出最為詳細的網路封包資料

tcpdump -i eth0 -nn protocol(arp icmp tcp udp )
tcpdump -i eth0 -nn port(80 21 22 23 ) -nnv h
tcpdump -i eth0 -nn port 80
tcpdump -i eth0 -nnv
tcpdump -i eth0 -nn host 192.168.1.1
tcpdump -i eth0 -nn net 192.168.1.0/24
tcpdump -i eth0 -nn src|dst port|host|net
tcpdump -i eth0 -nnv src port 80 and src host 192.168.1.1
tcpdump -i eth0 -nnv src port 80 or src port 22
tcpdump -i eth0 -nnv not port 5900
tcpdump -i eth0 -nnv 'host 192.168.1.1 and port 80' or 'host 192.168.1.2 and port 22'
============================
抓取標記為指定標記的包:
octet 八位組
在傳統的二進位制數字概念中,1 byte(位元組)=8 bit(位)。大多數因特網標準使用八位組(octet)這個術語而不是使用位元組來表示8位的量。該術語起始於TCP/IP發展的早期,當時許多早期的工作是在諸如DEC-10這樣的系統上進行的,然而這些系統的結構使用的

位元組(byte)長度不是8位(bit),因此出現了octet的單位,即準確定義 1 octet = 8 bit。

協議頭中第一個八位組是從0開始的
檢視tcpdump的man手冊,實際上flags標記位在第13個八位組(octet),標記從右到左是0到7
# tcpdump "tcp[13] & 0x03 != 0"
該過濾器跳過TCP頭的13個位元組,提取flag位元組。掩碼0x03選擇第一和第二位元位,即FIN和SYN位。如果其中一位不為0則報文被抓取。此命令會抓取TCP連線建立及關閉報文。
0 7| 15| 23| 31
----------------|----------------------|---------------|----------------
| HL| rsvd |C|E|U|A|P|R|S|F| window size |
----------------|----------------------|---------------|----------------
| | 13th octet | | |

Let’s have a closer look at octet no. 13:

| |
|----------------------|
|C|E|U|A|P|R|S|F|
|----------------------|
|7 5 3 0|


# tcpdump "tcp[13] & 0x03 != 0"
該過濾器抓取TCP頭排位13的八位組,提取flag位元組。掩碼0x03(換成2進位制就是00000011)選擇第一和第二位元位,即FIN和SYN位。如果其中一位不為0則報文被抓取。此命令會抓取TCP連線建立及關閉報文。
# tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0

# tcpdump -i lo "ip[9] = 6" 檢視IP頭的9號八位組,協議值為6(tcp) 注:udp值17, 1表示為ICMP協議, 2表示為IGMP協議
# tcpdump -i lo "icmp[0] = 8" 檢視icmp頭的0號八位組,8表示icmp-request


----------
關鍵字
gateway, broadcast,less,greater

列印所有通過閘道器snup的ftp資料包(注意, 表示式被單引號括起來了, 這可以防止shell對其中的括號進行錯誤解析)
#tcpdump 'gateway snup and (port ftp or ftp-data)'
如果資料包的閘道器地址是host, 則與此對應的條件表示式為真. 需要注意的是, 這裡的閘道器地址是指乙太網地址, 而不是IP 地址( 例如, 可理解為'注意'.the Ethernet source or destination address, 乙太網源和目標地址, 可理解為, 指代上句中的'閘道器地址' ).host 必須是名字而不是數字, 並且必須在機器的'主機名-ip地址'以及'主機名-以太地址'兩大對映關係中有其條目(前一對映關係可通過/etc/hosts檔案, DNS 或 NIS得到, 而後一對映關係可通過/etc/ethers 檔案得到

less length
如果資料包的長度比length 小或等於length, 則與此對應的條件表示式為真. 這與'len <= length' 的含義一致.

greater length
如果資料包的長度比length 大或等於length, 則與此對應的條件表示式為真. 這與'len >= length' 的含義一致.