平時分析客戶端和服務器網絡交互的問題時,很多情況下需要在客戶端和服務器抓包分析報文。
一般win下抓包使用WireShark即可,但是linux下就需要用到tcpdump了,下面是一些對於tcpdump的使用說明。
tcpdump可以將網絡傳送的數據包的"頭"截獲下來提供分析。
它支持針對網絡層,協議,主機,網絡或端口的過濾,並提供and,or,not等邏輯語句幫助你過濾無用信息。
一. 基本使用
關鍵字使類型:
第一種是關於類型的關鍵字,主要包括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將會監聽所有協議的信息包。
-
默認
tcpdump
監視第一個網絡節點上流過的所有數據包。
-
監視指定網絡接口
tcpdump -i eth1
-
監視指定主機的數據包
tcpdump host cas1
監視所有來自或去往cas1的包
tcpdump host 10.10.10.1
當然也可以指定IP
tcpdump -i eth0 src host cas1
截獲主機cas1發送的所有數據tcpdump -i eth0 dst host cas1
監視所有發送到主機cas1的數據 -
指定端口
tcpdump tcp port 23 and host cas1
獲取和主機cas1交互的所有telnet包
tcpdump udp port 123
監視本機UDP的ntp服務端口
tcpdump -i eth0 -vnn src host 10.10.10.122 and not port 22
抓取源ip是10.10.10.122且端口不是22的數據包
tcpdump -i eth0 -vnn \( src host 10.10.10.2 and dst port 22 \) or \( src host 10.10.10.65 and dst port 80 \)
tcpdump -i eth0 -vnn 'src host 10.10.10.2 and dst port 22' or ' src host 10.10.10.65 and dst port 80 '
抓取源ip是10.10.10.2且目的端口是22,或源ip是10.10.10.65且目的端口是80的數據包。
-
指定網段
tcpdump -i eth0 -vnn net 10.10.10.0/24
抓取包含10.10.10.0網段的數據包
抓取icmp協議的數據包
tcpdump -i eth0 -vnn icmp
- 抓取報文保存到文件
tcpdump –i eth0 -vnn -w /tmp/fil1 -c 100
把抓取的數據包記錄存到/tmp/fill文件中,當抓取100個數據包后就退出程序。
tcpdump –i eth0 -vnn -r /tmp/fil1 tcp
從/tmp/fill記錄中讀取tcp協議的數據包
tcpdump –i eth0 -vnn -r /tmp/fil1 host 10.10.10.58
從/tmp/fill記錄中讀取包含10.10.10.58的數據包
二. 參數詳解:
-a |
將網絡地址和廣播地址轉變成名字 |
-d |
將匹配信息包的代碼以人們能夠理解的匯編格式給出 |
-dd |
將匹配信息包的代碼以c語言程序段的格式給出 |
-ddd |
將匹配信息包的代碼以十進制的形式給出 |
-e |
在輸出行打印出數據鏈路層的頭部信息,包括源mac和目的mac,以及網絡層的協議 |
-f |
將外部的Internet地址以數字的形式打印出來 |
-l |
使標准輸出變為緩沖行形式 |
-n |
指定將每個監聽到數據包中的域名轉換成IP地址后顯示,不把網絡地址轉換成名字 |
-nn |
指定將每個監聽到的數據包中的域名轉換成IP、端口從應用名稱轉換成端口號后顯示 |
-t |
在輸出的每一行不打印時間戳 |
-v |
輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息 |
-vv |
輸出詳細的報文信息 |
-c |
在收到指定的包的數目后,tcpdump就會停止 |
-F |
從指定的文件中讀取表達式,忽略其它的表達式 |
-i |
指定監聽的網絡接口 |
-p |
將網卡設置為非混雜模式,不能與host或broadcast一起使用 |
-P |
指定要抓取的包是流入還是流出的包。可以給定的值為"in"、"out"和"inout",默認為"inout"。 |
-r |
從指定的文件中讀取包(這些包一般通過-w選項產生) |
-w |
直接將包寫入文件中,並不分析和打印出來 |
-T |
將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議) |
-X |
需要把協議頭和包內容都原原本本的顯示出來(tcpdump會以16進制和ASCII的形式顯示),這在進行協議分析時是絕對的利器。 |
-XX |
當分析和打印時, tcpdump 會打印每個包的頭部數據, 同時會以16進制和ASCII碼形式打印出每個包的數據, 其中包括數據鏈路層的頭部.這對於分析一些新協議的數據包很方便. |