1.引言
要实现两台内网主机进行通信,常规的方案如下:
客户端A<------------>服务端<------------>客户端B
服务端提供转发监听服务,需要有固定公网IP和端口。客户端A和B分别连接服务端,数据通过服务端进行转发。典型的应用包括FRP和NGINX的反向代理。
但这样的问题:所有数据都需要经过服务端进行转发,当数据过大时,服务端压力会特别大。
2.NAT穿透原理
所有TCP/UDP通信,都存在以下几个要素源MAC、目的MAC、源IP地址、目的
想知道内网穿透实现原理,先弄清楚我们平时在网络冲浪的时候,数据是如何发到服务器的又是如何接受到数据的?我相信大家都知道,我们客户端在发送数据给服务器的时候,首先服务器的ip地址和端口我们是事先知道的,服务器接收到客户端的数据请求的同时也获取到了客户端的公网ip地址和端口,然后服务器根据客户端的公网ip地址和端口返回数据。
因为IPV4的地址太少了,不可能每个设备都有一个固定的公网IP地址,所以运营商会在一个固定区域内设置NAT网关服务器(拥有公网IP地址)。
例子:
网络结构:客户端A<->Nat网关A(10.2.6.4.1)<->服务端(182.154.3.21)<->Nat网关B(10.3.5.7.8)<->客户端B结构说明:服务端的182.154.3.21为固定公网IP地址;客户端A连接服务端:客户端A内网192.168.10.2:5125,经过Nat网关A被映射为公网10.2.6.4.1:52145客户端B连接服务端:客户端B内网192.168.20.3:8547,经过Nat网关B被映射为公网10.3.5.7.8:68541
传输说明:当服务端发送数据给10.2.6.4.1:52145,就会被转发到192.168.10.2:5125,最后由客户端A接收。同样适用于客户端N。
按上面例子的原理,NAT穿透的步骤如下:
- 客户端A和客户端B分别主动和服务端建立好连接;
- 服务端分别告诉客户端A和客户端B对端的公网IP和端口;
- 客户端A和客户端B分别将数据送往对方的公网IP和端口,从而实现了互相通信,这也是P2P网络的经典实现方法
3.NAT
3.1.工作原理
NAT缓解了IPV4地址不够用的问题,同时也带了限制:那就是NAT外部的主机无法主动跟位于NAT内部的主机通信。NAT内部主机想要通信,必须主动和公网的一个IP通信,路由器负责建立一个映射关系,从而实现数据的转发, 这就是NAT的工作原理。
3.2.NAT分类
3.2.1 基础型NAT
仅将内网主机的私有IP地址转换成公网的IP地址,并不将TCP/UDP端口信息进行转换,分为静态NAT和动态NAT。
3.2.2 NAPT
NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。
3.3.2.1.锥型NAT
1.Full Cone NAT(全锥型)
内网主机和外网建立socket时,NAT会给其分配一个外网地址(IP:端口)。任何主机想要发送数据给这个内网主机,只要知道这个外网地址(IP:端口)就可以了。
2.Restricted Cone NAT(地址限制圆锥型NAT)
内网主机和外网建立socket时,NAT会给其分配一个外网地址(IP:端口)。任何主机想要发送数据给这个内网主机,需要知道这个外网地址(IP:端口),且内网主机之前用这个外网地址(IP:端口)曾向这个外部主机IP发送过数据。需要同时满足这两个条件,这个外部主机就可以发送数据给内网主机。
3.Port Restricted Cone NAT(端口限制圆锥型NAT)
与地址限制圆锥型类似,与之不同的是还要指定端口号。
3.3.2.2.对称NAT
NATSymmetric NAT(对称型NAT),对不同的外网IP地址都会分配不同的端口号。
内网主机和外网主机1建立socket时,NAT会给其分配一个外网地址1(IP:端口),如果内网主机同时用这个socket给外部主机2发送数据,NAT会给其分配一个外网地址2(IP:端口)。
如果NAT有多于一个外网IP,则外网IP-1和外网IP-2可能不同;如果NAT只有一个外网IP,则端口-1和端口-2肯定不同。
此外,任何外部主机想要发送数据给这个内网主机,那么它首先应该收到内网主机发给他的数据,然后才能往回发送,否则即使他知道内网主机的一个(PublicIP,Port)也不能发送数据给内网主机,这种NAT无法实现UDP-P2P通信。
3.3.2.3.锥型和对称的区别
对称NAT是一个请求对应一个外网地址1(IP:端口),非对称NAT是多个请求对应一个外网地址1(IP:端口)。
3.3.2.4.安全系数
对称型 > 端口受限锥型 > 受限锥型 > 全锥型
3.3.NAT组合的穿透属性
分别定义Full Cone NAT(完全圆锥型NAT)、Restricted Cone NAT(地址限制圆锥型NAT)、 ort Restricted Cone NAT(端口限制圆锥型NAT)、Symmetric NAT(对称型NAT)的值为1、2、3、4,如下:
1 Full Cone NAT(完全圆锥型NAT)
2 Restricted Cone NAT(地址限制圆锥型NAT)
3 Port Restricted Cone NAT(端口限制圆锥型NAT)
4 Symmetric NAT(对称型NAT)
穿透关系:
N为序列号相加,则N<=6可穿透。也就是只有3 和 4 ,以及4和4不可穿透。
3.4.例子:UDP打洞
该例子根据端口限制圆锥型Nat设计一个穿透过程:
网络结构:客户端A<->Nat网关A<->服务端<->Nat网关B<->客户端B
- 客户端A 和 客户端B分别通过Nat与服务器进行通信,服务端只存储两个客户端的公网IP地址信息;
- 服务端接收到数据时,分别将户端A 和 客户端B的IP地址信息发送给对方;
- 客户端A先发送一个探测数据给客户端B的公网IP,客户端B此时接收不到数据。因为根据协议,NatB中的映射没有这条规则,也就是说NatB并没有发送过数据给NatA,那就接收不到来自NatA的数据,但此时NatA添加了一条NatB信息的映射规则。
- NatB发送一条探测数据给NatA, NatA收到了。因为NatA在上一步骤中发送数据给NatB了,有了这条映射规则;
- NatA 再发送一条探测数据给NatB,NatB此时也能收到了;
- 现在,UDP隧道建立成功,可以进行数据传输了。这个过程也叫做UDP打洞;