tcpdump用法
- tcpdump
- 一、什么是tcpdump
- 二、命令格式與參數
- 三、參數列表
- 四、過濾規則組合
- 邏輯運算符
- 過濾器
- 關鍵字
- 理解 Flag 標識符
- 五、常用例子
tcpdump
一、什么是tcpdump
二、命令格式與參數
-
option 可選參數:將在后邊一一解釋。
-
proto 類過濾器:根據協議進行過濾,可識別的關鍵詞有: tcp, udp, icmp, ip, ip6, arp, rarp,ether,wlan, fddi, tr, decnet
-
type 類過濾器:可識別的關鍵詞有:host, net, port, portrange,這些詞后邊需要再接參數。
-
direction 類過濾器:根據數據流向進行過濾,可識別的關鍵字有:src, dst,同時你可以使用邏輯運算符進行組合,比如 src or dst
三、參數列表
設置不解析域名提升速度 | |
---|---|
-n | 不把ip轉化成域名,直接顯示 ip,避免執行 DNS lookups 的過程,速度會快很多 |
-nn | 不把協議和端口號轉化成名字,速度也會快很多。 |
-N | 不打印出host 的域名部分.。比如,,如果設置了此選現,tcpdump 將會打印’nic’ 而不是 ‘nic.ddn.mil’. |
過濾指定網卡的數據包 | |
---|---|
-i | 指定要過濾的網卡接口,如果要查看所有網卡,可以 -i any |
過濾特定流向的數據包 | |
---|---|
-Q | 選擇是入方向還是出方向的數據包,可選項有:in, out, inout,也可以使用 --direction=[direction] 這種寫法 |
常用的一些參數 | |
---|---|
-A | 以ASCII碼方式顯示每一個數據包(不顯示鏈路層頭部信息). 在抓取包含網頁數據的數據包時, 可方便查看數據 |
-l | 基于行的輸出,便于你保存查看,或者交給其它工具分析 tcpdump -nn -A -s1500 -l 通過 egrep 可以同時提取用戶代理和主機名(或其他頭文件) |
-q | 簡潔地打印輸出。即打印很少的協議相關信息, 從而輸出行都比較簡短 |
-c | 捕獲 count 個包 tcpdump 就退出 |
-s | tcpdump 默認只會截取前 96 字節的內容,要想截取所有的報文內容,可以使用 -s number , number 就是你要截取的報文字節數,如果是 0 的話,表示截取報文全部內容。 |
-S | 使用絕對序列號,而不是相對序列號 |
-C | file-size,tcpdump 在把原始數據包直接保存到文件中之前, 檢查此文件大小是否超過file-size. 如果超過了, 將關閉此文件,另創建一個文件繼續用于原始數據包的記錄. 新創建的文件名與-w 選項指定的文件名一致, 但文件名后多了一個數字.該數字會從1開始隨著新創建文件的增多而增加. file-size的單位是百萬字節(nt: 這里指1,000,000個字節,并非1,048,576個字節, 后者是以1024字節為1k, 1024k字節為1M計算所得, 即1M=1024 * 1024 = 1,048,576) |
-F | 使用file 文件作為過濾條件表達式的輸入, 此時命令行上的輸入將被忽略. |
過濾結果輸出到文件 | |
---|---|
-w | 使用 -w 參數后接一個以 .pcap 后綴命令的文件名,就可以將 tcpdump 抓到的數據保存到文件中。使用 wireshark 打開此文件便可進行分析tcpdump icmp -w icmp.pcap |
-r | 從文件中讀取數據,讀取后,我們照樣可以使用上述的過濾器語法進行過濾分析 tcpdump icmp -r all.pcap |
對輸出內容進行控制的參數 | |
---|---|
-D | 顯示所有可用網絡接口的列表 |
-e | 每行的打印輸出中將包括數據包的數據鏈路層頭部信息 |
-E | 揭秘IPSEC數據 |
-L | 列出指定網絡接口所支持的數據鏈路層的類型后退出 |
-Z | 后接用戶名,在抓包時會受到權限的限制。如果以root用戶啟動tcpdump,tcpdump將會有超級用戶權限。 |
-d | 打印出易讀的包匹配碼 |
-dd | 以C語言的形式打印出包匹配碼 |
-ddd | 以十進制數的形式打印出包匹配碼 |
-p | 不讓網絡接口進入混雜模式。默認情況下使用 tcpdump 抓包時,會讓網絡接口進入混雜模式。一般計算機網卡都工作在非混雜模式下,此時網卡只接受來自網絡端口的目的地址指向自己的數據。當網卡工作在混雜模式下時,網卡將來自接口的所有數據都捕獲并交給相應的驅動程序。如果設備接入的交換機開啟了混雜模式,使用 -p 選項可以有效地過濾噪聲。 |
控制詳細內容的輸出 | |
---|---|
-v | 產生詳細的輸出. 比如包的TTL,id標識,數據包長度,以及IP包的一些選項。同時它還會打開一些附加的包完整性檢測,比如對IP或ICMP包頭部的校驗和 |
-vv | 產生比-v更詳細的輸出. 比如NFS回應包中的附加域將會被打印, SMB數據包也會被完全解碼。(摘自網絡,目前我還未使用過) |
-vvv | 產生比-vv更詳細的輸出。比如 telent 時所使用的SB, SE 選項將會被打印, 如果telnet同時使用的是圖形界面,其相應的圖形選項將會以16進制的方式打印出來(摘自網絡,目前我還未使用過) |
控制時間的顯示 | |
---|---|
-t | 在每行的輸出中不輸出時間 |
-tt | 在每行的輸出中會輸出時間戳 |
-ttt | 輸出每兩行打印的時間間隔(以毫秒為單位) |
-tttt | 在每行打印的時間戳之前添加日期的打印(此種選項,輸出的時間最直觀) |
顯示數據包的頭部 | |
---|---|
-x | 以16進制的形式打印每個包的頭部數據(但不包括數據鏈路層的頭部) |
-xx | 以16進制的形式打印每個包的頭部數據(包括數據鏈路層的頭部) |
-X | 以16進制和 ASCII碼形式打印出每個包的數據(但不包括連接層的頭部),這在分析一些新協議的數據包很方便。 |
-XX | 以16進制和 ASCII碼形式打印出每個包的數據(包括連接層的頭部),這在分析一些新協議的數據包很方便 |
四、過濾規則組合
邏輯運算符
- and:所有的條件都需要滿足,也可以表示為
&&
- or:只要有一個條件滿足就可以,也可以表示為
||
- not:取反,也可以使用
!
過濾器
=
:判斷二者相等==
:判斷二者相等!=
:判斷二者不相等
關鍵字
- if:表示網卡接口名
- proc:表示進程名
- pid:表示進程 id
- svc:表示 service class
- dir:表示方向,in 和 out
- eproc:表示 effective process name
- epid:表示 effective process ID
理解 Flag 標識符
[S]
: SYN(開始連接)[.]
: 沒有 Flag[P]
: PSH(推送數據)[F]
: FIN (結束連接)[R]
: RST(重置連接)
五、常用例子
從 HTTP 請求頭中提取 HTTP 用戶代理:
tcpdump -nn -A -s1500 -l | grep "User-Agent:"
通過 egrep 可以同時提取用戶代理和主機名(或其他頭文件):
tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
只抓取 HTTP GET 和 POST 流量
抓取 HTTP GET 流量:
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
也可以抓取 HTTP POST 請求流量:
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
注意:該方法不能保證抓取到 HTTP POST 有效數據流量,因為一個 POST 請求會被分割為多個 TCP 數據包。