目錄
一、基礎過濾速查表
1. 協議過濾(單協議)
2. 端口過濾
3. IP地址過濾
二、組合過濾實戰示例
1. 協議+端口組合
2. IP+端口組合
3. 復雜邏輯組合
三、高級協議分析示例
1. HTTP請求分析
2. DNS問題排查
3. TCP連接問題分析
四、組合過濾場景分析指南
場景1:網站訪問失敗
場景2:數據庫連接超時
場景3:API性能下降
五、TCP報文分析
一、Flags [S] 和 Flags [R.] 的含義
二、TCP 標志位全集及 tcpdump 表示
三、詳細分析 TCP 報文的方法
1. 基礎字段解析
2. 使用 tcpdump 參數深入分析
3. 結合 Wireshark 可視化分析
4. 進階診斷技巧
四、常見場景與標志位組合
五、總結
六、結果分析方法與工具
1. 命令行實時分析
2. 使用Wireshark深度分析
3. 自動化分析腳本
七、性能優化技巧
1. 高效捕獲配置
2. 長期監控方案
八、常用場景命令速查
學習資源推薦
掌握TCPDump的核心在于熟練使用過濾表達式精準捕獲目標流量。本文整理了最實用的過濾示例,覆蓋協議、端口、IP等常見場景,并提供配套分析方法,助你快速定位網絡問題。
一、基礎過濾速查表
1. 協議過濾(單協議)
# 捕獲TCP流量
sudo tcpdump -i any tcp
?
# 捕獲UDP流量
sudo tcpdump -i any udp
?
# 捕獲ICMP(ping)流量
sudo tcpdump -i any icmp
?
# 捕獲ARP請求
sudo tcpdump -i any arp
?
# 捕獲DNS協議
sudo tcpdump -i any port 53
2. 端口過濾
# 捕獲80端口(HTTP)流量
sudo tcpdump -i any port 80
?
# 捕獲443端口(HTTPS)流量
sudo tcpdump -i any port 443
?
# 捕獲源端口為8080的流量
sudo tcpdump -i any src port 8080
?
# 捕獲目標端口3306(MySQL)的流量
sudo tcpdump -i any dst port 3306
?
# 捕獲端口范圍8000-9000的流量
sudo tcpdump -i any portrange 8000-9000
3. IP地址過濾
# 捕獲與192.168.1.100相關的所有流量
sudo tcpdump -i any host 192.168.1.100
?
# 捕獲來自10.0.0.1的流量
sudo tcpdump -i any src host 10.0.0.1
?
# 捕獲發送到8.8.8.8的流量
sudo tcpdump -i any dst host 8.8.8.8
?
# 捕獲192.168.1.0/24網段的流量
sudo tcpdump -i any net 192.168.1.0/24
二、組合過濾實戰示例
1. 協議+端口組合
# 捕獲HTTP流量(TCP+80端口)
sudo tcpdump -i any 'tcp and port 80'
?
# 捕獲HTTPS流量(TCP+443端口)
sudo tcpdump -i any 'tcp and port 443'
?
# 捕獲DNS流量(UDP+53端口)
sudo tcpdump -i any 'udp and port 53'
2. IP+端口組合
# 捕獲到8.8.8.8的DNS查詢
sudo tcpdump -i any 'dst host 8.8.8.8 and dst port 53'
?
# 捕獲來自192.168.1.100的SSH流量
sudo tcpdump -i any 'src host 192.168.1.100 and port 22'
?
# 捕獲到數據庫服務器的流量
sudo tcpdump -i any 'dst host 10.0.0.5 and (port 3306 or port 5432)'
3. 復雜邏輯組合
# 捕獲非HTTP的TCP流量
sudo tcpdump -i any 'tcp and not port 80'
?
# 捕獲來自特定網段到外部80端口的流量
sudo tcpdump -i any 'src net 192.168.1.0/24 and dst port 80'
?
# 捕獲SYN或RST包(TCP連接建立/重置)
sudo tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-rst) != 0'
三、高級協議分析示例
1. HTTP請求分析
# 捕獲HTTP GET/POST請求頭
sudo tcpdump -i any -A -s0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0' | grep -E 'GET |POST |HTTP/'
?
# 輸出示例
GET /api/users HTTP/1.1
Host: example.com
User-Agent: curl/7.68.0
分析要點:
檢查請求路徑和Host頭是否匹配
查看User-Agent識別客戶端類型
觀察是否有異常請求頭
2. DNS問題排查
# 捕獲DNS請求和響應
sudo tcpdump -n -s0 -i any port 53
?
# 輸出示例
15:30:45.123456 IP 192.168.1.100.5353 > 8.8.8.8.53: 12345+ A? example.com. (32)
15:30:45.234567 IP 8.8.8.8.53 > 192.168.1.100.5353: 12345 1/0/0 A 93.184.216.34 (48)
分析流程:
確認DNS查詢是否發出(
A? example.com
)檢查是否收到響應(
A 93.184.216.34
)響應時間是否正常(本例中111毫秒)
響應碼:
NOERROR
(0)表示成功,NXDOMAIN
(3)表示域名不存在
3. TCP連接問題分析
# 捕獲TCP握手包
sudo tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'# 輸出示例
16:20:01.123456 IP 10.0.0.2.34567 > 10.0.0.3.80: Flags [S], seq 123456789
16:20:01.234567 IP 10.0.0.3.80 > 10.0.0.2.34567: Flags [S.], seq 987654321, ack 123456790
16:20:06.456789 IP 10.0.0.2.34567 > 10.0.0.3.80: Flags [S], seq 123456789 # 重傳
問題診斷:
正常流程:SYN → SYN-ACK → ACK
本例問題:客戶端未收到SYN-ACK,導致SYN重傳
可能原因:防火墻阻止、服務未監聽、網絡不通
四、組合過濾場景分析指南
場景1:網站訪問失敗
# 組合過濾:目標域名+端口
sudo tcpdump -i any 'host example.com and port 80'# 分析步驟:
1. 檢查是否有SYN包發出 → 無則表示DNS或路由問題
2. 檢查是否收到SYN-ACK → 無則表示服務未響應
3. 檢查是否發送HTTP請求 → 無則表示客戶端問題
4. 檢查HTTP響應碼 → 5xx為服務端錯誤
場景2:數據庫連接超時
# 組合過濾:數據庫IP+端口
sudo tcpdump -i any 'host 10.0.0.5 and port 3306'# 分析步驟:
1. 檢查TCP握手是否完成 → 未完成則檢查網絡/防火墻
2. 觀察連接建立時間 → 長延遲可能網絡問題
3. 檢查是否有重傳 → 重傳指示丟包
4. 查看連接是否被RST終止 → 服務端主動拒絕
場景3:API性能下降
# 組合過濾:API端點+方法
sudo tcpdump -i any 'port 8080 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354' -A# 分析步驟:
1. 測量請求-響應時間 → 定位延遲階段
2. 檢查是否有TCP重傳 → 網絡問題
3. 觀察HTTP響應碼分布 → 5xx增加指示服務問題
4. 分析請求/響應大小 → 大數據量可能影響性能
五、TCP報文分析
一、Flags [S] 和 Flags [R.] 的含義
-
Flags [S](SYN 標志) 表示該數據包攜帶同步標志位(SYN),用于建立 TCP 連接的三次握手過程36。
-
場景:客戶端首次向服務器發送連接請求時,會設置
SYN=1
,此時tcpdump
顯示為Flags [S]
。例如:10:00:00.123456 IP client.50000 > server.80: Flags [S], seq 123456, win 65535
-
作用:初始化序列號,請求與對端建立連接。
-
-
Flags [R.](RST+ACK 標志) 表示該數據包同時設置了復位標志位(RST)*和*確認標志位(ACK),通常用于異常終止連接。
-
場景:
-
服務器收到發往未監聽端口的 SYN 請求時,會回復
RST+ACK
,表示 “端口不可達”。 -
連接過程中出現數據不一致(如序列號不匹配),一方發送
RST+ACK
強制關閉連接。
-
-
tcpdump 輸出示例:
10:00:01.789012 IP server.80 > client.50000: Flags [R.], seq 0, ack 123457, win 0
-
特點:RST 包不攜帶數據,接收方收到后會立即終止連接并通知應用層。
-
二、TCP 標志位全集及 tcpdump 表示
TCP 頭部共有 6 個標志位,在tcpdump
中通過以下字符表示:
標志位 | 全稱 | 簡寫 | 含義 |
---|---|---|---|
SYN | Synchronize | S | 同步序列號,用于建立連接(三次握手第一步) |
ACK | Acknowledgment | . | 確認號有效,用于確認已接收數據(除 SYN 包外,其他包通常包含 ACK) |
RST | Reset | R | 強制復位連接,用于終止異常或無效連接 |
FIN | Finish | F | 結束標志,用于關閉連接(四次揮手第一步) |
PSH | Push | P | 提示接收方立即將數據交付給應用層,避免緩沖隊列積壓 |
URG | Urgent | U | 緊急指針有效,表示數據需優先處理(帶外數據) |
特殊組合:
-
S.
= SYN + ACK(三次握手第二步,服務器響應客戶端的 SYN 請求) -
F.
= FIN + ACK(四次揮手第二步,對端確認關閉請求) -
P.
= PSH + ACK(推送數據并確認)
三、詳細分析 TCP 報文的方法
1. 基礎字段解析
通過tcpdump
輸出的關鍵字段可定位問題:
10:00:00.123456 IP client.50000 > server.80: Flags [S], seq 123456, win 65535
-
時間戳:
10:00:00.123456
—— 抓包時間。 -
IP 地址與端口:
client.50000 > server.80
—— 源 IP: 端口 → 目的 IP: 端口。 -
標志位:
Flags [S]
—— SYN 標志位。 -
序列號:
seq 123456
—— 初始序列號(ISN),用于數據排序和確認。 -
窗口大小:
win 65535
—— 接收方通告的滑動窗口大小,單位為字節。
2. 使用 tcpdump 參數深入分析
-
抓取完整數據包:
tcpdump -i eth0 -s0 -w capture.pcap 'tcp port 80'
-
-s0
:關閉默認的 68 字節截斷,抓取完整數據包。 -
-w capture.pcap
:保存為 PCAP 文件供后續分析。
-
-
顯示十六進制和 ASCII 內容:
tcpdump -XX -s0 'tcp port 80'
-
-XX
:同時顯示二層頭、IP 頭、TCP 頭及數據部分的十六進制和 ASCII 表示。
-
-
過濾特定標志位:
tcpdump 'tcp-syn|tcp-rst' # 僅抓取SYN或RST包
3. 結合 Wireshark 可視化分析
-
導入 PCAP 文件: 將
capture.pcap
拖入 Wireshark,通過Statistics → Conversation List → TCP查看流量會話。 -
關鍵分析點:
-
三次握手失敗:若客戶端發送 SYN 后未收到 SYN+ACK,可能是服務器端口未監聽(觸發 RST)或網絡阻斷。
-
重傳與超時:Wireshark 的 TCP Stream Graph → Time-Sequence Graph (Stevens) 可直觀顯示重傳次數和超時事件。
-
異常終止:大量 RST 包可能表示連接被強制關閉,需檢查防火墻規則或應用邏輯。
-
4. 進階診斷技巧
-
序列號與確認號:
-
正常情況下,
ack = seq + 數據長度
。若ack
值異常,可能存在丟包或亂序。 -
示例:客戶端發送
seq=100
、長度 50 字節的數據,服務器應回復ack=150
。
-
-
窗口縮放: 若
win
字段顯示為0
,可能是接收方緩沖區已滿,觸發流量控制(TCP Zero Window)。 -
緊急數據: 若
URG
標志位被設置,需結合urgptr
字段定位緊急數據位置。
四、常見場景與標志位組合
-
三次握手成功:
client → server: Flags [S] server → client: Flags [S.] client → server: Flags [.]
-
連接拒絕:
client → server: Flags [S] server → client: Flags [R.] # 端口未監聽或防火墻攔截
-
正常關閉(四次揮手):
client → server: Flags [F.] server → client: Flags [.] server → client: Flags [F.] client → server: Flags [.]
-
數據推送:
client → server: Flags [P.] # 立即將數據交付給應用層
五、總結
通過tcpdump
和 Wireshark 結合分析 TCP 標志位,可快速定位網絡連接問題:
-
SYN/RST:排查端口是否開放、防火墻規則是否攔截。
-
PSH/ACK:驗證數據是否及時交付應用層。
-
FIN/ACK:檢查連接關閉是否正常完成。
掌握這些方法后,可有效診斷網絡延遲、丟包、連接異常等問題,提升 TCP/IP 協議棧的故障排查效率。
六、結果分析方法與工具
1. 命令行實時分析
# 統計TCP標志位分布
sudo tcpdump -i any -q -tttt 'tcp' | awk '{print $6}' | sort | uniq -c# 輸出示例:1422 Flags [P.]893 Flags [.]128 Flags [S]5 Flags [R.]
解讀:
-
[P.]
:數據傳輸包(PSH+ACK) -
[.]
:ACK確認包 -
[S]
:SYN連接請求 -
[R.]
:連接重置(異常)
2. 使用Wireshark深度分析
# 捕獲并保存到文件
sudo tcpdump -i any -w capture.pcap# 在Wireshark中分析
wireshark capture.pcap
Wireshark高級功能:
-
流量圖(Statistics > Flow Graph)
-
協議分層統計(Statistics > Protocol Hierarchy)
-
專家信息分析(Analyze > Expert Info)
-
IO圖表(Statistics > IO Graph)
3. 自動化分析腳本
# 分析HTTP響應時間
tcpdump -ttt -n -r capture.pcap 'tcp port 80 and tcp[13] == 0x18' | \awk '/HTTP/{print $1, $5, $6, $7, $8}'# 輸出示例
0.000000 GET /api/v1/users 200
0.125000 POST /api/v1/orders 201
0.250000 GET /api/v1/products 200
七、性能優化技巧
1. 高效捕獲配置
# 限制包大小(只捕獲頭部)
sudo tcpdump -s 128 -w optimized.pcap# 設置緩沖區大小(避免丟包)
sudo tcpdump -B 4096 -w buffer_optimized.pcap# 過濾后保存(減少文件大小)
sudo tcpdump -w http_only.pcap 'port 80'
2. 長期監控方案
# 按時間分割文件(每小時一個)
sudo tcpdump -G 3600 -w capture_%H.pcap# 按大小分割文件(每100MB)
sudo tcpdump -C 100 -w capture.pcap# 自動壓縮歸檔
sudo tcpdump -w - | gzip > capture_$(date +%Y%m%d_%H%M%S).pcap.gz
八、常用場景命令速查
場景 | 命令 |
---|---|
基礎抓包 | sudo tcpdump -i any -w capture.pcap |
HTTP分析 | sudo tcpdump -i any -A -s0 'tcp port 80' |
DNS調試 | sudo tcpdump -n -s0 port 53 |
TCP連接 | sudo tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0' |
IP+端口 | sudo tcpdump 'host 192.168.1.100 and port 443' |
性能監控 | sudo tcpdump -tttt -q -n -i any > traffic.log |
黃金法則:遇到網絡問題,三步走:
sudo tcpdump -i any -w capture.pcap
保存原始數據使用過濾命令縮小范圍
在Wireshark中深入分析
學習資源推薦
-
官方文檔:
man tcpdump
(最權威參考) -
過濾指南:PCAP-FILTER(7)
-
實戰教程:TCPDump Mastery
-
在線練習:CloudShark
立即打開終端嘗試這些命令,遇到具體問題歡迎在評論區交流討論!