目錄
1. 核心功能與特性
2. 關鍵參數速查表
3. 基礎命令
3.1 協議/端口過濾
3.2?IP 地址過濾
3.3 高級邏輯組合
3.4 控制輸出詳細度
3.5 解析包內容
3.6 特殊包過濾
3.7 限制抓包數量
3.8 過濾特定大小包
3.9 過濾提升性能
??????3.10?多網卡綁定
3.11 高級組合命令
4. 實戰案例匯總
4.1 案例 1:捕獲 TCP 三次握手
4.2 案例 2:監控特定主機流量
4.3 案例 3:抓取 HTTP GET 請求
4.4 案例 4:診斷 HTTP 500 錯誤
4.5 案例 5:定位 DNS 解析失敗
4.6 案例 6:分析 TCP 連接超時
4.7 案例 7:實時提取 HTTP POST 表單中的密碼字段
4.8 案例 8:HTTPS請求間歇性失敗(證書鏈不完整)?
4.9 案例 9:網絡帶寬異常占用(廣播風暴)?
5. 輸出關鍵字段解析
6. 注意事項
6.1 權限要求
6.2 過濾技巧
6.3 輸出優化
tcpdump 是一款開源的命令行網絡數據包捕獲與分析工具,廣泛應用于網絡故障診斷、性能優化和安全審計。
1. 核心功能與特性
- 實時抓包
基于 libpcap 庫直接監聽網卡流量,支持實時捕獲和解析網絡數據包,輸出可讀性強的文本信息。 - 靈活過濾
支持表達式語法,可按協議(如?tcp
/udp
)、IP 地址(src
/dst
)、端口(port
)、協議標志位等精準過濾數據包。 - 跨平臺兼容
原生支持類 Unix 系統(Linux、BSD 等),Windows 可通過 WinDump(需 WinPcap 驅動)實現同等功能。 - 數據導出與分析
支持將抓包數據保存為?.pcap
?格式文件,便于 Wireshark 等工具深度分析。
2. 關鍵參數速查表
參數 | 作用 | 示例 |
---|---|---|
-i | 指定監聽網卡 | -i eth0 (監聽 eth0 網卡) |
-c | 限制抓包數量,達到后自動停止抓包 | -c 10 (捕獲 10 個包后停止) |
?-C? | 限制單個輸出文件大小(單位 MB)。文件達上限后會創建新文件。 | -C 100 -W 5 -w traffic.pcap |
-w | 保存至文件 | -w traffic.pcap |
-r | 讀取文件分析 | -r traffic.pcap |
-s | 設置抓包長度(-s 0 ?捕獲完整數據包) | -s 64 (只抓前 64 字節) |
-n | 禁用域名解析,不禁用端口解析 | 顯示原始 IP 而非域名 |
-nn | 禁用域名與端口解析 | 顯示原始 IP 和端口號 |
-v ?/?-vv ?/?-vvv | 控制輸出詳細層級(逐級增強) |
|
-l | 字母 (如配合? | tcpdump -l | grep 'keyword' |
-X | 以十六進制+ASCII 碼格式顯示報文內容(含應用層數據) | 分析 HTTP 請求內容時使用。 |
-e | 顯示數據鏈路層信息(如 MAC 地址、VLAN Tag) | 二層網絡問題排查(如 ARP 欺騙分析)。 |
-A | 以 ASCII 格式顯示數據(不顯示鏈路層頭部) | 快速查看文本協議(如 HTTP、FTP)。 |
--number | 為每個輸出行添加序號。 | |
-Q | 捕獲特定方向流量:in (入站)、out (出站)或?inout (雙向)。 | |
-q | -q ?強制使用數字端口號,確保輸出準確,而且便于?awk 、grep ?等工具處理 |
3. 基礎命令
# 抓取所有網卡流量(Ctrl+C 停止)
tcpdump -i any# 抓取特定網卡(eth0)流量
tcpdump -i eth0# 抓包保存到文件(-w 寫入,-r 讀取)
tcpdump -i eth0 -w capture.pcap# 讀取分析
tcpdump -r capture.pcap
3.1 協議/端口過濾
tcpdump tcp # 只抓 TCP
tcpdump udp port 53 # DNS 流量
tcpdump icmp # Ping 包
tcpdump port 80 # HTTP 流量
tcpdump portrange 8000-8080 # 端口范圍
3.2?IP 地址過濾
tcpdump host 192.168.1.100 # 進出該 IP 的流量
tcpdump src 10.0.0.1 # 來源 IP
tcpdump dst 172.16.0.5 # 目標 IP
tcpdump net 192.168.1.0/24 # 整個子網
3.3 高級邏輯組合
tcpdump 'tcp port 80 and (src 192.168.1.5 or dst 192.168.1.5)'
tcpdump 'icmp and not src 10.0.0.1' # 排除特定源
3.4 控制輸出詳細度
tcpdump -n # 禁用主機名解析(只顯示 IP)
tcpdump -nn # 禁用端口解析(顯示數字端口)
tcpdump -v # 增加詳細度
tcpdump -vvv # 最高詳細度(顯示 TTL、校驗和等)
3.5 解析包內容
tcpdump -A # ASCII 格式顯示(HTTP 內容)
tcpdump -X # HEX+ASCII 格式(二進制協議)
tcpdump -XX # 更完整的 HEX 輸出
3.6 特殊包過濾
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' # SYN/FIN 包
tcpdump 'tcp[13] & 4 != 0' # RST 包
tcpdump 'ip[8] < 10' # TTL < 10 的包(常用于 traceroute 檢測)
3.7 限制抓包數量
tcpdump -c 1000 # 抓1000個包后停止
3.8 過濾特定大小包
tcpdump greater 1000 # 抓大于1000字節的包
tcpdump less 128 # 抓小于128字節的包
3.9 過濾提升性能
tcpdump 'ip and not net 192.168.0.0/24' # 排除內網流量
??????3.10?多網卡綁定
tcpdump -i eth0 -i eth1 # 同時抓兩個網卡
3.11 高級組合命令
# 組合技:詳細解析+不解析+大小限制+保存文件
tcpdump -i eth0 -vvv -nn -s0 -c 1000 -w mysql_traffic.pcap 'tcp port 3306'# 實時過濾 MySQL 查詢
tcpdump -i any -s0 -l -A 'tcp port 3306 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x03000000' | grep -B1 -i "SELECT\|UPDATE"# 實時過濾經過服務器443端口的所有流量
tcpdump -i any -nn -vv -X -s 0 port 443 -w local_port_443.pcap
4. 實戰案例匯總
4.1 案例 1:捕獲 TCP 三次握手
場景:分析本地 HTTP 服務的連接建立過程。
命令:
tcpdump -i lo -n tcp port 8080 and 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'
輸出解析:
12:30:01.234 IP 127.0.0.1.12345 > 127.0.0.1.8080: Flags [S] # SYN 請求
12:30:01.235 IP 127.0.0.1.8080 > 127.0.0.1.12345: Flags [S.] # SYN-ACK 響應
12:30:01.236 IP 127.0.0.1.12345 > 127.0.0.1.8080: Flags [.] # ACK 確認
4.2 案例 2:監控特定主機流量
命令:
tcpdump -i eth0 host 192.168.1.100 and not port 22 # 過濾非 SSH 流量
用途:檢查指定主機的網絡活動,排除干擾流量。
4.3 案例 3:抓取 HTTP GET 請求
命令:
tcpdump -s0 -A -n 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' # 匹配 "GET "
說明:
通過檢測 TCP 載荷中的?GET
?關鍵字捕獲 HTTP 請求內容,-A
?參數以 ASCII 顯示載荷。
4.4 案例 4:診斷 HTTP 500 錯誤
tcpdump -i eth0 -s0 -A 'tcp port 80 and host 192.168.1.100'
分析要點:
-
檢查服務端是否返回?
HTTP/1.1 500
-
查看請求頭是否異常
-
觀察 TCP 序列號確認請求/響應完整性
4.5 案例 5:定位 DNS 解析失敗
tcpdump -i any -nn -s0 'udp port 53'
關鍵檢查:
-
客戶端是否發出 DNS 查詢
-
DNS 服務器是否響應
-
響應是否包含?
NXDOMAIN
(域名不存在)
4.6 案例 6:分析 TCP 連接超時
tcpdump -i eth0 'host 10.0.0.5 and tcp port 3306'
診斷步驟:
-
確認 SYN 包是否發出
-
是否收到 SYN-ACK
-
檢查是否有重傳(
[S]
?標志重復出現) -
觀察窗口大小(
win
?值)是否過小
4.7 案例 7:實時提取 HTTP POST 表單中的密碼字段
場景:
調試 Web 登錄流程,確認密碼是否明文傳輸。
sudo tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"
輸出示例:
POST /wp-login.php HTTP/1.1
Host: dev.example.com
log=admin&pwd=secret123&wp-submit=Log+In
關鍵分析:
- `-A`:以 ASCII 格式顯示包內容。
- `-l`:行緩沖,保證實時輸出。
- `egrep` 過濾出關鍵字段。
4.8 案例 8:HTTPS請求間歇性失敗(證書鏈不完整)?
現象?:?
用戶反饋訪問https://lmzf.example.com
時出現ERR_SSL_PROTOCOL_ERROR
,但瀏覽器控制臺無明確錯誤信息。
??抓包分析?:?
# 僅捕獲SSL握手階段
tcpdump -i eth0 -nn -s0 'port 443 and (tcp[20](@ref)& 0x17 = 0x02)' -w ssl_handshake.pcap
??關鍵發現?:?
- 客戶端發送
Client Hello
后,服務端未返回Server Hello
,直接斷開連接。 - 使用Wireshark解析發現:服務端證書鏈缺少中間CA證書。
??根因定位??
服務端配置的SSL證書未包含完整的證書鏈(僅部署了葉子證書)。
解決方案??
重新生成證書文件,包含完整的證書鏈。
4.9 案例 9:網絡帶寬異常占用(廣播風暴)?
現象??
服務器出口帶寬突然飆升至95%,但業務流量無明顯增長。
??抓包分析??
# 按流量排序捕獲大包
tcpdump -i eth0 -nn -q | head -1000 | awk '{print $3}' | sort | uniq -c | sort -nr
??關鍵發現??
- 90%流量來自
192.168.1.100
的ARP廣播請求
(每秒6000+次) - 目標MAC為全零
ff:ff:ff:ff:ff:ff
??根因定位??
網絡設備故障導致ARP表項丟失,觸發大量廣播請求。
??解決方案??
- 修復交換機ARP表同步問題
- 添加靜態ARP綁定:
arp -s 192.168.1.100 00:11:22:33:44:55
5. 輸出關鍵字段解析
18:30:28.123456 IP 192.168.8.100.58218 > 10.0.0.8.80: Flags [S], seq 392665715, win 29200, options [mss 1460,sackOK,TS val 12345 ecr 0,nop,wscale 7], length 0
-
時間戳:
18:30:28.123456
(精確到微秒) -
方向:
>
?表示流量方向 -
Flags:
[S]
=SYN,[.]
=ACK,[P]
=PUSH,[F]
=FIN -
seq/ack:序列號/確認號(跟蹤數據流關鍵)
-
win:窗口大小(流量控制指標)
-
length:數據載荷長度
6. 注意事項
6.1 權限要求
需使用?sudo?或 root 權限執行(因需訪問網卡)。
6.2 過濾技巧
- 組合條件:and/or(如?port 80 or port 443)。
- 排除干擾:not(如?not arp)。
6.3 輸出優化
- 添加?-tttt?顯示完整時間戳。
- 使用?-l?使輸出可實時管道傳輸(如?tcpdump -l | grep 'pattern')。