加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 概述
    • 一、tcpdump 安裝
    • 二、tcpdump 參數(shù)
    • 三、命令選項(xiàng)使用舉例
    • 四、條件過濾
    • 五、 邏輯表達(dá)式
    • 六、其他實(shí)例
    • 六、查看數(shù)據(jù)包完整內(nèi)容
    • 七、tcpdump 與 wireshark
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

網(wǎng)絡(luò)命令行抓包工具tcpdump詳解

2021/01/05
312
閱讀需 15 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

概述

用簡單的話來定義 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é)議、主機(jī)、網(wǎng)絡(luò)或端口的過濾,并提供 and、or、not 等邏輯語句來幫助你去掉無用的信息。

tcpdump 基于底層 libpcap 庫開發(fā),運(yùn)行需要 root 權(quán)限。

一、tcpdump 安裝

環(huán)境 虛擬機(jī):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ù)選項(xiàng)說明:

參數(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 在輸出的每一行不打印時(shí)間戳;
-v 輸出一個(gè)稍微詳細(xì)的信息,例如在 ip 包中可以包括 ttl 和服務(wù)類型的信息;
-vv 輸出詳細(xì)的報(bào)文信息;
-F 從指定的文件中讀取表達(dá)式,忽略其它的表達(dá)式;
-i 指定監(jiān)聽的網(wǎng)絡(luò)接口
-r 從指定的文件中讀取包(這些包一般通過 -w 選項(xiàng)產(chǎn)生);
-w 直接將包寫入文件中,并不分析和打印出來;
-T 將監(jiān)聽到的包直接解釋為指定的類型的報(bào)文,常見的類型有 rpc (遠(yuǎn)程過程調(diào)用)和 snmp(簡單 網(wǎng)絡(luò)管理協(xié)議;)

三、命令選項(xiàng)使用舉例

1. 截獲主機(jī)收到和發(fā)出的所有數(shù)據(jù)包。

命令:

tcpdump

說明:

tcpdump 截取包默認(rèn)顯示數(shù)據(jù)包的頭部。

普通情況下,直接啟動 tcpdump 將監(jiān)視第一個(gè)網(wǎng)絡(luò)接口上所有流過的數(shù)據(jù)包。

基礎(chǔ)格式:時(shí)間 數(shù)據(jù)包類型 源 IP 端口 / 協(xié)議 > 目標(biāo) IP 端口 / 協(xié)議 協(xié)議詳細(xì)信息

按下 Ctrl+C 會終止 tcpdump 命令。且會在結(jié)尾處生成統(tǒng)計(jì)信息。

終止 tcpdump

2. 指定抓包數(shù)量 -c

指定抓取 2 個(gè)數(shù)據(jù)包。

命令:

tcpdump?-c?2

說明:

最后會自動生成統(tǒng)計(jì)信息。

【注意,已經(jīng)切換到管理員了,虛擬機(jī)中要產(chǎn)生數(shù)據(jù)包,可以另外開一個(gè)窗口 ping baidu.com 后面不再提示】

ping baidu.com

3. 將抓包信息寫入文件 -w

使用 -w 選項(xiàng)指定記錄文件。

命令:

tcpdump?-c?10?-w?tcpdump_test.log

說明:

保存的文件不是文本格式,不能直接查看。tcpdump 保存的文件的格式是幾乎所有主流的抓包工具軟件都可以讀取。所以可以使用更易讀的圖形界面工具來查看記錄文件。

4. 讀取記錄文件 -r

使用 -r 選項(xiàng)讀取文件。

命令:

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)視第一個(gè)網(wǎng)絡(luò)接口,一般是 eth0。

7. 顯示更詳細(xì)的數(shù)據(jù)包信息 -v ?-vv

選項(xiàng) -v,-vv 可以顯示更詳細(xì)的抓包信息。

tcpdump -v

tcpdump -vv

8. 不使用域名反解 -n

使用 -n 后,tcpdump 會直接顯示 IP 地址,不會顯示域名(與 netstat 命令相似)。

9. 增加抓包時(shí)間戳 -tttt 選項(xiàng)

tcpdump 的所有輸出打印行中都會默認(rèn)包含時(shí)間戳信息;時(shí)間戳信息的顯示格式如下

hh:mm:ss.frac?(nt:?小時(shí):分鐘:秒 .)

此時(shí)間戳的精度與內(nèi)核時(shí)間精度一致, 反映的是內(nèi)核第一次看到對應(yīng)數(shù)據(jù)包的時(shí)間;

而數(shù)據(jù)包從物理線路傳遞到內(nèi)核的時(shí)間, 以及內(nèi)核花費(fèi)在此包上的中斷處理時(shí)間都沒有算進(jìn)來;

