
### 1. NAT 基本概念与类型
**NAT（Network Address Translation，网络地址转换）** 是路由器/防火墙将内网（私有IP）数据包的源地址和端口转换为公网（公有IP）地址和端口的技术。主要用于地址复用和安全隔离。

根据 **RFC 3489**（STUN 协议）和 **RFC 4787/5780** 的行为分类（映射行为 + 过滤行为），NAT 分为四种主要类型（中文社区常用 NAT1~NAT4 命名）：

- **NAT1：Full Cone NAT（全锥形 NAT / 完全圆锥型）**  
  最宽松类型。  
  - **映射行为**：Endpoint-Independent Mapping（端点无关映射）。同一个内网 (IP:Port) 映射到固定的公网 (IP:Port)，与目标地址无关。  
  - **过滤行为**：Endpoint-Independent Filtering（端点无关过滤）。一旦映射建立，**任何外部主机** 都可以向该公网 (IP:Port) 发送数据包。  
  相当于“门卫不在岗”，非常开放。

- **NAT2：Address-Restricted Cone NAT（地址限制锥形 NAT / 受限圆锥型）**  
  - **映射行为**：端点无关映射（公网端口固定）。  
  - **过滤行为**：Address-Dependent Filtering（仅地址相关过滤）。只允许**之前发送过数据的外部 IP** 的数据包进入（端口不限制）。  
  相当于“只认之前联系过的 IP”。

- **NAT3：Port-Restricted Cone NAT（端口限制锥形 NAT / 端口受限圆锥型）**  
  - **映射行为**：端点无关映射（公网端口固定）。  
  - **过滤行为**：Address and Port-Dependent Filtering（地址+端口相关过滤）。只允许**之前发送过数据的外部 (IP:Port)** 的数据包进入。  
  家庭宽带最常见类型，限制较严格。

- **NAT4：Symmetric NAT（对称型 NAT）**  
  最严格类型（也称 Hard NAT）。  
  - **映射行为**：Endpoint-Dependent Mapping（端点相关映射）。同一个内网 (IP:Port) 向**不同目标 (IP:Port)** 发送时，会映射到**不同公网端口**。  
  - **过滤行为**：通常为地址+端口相关过滤。  
  P2P 直连最困难，常需端口预测或中继。

**开放性排序**（从易到难）：NAT1 > NAT2 > NAT3 > NAT4  
**安全性排序**（从低到高）：NAT1 < NAT2 < NAT3 < NAT4  

**打洞可行性总结表**（UDP 打洞，基于常见实践）：

|          | NAT1 | NAT2 | NAT3 | NAT4 |
|----------|------|------|------|------|
| **NAT1** | ✅   | ✅   | ✅   | ✅   |
| **NAT2** | ✅   | ✅   | ✅   | ✅   |
| **NAT3** | ✅   | ✅   | ✅   | ❌（难） |
| **NAT4** | ✅   | ✅   | ❌   | ❌（最难） |

（注：NAT4 组合成功率低，常需端口预测 + 多次尝试或 TURN 中继。A+B ≤ 6 的经验法则有时被提及，但实际以具体行为为准。）

### 2. 打洞（Hole Punching / NAT Traversal）基本原理
打洞的核心是 **利用 NAT 的“状态保持”特性**：内网主机主动向外发送 UDP 数据包时，NAT 会创建临时映射表项（“打一个洞”），允许对应外部流量返回。

**经典 UDP Hole Punching 流程**（假设双方 A 和 B 都在 NAT 后，使用公网 STUN/协调服务器 S）：

1. **发现公网映射**：A 和 B 分别向 STUN 服务器 S 发送 UDP 包，S 返回各自的公网 (IP:Port)（称为 Candidate）。
2. **交换候选地址**：通过 S（信令通道）互相告知对方的公网 (IP:Port)。
3. **同时打洞**：A 和 B 在极短时间内**同时向对方的公网 (IP:Port) 发送 UDP 包**。
   - 第一个包可能被对方 NAT 丢弃（因为还没建立对应状态）。
   - 但发送动作会在自己 NAT 上创建映射，允许对方后续包进入。
