本文詳解Wireshark的核心功能,從抓包基礎到實際故障排查,帶你掌握網絡分析的必備技能。

前言

網絡出問題了,ping不通、連接超時、速度慢...這時候怎麼排查?

抓包分析是網絡排查的終極武器。不管問題多複雜,抓個包看看數據流,真相就在眼前。

Wireshark是最強大的抓包工具,免費開源,今天就來系統學習一下。


一、Wireshark安裝與基礎

1.1 安裝

# Windows/Mac
# 官網下載:https://www.wireshark.org/download.html

# Ubuntu/Debian
sudo apt install wireshark

# CentOS
sudo yum install wireshark wireshark-qt

# 允許非root用户抓包(Linux)
sudo usermod -aG wireshark $USER

1.2 界面介紹

┌─────────────────────────────────────────────────────────┐
│  菜單欄 | 工具欄 | 過濾器欄                              │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  數據包列表(Packet List)                               │
│  - 時間、源IP、目標IP、協議、長度、信息                   │
│                                                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  數據包詳情(Packet Details)                            │
│  - 各層協議解析                                          │
│                                                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  原始數據(Packet Bytes)                                │
│  - 十六進制 + ASCII                                     │
│                                                         │
└─────────────────────────────────────────────────────────┘

1.3 開始抓包

  1. 選擇要抓包的網卡(有流量的那個)
  2. 點擊藍色鯊魚鰭按鈕開始
  3. 進行你要分析的網絡操作
  4. 點擊紅色方塊停止

二、過濾器語法

過濾器是Wireshark的靈魂,數據包太多不過濾根本沒法看。

2.1 顯示過濾器(最常用)

# 按IP過濾
ip.addr == 192.168.1.100        # 源或目標是這個IP
ip.src == 192.168.1.100         # 源IP
ip.dst == 8.8.8.8               # 目標IP

# 按端口過濾
tcp.port == 80                  # TCP端口80
udp.port == 53                  # UDP端口53
tcp.dstport == 443              # 目標端口443

# 按協議過濾
http                            # HTTP協議
dns                             # DNS協議
tcp                             # TCP協議
udp                             # UDP協議
icmp                            # ICMP(ping)
arp                             # ARP協議

# 組合過濾
ip.addr == 192.168.1.100 and tcp.port == 80
http or dns
tcp and not port 22

# TCP標誌位
tcp.flags.syn == 1              # SYN包
tcp.flags.ack == 1              # ACK包
tcp.flags.fin == 1              # FIN包
tcp.flags.rst == 1              # RST包

# 包含特定內容
http contains "password"
tcp contains "error"

2.2 捕獲過濾器(抓包前設置)

# 只抓特定主機
host 192.168.1.100

# 只抓特定端口
port 80
portrange 8000-9000

# 只抓特定協議
tcp
udp
icmp

# 組合
host 192.168.1.100 and port 80

2.3 常用過濾器速查

場景

過濾器

分析某個IP的流量

ip.addr == x.x.x.x

只看HTTP

http

只看DNS

dns

TCP握手問題

tcp.flags.syn == 1

連接重置

tcp.flags.rst == 1

重傳問題

tcp.analysis.retransmission

慢請求

http.time > 1


三、TCP三次握手分析

3.1 正常握手

No.  Time     Source          Dest            Protocol  Info
1    0.000    192.168.1.100   93.184.216.34   TCP       54321→80 [SYN]
2    0.015    93.184.216.34   192.168.1.100   TCP       80→54321 [SYN,ACK]
3    0.016    192.168.1.100   93.184.216.34   TCP       54321→80 [ACK]

解讀:

  • 第1包:客户端發SYN,請求建立連接
  • 第2包:服務器回SYN+ACK,同意建立
  • 第3包:客户端發ACK,連接建立完成

3.2 常見異常

情況1:只有SYN,沒有回覆

1    0.000    192.168.1.100   10.0.0.1   TCP   [SYN]
2    1.000    192.168.1.100   10.0.0.1   TCP   [SYN] (重傳)
3    3.000    192.168.1.100   10.0.0.1   TCP   [SYN] (重傳)

原因:目標不可達、防火牆攔截、端口未監聽

情況2:收到RST

1    0.000    192.168.1.100   10.0.0.1   TCP   [SYN]
2    0.001    10.0.0.1        192.168.1.100   TCP   [RST,ACK]

原因:端口未監聽、被防火牆拒絕

情況3:握手成功但立即斷開

1-3  ...      正常三次握手
4    0.020    192.168.1.100   10.0.0.1   TCP   [FIN,ACK]

