概述

当主机只有私有IP,没有公网IP的时候,如果想要连接到因特网,就需要使用NAT(Network Address Translation,网络地址转换)或PAT(Port Address Translation,端口地址转换)技术。

使用NAT上网时,需要在 连接局域网和因特网的 路由器上安装NAT软件,并且NAT路由器至少要有一个公网IP。当内网主机和因特网通信时,由NAT负责将(私有IP,私有Port)转换成(NAT公网IP,NAT公网Port);当外部网络发来回应消息时,NAT还要负责将(NAT公网IP,NAT公网Port)转换回(私有IP,私有Port),并进行转发。NAT使用session记录这个映射关系。


NAT的分类

NAT分为三类:

nat-1.jpg


NAPT的分类

NAPT分为Cone NAPT(锥形NAPT)Symmetric NAPT(对称NAPT)

Cone NAPT又分为:

目前最常见的,应该是Port Restricted Cone NAPT端口限制锥形NAPT)。它也是要穿透的目标。


UDP内网穿透

这里只分析NAPT。

1,判断NAPT是Cone NAPT,还是Symmetric NAPT,Symmetric NAPT是无法穿透的

建立两个公网UDP Server,其中,Server1绑定(IP1,Port1),Server2绑定(IP2,Port2)。然后内网主机分别向这两个Server发送数据,Server收到的数据包的源地址就是(NATIP,NATPort),Server只需要把这个数据包的源地址进行序列化,然后发送到 该源地址 即可,NAT会将响应包转发给内网主机,最终内网主机就能拿到NAT转换后的IP地址和端口了。如果两次转换得到的IP地址和端口都相同,则说明是Cone NAPT,否则是Symmetric NAPT。

2,穿透Port Restricted Cone NAPT

如果程序能够穿透Port Restricted Cone NAPT,那么肯定能穿透Full Cone NAPT、Restricted Cone NAPT。


Python示例


参考文档