NAT 类型及 P2P 穿透

在当今互联网环境中,网络地址转换(NAT, Network Address Translation)技术已成为连接私有网络与公共互联网的核心桥梁。然而,NAT的广泛应用也为P2P通信带来了挑战。在P2P通信中,NAT穿透技术是实现设备间直接连接的关键。由于NAT屏蔽了外部网络的直接访问,P2P应用程序需要通过巧妙的技术手段绕过这一障碍,以建立高效的通信通道。本文深入探讨不同类型 NAT 的特性,分析NAT类型的探测方法及其原理,阐述NAT穿透的实现机制。

1. NAT类型

网络地址转换(NAT)类型根据其映射和过滤规则的不同,可分为以下四种主要类型,每种类型在地址端口映射和外部连接限制方面具有独特特性,影响P2P通信和NAT穿透的效果。这些NAT类型的不同特性直接影响P2P通信的可行性和效率,理解其工作原理是实现有效NAT穿透的基础。

1.1. 完全锥型(Full Cone)

内部主机的IP和端口映射到固定的外部IP和端口,任何外部设备都可以通过该外部地址向内部主机发起连接。特点是映射关系固定且开放,穿透性最强,但安全性较低。

如下图所示,Client B 和 Client C 都可以与 Client A 无阻碍双向通信。

1.2. 地址受限锥型(Address Restricted Cone)

内部主机的IP和端口映射到固定的外部IP和端口,但只有内部主机主动联系过的外部设备才能通过该映射发起连接。相比全锥形NAT,增加了来源IP限制,安全性更高,但穿透复杂性增加。

如下图所示,Client A 必须先向 Client B 发送报文,Client B 才能够向 Client A 发送报文;否则,Client C 直接向 Client A 发送的报文,会被 NAT 丢弃。

1.3. 端口受限锥型(Port Restricted Cone)

类似受限锥形NAT,但进一步限制外部设备必须使用内部主机曾联系过的IP和端口进行通信。端口限制提高了安全性,但对P2P连接的实现要求更高。

如下图所示,不仅 Client C 发送的报文会被丢弃,Client B 通过不同端口(IP地址不变)发送的报文也会被 NAT 丢弃。

1.4. 对称型(Symmetric)

每次内部主机与不同外部设备通信时,NAT分配不同的外部端口映射,且仅允许对应的外部设备通过该映射回连。映射的高度动态性和严格限制使对称NAT穿透难度最大。

如下图所示,Client A 向 Client B 和 Client C 发送报文,会在 NAT 上生成两个不同的映射表项,外部报文的 IP 地址和端口在表项中查找不到,都会被丢弃。

2. NAT类型探测

NAT类型探测是识别网络地址转换设备行为的关键过程,通过发送特定的请求并分析响应,确定NAT的类型及其对通信的限制。探测过程通常利用UDP数据包,通过与外部服务器交互,测试NAT的映射和过滤规则。核心原理在于观察内部IP和端口映射到外部地址的模式,以及外部请求是否能够成功接收。探测开始时,内部主机发送请求到不同外部IP和端口,服务器使用不同的IP和端口返回响应,基于是否收到响应及映射地址的稳定性,逐步判断NAT类型。包括检查UDP是否被防火墙阻止、是否分配公共IP,以及映射是否对所有外部请求开放或受地址/端口限制。

上图展示了NAT类型探测的技术原理,接下来我们将对其探测原理和流程进行深入分析。

2.1. UDP Blocked

内部主机向外部服务器发送探测报文。如果未收到服务器的响应,则表明网络存在UDP阻塞,可能由防火墙或NAT配置限制所致

2.2. Firewall

当内部主机收到服务器的首次响应并从响应中确认分配了公网IP后,探测流程继续进行。接下来,内部主机再次向服务器发送探测报文。此时,服务器将使用不同的IP地址和端口进行响应,以进一步测试网络环境的限制。如果第二次响应未能成功接收,表明可能存在防火墙对特定IP或端口的额外过滤,从而中断了通信。

2.3. Open Internet

如果内部主机成功接收到服务器使用不同IP地址和端口发送的第二次响应,则表明网络环境没有额外的限制或过滤,属于开放互联网(Open Internet)状态,允许来自不同外部端点的自由通信。

2.4. Full Cone NAT

当内部主机收到服务器的首次响应后,若发现响应中显示的并非公网IP,表明其通信经过NAT映射。接下来,内部主机再次发起探测报文,服务器则使用不同的IP地址和端口进行响应。如果内部主机仍能成功接收到这一第二次响应,说明NAT允许来自任何外部IP和端口的请求通过相同的映射,这符合全锥形NAT(Full Cone NAT)的特性,表明该NAT类型具有较高的开放性。

2.5. Symmetric NAT

如果内部主机未能接收到使用不同IP和端口发送的第二次响应,则进一步进行探测。内部主机随后向另一个外部端点(IP2:Port2)发起第三次探测报文,服务器使用相同地址(IP2:Port2)发送响应。如果内部主机发现外部看到的公网地址与第一次不同,表明NAT为每个不同的外部IP和端口对分配了独特的映射,这一行为特征符合对称NAT(Symmetric NAT)的特性,反映了其严格的动态映射规则。

2.6. Restricted Cone NAT

如果比较发现第一次和第三次探测中服务器返回的公网地址相同,表明NAT的映射在不同外部IP间保持一致。接下来,内部主机发起第四次探测,服务器使用与前次相同的IP但不同端口进行响应。如果内部主机无法收到这一响应,说明NAT限制了来自未主动联系过的端口的连接,符合端口受限锥形NAT(Port Restricted Cone NAT)的特性。反之,如果能够成功接收响应,表明NAT仅对未联系过的IP施加限制,而端口开放,符合地址受限锥形NAT(Address Restricted Cone NAT)的特征。

