首页/网络/抓包与流量分析速查/tcpdump 协议关键字过滤

tcpdump 协议关键字过滤

直接用协议名过滤:ip、ip6、arp、rarp、tcp、udp、icmp、icmp6 等;比用 proto 编号可读,且部分协议名能直接命中嵌套场景。

协议关键字在做什么

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            # 详细模式确认内外层

判读要点

  • 地址解析报文只在同一广播域可见,跨网段抓不到属于位置问题
  • 控制报文被限速或屏蔽时探测失败不代表目标不可达,需换传输层探测验证
  • 隧道流量过滤要明确指定内外层,同一报文可能同时命中多个协议关键字
  • 协议名大小写在表达式里不敏感,但为了可读性统一用小写更规范

易错点

  • 把协议号写成端口条件,两类条件含义完全不同,永远匹配不到
  • 在隧道流量上误按内层协议过滤,实际命中层次与预期不一致
  • 屏蔽或过滤 ICMPv6 会影响 IPv6 基础功能,制造出新的故障
  • 只用协议关键字不叠加地址或端口,高流量口上命中量过大影响分析效率
  • 双栈环境里只用 ip 关键字,漏掉 IPv6 那一半流量

数据来源与参考

  • man 8 pcap-filter(协议原语)
  • RFC 791(IP 协议字段)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