概述
用簡單的話來定義 tcpdump,就是:dump the traffic on a network,根據(jù)使用者的定義對網(wǎng)絡(luò)上的數(shù)據(jù)包進(jìn)行截獲的包分析工具。
tcpdump 可以將網(wǎng)絡(luò)中傳送的數(shù)據(jù)包的“頭”完全截獲下來提供分析。它支持針對網(wǎng)絡(luò)層、協(xié)議、主機、網(wǎng)絡(luò)或端口的過濾,并提供 and、or、not 等邏輯語句來幫助你去掉無用的信息。
tcpdump 基于底層 libpcap 庫開發(fā),運行需要 root 權(quán)限。
一、tcpdump 安裝
環(huán)境 虛擬機:vmware 15.5.2 os: ubuntu 12.04
安裝 tcpdump
sudo?apt-get?install?tcpdump
3. 版本查看
tcpdump?--h
tcpdump version 4.0。
libpcap version 1.1.1 ? ?表示 libpcap 的版本。
二、tcpdump 參數(shù)
常用參數(shù)選項說明:
參數(shù) | 含義 |
---|---|
-a | 將網(wǎng)絡(luò)地址和廣播地址轉(zhuǎn)變成名字 |
-c | 在收到指定的包的數(shù)目后,tcpdump 就會停止; |
-d | 將匹配信息包的代碼以人們能夠理解的匯編格式給出;以可閱讀的格式輸出。 |
-dd | 將匹配信息包的代碼以 c 語言程序段的格式給出; |
-ddd | 將匹配信息包的代碼以十進(jìn)制的形式給出; |
-e | 在輸出行打印出數(shù)據(jù)鏈路層的頭部信息; |
-f | 將外部的 Internet 地址以數(shù)字的形式打印出來; |
-l | 使標(biāo)準(zhǔn)輸出變?yōu)榫彌_行形式; |
-n | 直接顯示 IP 地址,不顯示名稱; |
-nn | 端口名稱顯示為數(shù)字形式,不顯示名稱; |
-t | 在輸出的每一行不打印時間戳; |
-v | 輸出一個稍微詳細(xì)的信息,例如在 ip 包中可以包括 ttl 和服務(wù)類型的信息; |
-vv | 輸出詳細(xì)的報文信息; |
-F | 從指定的文件中讀取表達(dá)式,忽略其它的表達(dá)式; |
-i | 指定監(jiān)聽的網(wǎng)絡(luò)接口; |
-r | 從指定的文件中讀取包(這些包一般通過 -w 選項產(chǎn)生); |
-w | 直接將包寫入文件中,并不分析和打印出來; |
-T | 將監(jiān)聽到的包直接解釋為指定的類型的報文,常見的類型有 rpc (遠(yuǎn)程過程調(diào)用)和 snmp(簡單 網(wǎng)絡(luò)管理協(xié)議;) |
三、命令選項使用舉例
1. 截獲主機收到和發(fā)出的所有數(shù)據(jù)包。
命令:
tcpdump
說明:
tcpdump 截取包默認(rèn)顯示數(shù)據(jù)包的頭部。
普通情況下,直接啟動 tcpdump 將監(jiān)視第一個網(wǎng)絡(luò)接口上所有流過的數(shù)據(jù)包。
基礎(chǔ)格式:時間 數(shù)據(jù)包類型 源 IP 端口 / 協(xié)議 > 目標(biāo) IP 端口 / 協(xié)議 協(xié)議詳細(xì)信息
按下 Ctrl+C 會終止 tcpdump 命令。且會在結(jié)尾處生成統(tǒng)計信息。
終止 tcpdump
2. 指定抓包數(shù)量 -c
指定抓取 2 個數(shù)據(jù)包。
命令:
tcpdump?-c?2
說明:
最后會自動生成統(tǒng)計信息。
【注意,已經(jīng)切換到管理員了,虛擬機中要產(chǎn)生數(shù)據(jù)包,可以另外開一個窗口 ping baidu.com 后面不再提示】
ping baidu.com
3. 將抓包信息寫入文件 -w
使用 -w 選項指定記錄文件。
命令:
tcpdump?-c?10?-w?tcpdump_test.log
說明:
保存的文件不是文本格式,不能直接查看。tcpdump 保存的文件的格式是幾乎所有主流的抓包工具軟件都可以讀取。所以可以使用更易讀的圖形界面工具來查看記錄文件。
4. 讀取記錄文件 -r
使用 -r 選項讀取文件。
命令:
tcpdump?-r?tcpdump_test.log
![讀取記錄文件
5. 打印出所有可工作的接口 -D
命令:
tcpdump?-D
其中網(wǎng)卡為 eth0。
6. 指定監(jiān)控的網(wǎng)卡 -i
命令:
tcpdump?-i?eth0
如果不指定網(wǎng)卡,默認(rèn) tcpdump 只會監(jiān)視第一個網(wǎng)絡(luò)接口,一般是 eth0。
7. 顯示更詳細(xì)的數(shù)據(jù)包信息 -v ?-vv
選項 -v,-vv 可以顯示更詳細(xì)的抓包信息。
tcpdump -v
tcpdump -vv
8. 不使用域名反解 -n
使用 -n 后,tcpdump 會直接顯示 IP 地址,不會顯示域名(與 netstat 命令相似)。
9. 增加抓包時間戳 -tttt 選項
tcpdump 的所有輸出打印行中都會默認(rèn)包含時間戳信息;時間戳信息的顯示格式如下
hh:mm:ss.frac?(nt:?小時:分鐘:秒 .)
此時間戳的精度與內(nèi)核時間精度一致, 反映的是內(nèi)核第一次看到對應(yīng)數(shù)據(jù)包的時間;
而數(shù)據(jù)包從物理線路傳遞到內(nèi)核的時間, 以及內(nèi)核花費在此包上的中斷處理時間都沒有算進(jìn)來;
使用 -tttt 選項,抓包結(jié)果中將包含抓包日期:
命令:
tcpdump?-tttt
增加抓包時間戳
四、條件過濾
1. 過濾:指定需要抓取的協(xié)議
tcpdump 可以只抓某種協(xié)議的包,支持指定以下協(xié)議:「ip,ip6,arp,tcp,udp,wlan」等。
命令:
tcpdump?udp
tcpdump?icmp
tcpdump?tcp
tcpdump?arp
2. 過濾:指定協(xié)議的端口號
使用 port 參數(shù),用于指定端口號。
命令:tcpdump tcp port 80
使用 portrange 參數(shù),用于指定端口范圍。
命令:tcpdump tcp portrange 1-1024
3. 過濾:指定源與目標(biāo)
src 表示源。
dst 表示目標(biāo)。
命令:
tcpdump src port 8080
tcpdump dst port 80
4. 過濾:指定特定主機的消息包
使用 host 指定需要監(jiān)聽的主機。
命令:
tcpdump?host?192.168.1.113
注意:若使用了 host 參數(shù)使用了計算機名或域名。例 tcpdump host shi-pc ,則無法再使用 -n 選項。
5. 過濾:指定數(shù)據(jù)包大小
使用 greater(大于)與 less(小于)可以指定數(shù)據(jù)包大小的范圍。
「例:只抓取大于 1000 字節(jié)的數(shù)據(jù)包?!?/p>
命令:
tcpdump?greater?1000
「例:只抓取小于 10 字節(jié)的數(shù)據(jù)包。」
命令:
tcpdump?less?10
五、 邏輯表達(dá)式
使用基本邏輯組合拼裝出更精細(xì)的過濾條件。
1. 邏輯與
邏輯與關(guān)系,使用 and。
命令:
tcpdump?tcp?and?host?192.168.1.112
tcpdump?tcp?and?src?192.168.1.112?and?port?8080
2. 邏輯或
邏輯或關(guān)系,使用 or。
命令:
tcpdump?host?192.168.1.112?or?192.168.1.113
3. 邏輯非
邏輯非關(guān)系,使用 not,也可以使用 ! 。
若使用 ! 必須與其后面的字符隔開一個空格。
例:當(dāng)通過 ssh 協(xié)議遠(yuǎn)程使用 tcpdump 時,為了避免 ssh 的數(shù)據(jù)包的輸出,所以一般需要禁止 ssh 數(shù)據(jù)包的輸出。
命令:
tcpdump?not?tcp?port?22
tcpdump?!?tcp?port?22
4. 括號
括號需要使用在引號內(nèi),或轉(zhuǎn)意使用。否則會報錯。
例:抓取非 22 端口,且主機為 192.168.1.112 和 192.168.1.113 的 TCP 數(shù)據(jù)包。
命令:
tcpdump?not?tcp?port?22?and?host?192.168.1.112or192.168.1.113
tcpdump?"not?tcp?port?22?and?host?(192.168.1.112?or?192.168.1.113)"
tcpdump?not?tcp?port?22?and?host?"(192.168.1.112?or?192.168.1.113)"
六、其他實例
1. 打印所有進(jìn)入或離開 sundown 的數(shù)據(jù)包 .
tcpdump?host?sundown
2. 截獲主機 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?)??
3. 如果想要獲取主機 210.27.48.1 除了和主機 210.27.48.2 之外所有主機通信的 ip 包,使用命令:
tcpdump?ip?host?210.27.48.1?and?!?210.27.48.2
4. 監(jiān)視所有送到主機 hostname 的數(shù)據(jù)包
tcpdump?-i?eth0?dst?host?hostname
5. 獲取主機 210.27.48.1 接收或發(fā)出的 telnet 包
23 為 telnet 的端口
tcpdump?tcp?port?23?and?host?210.27.48.1
6. 監(jiān)視本機的 udp 123 端口
123 為 ntp 的服務(wù)端口
tcpdump?udp?port?123?
7. 使用 tcpdump 抓取 HTTP 包
tcpdump??-XvvennSs?0?-i?eth0?tcp[20:2]=0x4745?or?tcp[20:2]=0x4854
- 0x4745 為"GET"前兩個字母"GE",0x4854 為"HTTP"前兩個字母"HT"。
tcpdump 對截獲的數(shù)據(jù)并沒有進(jìn)行徹底解碼,數(shù)據(jù)包內(nèi)的大部分內(nèi)容是使用十六進(jìn)制的形式直接打印輸出的。
顯然這不利于分析網(wǎng)絡(luò)故障,通常的解決辦法是先使用帶**-w 參數(shù)的 tcpdump 截獲數(shù)據(jù)并保存到文件中**,然后再使用其他程序(如 Wireshark)進(jìn)行解碼分析。當(dāng)然也應(yīng)該定義過濾規(guī)則,以避免捕獲的數(shù)據(jù)包填滿整個硬盤。
六、查看數(shù)據(jù)包完整內(nèi)容
tcpdump 默認(rèn)不顯示數(shù)據(jù)包的詳細(xì)內(nèi)容。
方法一:
使用 -A 參數(shù)能以 ASCII 碼顯示數(shù)據(jù)包。
例:只抓取 1 個數(shù)據(jù)包,并顯示其內(nèi)容。
命令:
tcpdump?-c?1?-A
方法二:
使用 -X 參數(shù)能 16 進(jìn)制數(shù)與 ASCII 碼共同顯示數(shù)據(jù)包。
例:只抓取 1 個數(shù)據(jù)包,并顯示其內(nèi)容。
命令:
tcpdump?-c?1?-X
七、tcpdump 與 wireshark
Wireshark(以前是 ethereal)是 Windows 下非常簡單易用的抓包工具,現(xiàn)在也有 Linux 版本。
通過 Tcpdump 抓取的數(shù)據(jù)包分析比較麻煩,要想很方便的分析數(shù)據(jù)包, 我們可以用 Tcpdump + Wireshark 的完美組合實現(xiàn):在 Linux 里抓包,然后在 Windows 里分析包。
保存數(shù)據(jù)包為 wireshark 能識別的文件:
tcpdump?tcp?-i?eth1?-t?-s?0?-c?100?and?dst?port?!?22?and?src?net?192.168.1.0/24?-w?./target.cap
參數(shù) | 含義 |
---|---|
tcp | ip icmp arp rarp 和 tcp、udp、icmp 這些選項等都要放到第一個參數(shù)的位置,用來過濾數(shù)據(jù)報的類型 |
-i eth1 | 只抓經(jīng)過接口 eth1 的包 |
-t | 不顯示時間戳 |
-s 0 | 抓取數(shù)據(jù)包時默認(rèn)抓取長度為 68 字節(jié)。加上 -S 0 后可以抓到完整的數(shù)據(jù)包 |
-c 100 | 只抓取 100 個數(shù)據(jù)包 |
dst port ! 22 | 不抓取目標(biāo)端口是 22 的數(shù)據(jù)包 |
src net 192.168.1.0/24 | 數(shù)據(jù)包的源網(wǎng)絡(luò)地址為 192.168.1.0/24 |
-w ./target.cap | 保存成 cap 文件,方便用 ethereal(即 wireshark)分析 |