- 0.1:NAT定义
- 0.2:NAT工作机制
- 0.3:NAT类型
- 0.4:NAT技术的优缺点
- 0.5:内网穿透
- 0.6:穿透原理
NAT定义
NAT(Network Address Translator,网络地址转换)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决IPv4地址短缺而开发的技术。
NAT工作机制
- 网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关;
- 网络访问只能先由私网侧发起,公网无法主动访问私网主机;
- NAT 路由器在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;
- NAT 路由器的存在对通信双方是保持透明的;
- NAT 路由器为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。
NAT类型
NAT分为两大类,基本的NAT和NAPT(Network Address/Port Translator)。
基本的NAT,它仅将内网主机的私有IP地址转换成公网IP地址,但并不将TCP/UDP端口信息进行转换,有动态与静态之区分。由于现在大部分都属于另一种类型,即NAPT,故这里不详细讨论基础NAT。 另外一种NAT叫做NAPT(Network Address/Port Translator),从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。
NAPT又分为锥型(Cone)和对称型(Symmetric),它们的区别在于,在NAT已分配端口号给Client A的情况下,如果Client A继续用1235端口与另一外网服务器通讯,锥型NAT还会继续用原来62000端口,即所分配的端口号不变。而对于对称型NAT,NAT将会分配另一端口号(如62001)给Client A的1235端口。也就是说,同一内网主机同一端口号,对于锥型NAT,无论与哪一外网主机通讯,都不改变所分配的端口号;而对于对等型NAT,同一内网主机同一端口号,每一次与不同的外网主机通讯,就重新分配另一个端口号。
NAT技术的优缺点
优点
- 节省合法的公有 IP 地址(最大的优点)
- 当网络发生变化时,避免重新编址
- 对外隐藏内部地址,增加网络安全性
缺点
- 无法从 NAT 的外部向内部服务器建立连接
- 转换表的生成和转换操作都会产生一定的开销
- 增加了网络通讯复杂度
- 通信过程中一旦 NAT 遇到异常需重新启动时,所有的 TCP 连接都将被重置。即使备置两台 NAT 做容灾备份,TCP 连接还是会被断开。
内网穿透
上图是一个非完整版内外网通讯图由内网端先发起,内网设备192.168.1.2:6677发送数据到外网时候必须经过NAT会转换成对应的外网IP+端口,然后在发送给外网设备,外网设备回复数据也是发给你的外网IP+端口。这只是单向的内去外,那反过来,如果外网的设备需要主动访问我局域网里的某一个设备是无法访问的,因为这个时候还没做NAT转换所以外网不知道你内网设备的应用具体对应的是哪个端口或者不允许入站,这个时候我们就需要内网穿透了,内网穿透也叫NAT穿透。
穿透原理
如上图所示经NAT转换后的内外网地址+端口,会缓存一段时间,在这段时间内192.168.1.2:6677和112.48.69.2020:8899的映射关系会一直存在,这样你的内网主机就得到一个外网地址(因为存在这个外网的地址,是内网穿透的基础),这个对应关系又根据NAT转换方法类型的不同,得用对应的方式实现打洞,NAT转换方法类型有下列几种:
(2)Address-Restricted cone NAT :
限制地址,即只接收曾经发送到对端的IP地址来的数据包。
一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。任意外部主机(hostAddr:any)都能通过给eAddr:port2发包到达iAddr:port1的前提是:iAddr:port1之前发送过包到hostAddr:any. "any"也就是说端口不受限制(只需知道某个转换后的外网ip+端口即可。)
(3)Port-Restricted cone NAT:
类似受限制锥形NAT(Restricted cone NAT),但是还有端口限制。
一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。一个外部主机(hostAddr:port3)能够发包到达iAddr:port1的前提是:iAddr:port1之前发送过包到hostAddr:port3.(双方需要各自知道对方转换后的外网ip+端口,然后一方先发一次尝试连接,另一方在次连接过来的时候就能直接连通了。)
每一个来自相同内部IP与port的请求到一个特定目的地的IP地址和端口,映射到一个独特的外部来源的IP地址和端口。