NAT 类型详解:四种 NAT 的数据流与原理解析
NAT 类型详解:四种 NAT 的数据流与原理解析
摘要:NAT(Network Address Translation)是 P2P 通信中绕不开的关卡。不同的 NAT 类型决定了内网设备能否被外部直接访问,直接影响 WebRTC 等 P2P 技术的穿透成功率。本文通过四张数据流图,直观对比 Full Cone、Address Restricted Cone、Port Restricted Cone 和 Symmetric 四种 NAT 类型的核心区别。
什么是 NAT?
NAT(网络地址转换)是一种将私有 IP 地址映射为公共 IP 地址的技术。它允许多个内网设备共享同一个公网 IP 上网,但也给外部主动连接内网设备带来了障碍——这被称为NAT 穿越问题。
根据 RFC 3489/4787 的定义,NAT 按其对入站数据包的过滤策略可分为四种类型,严格程度依次递增。
四种 NAT 类型的核心对比
场景设定
为方便对比,四张图采用统一的场景:
| 角色 | 地址 |
|---|---|
| 客户端(内网) | 192.168.1.10:5000 |
| NAT 公网地址 | 203.0.113.50 |
| 服务器 A | 10.0.0.1:80 / :8080 |
| 服务器 B | 20.0.0.1:80 / :443 |
一、Full Cone NAT(完全锥形NAT)
核心特征:映射建立后,不限制入站来源。
当内网客户端192.168.1.10:5000向外部发出第一个数据包时,NAT 建立一条映射:
192.168.1.10:5000 → 203.0.113.50:8000此后,任何外部主机都可以通过203.0.113.50:8000向该内网客户端发送数据包——无论源 IP 地址或端口是什么。
- 服务器 A(10.0.0.1:80)✅ 可以回包
- 服务器 A(10.0.0.1:8080)✅ 可以回包(不同端口)
- 服务器 B(20.0.0.1:80)✅ 可以回包
- 服务器 B(20.0.0.1:443)✅ 可以回包
入站过滤策略:无。只要目标端口匹配映射表中的公网端口,任何源地址的包都会被转发。
P2P 穿透性:★★★★★ 最容易穿透。
二、Address Restricted Cone NAT(地址限制锥形NAT)
核心特征:仅允许已通信过的源 IP 回包,但对端口不做限制。
映射规则与 Full Cone 相同,但在入站方向增加了源 IP 地址检查:
192.168.1.10:5000 → 203.0.113.50:8000 入站白名单:{ 10.0.0.1 } ← 客户端曾向 10.0.0.1 发过包- 服务器 A(10.0.0.1:80)✅ 可以回包(IP 在白名单中)
- 服务器 A(10.0.0.1:8080)✅ 可以回包**(同一 IP,不同端口仍允许)**
- 服务器 B(20.0.0.1:80)❌被阻止(IP 不在白名单中)
- 服务器 B(20.0.0.1:443)❌ 被阻止
入站过滤策略:src_ip == allowed_ip。NAT 维护一个「已通信过的主机 IP」列表,只有当入站数据包的源 IP 地址在此列表中时才放行。但该源 IP 可以使用任意端口回包。
P2P 穿透性:★★★★ 较易穿透(仍需打洞辅助)。
三、Port Restricted Cone NAT(端口限制锥形NAT)
核心特征:严格匹配源 IP:PORT 组合,二者缺一不可。
这是 Cone 类型中最严格的变体,在地址限制的基础上进一步增加了端口检查:
192.168.1.10:5000 → 203.0.113.50:8000 入站白名单:{ 10.0.0.1:80 } ← 客户端曾向 10.0.0.1:80 发过包- 服务器 A(10.0.0.1:80)✅ 可以回包(IP 和端口完全匹配)
- 服务器 A(10.0.0.1:8080)❌被阻止(IP 相同但端口不匹配)
- 服务器 B(20.0.0.1:80)❌被阻止(IP 不同)
入站过滤策略:src_ip == allowed_ip && src_port == allowed_port。仅允许来自同一 IP:PORT 组合的数据包通过。
P2P 穿透性:★★★ 需要完整的"打洞"流程。
四、Symmetric NAT(对称NAT)
核心特征:不同目标分配不同的映射端口,是限制最严格的 NAT 类型。
与前三类 Cone NAT 最本质的区别在于:映射规则依赖目标地址。
发往 10.0.0.1:80 → 建立映射 192.168.1.10:5000 → 203.0.113.50:8000 发往 20.0.0.1:80 → 建立映射 192.168.1.10:5000 → 203.0.113.50:8001(不同端口!)内网客户端使用相同的:5000端口分别向两台服务器发包,但在 NAT 上却产生了两个不同的映射(:8000和:8001),各自独立且互不通用。
- 服务器 A(10.0.0.1:80)→
:8000✅ 允许(映射精确绑定) - 服务器 A(10.0.0.1:8080)→
:8000❌被阻止(端口不符,A 从未用 :8080 通信过) - 服务器 A(10.0.0.1:80)→
:8001❌被阻止(:8001映射绑定给 B,A 不能用) - 服务器 B(20.0.0.1:80)→
:8000❌ 被阻止(同理)
入站过滤策略:dst_port == mapped_port && src_ip:port == dest_ip:port_of_original_packet。入站包必须精确匹配出站包的目标地址和 新分配的映射端口。
P2P 穿透性:★☆☆☆☆ 极难穿透。传统的 UDP 打洞技术在 Symmetric NAT 下基本失效,通常需要借助 TURN 中继服务器来转发数据。
为什么 Symmetric NAT 最难穿透?
在 Cone 类型中,内网客户端只要知道自己的公网映射地址(IP:Port),就可以将其告知对端,对端直接往这个地址发数据即可。但在 Symmetric NAT 下,映射端口随目标地址变化;客户端在对端打洞时使用的地址,与自己最终向对端发包时 NAT 分配的端口不同,导致打洞失效。
四种 NAT 的对比总结
| 特性 | Full Cone | Address Restricted | Port Restricted | Symmetric |
|---|---|---|---|---|
| 映射是否依赖目标地址 | 否 | 否 | 否 | 是 |
| 检查源 IP | 否 | 是 | 是 | 是 |
| 检查源端口 | 否 | 否 | 是 | 是 |
| 映射端口是否固定 | 是 | 是 | 是 | 随目标变化 |
| UDP 打洞成功率 | 极高 | 高 | 中 | 极低 |
| 推荐穿透方案 | 直接连接 | 打洞 | 打洞 + 预测 | TURN 中继 |
实际场景中的 NAT 分布(仅供参考)
根据业界多项统计,公网中各种 NAT 类型的大致分布为:
| NAT 类型 | 占比 | 常见场景 |
|---|---|---|
| Full Cone | ~5% | DMZ 主机、部分光猫桥接模式 |
| Address Restricted Cone | ~15% | 部分家用路由器 |
| Port Restricted Cone | ~35% | 常见于运营商 CGNAT |
| Symmetric NAT | ~40% | 企业防火墙、4G/5G 移动网络 |
| 无法穿透 | ~5% | 防火墙拦截 UDP |
注意:不同地区和网络环境的分布差异很大,移动网络(4G/5G)中 Symmetric NAT 的比例通常更高。
对 P2P 应用的启示
媒体流优先走 UDP— UDP 打洞成功率虽取决于 NAT 类型,但比 TCP 打洞灵活得多。
预留 TURN 保底— 当检测到 Symmetric NAT 或无法穿透时,自动降级到 TURN 中继。虽增加延迟和带宽成本,但保证了连接成功率。
ICE 框架是标配— WebRTC 的 ICE(Interactive Connectivity Establishment)框架自动枚举候选地址、探测连通性,并按优先级从高到低尝试:直连 > STUN 打洞 > TURN 中继。
NAT 类型探测— 通过 RFC 3489 定义的流程(或 RFC 5780 的改进版),客户端可以在连接前探测自己的 NAT 类型,从而选择合适的穿透策略。
