UDP打洞

在计算机科学中，UDP打洞指的是一种普遍使用的NAT穿越技术。

 描述 
通过UDP打洞实现NAT穿越是一种在处于使用了NAT的私有网络中的Internet主机之间建立双向UDP连接的方法。由于NAT的行为是非标准化的，因此它并不能应用于所有类型的NAT。

其基本思想是这样的：让位于NAT后的两台主机都与处于公共地址空间的、已知IP地址的第三台服务器相连，一旦NAT设备建立好UDP状态信息就转为直接通信，并让NAT设备在从另外一个主机传送过来时仍然保持当前状态。

这项技术需要使用圆锥型NAT设备，对称型NAT不能使用这项技术。

这项技术在P2P软件和VoIP电话领域被广泛采用，它是Skype用以绕过防火墙和NAT设备的技术之一。

相同的技术有时还被用于TCP连接——尽管远没有UDP成功。

 算法 
假设有两台分别处于各自的私有网络中的主机：A1和A2。N1和N2是两个网络的NAT设备，分别拥有IP地址P1和P2。 S是一个双方共知的、从任何地方都能访问得到的IP地址的公共服务器。

步骤一：A1和A2分别和S建立UDP连接，NAT设备N1和N2创建UDP转换状态并分配临时的外部端口号；

步骤二：S检查UDP包，看A1和A2的端口是否是正在使用的（否则N1和N2即应用了端口随机分配，这会让路由验证变得更麻烦）；

步骤三：如果端口不是随机化的，那么A1和A2各自选择端口X和Y，并告知S。S会让A1发送UDP包到P2:Y，让A2发送UDP包到P1:X；

步骤四：A1和A2通过转换好的IP地址和端口直接联系到对方的NAT设备。

 应用 
对于大型公司网络中常见的对称NAT设备（也称为双向NAT），UDP打洞不起作用。在对称NAT中，与知名STUN服务器的连接关联的NAT映射只会从知名服务器接收数据，因此已知第三台服务器看到的NAT映射不能有效连接。

在一个更详细的方法中，两个主机将开始发送给对方，并多次尝试。在受限制的Cone NAT上，来自其他主机的第一个数据包将被阻止。在此之后，NAT设备就有记录发送了一个数据包到另一台机器，并将所有数据包改为来自该IP地址和端口号。这项技术广泛应用于点对点软件和互联网协议语音电话，它也可以用来协助建立通过UDP运行的虚拟专用网络。相同的技术有时会扩展到传输控制协议（TCP）连接，但成功率较低，因为TCP连接流由主机操作系统控制，而不是应用程序，序列号随机选择。

 外部链接 
Peer-to-Peer Communication Across Network Address Translators 

Category:网络安全