内网穿透的示意图:(下图引自:)
-------------------------------------------
关于NAT的补充阅读(引自:)
当联机的双方NAT类型有一方为Cone NAT时(以下前三种)才有机会建立P2P连接,如果双方都是Symmetric NAT,必然无法成功建立P2P连接
几种常见的NAT类型:
- Full Cone
- Restricted Cone
- Port Restricted Cone
- Symmetric NAT
结合上面的P2P条件,当两台设备所处网络的NAT类型均为 Symmetric NAT,所以无法建立P2P连接,只能通过服务器中转通信
基本总结如下:
- 双方中只要有一方是Full Cone,可以P2P直连;
- 双方都是Restricted Cone或Port Restricted Cone,这种情况可以打洞,通过服务器握手以后,双方的数据不再经过中继服务器;
- 一方为Restricted Cone,另一方为Symmetric NAT,可以打洞,通过N2N服务器握手以后,双方的数据不再经过服务端;
- 一方为端口Port Restricted Cone,另一方为Symmetric NAT,这种情况无法打洞,数据要走服务器中转;
- 双方都为Symmetric NAT,这种情况也是无法打洞的,数据要走服务器中转;
-------------------------------------------
需要进行内网穿透设备可以是NAT设备也可能是NAT设备+防火墙,当然也可能是其他的类型,比如:NAT设备+均衡负载+防火墙
上面给出了几种常见的NAT类型:
- Full Cone
- Restricted Cone
- Port Restricted Cone
- Symmetric NAT
但是在实际的NAT类型中除了上面这四个类型还有在这四个基础上的其他改进类型,但是上面的这四个类型基本是主要的类别了。
上面的这四个类型也被叫做:
- 完全锥型
- IP限制锥形
- 端口限制锥形
- 对称型
1. 完全锥型
(示意图引自:https://zhuanlan.zhihu.com/p/457866704)
上图中内网主机X,A、B、C是公网主机。
该种NAT设备NAT的地址映射表中包含4个关键的数据:
{
内网IP
内网端口号
映射的公网IP
映射的公网端口号
}
也就是说在该种NAT设备下,内网X主机只要使用某个内网端口号给外网主机发送过数据后,那么就可以在NAT设备的地址映射表中保存上面的四个数据,于是其他的外网主机都可以通过这四个数据中的“映射的公网IP+映射的公网端口号”来给内网的X主机对应的“内网IP+内网端口号”发送数据。
2. IP限制锥型NAT
(示意图引自:https://zhuanlan.zhihu.com/p/457866704)
上图中内网主机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)
上图中内网主机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)
上图中内网主机X,A、B、C是公网主机。
该种NAT设备NAT的地址映射表中包含6个关键的数据:
{
内网IP
内网端口号
映射的公网IP
映射的公网端口号
被访问的外网主机的IP地址
被访问的外网主机的端口号
}
对称型NAT和端口限制锥型NAT同样都是会在内网主机的一次对外网的数据发送中在NAT设备的地址映射表中保存6个数据,但是与端口限制锥型NAT不同的是对称型NAT在内网IP和内网端口号不变的情况下对不同的“被访问的外网主机的IP地址”或相同的“被访问的外网主机的IP地址”但是不同的“被访问的外网主机的端口号”都会使用不同的“映射的公网端口号”甚至是不同的“映射的公网IP”。
注意:
- NAT设备的地址映射表的记录有效时间大致为2分钟。
- “打洞”在NAT中是指内网主机主动对外网的数据发送以使NAT设备的地址映射表中可以保存记录,并通过这种方式使外网主机可以按照这个“地址映射关系”来对内网主机进行数据访问。
关于“NAT的四种类型”给出更加详细的介绍推荐:
NAT的四种类型以及类型探测
利用这些知识我们可以编写内网穿透的代理程序,比如fastnat就是采用下面的编程语言:
C++虚拟网卡、go语言做周边网络的编程、node.js做界面操作
-------------------------------------------