Skip to content

了解NAT和连接性

什么是NAT?

网络地址转换 (NAT) 是路由器和防火墙使用的一种技术,它允许私有网络上的多个设备在访问互联网时共享同一个公网 IP 地址。您的设备拥有一个私有 IP 地址(例如 123.123.1 192.168.1.50),但当您连接到网站时,路由器会将其转换为自身的公网 IP 地址,并跟踪是哪个内部设备发出的请求。

NAT 最初是为了节省 IPv4 地址而设计的,但它给点对点连接带来了挑战:位于 NAT 后面的设备无法直接接收来自互联网的传入连接,因为外部流量无法知道要访问哪个内部设备。

不同环境下的NAT

并非所有NAT类型都相同。您所处的NAT类型会影响Cloink能否建立直接的对等连接,还是需要回退到中继服务器

简易NAT

大多数家用路由器使用所谓的端点无关映射 (EIM)或“简易 NAT”。当您的设备向任何外部地址发送数据包时,路由器会分配一个公共 IP 地址和端口的组合,该组合与目标地址无关。

工作原理:

  1. 您的设备192.168.1.50:12345向服务器 A 发送 UDP 数据包
  2. 您的路由器将此映射到203.0.113.10:54321
  3. 当您的设备向服务器 B 发送另一个数据包时,路由器使用相同的公共映射。203.0.113.10:54321
  4. 任何知道此映射关系的服务器都可以将数据包发送回您的设备。

P2P 通常有效的原因: 由于映射关系一致,STUN 服务器可以发现您的公网 IP 地址和端口,并将其共享给对等方,而对等方可以直接向您发送数据包。路由器看到返回的流量后,会允许其通过,因为它与现有的映射关系匹配。

┌─────────────────┐     ┌──────────────┐     ┌─────────────────┐
│  Your Device    │────▶│  Home Router │────▶│    Internet     │
│ 192.168.1.50    │     │  (Easy NAT)  │     │                 │
│    :12345       │     │ 203.0.113.10 │     │                 │
└─────────────────┘     │    :54321    │     └─────────────────┘
                        └──────────────┘

                    Same port for all destinations

限制性NAT

许多企业防火墙和一些 ISP 级路由器使用端点相关映射 (EDM)或“对称 NAT”。在这种模式下,公网 IP:端口映射会根据目标地址而改变。

工作原理:

  1. 您的设备10.0.5.100:12345向服务器 A 发送 UDP 数据包
  2. 防火墙将此映射到198.51.100.5:60001
  3. 当您的设备向服务器 B 发送数据包时,防火墙会分配不同的映射关系。198.51.100.5:60002
  4. 来自服务器 B 的数据包无法使用服务器 A 的映射。

为什么 P2P 更难: 当 STUN 服务器发现你的公网 IP 地址和端口时,该映射仅对进出 STUN 服务器自身的流量有效。当你的对端尝试向该地址发送数据包时,防火墙可能会拒绝这些数据包,或者将其映射为其他方式。

┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
│  Your Device    │────▶│ Corporate        │────▶│    Internet     │
│  10.0.5.100     │     │ Firewall         │     │                 │
│    :12345       │     │ (Symmetric NAT)  │     │                 │
└─────────────────┘     │ 198.51.100.5     │     └─────────────────┘
                        │   :60001 → Srv A │
                        │   :60002 → Srv B │ Different port per destination
                        └──────────────────┘

其他限制: 限制性 NAT 防火墙通常:

  • 完全屏蔽UDP或将其限制在特定端口。
  • 要求流量通过HTTP/HTTPS代理服务器。
  • 执行深度包检测,干扰隧道协议
  • 制定严格的出口规则,只允许流量流向已知目的地。

运营商级NAT

运营商通常使用运营商级NAT(CGNAT),它会在你和互联网之间增加一层额外的NAT。你的手机在运营商的内部网络上处于NAT之后,而该网络在面向互联网时又处于另一层NAT之后。

双重NAT问题:

┌─────────────┐     ┌───────────────┐     ┌───────────────┐     ┌──────────┐
│  Phone      │────▶│  Cell Tower   │────▶│  Carrier NAT  │────▶│ Internet │
│ 10.x.x.x    │     │   (NAT 1)     │     │   (NAT 2)     │     │          │
└─────────────┘     └───────────────┘     └───────────────┘     └──────────┘
                           │                      │
                    Private IP              Public IP
                    100.64.x.x             (Shared by many users)

