摘要

  • 链路检查字段为空,可能表示检查未执行、结果未导出或数据丢失;它既不等于检查通过,也不等于检查失败。只有服务器实际执行验证且失败时,RFC 9686 才要求丢弃消息,并建议记录失败。
  • 成功的 ADDR-REG-REPLY 只说明服务器收到有效的 ADDR-REG-INFORM,并要求客户端停止重传。它不能填补日志、数据库绑定、链路验证、实际流量、身份或行动授权上的空白。
  • 自动化必须把“从未产生”“产生但未保存”“曾经存在但已经过期”和“另一个系统尚未提供证据”分开编码,否则空值会被误当成许可或定罪依据。
  • 从地址登记走向隔离,应依次回答观测是否成立、归因强度是否足够、政策是否授权行动;任何未知状态都应缩小自动化权限,而不是由系统自行补写结论。

RFC 9686 是 IETF DHC 工作组形成、于 2024 年 12 月发布的标准轨 RFC。它让使用 SLAAC 自生成地址或静态地址的设备可以向 DHCPv6 基础设施登记,从而恢复一条地址可观察通道。RFC 9915 已取代 RFC 8415,并在第 6.6 节说明:地址由设备选择,服务器为这种登记创建 lease,设备执行周期性动作,lease 也可能过期。这是机制描述,不是带有 RFC 2119 MUST 的独立要求;它也不意味着地址由 DHCPv6 分配。

真正影响安全决策的,不是系统里有没有一条“成功”记录,而是每个缺失字段究竟属于哪一种状态。

六种不能互换的负证据

第一种:检查未执行。 RFC 9686 规定,服务器应该验证登记地址是否适用于所在链路,或是否位于通过 DHCPv6-PD 委派给客户端的前缀内。其规范强度是 SHOULD,意味着实现可以在有充分理由时不执行。若字段显示 not_performed,只能得出服务器没有完成这项验证,不能推断地址适合链路,也不能推断它不适合。

第二种:检查失败。 只有验证实际执行并且失败,服务器才必须丢弃消息,并应该记录这一事实。failed 因而是一项明确的否定结果,与空值不同。它支持拒绝该登记,却仍不能单独证明客户端恶意、地址由谁控制或相关报文确实出现。

第三种:日志被禁用。 对被接受的登记,服务器必须记录登记信息,除非配置为不记录。logging_disabled 表示本地政策明确关闭了日志;write_failed 表示本应记录却发生故障;no_record_found 则可能来自查询范围、留存期或数据管道问题。三者不能合并为“没有登记”。

第四种:binding 未创建。 服务器应该建立 Client Identifier 与 IPv6 地址的 binding,其规范强度是 SHOULD。binding_absent 可能是实现有理由省略,也可能是写入失败或状态已被清理。它不推翻已经收到消息这一事实,却降低了后续依靠服务器数据库做关联的能力。RFC 9915 所描述的 lease 生命周期,也不能被拿来伪造一条实际并不存在的 RFC 9686 binding。

第五种:记录已经过期。 binding 寿命跟随地址的 valid lifetime;valid lifetime 为零表示过期。expired 说明服务器侧时间状态已经终止,不等于该记录从未存在,也不证明设备在整个有效期内持续使用地址。过期后的流量若仍出现,需要新的网络证据解释。

第六种:没有实际使用证据。 Neighbor Cache 历史、端口信息或地址登记能够提供上下文,却不等于包或流量层面的实际使用证据。没有防火墙、应用日志、IPFIX 或抓包记录,只能说明当前证据集中没有确认目标通信,不能把“未观察到”自动提升为“没有发生”。

回执关闭重传,不关闭不确定性

客户端必须先确认接口所连接的 DHCPv6 基础设施支持登记。它通过 Option Request 请求 OPTION_ADDR_REG_ENABLE;基础设施在 Advertise 或 Reply 中返回该选项。没有支持信号时,客户端不得登记。发现支持后,客户端为有效的全局范围自生成或静态地址发送 ADDR-REG-INFORM;链路本地地址不登记。

