最简洁可靠的方式是用ip6关键字抓取所有IPv6流量,命令为sudo tcpdump -i eth0 -nn -s0 ip6,它不依赖上层协议或地址端口,且必须显式指定ip6前缀以区分IPv4。

直接用 ip6 关键字就能抓 IPv6 流量,这是最简洁、最可靠的方式。它会匹配所有 IPv6 数据包,不管上层是 TCP、UDP 还是 ICMPv6,也不依赖地址或端口条件。
基础抓取:只看 IPv6 包
运行以下命令即可捕获当前接口上的全部 IPv6 流量:
-
sudo tcpdump -i eth0 ip6—— 指定网卡(如 eth0),避免混入 loopback 或其他接口流量 - 加
-nn防止 DNS 和端口解析拖慢速度:sudo tcpdump -i eth0 -nn ip6 - 加
-s0确保截取完整数据包(尤其对 IPv6 扩展头重要):sudo tcpdump -i eth0 -nn -s0 ip6
组合过滤:定位特定 IPv6 行为
IPv6 流量常涉及邻居发现(NDP)和路由通告,可结合协议关键字进一步缩小范围:
- 抓 ICMPv6 的邻居请求(NS)和邻居通告(NA):
sudo tcpdump -i eth0 icmp6 and \(icmp6[0] = 135 or icmp6[0] = 136\) - 抓路由器请求(RS)和路由器通告(RA):
sudo tcpdump -i eth0 icmp6 and \(icmp6[0] = 133 or icmp6[0] = 134\) - 只抓某 IPv6 地址的通信:
sudo tcpdump -i eth0 ip6 host 2001:db8::1 - 抓某 IPv6 子网的流量:
sudo tcpdump -i eth0 ip6 net 2001:db8::/64
注意 IPv6 和 IPv4 的关键区别
IPv6 没有广播,大量使用多播和 NDP 替代 ARP;TCP/UDP 过滤语法与 IPv4 一致,但必须显式写 ip6 前缀,不能省略:
- ✅ 正确:
ip6 and tcp port 80、ip6 and udp port 53 - ❌ 错误:
tcp port 80(可能混入 IPv4)、udp port 53(同样不区分 IP 版本) - IPv6 的扩展头(如 Hop-by-Hop、Routing Header)不会被
ip6自动跳过,-s0尤其重要,否则可能截断关键字段
验证是否真有 IPv6 流量
如果执行 tcpdump -i eth0 ip6 后长时间无输出,先确认系统是否启用 IPv6:
- 检查接口是否有 IPv6 地址:
ip -6 addr show dev eth0 - 确认内核未禁用 IPv6:
sysctl net.ipv6.conf.all.disable_ipv6(返回 0 表示启用) - 某些环境(如容器或云主机)默认关闭 IPv6,需手动配置或检查网络策略