原因:應用層拒絕、認證失敗


四、HTTP分析實戰

4.1 追蹤HTTP流

右鍵數據包 → Follow → TCP Stream

可以看到完整的HTTP請求和響應:

GET /api/users HTTP/1.1
Host: api.example.com
User-Agent: curl/7.68.0

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 128

{"users": [...]}

4.2 分析慢請求

過濾慢請求:

http.time > 0.5

查看時間分佈:

  • 選中HTTP響應包
  • 看下方詳情中的時間字段
  • 或者:Statistics → HTTP → Request Sequences

4.3 HTTPS解密

HTTPS是加密的,直接抓包看不到內容。但可以通過配置解密:

方法1:使用SSLKEYLOGFILE(推薦)

# Linux/Mac
export SSLKEYLOGFILE=~/sslkeys.log

# Windows
set SSLKEYLOGFILE=C:\sslkeys.log

# 然後用瀏覽器訪問HTTPS網站
# Wireshark配置:Edit → Preferences → Protocols → TLS
# 設置 (Pre)-Master-Secret log filename 為上面的文件

方法2:使用私鑰(如果你有服務器私鑰)

Preferences → Protocols → TLS → RSA keys list


五、DNS分析

5.1 正常DNS查詢

No.  Time     Source          Dest       Protocol  Info
1    0.000    192.168.1.100   8.8.8.8    DNS       Standard query A www.example.com
2    0.025    8.8.8.8         192.168.1.100   DNS  Standard query response A 93.184.216.34

5.2 DNS問題排查

查詢無響應:

dns and dns.flags.response == 0

如果只有查詢沒有響應,檢查DNS服務器是否可達。

DNS解析慢:

  • 看查詢和響應的時間差
  • 正常應該在50ms以內
  • 超過200ms説明DNS服務器響應慢

NXDOMAIN(域名不存在):

dns.flags.rcode == 3

六、常見故障排查案例

6.1 案例:網站訪問慢

步驟:

  1. 開始抓包
  2. 訪問慢的網站
  3. 停止抓包
  4. 過濾:ip.addr == 網站IP

分析點:

  • DNS解析耗時?→ 換DNS
  • TCP握手耗時?→ 網絡延遲高
  • 等待響應耗時?→ 服務器處理慢
  • 數據傳輸耗時?→ 帶寬問題

6.2 案例:連接超時

過濾重傳:

tcp.analysis.retransmission

如果重傳很多,説明網絡丟包嚴重。

看RTT:
Statistics → TCP Stream Graphs → Round Trip Time

6.3 案例:連接被重置

過濾RST:

tcp.flags.rst == 1

常見原因:

  • 端口未監聽
  • 防火牆拒絕
  • 應用程序異常關閉
  • 連接超時被清理

七、高級技巧

7.1 統計功能

Statistics → Conversations      # 會話統計
Statistics → Protocol Hierarchy # 協議分佈
Statistics → IO Graphs          # 流量圖
Statistics → Flow Graph         # 流程圖

7.2 命令行工具tshark

# 抓包保存文件
tshark -i eth0 -w capture.pcap

# 讀取並過濾
tshark -r capture.pcap -Y "http"

# 只顯示特定字段
tshark -r capture.pcap -Y "http" -T fields -e http.host -e http.request.uri

# 實時抓包並過濾
tshark -i eth0 -Y "tcp.port == 80"

7.3 遠程抓包

# 在遠程服務器抓包,本地Wireshark分析
ssh user@server "tcpdump -i eth0 -w - port 80" | wireshark -k -i -

# 或者保存後下載
ssh user@server "tcpdump -i eth0 -c 1000 -w /tmp/capture.pcap"
scp user@server:/tmp/capture.pcap .

八、總結

Wireshark抓包分析的基本流程:

  1. 明確目標:要分析什麼問題
  2. 開始抓包:選對網卡,設好過濾器
  3. 復現問題:觸發要分析的網絡行為
  4. 停止抓包:不要抓太久,數據太多難分析
  5. 過濾定位:用過濾器找到關鍵數據包
  6. 深入分析:看協議詳情,追蹤數據流
  7. 得出結論:找到問題原因

常用過濾器記住這幾個就夠用:

  • ip.addr == x.x.x.x
  • tcp.port == xx
  • http / dns / tcp
  • tcp.flags.rst == 1
  • tcp.analysis.retransmission

掌握Wireshark,網絡問題再也難不倒你。


參考資料

  1. Wireshark User's Guide
  2. TCP/IP Illustrated, Volume 1
  3. Practical Packet Analysis - Chris Sanders