内网穿透的示意图:(下图引自:)

关于“内网穿透”的一些知识_IP

 

 

-------------------------------------------

 

 

关于NAT的补充阅读(引自:)

当联机的双方NAT类型有一方为Cone NAT时(以下前三种)才有机会建立P2P连接,如果双方都是Symmetric NAT,必然无法成功建立P2P连接
几种常见的NAT类型:

  1. Full Cone
  2. Restricted Cone
  3. Port Restricted Cone
  4. Symmetric NAT

结合上面的P2P条件,当两台设备所处网络的NAT类型均为 Symmetric NAT,所以无法建立P2P连接,只能通过服务器中转通信
基本总结如下:

  1. 双方中只要有一方是Full Cone,可以P2P直连;
  2. 双方都是Restricted Cone或Port Restricted Cone,这种情况可以打洞,通过服务器握手以后,双方的数据不再经过中继服务器;
  3. 一方为Restricted Cone,另一方为Symmetric NAT,可以打洞,通过N2N服务器握手以后,双方的数据不再经过服务端;
  4. 一方为端口Port Restricted Cone,另一方为Symmetric NAT,这种情况无法打洞,数据要走服务器中转;
  5. 双方都为Symmetric NAT,这种情况也是无法打洞的,数据要走服务器中转;

 

 

-------------------------------------------

 

 

 

需要进行内网穿透设备可以是NAT设备也可能是NAT设备+防火墙,当然也可能是其他的类型,比如:NAT设备+均衡负载+防火墙

上面给出了几种常见的NAT类型:

  1. Full Cone
  2. Restricted Cone
  3. Port Restricted Cone
  4. Symmetric NAT

但是在实际的NAT类型中除了上面这四个类型还有在这四个基础上的其他改进类型,但是上面的这四个类型基本是主要的类别了。

上面的这四个类型也被叫做:

  1. 完全锥型
  2. IP限制锥形
  3. 端口限制锥形
  4. 对称型

 

1. 完全锥型

 (示意图引自:https://zhuanlan.zhihu.com/p/457866704

关于“内网穿透”的一些知识_内网_02

 

上图中内网主机X,A、B、C是公网主机。

该种NAT设备NAT的地址映射表中包含4个关键的数据:

{     
  内网IP
  内网端口号
  映射的公网IP              
  映射的公网端口号
}

也就是说在该种NAT设备下,内网X主机只要使用某个内网端口号给外网主机发送过数据后,那么就可以在NAT设备的地址映射表中保存上面的四个数据,于是其他的外网主机都可以通过这四个数据中的“映射的公网IP+映射的公网端口号”来给内网的X主机对应的“内网IP+内网端口号”发送数据。

 

 

 

2. IP限制锥型NAT

 (示意图引自:https://zhuanlan.zhihu.com/p/457866704

关于“内网穿透”的一些知识_IP_03

 

上图中内网主机X,A、B、C是公网主机。

该种NAT设备NAT的地址映射表中包含5个关键的数据:

{
    内网IP
    内网端口号
    映射的公网IP
    映射的公网端口号
    被访问的外网IP地址
}

也就是说在该种NAT设备下,内网X主机使用某个内网端口号给外网主机发送过数据后,那么就可以在NAT设备的地址映射表中保存上面的5个数据,只有映射表记录中存在的被访问过的外网IP才可以通过这5个数据中的“映射的公网IP+映射的公网端口号”来给内网的X主机对应的“内网IP+内网端口号”发送数据。

 

 

 

 

3. 端口限制锥型

 (示意图引自:https://zhuanlan.zhihu.com/p/457866704

关于“内网穿透”的一些知识_内网_04

上图中内网主机X,A、B、C是公网主机。

该种NAT设备NAT的地址映射表中包含6个关键的数据:

{
  内网IP
  内网端口号
  映射的公网IP
  映射的公网端口号
  被访问的外网主机的IP地址
  被访问的外网主机的端口号
}

也就是说在该种NAT设备下,内网X主机使用某个内网端口号给外网主机发送过数据后,那么就可以在NAT设备的地址映射表中保存上面的6个数据,只有映射表记录中存在的“被访问过的外网IP+被访问过的外网IP对应的端口号”才可以通过这6个数据中的“映射的公网IP+映射的公网端口号”来给内网的X主机对应的“内网IP+内网端口号”发送数据。

 

 

 

 

 

 

4. 对称型NAT

 (示意图引自:https://zhuanlan.zhihu.com/p/457866704

关于“内网穿透”的一些知识_NAT_05

 

上图中内网主机X,A、B、C是公网主机。

该种NAT设备NAT的地址映射表中包含6个关键的数据:

{
  内网IP
  内网端口号
  映射的公网IP
  映射的公网端口号
  被访问的外网主机的IP地址
  被访问的外网主机的端口号
}

对称型NAT和端口限制锥型NAT同样都是会在内网主机的一次对外网的数据发送中在NAT设备的地址映射表中保存6个数据,但是与端口限制锥型NAT不同的是对称型NAT在内网IP和内网端口号不变的情况下对不同的“被访问的外网主机的IP地址”或相同的“被访问的外网主机的IP地址”但是不同的“被访问的外网主机的端口号”都会使用不同的“映射的公网端口号”甚至是不同的“映射的公网IP”。

 

 

 

注意:

  1. NAT设备的地址映射表的记录有效时间大致为2分钟。
  2. “打洞”在NAT中是指内网主机主动对外网的数据发送以使NAT设备的地址映射表中可以保存记录,并通过这种方式使外网主机可以按照这个“地址映射关系”来对内网主机进行数据访问。

 

 

 

关于“NAT的四种类型”给出更加详细的介绍推荐:

NAT的四种类型以及类型探测


 

 

 

利用这些知识我们可以编写内网穿透的代理程序,比如fastnat就是采用下面的编程语言:

C++虚拟网卡、go语言做周边网络的编程、node.js做界面操作

 

 

-------------------------------------------