协议关键字在做什么
BPF 支持直接用协议名过滤:网络层的 ip、ip6、arp、rarp,传输层的 tcp、udp、icmp、icmp6。用名字比用协议号可读得多,也便于他人核对。当协议没有专用名字时,可以退回到按 IP 协议号过滤,例如 GRE 是 47、封装安全载荷是 50、开放最短路径优先是 89。协议关键字可以与其他条件自由组合,是收窄流量范围最基本的一步。
基本信息
| 网络层 | ip / ip6 / arp / rarp |
|---|---|
| 传输层 | tcp / udp / icmp / icmp6 |
| 按协议号 | ip proto 47 表示 GRE,ip proto 89 表示开放最短路径优先 |
| 组合方式 | 协议名与 host、port、net 用 and 连接 |
| 常用协议号 | 6 TCP、17 UDP、47 GRE、50 封装安全载荷、89 开放最短路径优先 |
典型使用场景
- 只看管理类流量:用 icmp 观察探测行为
- 排查二层地址解析:用 arp 过滤地址请求与应答
- 识别隧道流量:用协议号过滤封装类型
- 排除噪音协议:用 not 去掉地址解析与探测报文
- 双栈环境分别排查:明确指定 ip 或 ip6 避免混淆
常用示例
常用示例
tcpdump -i eth0 -nn icmp # 全部 ICMP
tcpdump -i eth0 -nn 'ip6 and udp port 547' # IPv6 前缀分配
tcpdump -i eth0 -nn arp -c 20 # 地址解析
tcpdump -i eth0 -nn 'ip proto 47' # GRE 隧道
tcpdump -i eth0 -nn 'ip proto 89' # 开放最短路径优先
tcpdump -i eth0 -nn 'not (arp or icmp)' # 排除两类噪音
tcpdump -i eth0 -nn 'ip and not tcp and not udp' # 只看既非 TCP 也非 UDP 的 IP 流量协议关键字与用途
| 关键字 | 层次与含义 | 典型用途 |
|---|---|---|
| ip | 网络层 IPv4 | 明确限定地址族,避免与 IPv6 混淆 |
| ip6 | 网络层 IPv6 | 双栈环境单独排查 IPv6 流量 |
| arp | 地址解析 | 排查同网段通信与网关地址变化 |
| tcp | 传输层有连接协议 | 绝大多数业务流量的载体 |
| udp | 传输层无连接协议 | 解析、时间同步、新式传输协议 |
| icmp | 控制报文 | 连通性探测与不可达反馈 |
| ip proto 数值 | 按协议号匹配 | 没有专用名字的封装协议 |
协议关键字作用于网络层及以上。在带隧道封装的报文上它可能匹配到内层协议,需要结合详细解码模式判断到底命中在哪一层,避免误读。
IPv6 的正常运行依赖 ICMPv6,排查 IPv6 问题时屏蔽或排除 ICMPv6 会制造出新的故障,例如邻居发现与地址配置异常。
与其他条件组合
与其他条件组合
tcpdump -i eth0 -nn 'arp and host 10.0.0.1' # 与网关的地址解析
tcpdump -i eth0 -nn 'icmp and host 10.0.0.9' # 与该主机的探测
tcpdump -i eth0 -nn 'tcp and port 443 and not icmp' # 主流量,条件写全更清晰
tcpdump -i eth0 -nn -v 'ip proto 47' -c 5 # 详细模式确认内外层判读要点
- 地址解析报文只在同一广播域可见,跨网段抓不到属于位置问题
- 控制报文被限速或屏蔽时探测失败不代表目标不可达,需换传输层探测验证
- 隧道流量过滤要明确指定内外层,同一报文可能同时命中多个协议关键字
- 协议名大小写在表达式里不敏感,但为了可读性统一用小写更规范