内网穿透,也叫NAT穿透,进行NAT穿透是为了使具有某一个特定源ip地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机。
什么是内网穿透?
在当前的互联网环境中,由于IPv4的公网地址数量是有限的,无法给每一台需要接入互联网的设备分配一个公网ip。为了解决这一问题,大量接入网络的设备都只能分配到一个私有ip地址。
在一个公司或家庭内部,可以借助私有ip搭建一个网络用于相互通讯,这个网络被称为内网,位于同一个内网中的设备可以通过私有ip直接相互访问。而在互联网中,可以被直接访问的网站都需要拥有公网ip,当内网中的设备需要访问这些网站时,例如登录微信,百度查资料等等,需要借助网络地址转换技术(NAT)将私有ip转换为公有ip。
如此一来,虽然解决了公网ip不足的问题,但是位于内网中的设备无法被外网中的设备直接访问,同样,位于不同内网中的设备也无法直接相互访问。“内网穿透”就是为了能让两个位于不同内网中的设备可以直接通信的技术。
NAT简介
“内网穿透”又被称为“NAT穿透”,想要了解内网穿透,要先明白NAT的原理。目前使用最多的NAT方式为NAPT(网络地址端口转换)。下文中的NAT皆指“NAPT”。
用一个简化的模型来说明NAPT的实现机制:
服务器Server1 :3.3.3.3
服务器Server1 :4.4.4.4
NAT网关:5.5.5.5、192.168.0.1
内网设备PC1:192.168.0.5
“3.3.3.3”、“4.4.4.4”、“5.5.5.5”都是公网ip可以在互联网中相互访问。
当PC1的10000端口访问Server1的111端口时,PC1发出的数据包中ip和端口情况为192.168.0.5:10000 => 3.3.3.3:100;
当数据包到达NAT网关后,NAT网关发出的数据包为5.5.5.5:20000 => 3.3.3.3:100;
Server1接收到NAT网关发来的数据包后,发出响应包3.3.3.3:100 => 5.5.5.5:20000;
NAT网关接收到响应包后,通过查询NAT表,向PC1发出3.3.3.3:100 => 192.168.0.5:10000;
以上便是192.168.0.5:10000和3.3.3.3:100之间借助NAT通信的过程。
根据对ip和端口的限制机制,NAT可以分为四类,“全锥形NAT”、“地址受限锥形NAT”、“端口受限锥形NAT”和“对称NAT”。
全锥形NAT
在以上的场景中,192.168.0.5:10000和5.5.5.5:20000建立了映射关系,当公网上的其他设备访问5.5.5.5:20000时,都会被NAT网关转发到PC1中。
例如,Server2主动向NAT网关发出数据包4.4.4.4:101 => 5.5.5.5:20000,会被NAT网关转换为4.4.4.4:101 => 192.168.0.5:10000发送给PC1。这种NAT被称为“全锥形NAT”。
地址受限锥形NAT
如果在全锥形NAT的基础上增加限制条件,可以实现地址受限锥形NAT。
在以上的场景中,由于192.168.0.5:10000和3.3.3.3:100之间的通信,192.168.0.5:10000和5.5.5.5:20000建立了映射关系,但是只允许Server1可以借助这条映射和192.168.0.5:10000通信,Server2发来的数据包4.4.4.4:101 => 5.5.5.5:20000会被丢弃。
端口受限锥形NAT
在地址受限锥形NAT的基础上,再增加对端口的限制,就是端口受限锥形NAT。
例如,仅允许Server1的100端口可以借助192.168.0.5:10000和5.5.5.5:20000之间的映射关系和192.168.0.5:10000通信。Server1其他端口发出的数据包3.3.3.3:101 => 5.5.5.5:20000会被NAT网关丢弃。
注意:在受限锥形NAT中,禁止被限制对象主动和内网通信。例如Server2无法主动发送数据包到PC1的10000端口,但是PC1向Server2主动发起通信请求不受影响。
对称NAT
在受限锥形NAT中,内网同一ip的同一端口和外部通信时,建立的映射关系是一对一的。
例如,192.168.0.5:10000和Server1、Server2的不同端口通信时,都会被转换成3.3.3.3:20000。而在对称NAT中,内网同一ip的同一端口和外部通信时,建立的映射关系是一对多的。
例如,192.168.0.5:10000和3.3.3.3:100通信时,会被转换为3.3.3.3:20000,和3.3.3.3:101通信时,会被转换为3.3.3.3:20001。
内网穿透技术
所谓“内网穿透”就是让两个在不同内网中的设备可以直接通信。
同样用一个简化的模型来说明:
服务器Server1 :3.3.3.3
服务器Server1 :4.4.4.4
NAT网关1:5.5.5.5、192.168.0.1
内网设备PC1:192.168.0.5
NAT网关2:6.6.6.6、192.168.1.1
内网设备PC2:192.168.1.7
辅助服务器Server3 : 7.7.7.7
需要借助内网穿透技术实现PC1和PC2之间的通信。
方案一:
在全锥形网络中,实现内网穿透最容易。需要相互通信的内网设备分别和辅助服务器建立连接,辅助服务器便可以获取每个设备和各自NAT网关的映射关系。
辅助服务器将映射关系分发给每个内网设备,内网设备便可以直接利用这些映射关系和其他内网的设备通信。
例如,PC2希望和PC1的10000端口通信,需经历以下步骤:
a. PC1使用10000端口和Server3建立连接;
b. Server3收到PC1的连接请求,获得PC1和NAT网关1之间的映射关系为192.168.0.5:10000 <=> 5.5.5.5:20000;
c. PC2和Server3建立连接,接收Server3发来的映射信息;
d. PC2直接向5.5.5.5:20000发起连接请求;
e. PC1同意PC2发来的连接请求,连接建立完毕。
方案二:
方案一仅能在全锥形网络中生效,如果NAT网关1为受限锥形NAT网关,PC2发来的连接请求会被直接丢弃。在这种情景下,需要采取额外的措施使PC1和PC2之间能够通信。
假设PC2希望和PC1的10000端口通信,但是二者皆通过端口受限锥形NAT和互联网通信:
a. PC1使用10000端口和Server3建立连接;
b. PC2使用10000端口和Server3建立连接;
c. Server3收到连接请求,获得关系192.168.0.5:10000 <=> 5.5.5.5:20000、192.168.1.6:10000 <=> 6.6.6.6:20000;
d. PC1通过10000端口向6.6.6.6:20000发起连接请求。PC1的连接请求会被NAT网关2丢弃,但是在NAT网关1中,PC1和6.6.6.6:20000之间的通信已经被允许。;
e. PC2直接向5.5.5.5:20000发起连接请求;
f. 请求顺利到达PC1,PC1同意PC2发来的连接请求,连接建立完毕。
在对称NAT中,由于和不同地址建立的映射端口不同,无法实现内网穿透。