了解NAT和连接性
什么是NAT?
网络地址转换 (NAT) 是路由器和防火墙使用的一种技术,它允许私有网络上的多个设备在访问互联网时共享同一个公网 IP 地址。您的设备拥有一个私有 IP 地址(例如 123.123.1 192.168.1.50),但当您连接到网站时,路由器会将其转换为自身的公网 IP 地址,并跟踪是哪个内部设备发出的请求。
NAT 最初是为了节省 IPv4 地址而设计的,但它给点对点连接带来了挑战:位于 NAT 后面的设备无法直接接收来自互联网的传入连接,因为外部流量无法知道要访问哪个内部设备。
不同环境下的NAT
并非所有NAT类型都相同。您所处的NAT类型会影响Cloink能否建立直接的对等连接,还是需要回退到中继服务器
简易NAT
大多数家用路由器使用所谓的端点无关映射 (EIM)或“简易 NAT”。当您的设备向任何外部地址发送数据包时,路由器会分配一个公共 IP 地址和端口的组合,该组合与目标地址无关。
工作原理:
- 您的设备192.168.1.50:12345向服务器 A 发送 UDP 数据包
- 您的路由器将此映射到203.0.113.10:54321
- 当您的设备向服务器 B 发送另一个数据包时,路由器使用相同的公共映射。203.0.113.10:54321
- 任何知道此映射关系的服务器都可以将数据包发送回您的设备。
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:端口映射会根据目标地址而改变。
工作原理:
- 您的设备10.0.5.100:12345向服务器 A 发送 UDP 数据包
- 防火墙将此映射到198.51.100.5:60001
- 当您的设备向服务器 B 发送数据包时,防火墙会分配不同的映射关系。198.51.100.5:60002
- 来自服务器 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)会自动接管。
中继选择
当两个设备需要通过中继进行通信时:
- 双方均从 Cloink 管理服务接收中继服务器信息。
- Signal 服务帮助对等节点协商使用哪个中继服务器。
- 双方都连接到约定的中继服务器。
- 流量通过中继传输时,始终保持端到端加密。
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打洞技术:
- 对等方 A 向对等方 B 的公网地址发送 UDP 数据包(该数据包可能会被丢弃,但它会在 A 的 NAT 中打开一个漏洞)。
- 对等体 B 同时向对等体 A 的公网地址发送 UDP 数据包(在 B 的 NAT 中打开一个漏洞)
- 由于两个 NAT 现在都具有出站映射,因此允许返回数据包通过。
- 连接是通过两个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 进行端到端加密。
