今年春节过完转眼间已经30岁了,想研究的技术没有研究,想写的代码没有写,想看的小说没有看,想追的番和电视剧、电影都没看,各种惋惜和遗憾。心想还是写点什么吧,春节试用了Cloudnet的内网穿透,独特而有亮点,可惜不适合自己的需求,但仍推荐给大家。这里转一篇他们Wiki中写的《NAT穿透打洞技术介绍》,言简意赅,学到不少东西。

欣赏Tw93(侑夕)博文的一段话,愿30+的自己:“依旧潮流,依旧写自己喜欢的代码。不跟风,不攀比,不要变得油腻,不要变得年轻时候讨厌的那种中年人好为人师的样子,让自己舒舒服服过日子就够了。”

NAT穿透打洞技术介绍

作者: Cloudnet

NAT分类以及哪些NAT可以打洞成功?

NAT(网络地址转换)主要有以下几种分类:

1、 全锥形 NAT (Full Cone NAT)

一旦一个内部地址 (iAddr:iPort) 被映射到一个外部地址 (eAddr:ePort),任何发往 eAddr:ePort 的数据都会被转发到 iAddr:iPort。

打洞成功率:高

2、 受限锥形 NAT (Restricted Cone NAT)

只有当 iAddr:iPort 先发送数据给某个外部地址 (eAddr:ePort) 后,来自该外部地址的数据才能被转发回 iAddr:iPort。

打洞成功率:中

3、 端口受限锥形 NAT (Port Restricted Cone NAT)

类似于受限锥形 NAT,但是通信受限于特定的端口。只有当 iAddr:iPort 先发送数据给 eAddr:ePort 后,来自 eAddr 和指定端口的数据才会被转发。

打洞成功率:中

4、 对称型 NAT (Symmetric NAT)

每次从相同的内部地址和端口发送到一个特定的外部地址和端口时,都会使用一个新的随机外部端口。

打洞成功率:低

该类型的 NAT 常见于国内教育网系统中,例如: 校园网,教育网等。

在进行 NAT 穿透时,全锥形 NAT 是最容易打洞成功的,因为它对于入站数据没有严格的限制。而对称型 NAT 是最难打洞的,因为它对于每个不同的外部目标使用不同的映射,这使得建立直接的点对点连接变得复杂。

在实际应用中,例如 P2P 通信或 VoIP,通常需要使用 STUN(Session Traversal Utilities for NAT)、TURN(Traversal Using Relays around NAT)或 ICE(Interactive Connectivity Establishment)等技术来辅助完成 NAT 穿透。

为什么我们专注研究NAT打洞?

NAT 打洞(NAT Traversal)是一种技术,它允许位于私有网络中的设备与外部世界建立直接的通信连接。我们专注研究 NAT 打洞的原因包括:

1、 P2P 网络优化

在点对点 (P2P) 网络中,NAT 打洞可以提高数据传输效率,减少延迟,并降低中继服务器的负载。

2、 成本节约

通过直接通信,可以避免使用昂贵的中继服务,从而降低运营成本。

3、 隐私和安全性

直接的端到端连接可以增强数据传输的隐私性和安全性,因为数据不需要经过可能不受信任的第三方服务器。

4、 应用兼容性

许多现代的互联网应用,如视频会议、在线游戏和 VoIP 服务,都需要能够穿透 NAT 来实现最佳性能。

5、 广泛的适用性

随着 IPv4 地址的枯竭,越来越多的网络采用 NAT。因此,NAT 打洞技术变得越发重要,以确保网络的连通性。

6、 互联网规模扩展

NAT 打洞技术使得在没有公网 IP 地址的情况下也能进行大规模的网络连接,这对于互联网的扩展至关重要。

由于以上原因,NAT 打洞技术在网络通信领域中占据了重要地位,特别是在那些需要绕过 NAT 设备以建立直接通信的场景中。

cloudnet 如何实现 NAT 穿透? 使用了哪些技术

在 NAT 1-3 中基本上 Cloudnet 都是可以打洞成功的。 Cloudnet 使用了 STUN/TURN/ICE 等技术来辅助完成 NAT 穿透。

对于 NAT4 类型的 NAT,Cloudnet 使用了客户端随机端口技术,但是这不能保证 100% 的成功率,所以我们引入了中继服务,以保证 NAT4 类型的设备也能够快速使用高速网络连通。

