tcpdump 是 Linux 系統管理者與網路工程師必備的命令列封包擷取分析工具,基於 libpcap 函式庫,支援強大的 BPF (Berkeley Packet Filter) 過濾語法。本文系統整理常用過濾表達式與實戰場景。
tcpdump # 預設第一個介面 (通常 eth0)
tcpdump -i eth1 # 指定介面
tcpdump -i any # 所有介面
tcpdump -D # 列出可用介面
| 需求 | 指令範例 |
|---|---|
| 特定主機所有封包 | tcpdump host 192.168.1.50 |
| 來源/目的主機 | tcpdump src host 192.168.1.50 / dst host |
| 雙向通訊 | tcpdump host 192.168.1.50 and host 192.168.1.60 |
| 排除特定主機 | tcpdump host 192.168.1.50 and not host 192.168.1.100 |
| 整個網段 | tcpdump net 192.168.1.0/24 |
| 閘道通過封包 | tcpdump gateway 192.168.1.1 |
# 特定埠口
tcpdump port 80
tcpdump src port 22
tcpdump dst port 53
# 協定過濾
tcpdump tcp
tcpdump udp
tcpdump icmp
tcpdump ip6 # IPv6
# 組合:HTTP 流量
tcpdump tcp port 80
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# 最後條件過濾掉無資料的 SYN/FIN/ACK 封包
| 場景 | 過濾表達式 |
|---|---|
| TCP 連線建立/結束 (SYN/FIN) | tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' |
| 封包大小 > 576 bytes | tcpdump 'ip[2:2] > 576' |
| IP 廣播/多播 (非連結層) | tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224' |
| 非 Ping 的 ICMP 封包 | tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply' |
| 特定 TCP 旗標組合 | tcpdump 'tcp[13] == 0x12' (SYN+ACK) |
10:30:45.123456 IP 192.168.1.50.54321 > 192.168.1.100.80: Flags [S], seq 123456789, win 64240, options [mss 1460,sackOK,TS val 1234567 ecr 0], length 0
10:30:45.123456IP192.168.1.50.54321 (IP.埠口)>192.168.1.100.80Flags [S] (SYN)tcpdump -n # 不解析主機名/埠口 (加速)
tcpdump -nn # 連埠口號碼都不解析
tcpdump -X # 顯示十六進位 + ASCII 內容
tcpdump -XX # 含鏈路層標頭
tcpdump -s 0 # 擷取完整封包 (預設 262144 bytes)
tcpdump -w capture.pcap # 寫入檔案供 Wireshark 分析
tcpdump -r capture.pcap # 讀取檔案分析
tcpdump -c 100 # 擷取 100 個封包後結束
tcpdump -e # 顯示連結層標頭 (MAC)
tcpdump -i eth0 -n -s 0 -w http.pcap tcp port 80tcpdump -i eth0 -n udp port 53tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack = 0'tcpdump -e -n 'vlan 100'
-n 避免 DNS 解析阻塞-c 限制數量或 -w 離線分析tcpdump -f filter.txt -i eth0Wireshark / tshark 進行深度協定分析熟練掌握 tcpdump 過濾語法,能在無圖形介面的伺服器環境快速定位網路故障、分析效能瓶頸與偵測安全異常。