4. **连接建立**：双方状态表更新后，UDP 数据可双向直连。

**关键点**：
- 必须使用 **UDP**（无连接，状态易维护；TCP 打洞更复杂，需 Simultaneous Open）。
- 需要第三方协调服务器（STUN 获取映射，ICE 框架优化候选）。
- 如果一方是 NAT4，映射端口随目标变化，需预测端口增量或多次尝试。

**辅助技术**：
- **STUN**：发现公网地址和 NAT 类型。
- **TURN**：当打洞失败时，中继转发（Relay）。
- **ICE**（Interactive Connectivity Establishment）：WebRTC 等使用的框架，综合多种候选（主机、服务器反射、TURN）并优先直连。

### 3. 不同 NAT 类型组合下的打洞原理详解

#### 3.1 NAT1 ↔ NAT1（最简单）
- 双方公网端口固定，且过滤宽松。
- 交换公网地址后，任意一方发送即可建立，无需严格同时性。
- 成功率接近 100%。

#### 3.2 NAT1 ↔ NAT3（或 NAT2）
- NAT1 过滤宽松（几乎任何包都可进）。
- NAT3 需先“见过”对方：让 NAT3 侧先向 NAT1 发送包，更新 NAT3 状态表。
- 然后 NAT1 向 NAT3 发送，轻松通过。
- 成功率很高。

#### 3.3 NAT3 ↔ NAT3（常见家庭宽带场景）
- 双方公网端口固定，但过滤严格（需 IP+Port 匹配之前请求）。
- **必须同时发送**：双方在毫秒级窗口内互相发送 UDP 包，各自在对方 NAT 上“打洞”。
- 第一个包可能丢弃，但后续包因状态已建立而通过。
- 实际中通过 ICE/STUN 多次尝试 + 定时同步实现，高成功率（90%以上）。

#### 3.4 涉及 NAT4 的场景（较困难）
- **NAT1/NAT2/NAT3 ↔ NAT4**：
  - NAT4 向对方发送时，因目标不同可能换新端口。
  - 解决方案：NAT4 先向协调服务器发送获取“基础端口”，预测增量；对方尝试多个预测端口；或让非 NAT4 侧主动。
  - 常结合端口猜测（Port Prediction）。
- **NAT4 ↔ NAT4**：
  - 最难。双方端口都随目标变化。
  - 需高级端口预测算法、多次并行尝试，或直接 fallback 到 TURN 中继。
  - 成功率低（依赖运营商 NAT 实现，有些可达 70-90%，有些几乎为 0）。

### 4. 实际应用与注意事项
- **游戏联机、P2P 下载、VoIP/WebRTC**：依赖 NAT 打洞实现低延迟直连。
- **失败处理**：打洞超时 → 切换 TURN 中继（牺牲一些延迟，但保证连通）。
- **提升 NAT 类型方法**（可选，非打洞替代）：
  - 路由器开启 UPnP 或手动端口映射。
  - 部分运营商支持 DMZ 或桥接模式。
  - 使用支持 NAT 优化的 VPN（如某些 P2P VPN）。
- **当前现状（2026 年）**：家庭宽带多为 NAT3；运营商 CGNAT（大 NAT4）增多，打洞难度上升；ICE + TURN 仍是主流保底方案。

### 5. 参考与扩展
- RFC 3489（STUN）、RFC 4787（NAT 行为）、RFC 5780（NAT 类型检测）。
- 常见实现：WebRTC（ICE）、libp2p、各种 P2P VPN。
- 实战建议：使用 STUN 服务器测试自身 NAT 类型（如 stun.l.google.com:19302），然后观察打洞日志。
