tcpdump 是 Linux/Unix 系統級抓包神器,通過 libpcap 直接讀取數據鏈路層幀。本文涵蓋嵌入式移植編譯、核心選項詳解、BPF 過濾語法、協議級輸出解讀、HTTP 抓包實戰、Wireshark 離線分析最佳實踐。
# 1. 下載源碼
wget https://www.tcpdump.org/release/tcpdump-4.99.1.tar.gz
wget https://www.tcpdump.org/release/libpcap-1.10.1.tar.gz
# 2. 編譯 libpcap
tar xf libpcap-1.10.1.tar.gz && cd libpcap-1.10.1
./configure --host=arm-linux --target=arm-linux \
CC=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc \
--with-pcap=linux
make && make install # 生成 libpcap.a
# 3. 編譯 tcpdump
cd ../tcpdump-4.99.1
./configure --host=arm-linux --target=arm-linux \
CC=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc
make && make install # 當前目錄生成 tcpdump 可執行文件
# 4. 部署到目標板
scp tcpdump root@target:/usr/sbin/
關鍵點:CC 指定交叉編譯工具鏈;--with-pcap=linux 強制使用 Linux 平台特定代碼;靜態鏈接可避免目標板缺庫:LDFLAGS="-static"。
| 選項 | 作用 | 典型場景 |
|---|---|---|
-i eth0 | 指定網卡 | 多網卡服務器抓取特定流量 |
-n | 不解析域名,直接顯示 IP/端口號 | 加快輸出、避免 DNS 阻塞 |
-nn | 連端口號也不解析服務名 | 極速輸出 |
-s 0 | 抓取完整幀(默認 68/96 字節截斷) | 需完整 Payload 分析 |
-c 100 | 抓 100 個包後退出 | 自動化腳本、定時抓樣 |
-w file.pcap | 寫入二進制 pcap 文件 | 離線分析、Wireshark 導入 |
-r file.pcap | 讀取 pcap 文件離線分析 | 複現現場、異地協作 |
-X | 十六進制 + ASCII 顯示 Payload(不含鏈路層) | 快速查看 HTTP/JSON 明文 |
-XX | 含鏈路層頭部的十六進制 + ASCII | 分析自定義協議、VLAN 標籤 |
-v/-vv/-vvv | 遞增詳盡度:TTL/ID/選項/校驗和/SMB/NFS 細節 | 深度協議排查 |
-e | 顯示鏈路層頭部(MAC、VLAN、協議類型) | 二層網絡排查 |
-S | 顯示絕對 TCP 序列號(而非相對號) | 精確序列號分析 |
-t/-tt/-ttt/-tttt | 時間戳格式控制:無/相對/毫秒差/絕對日期時間 | 日誌關聯分析 |
-U | 寫文件時包級同步刷盤(配合 -w) | 防止崩潰丟包 |
[proto] [dir] [type] value
# 例子:
tcp port 80 # proto=tcp, type=port, value=80
src host 192.168.1.1 # dir=src, type=host, value=IP
dst net 10.0.0.0/8 # dir=dst, type=net, value=CIDR
not (!) > and (&&) = or (||) # 同級從左到右結合
# 例子:
tcp port 80 or tcp port 443 and host 1.2.3.4
# 等價於:tcp port 80 or (tcp port 443 and host 1.2.3.4)
| 需求 | 表達式 |
|---|---|
| 抓取 HTTP GET/POST 請求 | tcp[20:2]=0x4745 or tcp[20:2]=0x504f(GET=0x4745 "GE", POST=0x504f "PO") |
| 抓取 HTTP 響應 | tcp[20:2]=0x4854(HTTP=0x4854 "HT") |
| 排除 SSH 流量 | not port 22 |
| 只抓特定 VLAN 內的 IP 流量 | vlan 100 and ip |
| MPLS 雙層標籤過濾 | mpls 100000 and mpls 1024 |
| TCP 三次握手包 | 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' |
| IP 片段包 | 'ip[6:2] & 0x1fff != 0' |
| ICMP 非 ping 包 | 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply' |
10:30:45.123456 eth0 00:11:22:33:44:55 > 66:77:88:99:aa:bb, ethertype IPv4 (0x0800), length 98
ethertype:0x0800=IPv4, 0x86DD=IPv6, 0x0806=ARP, 0x8100=VLAN。src > dst: Flags [S], seq 123456, ack 0, win 65535, options [mss 1460,sackOK,TS val 123 ecr 0], length 0
-S),或相對號。udp 53: DNS query A example.com(自動解析應用層)。NFS reply ok 1472 read REG 100664 ids 417/0 sz 29388(-v 顯示文件屬性)。-v 顯示完整 SMB 協議樹,單包可佔屏,慎用。# 1. 生產環境抓取 HTTP 明文(排除 SSH、限制大小、寫文件)
tcpdump -i eth0 -nn -s 0 -c 5000 -w http.pcap 'tcp port 80 and (tcp[20:2]=0x4745 or tcp[20:2]=0x504f or tcp[20:2]=0x4854)'
# 2. 排查 DNS 解析慢
tcpdump -i eth0 -nn -s 0 -vvv port 53
# 3. 分析 TCP 重傳/亂序
tcpdump -i eth0 -nn -s 0 -S -vv 'tcp[tcpflags] & tcp-rst != 0 or tcp[tcpflags] & tcp-fin != 0'
# 4. 抓取特定客戶端完整會話
tcpdump -i eth0 -nn -s 0 -w client.pcap host 192.168.1.100 and not port 22
tcpdump -w capture.pcap 抓包。scp capture.pcap local:/tmp/ 下載本地。File → Open,享受圖形化流圖、專家信息、統計圖表、導出對象(HTTP 對象、文件)、Lua 腳本深度分析。http.request.method == "POST"、tcp.analysis.retransmission、dns.flags.response == 1。CAP_NET_RAW、CAP_NET_ADMIN;容器需 --cap-add=NET_RAW --cap-add=NET_ADMIN。-p 關閉混雜模式,但某些驅動/虛擬網卡(如 docker0、any)強制混雜,-p 不生效。-C 100 -W 10 每 100MB 切換文件,最多 10 個文件循環覆蓋。ip6 proto tcp、ip6 host 2001:db8::1。packets captured / packets received by filter / packets dropped by kernel,dropped > 0% 需增大 -B 緩衝區或降低抓包率。tcpdump 是網絡可觀測性的基石。熟練掌握 BPF 過濾語法、協議字段解讀、pcap 離線分析流程,配合 Wireshark 圖形化優勢,可解決 95% 以上網絡疑難雜癥。建議將常用命令模板做成別名或腳本,沉澱為個人/團隊知識庫。