摘要

  • PRR 成功只把规则带到 RESERVED 状态:它可以占住地址或端口,却不建立 NAT binding、不打开 pinhole,也不改变数据包处理。
  • PER 成功证明指定中间盒建立了本地 ENABLED 规则;它既不证明控制会话仍在线,也不证明数据包抵达远端应用。

值班人员看到控制器连接中断,便把相关变更单标记为“已回滚”。十分钟后,原先开放的流量仍能通过。设备没有违背协议,错误出在把两种寿命写进了同一个状态字段。

RFC 5189 描述的是 MIDCOM 语义,而不是某一种线协议。它允许 agent 控制 NAT、防火墙或组合设备,同时要求各类动作拥有可区分的状态、权限和回执。这个最小语义恰好说明:结束发指令的通道,不会自动撤销已经获准的规则。

预留先占资源,但不改变流量

Policy Reserve Rule 用于提前保留地址或端口范围。此时应用可能还不知道完整远端参数,却需要一个之后可交付给信令流程的稳定 tuple。

PRR 不配置地址绑定,也不打开防火墙孔洞。规范明确说中间盒的数据包处理保持不变。传统 NAT 通常预留外部地址,twice-NAT 可以同时预留内外地址;纯防火墙没有 NAT 资源可占,因此可以成功返回空的预留值。

空值不是失败,成功也不是放行。完整事实应写成:事务成功;规则 ID 进入 RESERVED;设备能力为纯过滤;没有地址资源被分配;数据面未改变。

如果平台把所有成功响应都归一为“active”,它会同时制造两个错误。在 NAT 上,它把尚未开放的资源当作已连通;在纯防火墙上,它把完全正确的空回执当作采集缺失。

ENABLED 必须由另一条事务建立

Policy Enable Rule 才改变数据包处理。NAT 建立 binding,防火墙建立 allow action,组合设备可能同时完成两者。PER 可以消费先前 PRR,也可以从未使用状态直接进入 ENABLED。

成功替换 PRR 时,系统可以复用同一个规则 ID。相同 ID 只说明新旧状态属于同一条演进链,并不说明两次响应拥有相同含义。审计记录必须保存 UNUSED → RESERVED → ENABLED 的转换时间。

若 PER 失败,被引用的预留继续存在。此时既没有启用通信,也不能假定资源已经释放。重试、显式删除和等待到期是三种不同处置;没有状态回读就无法安全选择。

PER 成功也有边界。它是中间盒对本地配置的权威回执,不是端到端收件证明。后续路由、另一台防火墙、主机监听、传输握手和应用授权都可能失败。规则回执、双侧抓包、远端接收和业务结果必须分别记录。

控制会话与规则各有时钟

正常 Session Termination、异步终止或连接中断都会结束 MIDCOM 会话。规范同时要求已建立规则继续保留,直到自身 lifetime 到期或另一个事件终止它们。

这项安排保护业务免受控制器短暂故障影响,却让治理责任变得更具体。规则存续时,创建它的会话可能已经无法查询。系统必须独立保存 agent 身份、认证结果、owner、创建请求、授予期限和后续事件。

agent 提交的 lifetime 只是提议。中间盒返回的 granted lifetime 才是当前承诺,而且不得超过请求值和会话建立时公布的最大值。把请求的一小时写成实际一小时,会在设备只批准十分钟时制造五十分钟虚假权限。

RLC 把 lifetime 设为零可以删除规则;中间盒或其他获权 agent 也可能触发异步变化。状态页需要把“谁请求”“谁有权”“设备实际授予什么”“何时观察到”放在同一条证据链上。

所有权不是在线状态

创建规则的已认证 agent 成为 owner,且 owner 在规则寿命内不变。策略可以允许另一个 agent 操作该 owner 的规则,但这属于显式授权,不是因为它碰巧接管了连接。

每条规则只属于一个 group,同组成员共享 owner。group 随第一个成员出现,随最后一个成员消失;它不是脱离成员而独立存在的持久对象。

group lifetime 初始上反映成员中最长的剩余期限,而 GLC 可以为全部成员设置共同期限,或以零一次终止所有成员。一个 group 里可能同时有 RESERVED 预留和 ENABLED 放行。相同的组删除动作对数据面的含义并不相同。

因此,仪表盘不能只显示“group alive”。它必须列出成员、状态、用途、期限和最后事件。否则一个仍存活的预留可能掩盖已经消失的放行,也可能反过来。

原子性也有适用范围

RFC 5189 要求请求事务彼此原子:不向 agent 报告稳定的中间状态。但异步事务可以中断或终止正在处理的请求。具体协议若把一个语义事务拆成多步,也可能改变原来的原子边界。

冲突策略同样需要原始记录。新规则若与已有规则冲突,按先到先得拒绝新请求,原规则不变;不冲突的重叠甚至完全相同规则可以同时接受。准入顺序解释规则为什么存在,却仍不能证明之后出现了哪些包。

需要保留的证据对象

首先记录不可变 change、session、agent、request 和 middlebox ID,以及认证 owner、设备能力、接口、事务类型、规则和 group ID、先前状态。

PRR 记录 A0 约束、协议、端口范围、奇偶要求、A1/A2 返回值和空值。PER 记录引用的 PRR 或直接启用路径、A0/A3 端点、方向、wildcard、binding 与 pinhole。两者都记录 requested、maximum 与 granted lifetime。

失败回执必须说明预留是否仍在;PRS/GS 回读和 REN、GEN、STN 按发生顺序追加。session end 不得自动填入 rule end。

最后连接中间盒两侧包观察、远端接收和应用结果。没有这些证据时,只能说“本地规则已建立,结果未知”。这不是降低自动化价值,而是让每个运行部件只为自己真正执行的现实负责。

来源

  1. RFC 5189 HTML
  2. RFC 5189 文本
  3. RFC 5189 记录
  4. IETF Datatracker RFC 5189
  5. RFC 5189 历史
  6. RFC 5189 引用
  7. RFC 5189 勘误
  8. RFC 3989
  9. RFC 3989 记录
  10. RFC 3303
  11. RFC 3303 记录
  12. RFC 3304
  13. RFC 3304 记录
  14. RFC 3198
  15. RFC 3234
  16. RFC 3022
  17. RFC 6887
  18. Heng Lu:现实层
  19. Heng Lu:最小初始规范
  20. Heng Lu:运行代码优先