摘要

  • PCP 允许主机明确申请 NAT 映射或防火墙开口,但真正采用的外部端点、策略和存续时间仍由服务器决定。
  • Nonce、租期与 Epoch Time 让短期状态可以核验和恢复,却不等于端口所有权、永久身份或端到端可达保证。

先看最容易被忽视的字段:Epoch Time。PCP 服务器在响应中带回自己的纪元时间。正常情况下,它随时间推进;服务器重启、显式映射状态丢失或发生某些外部地址变化时,客户端会看到回退或异常偏移。这个信号的作用不是证明流量从未中断,而是提醒客户端:先前相信的映射可能已不存在,应当尽快重建。

这恰好揭示了 PCP 所管理的对象。它不是主机永久拥有的一只公网端口,而是 NAT 或防火墙设备代为维护的一段边缘状态。主机能表达需求,设备保留分配权、策略权和时钟。

MAP 请求里,客户端写明传输协议和内部端口,也可以建议一个外部地址与端口。建议并不具有约束力。服务器若不能提供该组合,通常可以另行分配,并在成功响应中写回实际采用的外部端点和服务器设定的租期。只有加入 PREFER_FAILURE 时,客户端才要求服务器在无法满足建议值时直接失败,而不是换一个端点。

结果码把网关的裁量显性化。服务器可以因为不支持操作或选项、授权不足、资源紧张、用户配额耗尽,或无法提供指定外部端点而拒绝。成功响应只说明该服务器在当时接受并维护了某个映射。它不说明所有远端网络都能访问,也不说明端口从此属于申请者。

每条映射谱系还带有客户端随机选择的 96 位 Mapping Nonce。服务器把它原样放进响应,并在后续刷新时校验。在简单威胁模型下,一个不同的 nonce 不能轻易接管已有动态映射。它提供的是“这次刷新是否属于同一条映射”的证据,而不是人的身份、设备的永久身份,也不是对路径上攻击者的全面防护。

租期让控制关系继续保持清晰。主机仍需要映射,就要续租;不再续租,状态最终释放。对 MAP 来说,请求租期为零有严格定义的删除含义,还要结合协议、内部端口、nonce 和威胁模型处理。它不是任意删除他人映射的万能命令。

PEER 管理的则是指向特定远端地址和端口的显式出站映射,可以创建或延长这段状态。因为远端同伴已写入请求,它不能被当成普通 MAP 的别名。THIRD_PARTY 又把授权问题推到台前:客户端只有在服务器策略允许且自身获得授权时,才能替另一地址申请状态;面向家庭用户的网关被建议默认禁止这种做法。

RFC 7488 进一步说明,一个客户端面对的“服务器”未必只有一个地址,也未必只有一台设备。对于同一服务器的多个地址,客户端排序候选地址,对一个地址最多重传四次,再试下一个;全部失败后按规定周期重试。同一服务器的不同地址宜使用同一个 nonce,不同服务器则必须使用不同 nonce。

多台服务器的请求彼此独立,因此可能形成多份由不同设备维护的映射。若多条防火墙路径没有复制状态,客户端甚至需要在所有相关服务器上建立开口。一台服务器的成功不能替另一台作证。

事实、推论与未知

RFC 明确给出了字段、租期、nonce、结果码、Epoch Time、恢复动作和服务器选择规则。由此可以推论,PCP 的制度含义是“协商边缘状态的保管”,而非转移端口所有权。但这两份 RFC 没有提供部署率,不为任何产品背书,也不能解释某台网关为何做出具体分配,更不能保证任意来源都可达。RFC 7488 也没有规定如何证明获知的 PCP 服务器地址确实合法;这属于配置与供应机制的责任。

来源