常用的網絡工具 Wireshark 和 tcpdump

WireShark
爲什麼要抓包
1、 定位網絡問題;
2、 分析接口數據;
3、 學習網絡協議, 使用抓包工具分析網絡數據更直觀。
大部分場合都可以通過程序調試來定位問題, 但有些場景使用抓包來定位接口問題更準
確、 更方便, 如以下場景:
1、 你發送數據給後臺, 但後臺沒有收到, 可以對接口進行抓包分析, 看是後臺處理有
問題, 還是沒有將數據發出去, 或是發送數據格式有誤;
2、 你和後臺接口聯調測通, 但業務數據對不上, 你認爲是後臺問題, 後臺認爲是你發
的問題, 可以抓包確認問題所在;
3、 線上出現 bug 需要定位, 但你沒在公司, 沒有代碼可調試, 可直接抓包分析;
4、 系統性能不佳, 抓包看下接口響應時長, 是不是後臺出現性能問題。
常用的抓包工具有: F12(瀏覽器自帶的抓包工具) 、 Fiddler、 Charles, Wireshark。 而
Wireshark 在支持的協議, 用戶友好度、 價格(開源) 、 程序支持、 支持的操作系統上都很
好, 所以 Wireshark 也是我們最常用的抓包工具和報文分析工具。
下載與安裝
在 https://www.wireshark.org/的官方主頁點擊

進入下載頁面, 選擇適合自己的版本下載即可

Wireshark 的安裝很簡單, 就是一般的 windows 程序的安裝流程, 如遇問題自行百度解
決。

數據包的捕獲和基本用法
基本用法
運行 Wireshark, 稍等, 就會讓我們選擇捕獲哪個設備(連接) 的數據包

當前我們活躍的是「以太網」 , 雙擊這一行, Wireshark 開始捕獲數據, 並在窗口中顯
示, 可以看見隨着時間前進, 窗口中不斷刷新。 等上幾秒鐘, 結束捕獲, 單機工具欄中的
按鈕, 或者「捕獲」 下拉菜單中選擇「停止」 選項即可。
這個時候可以看見, Wireshark 窗口中顯示了大量的數據:


數據包列表: 最上面的面板用表格顯示了當前捕獲文件中的所有數據包, 其中包括了數
據包序號、 數據包被捕獲的相對時間、 數據包的源地址和目標地址、 數據包的協議以及在數
據包中找到的概況信息等列。
包詳情: 中間的面板分層次地顯示了一個數據包中的內容, 並且可以通過展開或是收縮
來顯示這個數據包中所捕獲到的全部內容。
包數據的字節形式顯示: 最下面的面板顯示了一個數據包未經處理的原始樣子, 也就是
其在鏈路上傳播時的樣子。 這些原始數據當然不容易理解。
在數據包列表中, 可以很明顯看見每行的五顏六色, 這些顏色其實是 Wireshark 用來區
分不同的協議的。 可以通過 Coloring Rules (着色規則) 窗口可以很容易地查看或修改每個協
議所對應的顏色。 如果想要打開這個窗口, 可以在「視圖」 下拉菜單中選擇的「着色規則」
選項即可。

同時捕獲的數據包可以導出爲文件, 也可以將數據包文件導入 Wireshark 進行分析。
過濾器
過濾器可以讓你找出你所希望進行分析的數據包。 簡單來說, 一個過濾器就是定義了一
定條件, 用來包含或者排除數據包的表達式。 如果你不希望看到一些數據包, 你可以寫一個
過濾器來屏蔽它們。 如果你希望只看到某些數據包, 你可以寫一個只顯示這些數據包的過濾
器。
Wireshark 主要提供兩種主要的過濾器。
· 捕獲過濾器:當進行數據包捕獲時, 只有那些滿足給定的包含/排除表達式
的數據包會被捕獲。
顯示過濾器:該過濾器根據指定的表達式用於在一個已捕獲的數據包集合中, 隱藏不想
顯示的數據包, 或者只顯示那些需要的數據包。
捕獲過濾器
捕獲過濾器用於進行數據包捕獲的實際場合, 使用它的一個主要原因就是性能。 如果你
知道你並不需要分析某個類型的流量, 你可以簡單地使用捕獲過濾器過濾掉它, 從而節省那
些會被用來捕獲這些數據包的資源。
比如, 我們現在要捕獲我們機器上所有 UDP 類型的數據包, 怎麼做? 在「捕獲」 下拉
菜單中選擇「選型」 , 彈出窗口中

選擇或者輸入 UDP, 然後單擊「開始」 按鈕進行捕獲。
 