3. P2P可穿透性

P2P穿透又叫P2P打洞,是指在网络地址转换(NAT)环境下,通过技术手段实现点对点(P2P)通信中两台主机直接建立连接的过程。尽管NAT有效解决了IP地址短缺和网络安全问题,但其对外部连接的限制(如映射和过滤规则)往往阻碍了P2P通信的直接性。影响P2P穿透成功率的因素是多方面的,比如 NAT 设备对标准协议的支持、动态 IP 地址策略、防火墙策略等,这其中,双方NAT类型的组合对P2P穿透成功率影响最大。

上面表格展示了不同NAT类型组合,P2P穿透的理论可行性,接下来我们深入研究其背后机理。

双方通过STUN服务器获取初始公网映射,并通过信令服务器交换这些地址。

3.1. 全锥型<->全锥型

全锥型 NAT 任何外部设备都可以通过该外部地址向内部主机发起连接,只要获取了 NAT 后地址,就可以完全无限制的进行双向通信,谁先向谁发送报文都可以。

3.2. 全锥型<->地址受限锥形

地址受限锥型 NAT,只允许与内部主机主动联系过地址进行通信,这就要求 Client B 要先向 Client A 发送报文,在地址受限锥型 NAT 上建立映射表项并记录地址 IPA',否则 Client A 发往 Client B 的报文会被 NAT 丢弃。

3.3. 全锥型<->端口受限锥型

端口受限锥型比地址受限锥型的限制更严格,只允许与内部主机主动联系过的地址和端口进行通信,这对全锥型 NAT 来说不是问题,因为一般情况,其映射的地址和端口不会变化。P2P打洞逻辑和流程与地址受限锥型一致。

3.4. 全锥型<->对称型

对称型 NAT 为不同外部设备通信分配不同的端口,如果 Client A 先发送报文,报文会被对称型 NAT 丢弃。因此,需要 Client B 向 Client A 发送报文,这样在对称型 NAT 会创建映射表项,分配新的地址和端口,Client A 发送的响应能够送达 Client B。

3.5. 地址受限锥型<->地址受限锥型

两边都是地址受限锥型 NAT,那第一个报文肯定会被对方 NAT 丢弃,如下图所示。但没关系,此时已经在主动发送报文端 Client B 的 NAT 上分配了端口映射,允许 IPA' 的报文通过。紧接着 Client A 发送报文,报文会顺利到达 Client B,双向打洞完成。

3.6. 地址受限锥型<->端口受限锥型

由于地址受限锥型建立的映射是固定映射,从 Client A 发送 Client B 报文的端口不会变化,因此,其打通逻辑和流程与 3.5 是一致的。

3.7. 地址受限锥型<->对称型

由于 Client B 的 NAT 是对称型,Client B 向 Client A 发送报文时,会分配新的端口,如果 Client B 发送的报文不能够到达 Client A,则 Client A 无法获取 Client B 在对称型 NAT 上分配的端口。因此,要求 Client A 先向 Client B 发送报文,虽然报文会被对称型 NAT 丢弃,但是会在地址受限锥型 NAT 上创建表项。

假设对称型 NAT 每次分配的IP地址不变,IPB'=IPB''。

3.8. 端口受限锥型<->端口受限锥型

双方都是端口受限锥型,任何一方先发送报文,报文都会被对方 NAT 丢弃,但是会在本端出口 NAT 上创建表项并记录访问的IP和端口,这样后续的报文就可以顺利通过。

3.9. 端口受限锥型<->对称型

对称型 NAT 每次都会分配新的端口,Client A 发往 Client B 的报文会被端口受限锥型 NAT 丢弃,这样 Client A就无法获知 Client B 在对称型 NAT 上的端口。因此,理论上是无法打洞成功的。

3.10. 对称型<->对称型

双方都是对称型 NAT,双方都无法获取对端绑定的端口,理论上无法打洞。

4. 总结

本文简要概述了NAT类型,并深入分析了NAT类型探测与P2P穿透的技术原理。然而,这些分析基于理想化环境,实际网络场景远超本文描述的复杂性,可能面临多层NAT、IP地址动态变化以及打洞窗口时间限制等诸多挑战。针对这些问题,工程实践中需开发针对性的解决方案,以增强系统的可靠性和适应性。本文仅展示了打洞的基本原理,而在实际工程中,为提升打洞效率,通常采用双向同时探测策略,从而优化连接建立的成功率和速度。此外,值得一提的是,对于理论上无法打洞的结论,工程上常通过智能猜测和优化手段,尝试将"不可能"转化为"可能"。

相关推荐
大数据新鸟1 天前
NIO 三大核心组件
服务器·网络·nio
Hello World . .1 天前
Linux驱动编程1:imxull上移植Linux系统
linux·运维·服务器
添砖java‘’1 天前
网络层IP
网络·网络协议·tcp/ip·ip
IMPYLH1 天前
Linux 的 numfmt 命令
linux·运维·服务器·bash
sunz_dragon1 天前
Claude Code / Codex Git 版本管理完整使用指南
服务器·人工智能
SPC的存折1 天前
3、主从复制实现同步数据过滤
linux·运维·服务器
SPC的存折1 天前
openEuler 24.03 MariaDB Galera 集群部署指南(cz)
linux·运维·服务器·数据库·mysql
SPC的存折1 天前
MySQL 8.0 分库分表
linux·运维·服务器·数据库·mysql
风吹迎面入袖凉1 天前
【Redis】Redisson分布式锁原理
java·服务器·开发语言
灰子学技术1 天前
Envoy 底层 TCP 交互、UDS 和事件驱动技术文档
网络·网络协议·tcp/ip