跳到内容

第 4 卷 / 第 9 章 / 第 3 课

9.3 NAT、NAPT 与穿透边界 ​

多台设备共用一个公网 IPv4 地址时,网关需要记住回包该交给谁。NAT 改写 IP 地址,NAPT/PAT 还改写 TCP 或 UDP 端口;家用路由器里俗称的 NAT,通常实际是有状态的 NAPT。理解这张映射表,就能解释为什么连接空闲后会失效,以及查到公网地址后仍未必能直连。

1. 出站 NAPT 如何映射回包 ​

下面是两条连接的地址转换示意,假设它们访问同一个远端服务:

text
inside local                    outside-visible
192.168.1.10:51000  --TCP-->   203.0.113.5:62001
192.168.1.11:51000  --TCP-->   203.0.113.5:62002

两个内网端点虽然都用了 51000,外部端口不同,回包便可以区分归属。目标为 203.0.113.5:62001 的回包会被改写后交给 192.168.1.10:51000。转换器还要更新受影响的 IPv4/TCP/UDP 校验和,并处理 ICMP 错误中引用的原报文;IPv4 UDP 的零校验和表示未启用,转换时应保留零值,不作普通校验和调整。RFC 3022 §4.1

映射和过滤是两个维度:同一内部 UDP 端点访问不同远端时,设备可能复用外部映射,也可能创建新映射;入站过滤则决定哪些远端可以向这个映射发包。地址或端口相关的过滤,通常只允许内网端点先前联系过的远端。仅用“锥形 NAT”或“对称 NAT”一个标签,不足以描述全部行为。RFC 4787

2. 状态有超时,也有容量上限 ​

每条 NAPT 映射需要状态表空间和可用的外部地址、端口。UDP 没有握手或关闭消息,设备通常依据空闲计时器回收映射;TCP 可以结合 SYN/FIN/RST 与计时器跟踪状态,但异常退出或非对称路径仍可能留下过期状态。

例如,某实验网关的 UDP 空闲超时设为 120 秒,应用沉默 180 秒后,对端仍向旧外部端口发送数据,回包就可能被丢弃。重新出站发送时,应用甚至可能获得新端口。这里的 120 秒是实验配置,不是所有 NAT 的固定值。

长连接需要按实际路径上的 NAT、防火墙和负载均衡器超时设计保活与重连。保活间隔要留出抖动余量,并评估移动设备耗电;如果本来就允许空闲后重连,也没有必要用高频包一直占住映射。

源端口或状态表耗尽时,即使 CPU 和带宽充足,新连接仍会失败。高扇出代理、大量短连接和 CGNAT 都可能遇到这种问题。应检查活动映射数、分配失败、每目标的端口压力及超时分布;不能简单把“一万个端口”等同于“一万个用户”。

3. 入站访问与端口转发 ​

外部发来的新包如果没有匹配的映射或过滤许可,通常会被丢弃。但 NAT 后的服务仍可通过以下方式获得入站路径:

  • 静态一对一地址映射;
  • 静态端口转发;
  • 动态映射允许的回包;
  • PCP、NAT-PMP、UPnP IGD 等映射控制协议;
  • 应用中继或反向隧道。

自动开放端口可能扩大受入侵内网设备的影响,应按信任边界限制或审计。端口转发之后,目标服务仍需认证、补丁和访问日志。

Hairpin NAT,也称 NAT loopback,允许内网客户端通过外部地址访问同一内网的服务。设备或配置不支持时,会出现外网能访问、内网使用公网名称反而不通的现象。分视图 DNS 可以让内外网获得不同地址,但也增加排查两套 DNS 答案的成本。

4. NAT 与防火墙负责不同操作 ​

NAT 负责地址或端口转换,防火墙根据安全策略允许或拒绝流量。家用网关常把两者放在同一设备上,并不意味着两者是同一功能。

地址转换可以隐藏部分内部拓扑,却不认证流量,也不阻止内网主机主动连接恶意服务。静态映射还可能直接开放内部服务。安全检查应分别核对转换规则和入站、出站过滤规则,不能只看到“NAT 已开启”就结束。

5. CGNAT 让公网地址成为共享标识 ​

运营商级 NAT(CGNAT)让多个用户共用公网 IPv4 地址,运营商内部常使用 100.64.0.0/10 共享地址空间。这带来几类影响:

  • 单凭公网源 IP 无法区分用户,需要结合外部源端口、协议、时间和运营商映射记录;
  • 按 IP 限流或评价信誉,可能同时影响许多用户;
  • 入站托管和点对点直连更困难;
  • 端口分配与日志量成为容量和隐私问题;
  • 用户可能同时经过家庭 NAT 与运营商 NAT,形成双重转换。

记录映射时,要能关联外部源地址、端口、协议、时间与内部用户标识。目的地址和目的端口不是每次归属查询都必须记录的内容;RFC 6888 建议除管理需要外不要在 CGN 中记录它们。RFC 6888 §4

6. STUN、TURN 与 ICE 各做一部分工作 ​

  • STUN:观察服务器看到的映射地址,也提供 ICE 连通性检查所用的请求与响应机制;
  • TURN:提供中继地址与数据转发,直连不可用或策略要求中继时可以使用,代价是中继带宽和容量;
  • ICE:收集本地、服务器反射和中继候选地址,对候选地址对进行检查,再按优先级和提名流程选路。

ICE 选出可用路径,不等于持续测出了全局最低延迟;连通性检查也不全是发往公共 STUN 服务器,候选端点会直接互相检查。生产实时系统若需要覆盖受限网络,通常要准备 TURN 回退,并处理凭据到期、中继容量、滥用防护和通信许可的新鲜度。

一次 STUN 查询只说明该服务器当时看到了哪个外部端点。更换远端、经过多层 NAT、切换网络或遇到防火墙过滤,结果都可能变化。公网地址已经查到,网络也不一定就愿意开门。RFC 8445

7. IPv6 的地址空间不依赖 NAT44 式共享 ​

IPv6 提供足够大的全局地址空间,入站是否可达仍由防火墙和主机策略决定。没有 NAT 不表示没有安全控制,地址转换也不自动提供身份认证。

NPTv6 等前缀转换机制仍可能用于特定架构,但 IPv6 不需要靠共享端口来缓解 32 位地址耗尽。是否采用转换,应根据多宿主、运营商切换、应用是否嵌入地址字面量和运维策略单独评估。

8. 验收问题 ​

  1. 普通 NAT、NAPT 与有状态防火墙分别改变什么?
  2. 上图两个内网端点为何能使用同一端口,又为何需要区分外部映射?
  3. 超过 UDP 映射空闲期限后,继续向旧端口回包可能发生什么?
  4. CGNAT 下,公网源 IP 为什么不足以定位用户?
  5. STUN、TURN、ICE 各自提供什么?
  6. IPv6 为什么仍需防火墙,却不需要 NAT44 式端口共享?

下一课进入9.4 路由控制面:RIP、OSPF 与 BGP。

参考 ​

Built with VitePress | Software Systems Atlas