NAT Traversal 实际工作原理:实用指南,帮助访问幕后设备
Source: Dev.to
引言
如果把互联网看作一个巨大的连通图,实际情况要碎片得多。如今大多数设备都位于私有网络内部,被执行网络地址转换(NAT)的路由器与公共互联网隔离。NAT 解决了 IPv4 地址短缺的问题,但它也破坏了最初的设计理念——任意两台主机应该能够直接通信,而无需额外的机制。
NAT 基础
- 原始模型 – 每台设备都有一个全局可路由的 IPv4 地址。
- 问题 – 四十亿个地址已不够用。
- 解决方案 – NAT 通过跟踪连接并改写数据包,让大量私有设备共享一个公网 IP。
- 结果 –
10.0.0.0/8、192.168.0.0/16等私有地址段成为常态,家庭路由器充当有状态防火墙。
NAT 工作原理
当数据包离开本地网络时,NAT 路由器:
- 记录一个流条目(五元组标识符):
- 源 IP
- 源端口
- 目的 IP
- 目的端口
- 传输协议(TCP/UDP)
- 将源 IP 和端口改写为路由器的公网地址以及选定的公网端口。
匹配已有条目的返回数据包会被放行;其他所有数据包均被丢弃。
NAT 映射类型
| 映射类型 | 行为 | 对点对点的影响 |
|---|---|---|
| Endpoint‑independent mapping | 对所有目的地复用同一个公网端口。 | 对打洞友好;对等方可以共享同一个公网地址/端口。 |
| Endpoint‑dependent (symmetric) NAT | 为每个目的地分配一个新公网端口。 | 打破典型的打洞,因为在 STUN 服务器上使用的端口不会在对等方之间复用。 |
过滤规则也各不相同:有些 NAT 在映射存在后允许来自任意源的数据包,而另一些则仅限原始远程 IP/端口的流量。
打洞(Hole Punching)
一种基于时序的技巧,在两端 NAT 上创建匹配的出站条目:
- 每个对等方联系 STUN 服务器,获取自己的公网 IP 和端口。
- 通过信令通道交换这些地址。
- 双方同时向对方发送数据包。
如果数据包在 NAT 仍保有出站状态时到达,入站数据包会被视为已有流的一部分而被放行。
- UDP 效果最佳,因为它是无连接的。
- TCP 可以使用 simultaneous open,但多数 NAT 对此支持不佳。
发卡(Hairpinning,NAT Loopback)
当同一路由器后面的两台设备尝试使用各自的公网地址相互通信时,路由器必须对流量进行转换并在内部回环。并非所有消费级路由器都支持发卡,这也是 ICE 框架先测试本地地址、再回退到公网地址的原因。
STUN – Session Traversal Utilities for NAT
STUN 服务器回答诸如:
- “我的公网 IP 和端口是什么?”
- “我的 NAT 行为如何?”
STUN 还通过周期性发送 keep‑alive 请求来保持 NAT 映射活跃。
TURN – Traversal Using Relays around NAT
如果直接通信失败,TURN 提供中继:
- 在 TURN 服务器上分配一个公网地址。
- 在对等方之间转发数据包。
这会增加延迟,但能保证连通性,尤其在受限的企业或移动网络中。
ICE – Interactive Connectivity Establishment
ICE 协调整个过程:
- Gather candidates – 本地地址、STUN 获得的公网地址、TURN 中继地址。
- Connectivity checks – 测试每一对候选地址。
- Selection – 选取最佳路径(本地 → 打洞 → 中继)。
目标是先尝试成本最低、延迟最小的路径,只有必要时才回退。
端口映射协议
一些路由器公开 API,允许应用直接请求入站映射:
- UPnP IGD
- NAT‑PMP
- PCP
这些仅在用户的路由器是路径中唯一 NAT 时有效。若在 ISP 管理的网络中,上游 NAT 常会阻断它们。
Carrier‑Grade NAT (CGN)
运营商将整栋楼或小区放在同一个公网 IP(CGN)后面。在这种环境下:
- 家用路由器无法暴露服务,因为 ISP 的 NAT 在到达用户侧之前就拦截了未请求的流量。
- 穿透成功取决于运营商对映射和发卡的处理方式,极不确定。
IPv6 考量
IPv6 消除了地址匮乏,为每台设备提供全局可达的地址。理论上恢复了端到端连通性,但:
- 防火墙仍会过滤入站流量。
- 点对点系统仍需一种方式请求入站许可。
IPv6 的普及程度不均,IPv4 的各种穿透方案仍将存在多年。
构建健壮的 NAT‑Traversal 实现
典型实现包括:
- 以 UDP 为主的通信方式。
- 访问 STUN 服务器以发现公网地址。
- 在不可恢复的情况下使用 TURN 中继作为后备。
- 使用 信令通道(WebSocket、SIP 等)交换候选地址。
- 保持 NAT 端口活跃的策略(周期性 keep‑alive)。
- 定期连通性检查 以适应网络变化。
- 端到端加密 确保数据安全。
应用通常先使用最慢但最可靠的方法(TURN),随后在更好路径可用时升级为直接路径。
实际使用案例
- WebRTC 在浏览器中内置 ICE,实现点对点视频、音频和数据传输。
- Mesh 网络工具 使用类似逻辑,在无需手动配置的情况下连接设备。
- 某些隧道工具创建绕过 NAT 的安全通道,而非直接穿透。
结论
NAT 穿透是对必然产生的问题的回应。IPv4 耗尽迫使互联网采用 NAT,进而破坏了最初的端到端模型。穿透技术通过巧妙的时序、发现和回退机制,恢复了全局连通网络的幻象。除非 IPv6 完全主导,否则这些机制仍是每一次流畅视频通话、多人游戏或点对点传输的关键。
NAT 穿透是如何工作的? – 通过发现公网端点、通过协同的出站流量创建临时 NAT 状态,并在必要时回退到中继,由 STUN、TURN、ICE 等协议统一调度实现。