tcpdump 是 Linux 系統管理員、網絡工程師、安全分析師必備的命令行抓包神器。本文匯總高頻使用場景、核心參數詳解、BPF 過濾表達式實例、輸出文件分析流程,助您快速定位網絡故障、分析協議交互、排查性能瓶頸。
| 參數 | 含義 | 典型值/示例 |
|---|---|---|
-i <interface> | 指定監聽網卡 | eth0, any (所有接口), lo |
-n | 不解析主機名/IP 端口服務名 (顯著加快輸出) | 必加,生產環境標配 |
-nn | 同時不解析協議名/端口號 (更快) | 極強推薦 |
-c <count> | 抓取指定數量數據包後退出 | -c 100 |
-w <file.pcap> | 寫入二進制 pcap 文件 (供 Wireshark 分析) | -w capture.pcap |
-r <file.pcap> | 讀取 pcap 文件離線分析 | -r capture.pcap |
-s <snaplen> | 抓取長度 (字節),0 表抓完整包 | -s 0 (現代版默認 262144) |
-v / -vv / -vvv | 遞增詳細輸出級別 (協議解析細節) | -vv |
-X / -XX | 十六進制+ASCII 顯示數據載荷 (含/不含鏈路層頭) | 調試應用層協議 |
-e | 顯示鏈路層頭部 (MAC 地址) | 排查 ARP/二層問題 |
-t / -tt / -ttt / -tttt | 時間戳格式控制 | -tttt 完整日期時間最易讀 |
-S | 顯示絕對 TCP 序列號 (而非相對) | TCP 重傳/亂序分析 |
-Z <user> | 權限分離:以指定用戶寫文件 (安全) | -Z nobody |
# 抓取 eth0 上 500 個包,存檔供 Wireshark
tcpdump -i eth0 -nn -s 0 -c 500 -w eth0_500.pcap
# 長期抓包 (環形緩衝,每 100MB 切換文件,保留 10 個)
tcpdump -i eth0 -nn -s 0 -C 100 -W 10 -w /var/log/tcpdump/eth0_ring.pcap
# 只抓 HTTP (80) 流量
tcpdump -i eth0 -nn -s 0 -c 200 -w http.pcap port 80
# 只抓 HTTPS (443) 流量
tcpdump -i eth0 -nn -s 0 -w https.pcap port 443
# 排除 SSH (22) 干擾 (運維操作產生大量包)
tcpdump -i eth0 -nn -s 0 -w no_ssh.pcap port not 22
# 多端口 OR (MySQL 3306 或 Redis 6379)
tcpdump -i eth0 -nn -s 0 -w db.pcap 'port 3306 or port 6379'
# 端口範圍 (被動模式 FTP 數據端口 20000-21000)
tcpdump -i eth0 -nn -s 0 -w ftp_data.pcap 'portrange 20000-21000'
# 只抓與 192.168.1.100 通信的包 (源或目的)
tcpdump -i eth0 -nn -s 0 host 192.168.1.100
# 只抓源 IP 為 10.0.0.1 的包
tcpdump -i eth0 -nn -s 0 src host 10.0.0.1
# 只抓目的 IP 為 8.8.8.8 的包 (DNS 查詢)
tcpdump -i eth0 -nn -s 0 dst host 8.8.8.8
# 子網過濾 (內網 192.168.0.0/16)
tcpdump -i eth0 -nn -s 0 net 192.168.0.0/16
# 只抓 TCP 協議
tcpdump -i eth0 -nn -s 0 tcp
# 只抓 UDP (DNS/流媒體)
tcpdump -i eth0 -nn -s 0 udp
# 只抓 ICMP (Ping/路由錯誤)
tcpdump -i eth0 -nn -s 0 icmp
# 只抓 TCP SYN 包 (連接建立嘗試)
tcpdump -i eth0 -nn -s 0 'tcp[tcpflags] & tcp-syn != 0'
# 只抓 TCP RST 包 (連接異常重置)
tcpdump -i eth0 -nn -s 0 'tcp[tcpflags] & tcp-rst != 0'
# 只抓 TCP FIN 包 (連接正常關閉)
tcpdump -i eth0 -nn -s 0 'tcp[tcpflags] & tcp-fin != 0'
# 目標:抓取 192.168.1.50 訪問 10.0.1.10:80 的完整 HTTP 會話
tcpdump -i eth0 -nn -s 0 -w session.pcap 'host 192.168.1.50 and host 10.0.1.10 and port 80'
# 目標:排除 SSH、抓取內網 Web 異常 (RST/重傳)
tcpdump -i eth0 -nn -s 0 -w web_issue.pcap 'port 80 and (tcp[tcpflags] & (tcp-rst|tcp-syn|tcp-fin) != 0) and not port 22'
scp user@host:/path/to/capture.pcap . (二進制模式)。File → Open。http、dns、tcp.port == 3306tcp.analysis.retransmission (重傳)、tcp.analysis.lost_segment (丟包)tcp.stream eq 5 (跟蹤特定 TCP 流)Statistics → Flow Graph (時序圖)Statistics → Conversations (會話統計)Statistics → TCP Stream Graphs → Round Trip Time (RTT 走勢)Analyze → Expert Information (專家信息:錯誤/警告/提示)File → Export Packet Dissections → As CSV/JSON 供腳本處理。-i any 或 10Gbps+) 使用 -c 限制數量、-s 96 只抓頭部、或使用內核旁路工具 (pf_ring, DPDK, XDP)。CAP_NET_RAW, CAP_NET_ADMIN。生產環境建議專用賬號 + setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump。tcpdump -e 顯示 802.1Q 標籤,過濾 vlan 100。ip6, ip6 host ::1。-C 100 -W 10 (100MB*10=1GB 循環) 適合間歇性故障捕獲。tcpdump -i <if> -nn -s 0 -c <N> -w <file> <BPF filter> 是萬能模板。熟練掌握 BPF 語法 (host, port, net, proto, tcpflags, and/or/not) 能將海量流量精準縮小至問題領域,配合 Wireshark 圖形化深度分析,構成網絡故障定位的「雙劍合璧」。