内网穿透
在解释 内网穿透 这件事之前,我先抛出一个问题:如果让你来设计一套框架去实现两台内网主机进行通信,你会怎么做?
中继(Relaying)
一个非常直观的设计就是先准备一台拥有公网IP的服务器命名为Server
,然后两台处于同内网下的客户端主机,分别为ClientA
和ClientB
,然后两台客户端机器分别连接服务器。这时候服务器充当一个数据中转站,把ClientA
发送的数据转发给ClientB
,反向同理,这就实现了两台内网的客户端之间的数据通信。
比较常见的就是平常经常使用到的frp,它就是一个典型的通过中继(也叫转发)实现的内网穿透功能。
NAT(Network Address Translation)穿透
NAT穿透,简单地讲就是要让处于不同NAT网络下的两个节点(Peer)建立直接连接,只知道自己的内网地址是肯定不行的,他们需要知道对方的公网IP和端口,然后双方互相向对方发送数据包,从而建立起连接。整个流程可以看做两个关键步骤:
- 发现自己的公网IP和Port
- 将自己的IP和Port共享给对方
而NAT有几种不同的形态:
Full Cone NAT(完全圆锥型)
这种会将同一内网地址端口192.168.1.2:4567
发送至公网的所有请求都映射成同一个公网地址端口10.2.6.4.1:6666
,192.168.1.2
可以收到任意外部主机发送到10.2.6.4.1:6666
的数据报文,也就是说,只要知道内网地址被映射成的公网IP,任何公网IP对其发送数据,这个内网下的所有端口都能接收到此数据。
这种类型的客户端局限性最低,也是最理想的情况,但是现实大部分情况都不是这种模型。
Address Restricted Cone NAT (地址限制圆锥型)
这种会将从同一内网地址端口192.168.1.2:4567
发至公网的所有请求都映射成同一个公网地址端口10.2.6.4.1:6666
,只有当内部主机192.168.1.2
先给服务器Server 6.7.8.9
发送一个数据报后,192.168.1.2
才能收到服务器Server 6.7.8.9
发送到公网地址端口10.2.6.4.1:6666
的数据报文。
注意理清楚这里面的细节,地址限制圆锥型的意思就是说,内网地址接收到数据的这个公网IP必须是这个内网地址曾经发送过数据的IP地址(这就是一种映射规则
),当前内网地址下的所有端口才能接收到此数据。