P2P面临的挑战:

  • 需要两层NAT转换才能穿越
  • 运营商通常在 CGNAT 层使用对称 NAT。
  • 公共 IP 地址由数千个用户共享
  • 映射操作可能存在较短的超时时间(30-60 秒)
  • 当您在不同基站之间移动时,网络状况会频繁变化。

WARNING

您在移动网络中看到的地址范围100.64.0.0/10是为运营商级NAT保留的。Cloink也使用此地址范围进行内部寻址,这是为了避免与典型的私有网络地址范围冲突。

1:1 NAT

云虚拟机和数据中心服务器的情况则有所不同: 公有云(AWS、GCP、Azure):

  • 虚拟机通常具有私有 IP 地址,并通过 1:1 NAT 将其转换为公共 IP 地址(例如弹性 IP)。
  • 这对于出站连接来说就像简单的NAT一样。
  • 安全组控制入站访问,但不影响 NAT 行为
  • P2P 通常运行良好,一般不需要任何防火墙更新。

私有/本地数据中心:

  • 可能完全没有NAT(扁平网络,具有公共或路由IP地址)
  • 或者可能位于具有严格NAT的企业级防火墙之后。
  • 通常有严格的出口政策,限制流量流向已知目的地。

Cloink 中继

当无法建立直接的点对点连接时(通常是由于NAT问题),Cloink会使用中继服务器来确保连接。Cloink内置了一个专门针对其使用场景优化的定制中继系统。

中继器的工作原理

Cloink 中继服务器是一个轻量级服务器,当对等节点无法直接连接时,它会转发加密的 WireGuard 流量。与传统的 TURN 服务器不同,Cloink 中继服务器使用了一种专为提高效率而设计的自定义协议。

传输协议:

  • QUIC: 一种基于UDP的现代协议,内置加密功能。它是主要的传输协议,延迟更低。
  • WebSocket: 一种基于HTTP、通过TCP传输的协议。当UDP被阻止时,它可以作为备用方案,因为对于防火墙来说,它看起来像是标准的HTTPS流量。

当客户端连接到中继服务器时,它会同时尝试两种协议,并使用先建立连接的协议。如果由于网络限制导致 QUIC(UDP)连接失败,WebSocket(TCP)会自动接管。

中继选择

当两个设备需要通过中继进行通信时:

  1. 双方均从 Cloink 管理服务接收中继服务器信息。
  2. Signal 服务帮助对等节点协商使用哪个中继服务器。
  3. 双方都连接到约定的中继服务器。
  4. 流量通过中继传输时,始终保持端到端加密。

Cloink 支持多个中继服务器实例以实现高可用性。如果某个中继服务器不可用,对等节点可以切换到备用服务器。

WARNING

自托管部署可以运行自己的中继服务器。为了获得最佳性能,请将中继服务器部署在地理位置上靠近用户的位置。

P2P连接与中继连接

P2P(点对点)连接

Cloink建立P2P连接时,流量直接在对等节点之间流动,无需中间服务器:

┌──────────────┐                                    ┌──────────────┐
│    Peer A    │◀──────── Encrypted WireGuard ────▶│    Peer B     │
│  (Your PC)   │               Tunnel               │  (Server)    │
└──────────────┘                                    └──────────────┘

优势:

  • 更低延迟:数据包选择最短网络路径传输。
  • 更高的吞吐量:无中继服务器瓶颈
  • 更高的可靠性:更少的故障点
  • 隐私:流量不会经过任何第三方基础设施。

要求:

  • 至少有一个对等方必须具有“友好”NAT 或公共 IP 地址。
  • UDP流量必须由中间防火墙允许。
  • NAT映射必须足够稳定才能进行打洞操作。

中继连接

当 P2P 连接失败时,Cloink 会回退到中继服务器。流量在离开您的设备之前就已经加密,并且在通过中继服务器时也保持加密状态:

┌──────────────┐         ┌───────────────┐         ┌──────────────┐
│    Peer A    │◀───────▶│ Relay Server  │◀───────▶│    Peer B    │
│  (Your PC)   │         │  (Cloink)     │         │  (Server)    │
└──────────────┘         └───────────────┘         └──────────────┘

                 Traffic is still WireGuard
                 encrypted end-to-end

当发生中继连接时:

  • 双方都采用了对称NAT。
  • UDP 被阻止,但允许通过 TCP 进行 WebSocket 连接。
  • 具有深度包检测功能的激进型防火墙
  • 极其严格的企业网络

