IPv6 先用 ICMPv6 解析邻居,TCP 才能正常通信
以太网链路上的 IPv6 主机,需要先取得邻居的链路层目的地址,才能发送相应帧。邻居发现通过 ICMPv6 的邻居请求和邻居通告完成地址解析,同时还涵盖路由器发现、邻居可达性检测等超出 IPv4 ARP 的功能。把它简单理解为“地址更长的 ARP”,会掩盖配置 IPv6 网络时必须考虑的依赖关系,尤其是控制报文与应用通信之间的联系。 坏掉的样子 拥有有效 IPv6 地址和路由,不代表能够解析下一跳的以太网地址。如果必要的请求或通告被过滤,TCP 服务可以一直正常监听,客户端却在交换应用数据前就失败。只开放应用 TCP 端口,无法修复这个较低层依赖。排查时应把邻居表、相关 ICMPv6 流量和服务监听一起观察,不能只从端口是否开放判断整条路径。 缓存状态还可能隐藏错误。已有可用邻居条目的主机,在破坏性规则安装后可能继续通信;新客户端或条目失效之后,故障才暴露。反过来,STALE 状态也不自动意味着损坏:邻居发现可以利用已有链路地址,随后再检查可达性。应理解状态转换,不能要求每个正常条目永远显示 REACHABLE,否则会把正常缓存生命周期误判为故障。 另一类混淆,是在本地以太网段上解析远端应用服务器地址。目的地位于链路之外时,主机通常解析选中的下一跳路由器,而不是远端服务器。判断邻居表应出现哪个地址之前,需要先确认选路。捕获接口错误,或者已有缓存使本次无需重新发送请求,也能解释空白抓包结果,不能据此证明邻居发现根本没有发生。 本图解释 ICMPv6 依赖。邻居解析不认证地址归属,也不单独验证 SLAAC、路由器通告处理或重复地址检测;绘图未重跑网络实验。 快速验证 历史报告使用 Python 3.11.16、iproute2 6.1.0、nftables 1.0.6 与 tcpdump 4.99.3;本轮未重跑。脚本名为 check-neighbor-discovery.py,只应留给另外获得授权的可丢弃 Linux 虚拟机。容器共享其内核,NET_ADMIN、SYS_ADMIN、proc 挂载和命名空间防火墙变更需要这一隔离边界。构建阶段会下载软件包,--network none 只适用于之后的容器运行。保持断言开启,不要为绕过设置失败而放宽宿主安全策略。新建 veth、邻居与防火墙变更仅应存在于实验内部: ...