• 正文
  • 相關推薦
申請入駐 產業(yè)圖譜

網絡命令行抓包工具tcpdump詳解

2021/01/05
224
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

概述

用簡單的話來定義 tcpdump,就是:dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。

tcpdump 可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支持針對網絡層、協(xié)議、主機、網絡或端口的過濾,并提供 and、or、not 等邏輯語句來幫助你去掉無用的信息。

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

一、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 參數

常用參數選項說明:

參數 含義
-a 將網絡地址和廣播地址轉變成名字
-c 在收到指定的包的數目后,tcpdump 就會停止;
-d 將匹配信息包的代碼以人們能夠理解的匯編格式給出;以可閱讀的格式輸出。
-dd 將匹配信息包的代碼以 c 語言程序段的格式給出;
-ddd 將匹配信息包的代碼以十進制的形式給出;
-e 在輸出行打印出數據鏈路層的頭部信息;
-f 將外部的 Internet 地址以數字的形式打印出來;
-l 使標準輸出變?yōu)榫彌_行形式;
-n 直接顯示 IP 地址,不顯示名稱;
-nn 端口名稱顯示為數字形式,不顯示名稱;
-t 在輸出的每一行不打印時間戳;
-v 輸出一個稍微詳細的信息,例如在 ip 包中可以包括 ttl 和服務類型的信息;
-vv 輸出詳細的報文信息;
-F 從指定的文件中讀取表達式,忽略其它的表達式;
-i 指定監(jiān)聽的網絡接口;
-r 從指定的文件中讀取包(這些包一般通過 -w 選項產生);
-w 直接將包寫入文件中,并不分析和打印出來;
-T 將監(jiān)聽到的包直接解釋為指定的類型的報文,常見的類型有 rpc (遠程過程調用)和 snmp(簡單 網絡管理協(xié)議;)

三、命令選項使用舉例

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

命令:

tcpdump

說明:

tcpdump 截取包默認顯示數據包的頭部。

普通情況下,直接啟動 tcpdump 將監(jiān)視第一個網絡接口上所有流過的數據包。

基礎格式:時間 數據包類型 源 IP 端口 / 協(xié)議 > 目標 IP 端口 / 協(xié)議 協(xié)議詳細信息

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

終止 tcpdump

2. 指定抓包數量 -c

指定抓取 2 個數據包。

命令:

tcpdump?-c?2

說明:

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

【注意,已經切換到管理員了,虛擬機中要產生數據包,可以另外開一個窗口 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

其中網卡為 eth0。

6. 指定監(jiān)控的網卡 -i

命令:

tcpdump?-i?eth0

如果不指定網卡,默認 tcpdump 只會監(jiān)視第一個網絡接口,一般是 eth0。

7. 顯示更詳細的數據包信息 -v ?-vv

選項 -v,-vv 可以顯示更詳細的抓包信息。

tcpdump -v

tcpdump -vv

8. 不使用域名反解 -n

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

9. 增加抓包時間戳 -tttt 選項

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

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

此時間戳的精度與內核時間精度一致, 反映的是內核第一次看到對應數據包的時間;

而數據包從物理線路傳遞到內核的時間, 以及內核花費在此包上的中斷處理時間都沒有算進來;

使用 -tttt 選項,抓包結果中將包含抓包日期:

命令:

tcpdump?-tttt

增加抓包時間戳

四、條件過濾

1. 過濾:指定需要抓取的協(xié)議

tcpdump 可以只抓某種協(xié)議的包,支持指定以下協(xié)議:「ip,ip6,arp,tcp,udp,wlan」等。

命令:

tcpdump?udp

tcpdump?icmp

tcpdump?tcp

tcpdump?arp

2. 過濾:指定協(xié)議的端口號

使用 port 參數,用于指定端口號。

命令:tcpdump tcp port 80

使用 portrange 參數,用于指定端口范圍。

命令:tcpdump tcp portrange 1-1024

3. 過濾:指定源與目標

src 表示源。

dst 表示目標。

命令:

tcpdump src port 8080

tcpdump dst port 80

4. 過濾:指定特定主機的消息包

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

命令:

tcpdump?host?192.168.1.113

注意:若使用了 host 參數使用了計算機名或域名。例 tcpdump host shi-pc ,則無法再使用 -n 選項。

5. 過濾:指定數據包大小

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

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

命令:

tcpdump?greater?1000

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

命令:

tcpdump?less?10

五、 邏輯表達式

使用基本邏輯組合拼裝出更精細的過濾條件。

1. 邏輯與

邏輯與關系,使用 and。

命令:

tcpdump?tcp?and?host?192.168.1.112



tcpdump?tcp?and?src?192.168.1.112?and?port?8080

2. 邏輯或

邏輯或關系,使用 or。

命令:

tcpdump?host?192.168.1.112?or?192.168.1.113

3. 邏輯非

邏輯非關系,使用 not,也可以使用 ! 。

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

例:當通過 ssh 協(xié)議遠程使用 tcpdump 時,為了避免 ssh 的數據包的輸出,所以一般需要禁止 ssh 數據包的輸出。

命令:

tcpdump?not?tcp?port?22


tcpdump?!?tcp?port?22

4. 括號

括號需要使用在引號內,或轉意使用。否則會報錯。

例:抓取非 22 端口,且主機為 192.168.1.112 和 192.168.1.113 的 TCP 數據包。

命令:

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. 打印所有進入或離開 sundown 的數據包 .

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 的數據包

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 的服務端口

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 對截獲的數據并沒有進行徹底解碼,數據包內的大部分內容是使用十六進制的形式直接打印輸出的。

顯然這不利于分析網絡故障,通常的解決辦法是先使用帶**-w 參數的 tcpdump 截獲數據并保存到文件中**,然后再使用其他程序(如 Wireshark)進行解碼分析。當然也應該定義過濾規(guī)則,以避免捕獲的數據包填滿整個硬盤。

六、查看數據包完整內容

tcpdump 默認不顯示數據包的詳細內容。

方法一:

使用 -A 參數能以 ASCII 碼顯示數據包。

例:只抓取 1 個數據包,并顯示其內容。

命令:

tcpdump?-c?1?-A

方法二:

使用 -X 參數能 16 進制數與 ASCII 碼共同顯示數據包。

例:只抓取 1 個數據包,并顯示其內容。

命令:

tcpdump?-c?1?-X

七、tcpdump 與 wireshark

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

通過 Tcpdump 抓取的數據包分析比較麻煩,要想很方便的分析數據包, 我們可以用 Tcpdump + Wireshark 的完美組合實現:在 Linux 里抓包,然后在 Windows 里分析包。

保存數據包為 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
參數 含義
tcp ip icmp arp rarp 和 tcp、udp、icmp 這些選項等都要放到第一個參數的位置,用來過濾數據報的類型
-i eth1 只抓經過接口 eth1 的包
-t 不顯示時間戳
-s 0 抓取數據包時默認抓取長度為 68 字節(jié)。加上 -S 0 后可以抓到完整的數據包
-c 100 只抓取 100 個數據包
dst port ! 22 不抓取目標端口是 22 的數據包
src net 192.168.1.0/24 數據包的源網絡地址為 192.168.1.0/24
-w ./target.cap 保存成 cap 文件,方便用 ethereal(即 wireshark)分析

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

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