首页/网络/抓包与流量分析速查/tcpdump 抓 IPv6 流量

tcpdump 抓 IPv6 流量

用 ip6 原语过滤 IPv6 报文,可继续叠加 icmp6、tcp、udp 等关键字;IPv6 邻居发现、路由通告等基础协议都跑在 ICMPv6 上,排障时要单独关注。

抓 IPv6 流量的写法

ip6 原语把过滤范围限定在 IPv6 报文,之后可以继续叠加 tcp、udp、icmp6 等关键字。IPv6 的地址自动配置与邻居发现都跑在 ICMPv6 上,排查地址无法配置、网关不可达时不能只看 TCP 与 UDP;双栈环境排障的第一步,也是先分清流量走的是哪个协议族。

基本信息

适用平台Linux / macOS / BSD 上的 tcpdump
语法ip6 [and …] / icmp6 / icmp6 and ip6[40] = <类型>
关键类型128/129 Echo、133/134 路由、135/136 邻居发现
常用搭配-nn 不解析名字、-vv 展开字段、-e 看帧头
地址匹配host 关键字后可直接写 IPv6 地址

典型使用场景

  • 排查 IPv6 地址配置失败:先确认能否看到路由通告与邻居交互
  • 验证双栈服务是否真的走了 IPv6,而不只是解析到了 AAAA 记录
  • 检查设备是否按策略放行 ICMPv6,避免邻居发现被拦
  • 核对 IPv6 与 IPv4 两条路径的时延差异
  • 定位只支持 IPv6 的客户端为何连不上服务

常用示例

常用示例
tcpdump -i eth0 -nn ip6                              # 全部 IPv6 流量
tcpdump -i eth0 -nn 'icmp6 and ip6[40] = 135'         # 邻居请求 NS
tcpdump -i eth0 -nn 'icmp6 and ip6[40] = 136'         # 邻居通告 NA
tcpdump -i eth0 -nn 'ip6 and tcp port 443'            # IPv6 上的 HTTPS
tcpdump -i eth0 -nn 'ip6 and host 2400:3200::1'       # 限定对端地址

ICMPv6 类型速查

类型值名称作用
133路由请求主机主动请求路由器通告
134路由通告路由器下发前缀与默认网关信息
135邻居请求地址解析与可达性检测
136邻居通告应答邻居请求
128 / 129Echo 请求与应答等价于 IPv4 环境下的 ping
屏蔽 ICMPv6 会直接破坏地址自动配置与邻居发现,抓不到 NS 与 NA 时先怀疑策略设备而不是终端。
双栈环境下按域名过滤可能同时命中 IPv4 与 IPv6 两串流量,分析前先明确要看的协议族。

补充要点

  • 先确认终端是否真的拿到了 IPv6 地址,再谈过滤表达式怎么写
  • 路由器通告被拦截时终端只有链路本地地址,表现与「完全没有 IPv6」一致
  • IPv6 基础首部固定 40 字节,扩展头会改变后续协议字段的偏移
  • 跨网段排查时源地址可能是临时地址,与设备上的固定地址不同
排查 IPv6 分片与扩展头问题时用 -vv 展开字段,分片信息位于扩展头而非基础首部。
抓包前先用地址查看命令确认本机 IPv6 状态,能省掉大量无效抓包。

易错点

  • 沿用 IPv4 的过滤表达式抓 IPv6:分片与 ICMP 字段结构不同,表达式会失效或返回空结果
  • 把 ICMPv6 当无关流量过滤掉,导致地址配置与邻居发现问题完全查不下去
  • 只按 IPv6 地址过滤却忘了链路本地地址用于邻居交互,抓包时要用 -e 才能看清二层地址

数据来源与参考

  • man 8 pcap-filter(ip6/icmp6)
  • RFC 8200(IPv6)
  • RFC 4443(ICMPv6)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