捕獲過濾器的 BPF 語法
捕獲過濾器應用於 WinPcap/NPcap, 並使用 Berkeley Packet Filter(BPF) 語法。
這個語法被廣泛用於多種數據包嗅探軟件, 主要因爲大部分數據包嗅探軟件都依賴於使
用 BPF 的 libpcap/WinPcap 庫。 掌握 BPF 語法對你在數據包層級更深入地探索網絡來說,
非常關鍵。
使用 BPF 語法創建的過濾器被稱爲表達式, 並且每個表達式包含一個或多個原語。 每
個原語包含一個或多個限定詞, 然後跟着一個 ID 名字或者數字
Type 指出名字或數字所代表的意, 例如: host、 port
Dir 指明傳輸方向是前往還是來自 例如: src、 dst
Proto 限定所要匹配的協議 例如: ether、 ip、 tcp、 udp、 http、 ftp
例如:
dst host 192.168.0.10 && tcp port 80
這是一個捕獲過濾器樣例, 其中「dst host 192.168.0.10」 就構成了一個原語, 我們的樣
例裏有兩個原語, 兩個原語用邏輯運算符「&&」 組合了起來。 邏輯運算符共有三個:
連接運算符: 與 (&&)
選擇運算符: 或 (||)
否定運算符: 非 (!)
對我們的樣例來說, 表示捕獲的數據包應該滿足條件爲: 目的主機是 192.168.0.10, 通
信協議是 tcp, 源端口或者目的端口是 80。
主機名和地址過濾器
我們所創建的大多數過濾器都會關注於一個或一些特定的網絡設備。 根據這個情況, 可
以根據設備的 MAC 地址、 IPv4 地址、 IPv6 地址或者 DNS 主機名配置過濾規則。 比如:
捕獲所有和主機 IPv4 地址相關的流量:
host 192.168.0.10
捕獲所有和主機 Ipv6 地址相關的流量:
host fe80::1945:cbf1:1393:8f17
使用基於一臺設備的主機名 host 限定詞進行過濾:
host remoteserver
考慮到一臺主機的 IP 地址可能會變化, 你可以通過加入 ether 協議限定詞, 對它的 MAC
地址進行過濾:
Ether host 24-41-8C-26-04-9F
當然還可在 host 之前加 src 或者 dst 進行傳輸方向的限定。
端口和協議過濾器
只對 8080 端口進行流量捕獲:
port 8080
想要捕獲除 8080 端口外的所有流量
!port 8080
端口過濾器一樣和傳輸方向限定符一起使用, 比如:
dst port 80
協議過濾器可以讓我們基於特定協議進行數據包過濾。 BPF 語法甚至提供給我們的一項
強大功能, 就是我們可以通過檢查協議頭中的每一字節來創建基於那些數據的特殊過濾器。
比如:
tcp[13]&4=4
表示捕獲的數據是 tcp 協議的數據包, 且 tcp 數據包中第 13 個字節的第 4 位被設置了。
顯示過濾器
顯示過濾器應用於捕獲文件, 用來告訴 Wireshark 只顯示那些符合過濾條件的數據包。
你可以在包列表面板上方的 Filter 文本框中, 輸入一個顯示過濾器。


顯示過濾器的語法不同於捕獲過濾器, 比如我們通過捕獲功能, 捕獲了本機所有的數據


現在我們不需要看 UDP 類型的數據包, 只需輸入:
!udp
可以看見所有的 udp 類型的數據包不再顯示了:

現在我們多加一個限定, 只顯示 ip 地址爲 40.90.189.152(新加坡 Microsoft 數據中心)
的數據包


可以看見, 顯示的數據包就變爲: 不是 udp 數據包, 同時源地址或者目的地址是
40.90.189.152。
在我們上面的過濾條件「!udp and ip.addr==40.90.189.152」 中, 牽涉到了過濾條件的比
較操作符和邏輯操作符:
比較操作符可以讓你進行值的比較。 舉例來說, 當你在檢查一個 TCP/P 網絡中的問題
時, 你可能經常需要檢查和某一個 IP 地址相關的數據包。 等於操作符可以讓你創建一個只
顯示 192.168.0.1 這個 IP 地址相關數據包的過濾器。
ip.addr==192.168.0.1
比較操作符還有:
等於 ==
不等於 !=
大於 >
小於 <
大於或等於 >=
小於或等於 <=
邏輯操作符有:
and 兩個條件需同時滿足
or 其中一個條件被滿足
xor 有且僅有一個條件被滿足
not 沒有條件被滿足
儘管在理論上編寫過濾器表達式很簡單, 但針對不同問題創建過濾器時, 依然需要許多
特定的關鍵詞與操作符。 可以到 Wireshark 的官網查看:
https://www.wireshark.org/docs/dfref

比如 tcp 相關的, 可以通過單擊具體條目查看更多:
 

 

 

預定義過濾器
過濾器可以事先設置好, 不需要每次使用時都重新輸入, 捕獲過濾器在菜單「捕獲」 -
「捕獲過濾器」 中設置, 顯示過濾器在菜單「分析」 -「Display Filters」 中設置。
 

TCPDUMP
 

