9.3 NAT、NAPT 与穿透边界
边境驿站只有少量公网地址,却要让大量内部连接同时出发,地址和端口因此被反复改写。
NAT 修改 packet 中的 IP address,NAPT/PAT 还修改 TCP/UDP port,使多个 internal flow 可分享较少 external IPv4 address。Home router 中常说的“NAT”通常实际是 stateful NAPT。
1. Outbound NAPT 的 mapping
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:62002Translator 保留 mapping/state,让 reply 从 203.0.113.5:62001 转回 192.168.1.10:51000。它还要增量更新或重算 IP/TCP/UDP checksum,并对 ICMP error 里 quoted original packet 做相应 translation。
Mapping key 与 inbound filtering 行为不是全部 NAT 都一样。UDP NAT 可为同一 internal endpoint 对不同 remote endpoint 重用 external mapping,也可创建不同 mapping;filter 可允许任意 remote 回包,也可只允许已发送过的 address/port。穿透协议不能假设“所有 NAT 都是 full cone/symmetric”这类单一模型。
2. State 有 timeout,也有 capacity
NAPT mapping 需要 external port/state-table entry。UDP 无 connection handshake,translator 根据 idle timer 回收 state;TCP 可根据 SYN/FIN/RST 和 timer 跟踪状态,但 crash/asymmetric path 会留下 half-open/stale entry。
Long-lived application 要知道 NAT/firewall/LB 的 idle timeout,用 protocol-appropriate keepalive 与 reconnect,不要靠高频无意义 packet 永久占住 mapping。Keepalive interval 要小于最短 idle timeout 且有 jitter,并评估 mobile power/network cost。
External address/port 与 state table 都可 exhaustion。High fan-out proxy、CGNAT 或大量 short connection 可因 source-port pressure 失败,即使 CPU 和 bandwidth 仍充足。要观测 active mappings、allocation failures、per-destination tuple pressure 与 timeout distribution。
3. Unsolicited inbound traffic 与 port forwarding
没有 dynamic mapping/filter permission 时,从 external side 到 shared address:port 的 packet 没有明确 internal destination,通常被丢弃。但“NAT 后绝对无法入站”也不对:
- Static one-to-one mapping;
- Static port forwarding;
- Dynamic mapping 的 reply path;
- PCP/NAT-PMP/UPnP IGD 等 mapping control;
- Application relay/reverse tunnel。
UPnP 自动开 port 会扩大 local compromised device 的影响,需要按 trust boundary 禁用、限制或审计。Port forwarding 也要有明确 destination service authentication、patching 和 logging。
Hairpin NAT/NAT loopback 允许 internal client 通过 NAT 的 external address 访问同一 internal service。不是所有 device/configuration 都支持,失败时可表现为“外网能访问,内网用 public name 反而不通”。Split-horizon DNS 是另一种 design,但带来 internal/external answer 不同的运维成本。
4. NAT 不是 firewall
NAT 的主要操作是 address/port translation,firewall 的主要操作是按 security policy allow/deny traffic。Home gateway 常把 stateful firewall 和 NAPT 放在同一 device,导致两者被误以为是同一功能。
Address translation 可隐藏 internal topology,但不 authentication traffic,不阻止 internal host 发起 malicious connection,也不替代 egress/ingress policy。Static mapping 甚至可以将 external traffic 直接导向 internal service。Security review 要分开记录 translation rule 和 firewall rule。
5. CGNAT 扩大了 shared identity 问题
Carrier-grade NAT 让多个 subscriber 分享 provider public IPv4 address,常使用 100.64.0.0/10 shared address space。Consequence:
- Public source IP 不能唯一标识 subscriber,需 timestamp + source/destination address/port + protocol 才能查 mapping log;
- IP-based rate limit/reputation 可误伤大量 user;
- Inbound hosting/peer-to-peer 更难;
- Port allocation 和 logging 成为 provider capacity/privacy concern;
- Subscriber 可能同时经过 home NAT 与 CGNAT(double NAT)。
6. STUN、TURN 与 ICE 解决的问题不同
- STUN:Client 向 STUN server 观察自己的 server-reflexive address/mapping,并用于 connectivity checks;
- TURN:直连 candidate 失败时,由 relay server 中继 media/data,成本更高但可达性更强;
- ICE:收集 host/server-reflexive/relayed candidates,做连通性检查并选 candidate pair。
STUN 不是“一次查到 public IP 就打穿任意 NAT”:mapping/filtering 行为、multiple NAT、firewall、IPv4/IPv6 和 network change 都会影响 candidate。Production realtime system 需要 TURN fallback,credential expiry、relay capacity、abuse prevention 与 consent freshness。
7. IPv6 不需要用 NAT44 解决 address scarcity
IPv6 global address space 允许 end-to-end addressing,但仍必须用 stateful firewall/host policy 决定 inbound reachability。“没 NAT 就没安全”是把 address translation 与 packet filtering 混为一谈。
IPv6 prefix translation(NPTv6)和其他 translation mechanism 在某些 architecture 中存在,但它们不改变“IPv6 不需要 port-sharing NAT 来应对 32-bit address exhaustion”这一点。是否 translation 要根据 multihoming、provider independence、application literal address 与 operational policy 单独评估。
8. 验收问题
- 区分 basic NAT、NAPT 和 stateful firewall。
- 为什么 public source IP 在 CGNAT 后不能唯一定位 subscriber?
- UDP mapping timeout 对 long-idle realtime session 有什么影响?
- STUN、TURN、ICE 各自提供什么?
- 为什么 IPv6 仍需要 firewall policy,但不需要 NAT44-style address sharing?
下一课进入9.4 Routing control plane:RIP、OSPF 与 BGP。