NAT Traversal 实际工作原理:实用指南,帮助访问幕后设备

发布: (2025年12月9日 GMT+8 17:46)
8 min read
原文: Dev.to

Source: Dev.to

引言

如果把互联网看作一个巨大的连通图,实际情况要碎片得多。如今大多数设备都位于私有网络内部,被执行网络地址转换(NAT)的路由器与公共互联网隔离。NAT 解决了 IPv4 地址短缺的问题,但它也破坏了最初的设计理念——任意两台主机应该能够直接通信,而无需额外的机制。

NAT 基础

  • 原始模型 – 每台设备都有一个全局可路由的 IPv4 地址。
  • 问题 – 四十亿个地址已不够用。
  • 解决方案 – NAT 通过跟踪连接并改写数据包,让大量私有设备共享一个公网 IP。
  • 结果10.0.0.0/8192.168.0.0/16 等私有地址段成为常态,家庭路由器充当有状态防火墙。

NAT 工作原理

当数据包离开本地网络时,NAT 路由器:

  1. 记录一个流条目(五元组标识符):
    • 源 IP
    • 源端口
    • 目的 IP
    • 目的端口
    • 传输协议(TCP/UDP)
  2. 将源 IP 和端口改写为路由器的公网地址以及选定的公网端口。

匹配已有条目的返回数据包会被放行;其他所有数据包均被丢弃。

NAT 映射类型

映射类型行为对点对点的影响
Endpoint‑independent mapping对所有目的地复用同一个公网端口。对打洞友好;对等方可以共享同一个公网地址/端口。
Endpoint‑dependent (symmetric) NAT为每个目的地分配一个新公网端口。打破典型的打洞,因为在 STUN 服务器上使用的端口不会在对等方之间复用。

过滤规则也各不相同:有些 NAT 在映射存在后允许来自任意源的数据包,而另一些则仅限原始远程 IP/端口的流量。

打洞(Hole Punching)

一种基于时序的技巧,在两端 NAT 上创建匹配的出站条目:

  1. 每个对等方联系 STUN 服务器,获取自己的公网 IP 和端口。
  2. 通过信令通道交换这些地址。
  3. 双方同时向对方发送数据包。

如果数据包在 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 协调整个过程:

  1. Gather candidates – 本地地址、STUN 获得的公网地址、TURN 中继地址。
  2. Connectivity checks – 测试每一对候选地址。
  3. 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 等协议统一调度实现。

Back to Blog

相关文章

阅读更多 »