tcpdump 可以抓所有層的數據, 功能十分強大, tcpdump Linux 作爲網絡服務器, 特別
是作爲路由器和網關時, 數據的採集和分析是不可少的。 TcpDump 是 Linux 中強大的網絡數
據採集分析工具之一。 用簡單的話來定義 tcpdump, 就是:dump the traffic on a network, 根
據使用者的定義對網絡上的數據包進行截獲的包分析工具。 作爲互聯網上經典的的系統管理
員或者運維人員必備工具, tcpdump 以其強大的功能, 靈活的截取第略, 成爲每個高級的系
統管理員/運維人員分析網格, 排查問題等所必備的工具之一。 注意 tcpdump 必須以超級管
理員的身份登錄系統才能使用。
tcpdump 的參數比較多:
tcp

各個參數的意義如下:
A: 以 ascii 編碼打印每個報文(不包括鏈路的頭) 。
a: 將網絡地址和廣播地址轉變成名字。
c: 抓取指定數目的包。
C: 用於判斷用 -w 選項將報文寫入的文件的大小是否超過這個值, 如果超過了就新建
文件(文件名後綴是 1、 2、 3 依次增加) ;
d: 將匹配信息包的代碼以人們能夠理解的彙編格式給出;
dd: 將匹配信息包的代碼以 c 語言程序段的格式給出;
ddd: 將匹配信息包的代碼以十進制的形式給出;
D: 列出當前主機的所有網卡編號和名稱, 可以用於選項 -i;
e: 在輸出行打印出數據鏈路層的頭部信息;
f: 將外部的 Internet 地址以數字的形式打印出來;
F<表達文件>: 從指定的文件中讀取表達式,忽略其它的表達式;
i<網絡界面>: 監聽主機的該網卡上的數據流, 如果沒有指定, 就會使用最小網卡編號
的網卡(在選項-D 可知道, 但是不包括環路接口) , linux 2.2 內核及之後的版本支持 any 網
卡, 用於指代任意網卡;
l: 如果沒有使用 -w 選項, 就可以將報文打印到 標準輸出終端(此時這是默認) ;
n: 顯示 ip, 而不是主機名;
nn: 顯示 port, 而不是服務名;
N: 不列出域名;
O: 不將數據包編碼最佳化;
p: 不讓網絡界面進入混雜模式;
q: 快速輸出, 僅列出少數的傳輸協議信息;
r<數據包文件>: 從指定的文件中讀取包(這些包一般通過-w 選項產生);
s<數據包大小>: 指定抓包顯示一行的寬度, -s0 表示可按包長顯示完整的包, 經常和-A
一起用, 默認截取長度爲 60 個字節, 但一般 ethernet MTU 都是 1500 字節。 所以, 要抓取
大於 60 字節的包時, 使用默認參數就會導致包數據丟失;
S: 用絕對而非相對數值列出 TCP 關聯數;
t: 在輸出的每一行不打印時間戳;
tt: 在輸出的每一行顯示未經格式化的時間戳記;
T<數據包類型>: 將監聽到的包直接解釋爲指定的類型的報文, 常見的類型有 rpc (遠
程過程調用) 和 snmp(簡單網絡管理協議) ;
v: 輸出一個稍微詳細的信息, 例如在 ip 包中可以包括 ttl 和服務類型的信息;
vv: 輸出詳細的報文信息;
x/-xx/-X/-XX: 以十六進制顯示包內容, 幾個選項只有細微的差別, 詳見 man 手冊;
w<數據包文件>: 直接將包寫入文件中, 並不分析和打印出來;
expression: 用於篩選的邏輯表達式。
在 tcpdump 中, tcpdump 利用正則表達式作爲過濾報文的條件, 如果一個報文滿足表
達式的條件, 則這個報文將會被捕獲。 如果沒有給出任何條件, 則網絡上所有的信息包將會
被截獲。
在表達式中一般如下幾種類型的關鍵字, 一種是關於類型的關鍵字, 主要包括 host,
port, 例如 host 210.27.48.2, 指明 210.27.48.2 是一臺主機, port 23 指明端口號是 23。 如
果沒有指定類型, 缺省的類型是 host。
第二種是確定傳輸方向的關鍵字, 主要包括 src , dst 這些關鍵字指明瞭傳輸的方向。 舉
例說明, 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 等類型。
如果沒有指定任何協議, 則 tcpdump 將會監聽所有協議的信息包。
表達式還可以通過
! or not
&& or and
|| or or
進行連接
比如,
tcpdump -i eth0 tcp port 3306 -w ./mysql.cap
捕獲本機網絡設備 eth0 上 tcp 協議, 端口 3306 的數據包, 並寫入當前目錄下的 mysql.cap
文件。

不過 tcpdump 的輸出不夠直觀, 所以我們一般用 tcpdump 抓包以後下載到本地用
Wireshark 打開分析。