本文詳解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 開始抓包
- 選擇要抓包的網卡(有流量的那個)
- 點擊藍色鯊魚鰭按鈕開始
- 進行你要分析的網絡操作
- 點擊紅色方塊停止
二、過濾器語法
過濾器是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的流量
|
|
|
只看HTTP
|
|
|
只看DNS
|
|
|
TCP握手問題
|
|
|
連接重置
|
|
|
重傳問題
|
|
|
慢請求
|
|
三、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 案例:網站訪問慢
步驟:
- 開始抓包
- 訪問慢的網站
- 停止抓包
- 過濾:
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抓包分析的基本流程:
- 明確目標:要分析什麼問題
- 開始抓包:選對網卡,設好過濾器
- 復現問題:觸發要分析的網絡行為
- 停止抓包:不要抓太久,數據太多難分析
- 過濾定位:用過濾器找到關鍵數據包
- 深入分析:看協議詳情,追蹤數據流
- 得出結論:找到問題原因
常用過濾器記住這幾個就夠用:
ip.addr == x.x.x.xtcp.port == xxhttp/dns/tcptcp.flags.rst == 1tcp.analysis.retransmission
掌握Wireshark,網絡問題再也難不倒你。
參考資料
- Wireshark User's Guide
- TCP/IP Illustrated, Volume 1
- Practical Packet Analysis - Chris Sanders