消息必须包含 Client Identifier 和恰好一个 IA Address,并从待登记地址发出。服务器必须丢弃缺少 Client Identifier、携带 Server Identifier、包含 Option Request,或 IA Address 与原始源地址不匹配的消息。经中继时,比较对象是最内层 Relay-forward 的 peer-address。

对被接受的登记,服务器在未禁用记录时必须写日志,应该建立 Client Identifier—地址 binding,应该将地址标记为不可分配,并且必须发送 ADDR-REG-REPLY。这四项行为不能折叠成一个“已确认”状态。尤其是 Reply,只表示服务器收到有效消息,并让客户端停止重传;它不证明日志或 binding 已持久化,也不证明链路验证已经执行。

RFC 9686 还明确限制旁路设备的推断。服务器必须回复有效消息,但 DHCPv6 relay 或其他 snooping 节点不得仅凭 ADDR-REG-REPLY 新增或改变转发状态或安全状态。监听到回执不是获得隔离权限的替代途径。

从观测到行动的决策树

自动化可以采用一棵三层决策树,而不是寻找一个万能的成功字段。

  1. 观测层:服务器究竟看见了什么?

    • 是否已在该接口发现 OPTION_ADDR_REG_ENABLE?
    • 是否收到结构正确、地址匹配的 ADDR-REG-INFORM?
    • 是否经过中继,最内层 peer-address、接口、链路标识和时间是否保留?
    • 链路或委派前缀验证是 passed、failed、not_performed 还是 unknown?
    • 日志、binding、不可分配标记和 Reply 各自处于什么状态?

    若验证失败,登记必须被丢弃;若检查未执行或状态未知,系统只能保留较窄的“收到客户端主张”结论。

  2. 归因层:还有哪些独立关联?

    • 是否存在目标时窗内的防火墙、应用、IPFIX 或包记录?
    • 是否有邻居缓存历史、认证、RADIUS、资产清单和交换机或路由器端口信息?
    • 各数据源时钟、有效期与留存窗口是否重合?
    • 是否有同一地址对应不同 Client Identifier,或同一标识跨多个链路出现?

    RFC 4862 的 DAD 只检查链路内地址可能具有的唯一性,且并非完全可靠;它不认证主体。FCFS SAVI 可以增强保护边界内的持有者判断,但 RFC 6620 在该机制中只允许交换机端口作为 binding anchor。即使锚可信,它也提供链路附着线索,而不是自然人身份或实际发包证明。

  3. 授权层:当前证据允许做什么?

    • 本地政策是否允许依据这一证据组合自动处置?
    • 动作是增加监测、要求补证、限制会话,还是隔离设备或账号?
    • 是否需要人工批准、时间限制、回滚条件和申诉渠道?
    • 缺失值会不会被规则引擎默认转换成“通过”或“失败”?

    协议规范可以规定消息处理,却不授予组织处罚权。证据不足时,自动化的合法输出可以是“升级调查”或“禁止自动隔离”,而不是替缺失字段选择最方便的含义。

刷新缺席也有多种解释

SLAAC 地址登记并不是固定周期心跳。客户端在登记或刷新时,以当前 valid lifetime 的 80% 为基础,乘以 0.9 至 1.1 的随机去同步系数,计算 NextAddrRegRefreshTime;但初次计算本身并不安排 refresh。

只有网络将现有地址的 Valid Lifetime 改变超过 1% 时,客户端才安排刷新。若寿命只是正常倒计时,预计过期时刻不变,客户端可能始终不发送刷新,因为服务器已有足够信息让登记按原定时刻过期。因此,越过 nominal 80% 时间点而没有新消息,不是刷新中断的证明。

静态地址默认每 4 小时刷新一次,且间隔应该可配置。这个 4 小时是登记刷新间隔,不是地址寿命,也不能统一套用到 SLAAC。监测状态至少应区分 refresh_not_scheduled、refresh_scheduled、refresh_overdue、expired_as_expected 与 telemetry_missing。

来源