摘要
- RFC 9898 把十五类 IPv6 Neighbor Discovery 问题归到三个根因:多播、默认信任同链路节点,以及路由器按需创建 NCE。
- REACHABLE 表示 ND 近期确认过相邻 IP 层的正向可达性;它不证明地址权属、用户身份、整个事故窗口内的授权,也不证明应用成功。
复盘会上,邻居表截图被放在最醒目的位置。目标 IPv6 地址对应一条链路层地址,状态是 REACHABLE,时间也落在调查区间附近。有人于是问:“既然路由器认得这个地址,能否确认当时是哪位用户?”
不能。路由器没有撒谎,只是问题超出了它的职责。邻居表为下一帧寻找本地出口;用户身份来自接入认证,地址使用权来自分配或委派,历史归因还需要时间一致的日志。把最容易查询的表当成总账,会把证据缺口藏在一个绿色状态后面。
RFC 9898 的价值不在创造新协议,而在整理二十多份 RFC 里的部署经验。它列出十五项潜在问题,并提醒这些问题不一定在每个网络出现。更重要的是,它把复杂现象收束为三个设计来源:ND 多次使用多播;原始链路模型把同链路节点视为可信;当路由器收到发往未知 on-link 地址的报文时,会临时创建 Neighbor Cache Entry 并启动解析。
RFC 4861 对状态边界说得很清楚。Neighbor Cache、Destination Cache、Prefix List 与 Default Router List 是不同的概念结构。Neighbor Cache 保存相邻节点的链路层信息与可达状态;Destination Cache 保存目的地址应走的下一跳;Prefix List 决定哪些前缀被视为 on-link;Default Router List 保存可选路由器。实现可以在内部合并数据结构,审计却不能把它们的含义也合并。
当节点知道下一跳 IP 却不知道链路层地址时,它会创建 INCOMPLETE 条目,发送多播 Neighbor Solicitation,并暂存等待解析的报文。收到有效的 solicited Neighbor Advertisement 后,条目可写入链路层地址、转为 REACHABLE,并释放队列。其后还可能经历 STALE、DELAY 与 PROBE。
这些状态全是执行语义。REACHABLE 只表示按照 ND 的规则,邻居 IP 层的正向路径近期得到确认。STALE 表示链路层地址已知,但近期可达性未被确认。它们不记载租用合同、不说明谁通过认证、不证明某组织有权长期使用地址,也不会在缓存淘汰后自动留下完整历史。
“按需建表”让这条界线变得无法忽视。远端攻击者不必进入本地链路,只需向 on-link 前缀内大量不存在的地址发送流量,就能诱使路由器创建许多 INCOMPLETE 条目并逐个发起解析。于是,邻居缓存既是映射表,也是有限的 CPU、内存与待处理工作额度。
这意味着条目数量不能直接当成主机数量。INCOMPLETE 可能只是一个没有答案的问题,不是活跃设备。反过来,表里没有某地址,也可能源于超时、淘汰、重启、容量上限或近期没有流量,不能直接证明主机不存在。
RFC 9898 把后果分成三类。第一是 NCE 耗尽,解析工作拖垮资源;第二是首包在等待解析时延迟甚至丢失;第三是地址问责不足。SLAAC 允许主机自行生成地址,路由器可能直到需要转发时才知道它。即便使用 DHCPv6,如果没有 snooping、地址注册或其他接入关联,转发路由器也未必拥有完整的地址历史。
不同缓解措施解决不同问题。RFC 6583 建议过滤未使用地址空间、限制 ND 处理速率,并优先服务已有 NCE。它们保护的是容量和在用邻居。厂商常为每个接口设置条目上限;上限避免无限扩张,却也会在合法地址多于容量时造成丢包。容量保护不会凭空产生身份信息。
RFC 9131 关注首包。主机可通过 Gratuitous Neighbor Discovery 让首跳路由器预先建立 STALE 条目,使返回流量到来时不必再从零解析。这能减少等待和丢包,但 STALE 本来就表示“有链路层信息、近期可达性未确认”,更不等于“用户身份已核实”。
SAVI、RA-Guard 与 DHCPv6 地址注册也不能压成一个“ND 安全”开关。SAVI 把地址与二层端口绑定,拒绝其他端口冒用;RA-Guard 限制哪些端口可以发送 Router Advertisement;地址注册把主机自生成或静态配置的地址告知管理系统。RFC 9099 给出了更广的 IPv6 安全背景。每项控制都能提供一段证据,但见证对象不同。
RFC 9898 最值得管理层关注的结论是隔离。L3 加 L2 隔离把每个主机放进独立子网与链路,从而同时缩小多播域、信任域,并让路由器按唯一前缀转发,减少按需解析。仅做 L3 隔离时,每个主机或客户端获得独立前缀,但底层介质仍可共享。部分 L2 隔离借助代理划分多播域。非隔离方案则针对单项症状修补。
强隔离并非免费。它需要路由器和交换层能力,可能增加逻辑接口,把主机间流量集中到路由器,还可能破坏 mDNS 之类主机间多播服务。RFC 8273 还提醒:若同一链路层地址每次都得到同一独立前缀,远端会更容易跟踪主机。RFC 9663 说明 DHCPv6-PD 能在大型广播网络按客户端分配前缀,但能规模化不代表隐私选择已经完成。
可靠归因因此必须跨表连接。首先保存前缀分配或委派事件、有效期与签发方;再保存接入会话、认证结果、端口、线路或无线承载;随后加入 SAVI 绑定或 DHCPv6 注册;最后才是带接口、IPv6 地址、链路层地址、状态、原因和时钟质量的 NCE 变化。若要证明业务结果,还要继续接上报文观察与应用提交记录。
时间必须进入主键。事故之后查询到的映射不能替代事故发生时的映射。临时地址、MAC 随机化、重连、故障切换、缓存刷新都会让部分标识保留、主体却改变。日志没有保留,就应写明无法证明,而不是用后来状态补写过去。
Heng Lu 的运行代码优先不是让路由器成为最高权威,而是让每个系统只对自己直接执行的事实负责。路由器证明缓存状态;接入系统证明认证会话;委派系统证明它发放的前缀;应用证明它提交的操作。谁的查询界面更方便,谁也不会因此获得跨层主权。
现实层要求我们不让符号代替其描述的对象;数据主权的技术与实践区别要求不把技术控制写成权属;最小初始规范则允许 ND 保持薄而互通,把隔离强度、缓存预算、注册、隐私、保留与回滚留给能观察本地拓扑的运营者。
管理层真正需要问的是:哪套系统在什么时间观察到了哪种关系,它在故障时会丢掉什么,又有什么独立证据把本地转发状态连接到应承担责任的主体?
Sources
- https://www.rfc-editor.org/rfc/rfc9898.html
- https://www.rfc-editor.org/rfc/rfc4861.html
- https://www.rfc-editor.org/rfc/rfc6583.html
- https://www.rfc-editor.org/rfc/rfc9099.html
- https://www.rfc-editor.org/rfc/rfc9131.html
- https://www.rfc-editor.org/rfc/rfc8273.html
- https://www.rfc-editor.org/rfc/rfc9663.html
- https://heng.lu/running-code-primary-the-patch-needed-to-preserve-the-internet-original-design/
- https://heng.lu/minimum-initial-specification-localized-future-decision-voluntary-adoption-internet-coordination-system/
- https://heng.lu/on-reality-layers-symbolic-power-and-why-clarity-feels-so-hostile/
- https://heng.lu/on-data-sovereignty-technical-vs-practical-realities/
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance

