摘要

  • RFC 9827 只改名并扩展语义空间:Transform Type 5、ID 0 与 ID 1 获得更准确的名称,但 AH/ESP 处理与线上比特均未改变。
  • ID 0 和 ID 1 保证 SA 级序列在入网时单调递增、不回卷且唯一,所以适合支撑 anti-replay;接收端是否真正启用滑动窗口,仍是每个 SA 的本地决定。
  • 协商、发送端分配、汇总入网属性、接收观察、认证、窗口状态、重放拒绝和下游安全是八份不同证据。隐式 IV 要求唯一,AGGFRAG/IP-TFS 还要求严格的连续 +1。

一次改名,揭开一个长期误读

RFC 9827 于 2025 年 11 月作为 Standards Track 发布。它没有给 ESP 增加一个字节,也没有改写 AH 的接收算法。它把 Transform Type 5 从 Extended Sequence Numbers 改名为 Sequence Numbers;ID 0 从 No Extended Sequence Numbers 改成 32-bit Sequential Numbers;ID 1 则改成 Partially Transmitted 64-bit Sequential Numbers。

旧语义仍然有效,线上字段没有变化。改名之所以重要,是因为旧名称把“序列属性协商”缩成了“是否使用 ESN”。实际上,这个 Transform 所承载的契约更宽:计数器的逻辑宽度是多少,哪些位在线上,是否递增,能否回卷,是否在整个 SA 范围内唯一。

IANA 当前登记已经证明这种扩展不是文字游戏。RFC 9838 后来定义了 ID 2:32-bit Unspecified Numbers。字段仍是 32 位,但同一 SA 内的唯一性不再保证。3–1023 尚未分配,1024–65535 留作私有使用。以后同一 Type 下可以出现完全不同的序列属性,不能再凭“支持 Type 5”推断 replay protection 的效果。

因此,运营审计的起点不该是一盏“ESN 已启用”的绿灯,而应是:到底协商了哪个 ID,这个 ID 由哪份规范定义,它只保证到哪一条边界。

契约只到报文进入网络为止

RFC 9827 对边界说得十分精确:Type 5 描述同一 IPsec SA 的报文在进入网络时所具有的序列号属性。

这里的“序列号”不一定等于报文里可见的 32 位字段。ID 1 的低 32 位随 AH/ESP 发送,高 32 位由接收端依据此前已认证报文重建。它是一项逻辑状态,而非完整线上字段。

属性也不是对某个 sender 动作的表扬,而是对 SA 报文集合的断言。两个不同 sender 或两个硬件队列都可能认真递增各自的本地计数器,却在同一 SA 下撞上相同数值。每个局部生成器“都没重复”,并不能推出汇总流唯一。

“进入网络时”同样不可省略。网络可以复制一份报文,让接收端看到两个相同序列;可以重排,使本来递增的流乱序到达;可以丢包,留下缺口;也可以因为镜像和多点采集,把同一对象记录两次。接收端的 capture 既不能单独证明发送端冲突,也不能推翻入网时的唯一性承诺。

这个边界体现了 docs/heng-lu-note.md 的核心纪律:记录应描述自己真正观察和控制的现实,而不是凭名称扩张到下游结果。规范提供最小共同语义,运行中的计数器、网络与接收策略分别为后续事实负责。

“适合 anti-replay”不等于“已执行 anti-replay”

ID 0 是 32 位单调递增计数器,在线上传输,不回卷,并在 SA 生命周期内唯一。ID 1 是 64 位单调递增计数器,只传低位,由接收端推导高位,同样不回卷且唯一。RFC 9827 据此称它们“适合” replay protection。

“适合”不能在汇报里被改写成“开启”。RFC 4301、RFC 4302 与 RFC 4303 都把 anti-replay 保留为接收端针对每个 SA 的本地选择。实现必须具备相关能力,但具体接收端可以关闭。关闭后,入站 Sequence Number 不接受任何 replay 窗口检查。

开启后,接收端维护滑动窗口。落在左边界之外的是过旧报文;窗口内已经标记的是重复;更新且通过认证的数值可以推动右边界。窗口大小也由接收端本地决定,不会通知发送端,因此同一多播 SA 的不同成员可以拥有不同的乱序容忍度。

检查还有明确的提交顺序。接收端可以先做廉价的窗口预判,避免对明显过旧的报文做密码计算;但只有完整性验证或 authenticated decryption 成功后,才可更新可信窗口。否则攻击者只需发一个未经认证的超大序列号,就可能把后续合法报文挤到窗口之外。

ESN 把这个差异放得更大。高 32 位依赖接收端此前的认证历史。即使接收端不使用 replay protection,也必须认证进入的 ID 1 报文,才能正确选择隐含高位。认证回答“报文是否属于这个 SA 的可信密码状态”;窗口回答“这个可信报文是否是新的”。两者不能合并。