** 权衡取舍:**

  • 延迟较高:流量必须往返于中继服务器。
  • 吞吐量降低:中继服务器容量由用户共享
  • 地理位置依赖性:延迟取决于中继服务器的位置。

WARNING

即使流量经过中继,它仍然使用 WireGuard 进行端到端加密。中继服务器无法解密或检查您的流量——它只会转发对等节点之间的加密数据包。

Cloink 如何建立连接

Cloink 使用 ICE(交互式连接建立)协议来寻找两个对等节点之间最佳的连接路径。ICE 也是 WebRTC 视频通话所使用的技术。

连接过程

当两个 Cloink 对等节点需要连接时:

1. 发送 ICE 候选者:

每个同伴都会找出所有可能的到达方式: 主机候选地址:机器上的本地 IP 地址(例如,192.168.1.50:51820)。这些地址是通过枚举设备上的所有网络接口收集的。

服务器自反候选地址:从 NAT 外部看到的公网 IP 地址和端口(例如,203.0.113.10:54321)。这些信息是通过向 STUN 服务器发送 STUN 绑定请求来发现的,STUN 服务器会响应它观察到的公网 IP 地址和端口。

中继候选地址:由 TURN/中继服务器分配的地址(备用选项)。这些地址是通过向 TURN 服务器请求分配获得的,TURN 服务器会在中继服务器上预留一个端口,用于将流量转发给对等方。

2. 候选人交换:

同伴之间通过 Cloink Signal 服务交换他们发现的候选地址信息。这种交换采用端到端加密,因此 Signal 服务无法看到候选地址的实际信息。

3. 连接性检查:

双方同时尝试使用所有候选连接对相互连接。ICE 会按优先级顺序执行这些检查,优先选择直接连接而非中继连接:

Priority 1: Host ↔ Host         (direct LAN connection)
Priority 2: Host ↔ Server Reflexive  (direct through NAT)
Priority 3: Server Reflexive ↔ Server Reflexive (both behind NAT)
Priority 4: Relay ↔ Any         (fallback via relay server)

4. 建立连接:

第一个成功交换数据包的候选数据包对将成为活动连接。然后,Cloink 配置 WireGuard 使用此路径进行加密隧道通信。

NAT 穿透

当两个对等节点都位于NAT之后时,Cloink使用一种称为UDP打洞技术:

  1. 对等方 A 向对等方 B 的公网地址发送 UDP 数据包(该数据包可能会被丢弃,但它会在 A 的 NAT 中打开一个漏洞)。
  2. 对等体 B 同时向对等体 A 的公网地址发送 UDP 数据包(在 B 的 NAT 中打开一个漏洞)
  3. 由于两个 NAT 现在都具有出站映射,因此允许返回数据包通过。
  4. 连接是通过两个NAT漏洞建立的。
    Peer A                                           Peer B
      │                                                │
      │──────── UDP to B's public addr ───────────────▶│ (may be dropped)
      │                                                │
      │◀─────── UDP to A's public addr ────────────────│ (may be dropped)
      │                                                │
      │         Both NATs now allow return traffic     │
      │                                                │
      │◀───────────── P2P Connection ─────────────────▶│

打洞失败时:

  • 对称NAT在两侧都会改变端口映射,从而破坏协调。
  • 具有严格过滤功能的防火墙会丢弃未经请求的UDP数据包。
  • NAT映射超时后连接仍无法建立。

Cloink 中的中继基础设施

Cloink 提供全球分布式中继服务器,即使在最受限的网络环境下也能确保最小的性能影响和连接性。中继系统支持两种传输协议:

  • QUIC: 高性能基于UDP的传输协议(主要)

  • WebSocket: 一种基于 TCP 的传输协议,工作在 443 端口(UDP 被阻塞时的备用方案)。

WebSocket 传输对于只允许 HTTPS 流量的企业网络来说尤为重要,因为它对防火墙来说就像是标准的 Web 流量。

为了与旧系统兼容,Cloink 也支持 TURN (Coturn) 服务器,但对于新部署,建议使用原生中继。

概括

NAT类型常见场景P2P可用性备注
简单NAT家庭网络通常无需配置即可工作
限制型NAT办公网络中低可能需要IT部门配置UDP端口转发
运营商级NAT移动网络低-中低因运营商而异;Wi-Fi 通常更好
1:1 NAT云服务检查安全组 UDP 规则

Cloink 旨在适用于所有这些环境。当 P2P 连接不可用时,中继回退机制可确保您保持连接。连接类型会影响延迟和吞吐量,但安全性保持不变——您的流量始终使用 WireGuard 进行端到端加密。