tcpdump 直接用 tcp/udp/icmp/arp 等协议关键字即可过滤对应流量,无需端口或 IP 条件;如 sudo tcpdump -i eth0 tcp 抓纯 TCP 包,udp port 53 匹配双向 DNS 流量,icmp 抓 ICMP 报文,ARP 必须显式用 arp 过滤。

Linux 中抓取指定协议类型的网络流量,核心是利用 tcpdump 或 Wireshark 的协议过滤能力。两者底层都依赖 BPF(Berkeley Packet Filter)语法,但操作方式不同:tcpdump 适合命令行快速定位,Wireshark 更适合图形化深度解析。
用 tcpdump 抓指定协议流量
tcpdump 支持直接用协议名作为过滤条件,无需端口或 IP,简洁高效:
-
HTTP 流量:sudo tcpdump -i eth0 port 80
(注意:HTTPS 是 443,但加密后无法看到 URL/内容,仅能识别连接) - DNS 查询:sudo tcpdump -i eth0 port 53
- ICMP(ping):sudo tcpdump -i eth0 icmp
- TCP 或 UDP 单独抓取:sudo tcpdump -i eth0 tcp / sudo tcpdump -i eth0 udp
- ARP 协议:sudo tcpdump -i eth0 arp
- 完整协议名写法(更可靠):sudo tcpdump -i eth0 proto \tcp / proto \udp / proto \icmp(反斜杠防 shell 解析)
用 Wireshark 抓指定协议流量
Wireshark 启动捕获后,在顶部“显示过滤器”栏输入协议关键字即可实时筛选:
- 直接输入 http、dns、tls、quic(Wireshark 2.6+ 原生支持 HTTP/3)、arp 等协议名
- 组合使用更精准,例如:http and ip.dst == 192.168.1.100
- 过滤器输错时框变红,不影响继续编辑;按回车或点蓝色箭头生效
- 注意区分“捕获过滤器”(启动前设,减少写入量)和“显示过滤器”(捕获后筛,不丢包)
进阶:按协议行为或字段过滤
某些场景需超越协议名,深入协议特征:
- 只抓 TCP SYN 包(连接发起):tcp[tcpflags] & tcp-syn != 0(tcpdump)或 tcp.flags.syn == 1(Wireshark)
- 抓 HTTP GET 请求(tcpdump + BPF):
sudo tcpdump -i eth0 'tcp port 80 and (tcp[((tcp[12]&0xf0)>>2):4] = 0x47455420)'
(匹配 GET 后跟空格的 ASCII 十六进制) - Wireshark 中查看 HTTP 方法:展开 HTTP 层 → “Request Method” 字段,右键可“应用为过滤器”
注意事项与建议
实际使用中容易忽略几个关键点:
- 权限问题:tcpdump 和 Wireshark 都需要 cap_net_raw 权限或 root;非 root 用户需加入 wireshark 组并重登录
- 接口选择:用
tcpdump -D或 Wireshark 主界面确认目标接口(如 eth0、wlan0、lo),避免在错误接口上空抓 - 截断风险:默认 tcpdump 只抓前 68 字节(含 IP+TCP 头),加 -s 0 才捕获完整载荷,尤其对 HTTP 内容分析必不可少
- 敏感信息:抓包文件(.pcap/.pcapng)含明文账号、Cookie、URL 等,导出或共享前务必脱敏或加密