IKEv2 谈妥的是属性,不是计数器保管

IKEv2 在 SA payload 中排列 proposal 与 transform,为 Child SA 选择参数。按 RFC 7296 的旧名称,发起方若同时接受普通序列与 ESN,通常会同时提供 ID 0 和 1;只提供 ID 1,表示不能接受普通 32 位模式。响应方的选择形成这条 Child SA 的序列属性契约。

签收材料应保存双方 offer、最终 ID、Child SA、方向、SPI、peer 身份、软件 build 与策略版本。配置里“优先 ESN”不等于真正选择了 ID 1。

然而,选择 ID 1 也不会自动把计数器交给一个可靠的全局 owner。高吞吐网关常把同一 SA 的报文分给多个 CPU core、NIC queue 或 accelerator。备用节点可能接管了密钥,却只拿到较早的计数 checkpoint。重启或 offload reset 也可能把局部状态拉回旧 epoch。协商结果没变,线上却已经重复。

RFC 4303 明说,ESP 不为多发送端 SA 提供计数同步。实际证明必须落到 SA 范围的分配机制:谁预留号段、每个队列的 epoch、状态如何持久化、failover 如何移交、何时 rekey。局部“计数器正常”不是汇总流证据。

同一个数出现两次,有四种完全不同的原因

接收端若看见两个 SPI 与 Sequence Number 相同、且都能通过认证的 ESP 报文,至少存在四种解释:发送端重复用了值;网络复制了一个合法报文;两个采集点重复记录了同一份;攻击者重放了此前捕获的报文。

仅凭字节无法归因。需要把入网点 packet fingerprint、各 capture 位置、接收时间、认证结果与 replay-window verdict 串起来。ID 1 还要保存推导的高位以及推导所依赖的认证历史。真正的拒绝收据包括决定前窗口、old/duplicate/new 结论、决定后窗口和最终处置。

反向推理同样不成立。应用没有产生两次效果,不能证明 anti-replay 生效。也许网络根本没复制;也许上游已经丢弃;也许 capture 不完整;也许窗口被关闭,但应用天然只执行了一次。缺少可见副作用,不等于存在一条已记录的安全裁决。

当序列号成为密码 nonce 的一部分

RFC 8750 为若干 counter-mode AEAD 定义隐式 IV:不再携带显式 8 字节 IV,而是由 ESP 序列号在两端生成。对同一密钥,IV 绝不能重复。

这使序列唯一性从“是否拒绝重复报文”升级为密码安全前提。两个 sender 若在同一 SA 与 key 下撞号,即便所有 receiver 都关闭 replay window,nonce 重用风险也已经发生。RFC 8750 因而禁止在可能重叠的环境使用隐式 IV,多播场景必须另有统一的防重叠机制。

所以,Transform ID 只是证据链的一环。还要证明真实生成架构、密钥边界与 rekey 在计数耗尽前完成。

RFC 9347 的 AGGFRAG/IP-TFS 消费的是另一种属性。它要沿外层 ESP 报文的逻辑顺序重组内层报文。普通 ESP 要求序列递增,却允许只使用偶数;AGGFRAG 要求每个后继报文严格 +1,并对 all-pad 报文给出专门规则。它的 reorder window 与 anti-replay window 可以有不同尺寸和目的。

因此,ID 0/1 的单调与唯一仍不等于 AGGFRAG 完整合规。部署还要证明连续分配、片段顺序,以及 SA 切换不会把同一内层报文的前后片段分给两个不同 SA。

ID 2 说明为什么必须扩宽 Type 5

RFC 9838 在多发送端 G-IKEv2 数据 SA 中使用 32-bit Unspecified Numbers,明确告知 group member:此 SA 不保证唯一,传统 anti-replay 不应被期待。接收端依旧保留本地选择,但可供选择的输入属性已经不同。

后果随属性直接传播:不具备唯一性时不得使用依赖序列的隐式 IV;没有单一单调序列时,多发送端多播不能使用 AGGFRAG。字段存在、Transform 被选择、窗口开关开启,是三件不同事情。

八份收据,而不是一份“支持”声明

一条可复核的 RFC 9827 主张应包含八层:IANA 语义;IKEv2 offer/selection;发送端生成与移交;所有入网点的汇总属性;接收端 policy/window;认证后的实收报文;明确 replay 裁决;IIV、AGGFRAG 与未来 ID 的兼容性。

前一层不会自动填写后一层。RFC 9827 的价值正是它对自身效果很克制:只修正登记语言、扩展语义空间、澄清既有值。运营方若保持同样克制,就不会把“协商了一个合适的序列格式”误报成“重放已经被拒绝”。

来源