使用 -tttt 選項(xiàng),抓包結(jié)果中將包含抓包日期:

命令:

tcpdump?-tttt

增加抓包時(shí)間戳

四、條件過濾

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. 過濾:指定特定主機(jī)的消息包

使用 host 指定需要監(jiān)聽的主機(jī)。

命令:

tcpdump?host?192.168.1.113

注意:若使用了 host 參數(shù)使用了計(jì)算機(jī)名或域名。例 tcpdump host shi-pc ,則無法再使用 -n 選項(xiàng)。

5. 過濾:指定數(shù)據(jù)包大小

使用 greater(大于)與 less(小于)可以指定數(shù)據(jù)包大小的范圍。

「例:只抓取大于 1000 字節(jié)的數(shù)據(jù)包?!?/p>

命令:

tcpdump?greater?1000

「例:只抓取小于 10 字節(jié)的數(shù)據(jù)包?!?/p>

命令:

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,也可以使用 ! 。

若使用 ! 必須與其后面的字符隔開一個(gè)空格。

例:當(dāng)通過 ssh 協(xié)議遠(yuǎn)程使用 tcpdump 時(shí),為了避免 ssh 的數(shù)據(jù)包的輸出,所以一般需要禁止 ssh 數(shù)據(jù)包的輸出。

命令:

tcpdump?not?tcp?port?22


tcpdump?!?tcp?port?22

4. 括號

括號需要使用在引號內(nèi),或轉(zhuǎn)意使用。否則會報(bào)錯(cuò)。

例:抓取非 22 端口,且主機(jī)為 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)"

六、其他實(shí)例

1. 打印所有進(jìn)入或離開 sundown 的數(shù)據(jù)包 .

tcpdump?host?sundown

2. 截獲主機(jī) 210.27.48.1 和主機(jī) 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. 如果想要獲取主機(jī) 210.27.48.1 除了和主機(jī) 210.27.48.2 之外所有主機(jī)通信的 ip 包,使用命令:

tcpdump?ip?host?210.27.48.1?and?!?210.27.48.2

4. 監(jiān)視所有送到主機(jī) hostname 的數(shù)據(jù)包

tcpdump?-i?eth0?dst?host?hostname

5. 獲取主機(jī) 210.27.48.1 接收或發(fā)出的 telnet 包

23 為 telnet 的端口

tcpdump?tcp?port?23?and?host?210.27.48.1

6. 監(jiān)視本機(jī)的 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"前兩個(gè)字母"GE",0x4854 為"HTTP"前兩個(gè)字母"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ù)包填滿整個(gè)硬盤。

六、查看數(shù)據(jù)包完整內(nèi)容

tcpdump 默認(rèn)不顯示數(shù)據(jù)包的詳細(xì)內(nèi)容。

方法一:

使用 -A 參數(shù)能以 ASCII 碼顯示數(shù)據(jù)包。

例:只抓取 1 個(gè)數(shù)據(jù)包,并顯示其內(nèi)容。

命令:

tcpdump?-c?1?-A

方法二:

使用 -X 參數(shù)能 16 進(jìn)制數(shù)與 ASCII 碼共同顯示數(shù)據(jù)包。

例:只抓取 1 個(gè)數(shù)據(jù)包,并顯示其內(nèi)容。

命令:

tcpdump?-c?1?-X

七、tcpdump 與 wireshark

Wireshark(以前是 ethereal)是 Windows 下非常簡單易用的抓包工具,現(xiàn)在也有 Linux 版本。

通過 Tcpdump 抓取的數(shù)據(jù)包分析比較麻煩,要想很方便的分析數(shù)據(jù)包, 我們可以用 Tcpdump + Wireshark 的完美組合實(shí)現(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 這些選項(xiàng)等都要放到第一個(gè)參數(shù)的位置,用來過濾數(shù)據(jù)報(bào)的類型
-i eth1 只抓經(jīng)過接口 eth1 的包
-t 不顯示時(shí)間戳
-s 0 抓取數(shù)據(jù)包時(shí)默認(rèn)抓取長度為 68 字節(jié)。加上 -S 0 后可以抓到完整的數(shù)據(jù)包
-c 100 只抓取 100 個(gè)數(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)分析

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號『一口Linux』號主彭老師,擁有15年嵌入式開發(fā)經(jīng)驗(yàn)和培訓(xùn)經(jīng)驗(yàn)。曾任職ZTE,某研究所,華清遠(yuǎn)見教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專利和軟件著作。精通計(jì)算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實(shí)際項(xiàng)目出發(fā),保持原理+實(shí)踐風(fēng)格,適合Linux驅(qū)動新手入門和技術(shù)進(jìn)階。