按协议收窄抓包范围
协议限定词把抓包范围从「所有报文」收窄到某一类:icmp 看通断与差错、arp 看二层地址解析、udp and port 53 看 DNS、ip proto 47 看 GRE 隧道。写在整个表达式最前面可读性最好。需要特别注意的是封装:以太网帧里如果有 802.1Q 标签,链路层结构会整体后移,不加 vlan 限定的大量表达式会直接匹配不到报文。
基本信息
| 适用平台 | Linux tcpdump(语法与 Wireshark 捕获过滤器一致) |
|---|---|
| 常见协议词 | tcp、udp、icmp、icmp6、arp、ip、ip6、vlan、mpls、pppoes |
| 二层写法 | ether proto 0x0806(等价于 arp) |
| 隧道协议 | ip proto 47 为 GRE;VXLAN 走 UDP 4789 |
| 权限要求 | root 或具备 CAP_NET_RAW |
典型使用场景
- 确认 ARP 解析是否正常:抓 arp 看请求与应答是否成对
- 排查 ICMP 差错报文:看是否有目标不可达或需要分片
- 抓 DNS 流量:udp and port 53 观察查询与响应配对
- 隧道排障:按外层协议过滤后再展开内层封装
- 带 VLAN 标签的链路上抓业务流量:必须先写 vlan 再写 ip/tcp
协议过滤示例
协议过滤示例
sudo tcpdump -nn -i eth0 icmp # ICMP 差错与探测
sudo tcpdump -nn -i eth0 icmp6 # IPv6 的 ICMP
sudo tcpdump -nn -i eth0 arp # 二层地址解析
sudo tcpdump -nn -i eth0 udp and port 53 # DNS 流量
sudo tcpdump -nn -e -i eth0 'vlan 100 and ip' # 指定 VLAN 后再限定 IP
sudo tcpdump -nn -i eth0 'ip proto 47' # GRE 隧道外层
sudo tcpdump -nn -i eth0 'ether proto 0x0806' # ARP 的二层写法协议词与用途
| 限定词 | 匹配内容 | 典型用途 |
|---|---|---|
| icmp / icmp6 | ICMP 报文 | 通断判断、差错报文分析 |
| arp | ARP 请求与应答 | 二层地址解析异常、IP 冲突排查 |
| udp / tcp | 传输层协议 | 区分传输方式,配合 port 收窄 |
| vlan | 带 802.1Q 标签的帧 | Trunk 链路抓包的前置条件 |
| ip proto 47 | GRE 协议 | 隧道封装外层观察 |
| mpls / pppoes | MPLS 与 PPPoE 封装 | 运营商或拨号链路场景 |
VLAN 标签会改变报文结构:不加 vlan 限定条件时,很多带标签的报文默认匹配不到 ip 或 tcp 表达式,表现为「抓不到包」。
抓 VLAN 时别忘了 -e:只有加上 -e 才会打印链路层头部,否则即使过滤条件正确,也看不到标签值与源目的 MAC,判读会缺关键证据。
封装叠加场景(如 VXLAN 承载带 VLAN 的业务流量)建议先按外层协议收窄范围落盘,再用显示过滤器逐层展开内层,确认每一层封装是否完整。