我应该如何做来增加 NAT 打洞成功率?

目前很多城市的运营商都已经回收公网 IP 地址,并分配 100.64 段的 IP 地址,近年来运营商新装的宽带基本上都是光猫+路由器一体机,如果你的路由器没有配置上网帐户,直接就是插上就能用的话,那你的光猫就带有路由器功能,那么您的 NAT 至少是 2-3 层,如果您有设备的控制权,我们建议您开启 upnp/pcp/pmp 这些作为辅助,那么 NAT 打洞成功率就会很高。 如果你是网络管理员,可以开放 udp 端口 41641,那么 NAT 打洞成功率 100%。

NAT 穿透/打洞的常见问题解答

为什么在同一个内网中有的设备可以打洞成功,有的却无法打洞成功?

在同一个内网中,不同设备之间在进行 NAT 打洞时可能会遇到成功或失败的情况,这可能由以下几个因素导致:

1、 NAT 类型差异

即使设备位于同一内网,它们也可能连接到不同类型的 NAT。例如,一些设备可能处于完全锥形 NAT 后面,而其他设备可能处于对称型 NAT 后面。对称型 NAT 更难穿透。

2、 端口预测不一致

NAT 设备在分配外部端口时可能采用不同的策略。如果 NAT 设备不允许端口预测,那么打洞过程可能会失败。

3、 设备配置

设备的防火墙设置或私有网络配置可能阻止了打洞尝试。确保相关的端口和协议没有被阻塞是成功打洞的关键。

4、 超时设置

不同的 NAT 设备可能有不同的超时设置。如果一个设备的 NAT 映射很快就超时了,那么打洞尝试可能会因为映射失效而失败。

5、 并发连接限制

某些 NAT 设备可能对并发连接数有限制。如果达到上限,新的打洞尝试可能无法建立。

6、 IP 地址变化

在动态 IP 地址分配的环境中,设备的公网 IP 地址可能会变化,这会影响到打洞的成功率。

7、 路由器/防火墙固件差异

不同的路由器或防火墙固件可能实现 NAT 的方式不同,这可能会影响到 NAT 打洞的成功率。

8、 多层 NAT

如果内网中存在多层 NAT,打洞过程将变得更加复杂,成功率可能会降低。

9、 端口容量

因为需要占用最上层的公网 IP 的端口,而最上层公网 IP 往往可能是整个小区的人都在共用,端口也会很紧张,如果 NAT 打洞时协商不到端口那就会持续协商,直到成功协商到端口并打洞成功,所以这也会导致为什么同一个内网的设备有的打洞成功而有的却无法成功的原因。

理解和诊断这些因素有助于改善 NAT 穿透/打洞的成功率,并且可能需要针对特定的网络环境调整策略。

如何解决这个问题呢?

Cloudnet 在 1.58 版本开发了一种叫做 NAT 动态路由的技术。 该技术的原理是将打洞成功的设备作为 NAT 路由节点,而同处于一个内网的其他设备则通过这个 NAT 路由节点来进行转发特定的网段流量,当设备打洞成功则自动切换回本机路由,不再走 NAT 动态路由。

使用该功能的前提是内网中至少有一个设备是可以打洞成功的,且该设备必须是一直在线的,且不会被关机,以保证 NAT 动态路由的可用性。

Cloudnet 进行 NAT 打洞时,为什么会有延时?

对于 NAT1-3 类型的 NAT,Cloudnet 基本上可以做到只需几秒即可打洞成功。

对于 NAT4 可能不会立刻打洞成功,针对此场景我们会先使用中继服务来保证你的网络是通的,并同时进行打洞,一旦打洞成功就会切换到直连模式,这个过程有时会持续几分钟甚至更久。

什么是 idle 状态?

如果穿透成功后长时间没有使用(没有任何流量进出),那么客户端与对端的设备就会变为空闲状态(idle)。

什么情况下会重新打洞?

穿透成功就会持续占用运营商公网 IP 网关分配的端口,如果运营商的网关设备重置连接或强制释放端口那就需要重新进行打洞。

如果穿透成功后长时间没有使用(没有任何流量进出),那么客户端也会自动释放端口,再次使用时就会重新进行打洞。