摘要

  • RFC 3102 允许私有地址域中的主机借用一个完整公网地址,或借用共享地址上的一组端口;网关仍掌握资源池、bind、租期和使用策略。
  • 参数对主机可见,并不等于路径已经成立。主机必须判断目的地究竟在本地还是公网,而跨地址域的多方应用当时没有通用解法。

一个主机,同时活在两个地址域

传统 NAT 把关键动作放在边界设备中。主机发送带私有源地址的数据包,翻译器在出口改写地址或端口,再设法在回程恢复对应关系。主机可以毫不知情,但凡应用把地址写入负载、依赖端到端头部不变,所谓透明就会露出代价。

2001 年 10 月发布的 RFC 3102–3105 选择了另一条路。RSIP 主机先向两个地址域之间的网关申请资源。网关把第二个地址域的参数临时借给它;主机把这些参数装进自己的网络栈,以借来的公网源地址构造内层数据包,再通过隧道送到网关。网关去掉外层封装后转发,内层公网源地址无需再次翻译。

RFC 3102 定义了两种范围。RSA-IP 在租期内把一个完整而唯一的公网地址交给一台主机。RSAP-IP 可以让多台主机共享同一个公网地址,但给每台主机分配该地址上互不冲突的端口。前者像临时获得整套门牌,后者则只得到门牌下的若干入口。

两种模式都让主机看见公网参数,却都没有把地址的持久控制权转走。私有地址仍用于抵达网关,借来的参数用于在公网出现;网关仍保管资源池,也仍能拒绝、限缩或收回这次出现。

一次分配其实包含多份记录

RFC 3103 把架构写成状态机。主机先注册,获得 client ID;随后申请地址或地址—端口资源。网关的回应还可包含 bind ID、租期、隧道类型和远端流策略。主机能够请求续租、查询状态、申请监听入站流量、释放绑定和注销。

这些记录各自只证明一件事。注册说明网关认识一个客户端会话;分配说明某些资源在某些条件下获准使用;bind 把私网侧主机与公网参数关联;租期限定有效时间;流策略限定可联系的远端。它们都不能单独证明主机已经安装路由、隧道正在工作、网关实际放行,或回包抵达了原主机。

控制也不是对称的。主机可以建议某个地址或端口,网关可以因资源已占用、无可用容量或违反策略而拒绝。主机若使用未分配的地址、端口组合、远端或隧道,网关应丢弃数据包并返回错误。主机负责把公网参数写进包;网关负责判断这个用法是否属于仍有效的授权。

因此,运营记录不能只写“已分配”。应分别保留请求、响应、client ID、bind ID、精确资源、策略、租期、主机路由、隧道封装、网关判定以及双向包观测。只有整条链一致,借出的参数才真正产生服务。

“本地”不再是不言自明的事实

主机知道公网参数之后,必须在发送前决定:目的地能否直接从私网抵达,还是应走 RSIP 接口与网关隧道?在单一子网中,地址和掩码也许足够。复杂私网中,RFC 3102 建议由网关保存私有网络及掩码列表,让主机查询。

问题在于,这份答案会随路由变化而过期。如果私网拓扑的变化快于一个 RSIP 会话,主机甚至可能对每个目的地重新发问。RFC 3102 没有把困难包装成完成的功能:它明确说,可靠的通用解法很难形成,而且实际严重程度尚不清楚。

多方应用把矛盾放大。一名参与者可能把 IP 地址当作全球端点标识传给另一名参与者,却不知道接收者从哪个地址域观察。传私有地址,公网一方可能无路可达;传公网地址,本地两方又可能被迫绕回网关。文档承认这一类问题没有已知的通用解决方案。

这不是单纯的实现瑕疵,而是一个字段承担了过多语义:它既像拓扑位置,又像可达线索,还常被应用误当作身份。RSIP 能让“借来的地址”更显式,却不能让所有观察者共享同一种本地性。

租约结束,不代表旧状态已经消失

租期给授权加上边界,也让稀缺地址和端口能够回到池中。主机可以续租或主动释放,网关可以等待到期或异步撤销。但行政时钟与传输协议时钟并不一致。

TCP 连接关闭后,旧四元组仍可能停留在 TIME_WAIT。如果地址—端口组合刚释放就借给另一台主机,新租约可能与旧连接的迟到数据包或冲突保护相遇。所以,“租期到点”与“可安全复用”是两个事件。

