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 应用的启示

  1. 媒体流优先走 UDP --- UDP 打洞成功率虽取决于 NAT 类型,但比 TCP 打洞灵活得多。

  2. 预留 TURN 保底 --- 当检测到 Symmetric NAT 或无法穿透时,自动降级到 TURN 中继。虽增加延迟和带宽成本,但保证了连接成功率。

  3. ICE 框架是标配 --- WebRTC 的 ICE(Interactive Connectivity Establishment)框架自动枚举候选地址、探测连通性,并按优先级从高到低尝试:直连 > STUN 打洞 > TURN 中继。

  4. NAT 类型探测 --- 通过 RFC 3489 定义的流程(或 RFC 5780 的改进版),客户端可以在连接前探测自己的 NAT 类型,从而选择合适的穿透策略。

相关推荐
一个处女座的程序猿O(∩_∩)O1 小时前
如何保持nginx配置与前端打包dist的路径保持一致、解决页面刷新白屏以及页面跳转问题
运维·前端·nginx
想唱rap1 小时前
五种IO模型和非阻塞IO
linux·运维·服务器·网络·数据库·tcp/ip
环流_1 小时前
nacos:负载均衡 3大核心操作
运维·nacos·负载均衡
阿洛学长2 小时前
CSDN、掘金、简书博客文章如何转为Markdown?
运维·数据库·架构·php·持续部署
方安乐2 小时前
交换机的自学机制
运维·服务器·网络
jieyucx3 小时前
Go 语言进阶:构造函数、父子结构体与组合复用详解
服务器·算法·golang·继承·结构体·构造函数
MXsoft6184 小时前
**智能运维如何实现全栈监控与****AI****告警?****——****一体化平台实战解析**
运维·人工智能
MXsoft6184 小时前
**运维体系升级:筑牢企业数字化转型的稳定底座**
运维