抓包分析工具—tcpdump

   tcpdump(dump the traffic on a network)是一款在Unix下一款比較實用的一款用於分析數據包的工具,它支持針對網絡層、協議、主機、網絡或端口的過濾,並提供and、or、not等邏輯語句、布爾表達式對報文的報頭匹配,在linux系統下如果未安裝可以通過yum來安裝,不過要注意的是在使用需要相應的權限:

對於SunOS 的nit或bpf界面: 要運行tcpdump , 必須有/dev/nit或/dev/bpf* 的讀訪問權限;
對於Solaris的dlpi: 必須有網絡仿真設備 (network pseudo device), 如 /dev/le的讀訪問權限;
對於HP-UX的dlpi、IRIX的snoop、Linux: 必須是root, 或者把它安裝成 root 的設置uid 程序;
對於 Ultrix和Digital UNIX: 一旦超級用戶使用promiscuous 操作模式 (promiscuous-mode), 任何用戶 都可以 運行 tcpdump;
對於BSD: 必須有/dev/bpf*的讀訪問權限。

而tcpdump的常用選項參數如下:

       -A     數據包內容以ASCII顯示,通常用來抓取網頁的數據包數據.
       -a     試着 把 網絡和廣播地址轉換成名稱.
       -c     監聽數據包數,如果沒有帶這個參數tcpdump會不斷的監聽,當收到count報文後退出.
       -d     把編譯過的數據包編碼轉換成可閱讀的格式,並傾倒到標準輸出.
       -dd    把編譯過的數據包編碼轉換成C語言的格式,並傾倒到標準輸出.
       -ddd   把編譯過的數據包編碼轉換成十進制數字的格式,並傾倒到標準輸出.
       -e     顯示數據鏈路層的數據包.
       -f     用數字顯示網際網絡地址.
       -F     指定內含表達方式的文件.
       -i     監聽的網絡接口.
       -l     使用標準輸出列的緩衝區.
       -n     不把主機的網絡地址轉換成ip
       -N     不列出域名.
       -O     不將數據包編碼最佳化,這個選項只有當你懷疑優化器有bug時纔有用.
       -p     不讓網絡界面進入混雜模式.
       -q     快速輸出,僅列出少數的傳輸協議信息.
       -r     從指定的文件讀取數據包數據.
       -s     設置每個數據包的大小.
       -T     強制將表達方式所指定的數據包轉譯成設置的數據包類型.目前已知的類型有: rpc (遠程過程調用 Remote Procedure Call), rtp
              (實時應用協議 Real-Time Applications protocol), rtcp (實時應用控制協議 Real-Time Applications control  protocol),  vat  (可視音頻工具
              Visual Audio Tool), 和 wb (分佈式白板 distributed White Board).
       -S     用絕對而非相對數值列出TCP關聯數.
       -t     禁止顯示時戳標誌.
       -tt    顯示未格式化的時戳標誌.
       -v     詳細顯示指令執行過程. 例如, 顯示IP數據報中的生存週期和服務類型.
       -vv    更詳細顯示指令執行過程. 例如,顯示NFS應答報文的附加域.
       -w     把數據包數據寫入指定的文件.
       -x     以 16進制數形式顯示每一個報文(去掉鏈路層報頭後).可以顯示較小的完整報文,否則只顯示snaplen個字節.
       expression表達式:
              用來選擇要轉儲的數據報.如果沒有指定expression , 就轉儲網絡的全部報文.否則, 只轉儲相對expression爲邏輯爲真的數據包報文.
 
              expression 由一個或多個原語(primitive)組成.原語通常由一個標識(id,名稱或數字),和標識前面的一個或多個修飾子(qualifier)組成.修飾子有三種不同的類型:
 
              type   類型修飾子指出標識名稱或標識數字代表什麼類型的東西.可以使用的類型有host,net和port.例如,`host foo', `net128.3', `port 20'.如果不指定類型修飾子, 就使用缺省的host . 
              dir    方向修飾子 指出 相對於 標識 的 傳輸方向 (數據是 傳入還是傳出 標識).  可以使用的 方向 有 src, dst, src or dst 和 src  and  dst.
                     例如, `src foo', `dst net 128.3', `src or dst port ftp-data'.  如果 不指定 方向修飾子, 就使用 缺省的 src or dst .  對於 `null'
                     鏈路層 (就是說 象 slip 之類的 點到點 協議), 用 inbound 和 outbound 修飾子 指定 所需的 傳輸方向. 
              proto  協議修飾子 要求 匹配 指定的協議. 可以使用的 協議 有: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp  和  udp.
                     例如, `ether src foo', `arp net 128.3', `tcp port 21'.  如果 不指定 協議修飾子, 就使用 所有 符合 類型 的 協議. 例如, `src foo'
                     指 `(ip 或 arp 或 rarp) src foo' (注意後者不符合語法), `net bar' 指 `(ip 或 arp 或 rarp) net bar',  `port 53' 指 `(tcp 或 udp)
                     port 53'. 
              更復雜的過濾器表達式可以通過 and, or 和 not 連接原語來組建. 例如, `host  foo  and  not  port  ftp  and  not  port  ftp-data'.
              允許的 原語 有:
              dst host host
                     如果報文中IP的目的地址域是host, 則邏輯爲真.host既可以是地址,也可以是主機名.
 
              src host host
                     如果報文中IP的源地址域是host,則邏輯爲真.
 
              host host
                     如果報文中IP的源地址域或者目的地址域是host,則邏輯爲真.上面所有的host表達式都可以加上ip,arp,或rarp關鍵字做前綴,就象:ip host host
                     它等價於:
                          ether proto \ip and host host
                     如果host是擁有多個IP地址的主機名,它的每個地址都會被查驗.
 
              ether dst ehost
                     如果報文的以太目的地址是ehost,則邏輯爲真. Ehost既可以是名字 (/etc/ethers 裏有), 也可以是數字
 
              ether src ehost
                     如果報文的以太源地址是ehost,則邏輯爲真.
 
              ether host ehost
                     如果報文的以太源地址或以太目的地址是ehost,則邏輯爲真.
 
              gateway host
                     如果報文把host當做網關, 則邏輯爲真.
                     
              dst net net
                     如果報文的IP目的地址屬於網絡號net,則邏輯爲真. 
 
              src net net
                     如果報文的IP源地址屬於網絡號net,則邏輯爲真.
 
              net net
                     如果報文的IP源地址或目的地址屬於網絡號net, 則邏輯爲真.
 
              net net mask mask
                     如果IP地址匹配指定網絡掩碼(netmask)的net,則邏輯爲真.本原語可以用src或dst修飾.
 
              net net/len
                     如果IP地址匹配指定網絡掩碼的net, 則邏輯爲真.
 
              dst port port
                     如果報文是ip/tcp或ip/udp, 並且目的端口是port, 則邏輯爲真.
 
              src port port
                     如果報文的源端口號是port,則邏輯爲真.
 
              port port
                     如果報文的源端口或目的端口是port,則邏輯爲真.
 
              less length
                     如果報文的長度小於等於length,則邏輯爲真. 它等同於:len <= length.
 
              greater length
                     如果報文的長度大於等於length,則邏輯爲真. 它等同於:len >= length.
 
              ip proto protocol
                     如果報文是IP數據報, 其內容的協議類型是protocol,則邏輯爲真.
 
              ether broadcast
                     如果報文是以太廣播報文,則邏輯爲真.關鍵字ether是可選的.
 
              ip broadcast
                     如果報文是IP廣播報文,則邏輯爲真.Tcpdump檢查全0和全1廣播約定,並且檢查本地的子網掩碼.
 
              ether multicast
                     如果報文是以太多目傳送報文(multicast),則邏輯爲真. 關鍵字ether是可選的.
 
              ip multicast
                     如果報文是IP多目傳送報文,則邏輯爲真.

總之tcpdump的使用還是可以滿足日常的數據包分析使用的,如下以下一些例子:

監聽來自eth0網卡且通信協議爲ssh(缺省22端口)來源於192.168.2.100的數據包數據

[root@localhost ~]# tcpdump -i eth0 -nn 'port 22 and src host 192.168.2.100'

截獲主機192.168.1.100和主機192.168.2.100或192.168.0.100的通信

[root@localhost ~]# tcpdump host 192.168.1.100 and \(192.168.1.100 or 192.168.0.100\)

截取本機的udp協議的ntp(缺省123端口)

[root@localhost ~]# tcpdump udp port 123

總之,在日常可以使用tcpdump來對各種數據包進行分析,在這裏就不做過多的說明,需要更多tcpdump的使用可以看相關的man幫助手冊,當然是用tcpdump對七層上數據沒有做比較徹底的解碼,所以平時也可把抓取的數據包寫入文件後使用wireshark來進行進一步的分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章