故障也会制造两份不一致的记忆。主机重启后,网关可能仍保留它已忘记的绑定;网关重启后,主机可能继续持有服务器已经丢失的分配。RFC 3103 设计了重新注册与错误恢复,但任何一侧的记忆都不能自动成为完整事实。

可靠审计要对齐租约开始、续期、释放或到期、主机重启、网关重启,以及重新协调后首个被接受的数据包。地址相同,不代表授权属于同一代。

共享地址把位置与身份拆开

RSA-IP 与动态 DNS 的关系类似 DHCP:一台主机在一段时间内掌握整个地址。RSAP-IP 则不同。多个完整域名可以解析到同一个公网地址,而不同端口背后其实是不同逻辑主机。公网对端往往会假定一个地址上的服务属于同一主体;RFC 3102 因此警告,RSAP-IP 与动态 DNS 的结合应十分谨慎。

RFC 3104 在 IPsec 中把这一区分做得更彻底。多台 RSIP 客户端可以共享公网地址,向不理解 RSIP 的对端发起 IKE 和 IPsec。对端看到的源地址不能代表真正的 peer identity,必须用 IKE 标识来区分。

回程 IKE 报文可依据目标端口、initiator cookie 与目标地址分流;AH 或 ESP 则依据协议号、SPI 与目标地址。SPI 还必须同时在客户端空间和共享网关空间中唯一。共同地址仍是定位入口,却不再足以充当主体。

扩展也有边界:它主要处理客户端发起的情形,需要 IPsec 实现参与,bump-in-the-stack 方案不能期待原样工作。内层头部保持不变,并不自动带来应用层或安全层的透明。

发现一个网关,不等于获得使用权

RFC 3105 用 SLP 发布 service:rsip 服务 URL、能力、有效期和可选负载。scope 可以把一组客户端引向特定服务器,客户端也可比较各服务器声明的连接数,选择看起来较空闲的一台。

这些只是选择依据。SLP scope 明确不是访问控制;服务广告说明服务器声称提供什么,不说明某个客户端有权得到资源;负载值在选择完成前就可能变化。发现之后仍要注册、获批、安装路径并观察数据包。

由此,控制面可以清楚拆开:管理员影响发现与 scope,网关批准资源与策略,主机选择本地或公网路径,远端解释地址和身份,运行中的数据包才说明组合结果。任何一方都不是整条链的唯一权威。

Experimental 的价值,正在于它没有掩盖代价

RFC 3102–3105 都是 Experimental,而不是 Internet Standard。IESG 注记提醒,完整实现需要显著修改主机和网关,浮动端口可能破坏某些应用,运营复杂度必须与其他缓解地址短缺的方法比较。RFC 3102 自己也说 RSIP 不是 IPv4 地址短缺的长期答案。现有来源没有提供广泛部署统计,更不能证明它取代了 NAT。

这并不让 RSIP 失去历史意义。它把透明翻译器内部的一团状态拆成可命名的对象:注册、资源分配、绑定、租期、策略、发现、故障恢复与本地性判断。公网参数进入主机之后,地址共享反而更明显地成为一项状态分发工程。

一枚借来的公网地址能说明数据包希望在哪个地址域出现。它不能单独证明持久所有权、唯一身份、正确路径、IPsec 认证或实际送达。网关借出了地址;只有控制记录、运行状态与双向数据包同时吻合,借用才成为真实的网络服务。

资料来源

  1. https://www.rfc-editor.org/rfc/rfc3102.html
  2. https://www.rfc-editor.org/info/rfc3102
  3. https://datatracker.ietf.org/doc/rfc3102/
  4. https://www.rfc-editor.org/rfc/rfc3103.html
  5. https://www.rfc-editor.org/info/rfc3103
  6. https://datatracker.ietf.org/doc/rfc3103/
  7. https://www.rfc-editor.org/rfc/rfc3104.html
  8. https://www.rfc-editor.org/info/rfc3104
  9. https://datatracker.ietf.org/doc/rfc3104/
  10. https://www.rfc-editor.org/rfc/rfc3105.html
  11. https://www.rfc-editor.org/info/rfc3105
  12. https://www.rfc-editor.org/rfc/rfc1631.html
  13. https://www.rfc-editor.org/rfc/rfc2663.html
  14. https://www.rfc-editor.org/rfc/rfc2993.html
  15. https://www.rfc-editor.org/rfc/rfc3022.html