9.3 NAT、NAPT 与穿透边界
多台设备共用一个公网 IPv4 地址时,网关需要记住回包该交给谁。NAT 改写 IP 地址,NAPT/PAT 还改写 TCP 或 UDP 端口;家用路由器里俗称的 NAT,通常实际是有状态的 NAPT。理解这张映射表,就能解释为什么连接空闲后会失效,以及查到公网地址后仍未必能直连。
1. 出站 NAPT 如何映射回包
下面是两条连接的地址转换示意,假设它们访问同一个远端服务:
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. 验收问题
- 普通 NAT、NAPT 与有状态防火墙分别改变什么?
- 上图两个内网端点为何能使用同一端口,又为何需要区分外部映射?
- 超过 UDP 映射空闲期限后,继续向旧端口回包可能发生什么?
- CGNAT 下,公网源 IP 为什么不足以定位用户?
- STUN、TURN、ICE 各自提供什么?
- IPv6 为什么仍需防火墙,却不需要 NAT44 式端口共享?
下一课进入9.4 路由控制面:RIP、OSPF 与 BGP。