浅谈NAT类型
静态一对一映射
内网使用的地址段是192.168.1.0,路由器连接公网的接口地址是200.1.1.1,这个地址是一个合法的IPv4的公网地址,现在192.168.1.1是无法直接访问8.8.8.8公网节点,因为穿着睡衣不能直接出去,那我要出去该怎么办,有一个最简单的办法,就是在路由器上部署静态一对一映射的NAT,首先申请购买一个合法的公网地址,比如200.1.1.100是通过运营商申请购买的,相当于是一套西装,这个西装外套跟睡衣做一个关联,也就是200.1.1.100公有地址和192.168.1.1私有地址做一对一的关联。
当PC访问外网的8.8.8.8时,源IP地址192.168.1.1目的IP地址8.8.8.8的数据包到达路由器后,路由器判断出来从inside访问outside,路由器就会查询NAT映射表,发现192.168.1.1要转换成200.1.1.100的,所以把数据包的源地址擦掉,写成200.1.1.100并发出去。
这个数据包就会在公网上路由,最后就被路由到目的地8.8.8.8,8.8.8.8会做一个回包,这个数据包的源是8.8.8.8目的地址200.1.1.100,这时数据包回到路由器依然会查NAT映射表,发现200.1.1.100要转换成192.168.1.1,那么数据包就会被重写,目的地址写成192.168.1.1,然后数据包会交给这台PC,这样就完成了数据包的往返。
这种NAT类型叫静态一对一IP映射,这种类型实现了私有IP访问公网的问题,完成映射后,PC可以访问8.8.8.8,但同时公网也能主动发起访问,使用的 目的地址是200.1.1.100来访问内网的节点。在静态一对一映射当中,是把整个192.168.1.1映射到200.1.1.100,意味着192.168.1.1所有的端口号跟200.1.1.100做一个关联,这种在某些场景中,不是特别安全。假设服务器时提供WEB服务的,所以我们只需要把TCP的80端口映射出去就行了,但是静态一对一映射把所有端口都映射出去,因此被认为不安全。
注意:这种类型,其实并不能够从根本上缓解IPv4地址空间紧缺的问题,因为一个私有IP地址就需要一个公有IP地址。
弊端:它是静态的,意味着需要手工创建映射关系,如果有100个IP就需要手工创建100条映射关系,而且当IP发生变化,又不得不去修改,笨拙。
基于地址池的一对一映射(no-pat)
所谓的no-pat就是不去做端口转换,只做IP转换,也是一对一的映射,一个私有IP对应一个公有IP,只不过是动态的映射,所谓的动态映射,就是假设申请到一个公网地址区间,200.1.1.100-200.1.1.110这个10个IP,我把这个10个IP放到一个池里边,这个池现在有10个公网IP地址,当有私网用户访问外网时,就会从地址池中拿一个地址出来给他用,形成一个动态的映射关系。
动态它是有一个时间概念的,如果没有数据访问时,就会失效,当然如果一直有数据使用这个表项,这个表项就会一致存活。
当然如果有下一个用户访问时,又会去池里边再取一个地址,在建立一个映射。注意,这种方式是动态的,也就是192.168.1.1在有一段时间没有访问外网,这个表项就会自动老化,然后把这个公网地址又放回池里边供其他人使用,而且它是一对一的映射,10个公网IP并发时最多只能有10个人使用,因为1个IP对于1个IP,只能对IP做转换,不对端口做转换。相比静态映射更加灵活一点,但是也没有从根本上缓解IPv4地址问题。
基于地址池的多对一映射(NAPT)
所谓的多对一就是NAPT,也就是IP和端口号都做转换,这种方式是从真正意义上缓解IPv4公网地址紧缺问题。
NO-PAT:只对IP做转换,一对一的关系。
NAPT:网络地址和端口都做转换,多对一的关系。
源地址(转换前) | 源地址(转换后) |
---|---|
192.168.1.1 1099 | 200.1.1.100 2000 |
192.168.1.2 1088 | 200.1.1.100 2001 |
192.168.1.3 1077 | 200.1.1.100 2002 |
用一个公有IP,但使用不同的端口号来映射。
NAT Server
所谓的nat server,假设我内网有WEB服务器(80),需要对外网提供服务,外网又不能够直接使用192.168.1.1来访问WEB,这时就可以使用nat server,把服务器的真实IP映射到外网的200.1.1.100:8080,这样一来如果有外网用户访问服务器时,数据包的目的地址为200.1.1.100:8080这个数据包到达路由器把它做一个转换,因为这里有NAT表项,目的地址转换成192.168.1.1:80,这样就完成了数据访问的通路。