知识点:
静态NAT
动态NAT
NAPT/PAT
Easy-ip
NAT-server
在vmware workstation的用户手册当中发现会有nat的存在,会在docker或kvm、net-filter框架当中看到nat身影。
NAT的产生是因为全球IP地址不足
中国互联网络信息中心
企业/个人—运营商—CNNIC(中国互联网信息中心)—APNIC—ICANN
APNIC:亚太地区注册机构,AP代表亚太地址,全世界一共有五个;
ICANN:IP地址最高的管理地址,2012宣布IP地址已经分配完成,下面的区域还有IP地址;
手机的4G网络拿到的也是一个私网地址,比如你在广州办了一张卡,但是你人在东北,那其实你的IP地址会显示在广州,因为你用的公网IP地址在广州。
没有NAT不能上网的原因不是中间的路由器不转发私网路由,而是回包没路由,它也不能加这个路由;
NAT好处:有效避免外网攻击,可以很大程序上提高网络的安全性
控制内网主机访问外网,同时也控制外网访问内网,解决了内外网不能互通的问题
家用路由器为什么那么差劲?直播、打游戏会卡,但是一重启就会好多了?
这其实与NAT有关,NAT的会话信息是存储在内存当中的,如果说你的同时上网的设备过多,内存会不足,所以就会出现这种情况。所以现在很多的家用路由器厂商都在强调自家的厂商内存够大,能同时支持几十人在线。
现在的运营商给的光猫都携带了路由器的功能,基本上的上网没有问题,我们在中小企业是否可以不买路由器,就直接使用光猫的路由功能呢?不建议这么做,因为光猫的性能其实不怎么好,由于是内存,如果大量产生了会话,那就会很容易出现网络卡顿的现象,所以说,我们最好自己购买的大内存路由器,然后将路由功能,尤其是NAT功能放到我们自己购买的路由器上,这样会话就存在在我们自己购买的路由器上,用户体验就会好很多;
静态NAT
静态最重要的特点就是一对一
- Int 出接口
- Int gx/x/x
- #全局开启功能
- nat static enable开启NAT静态功能
- #在外网接口配置
- nat static global (与外网ip处于同一网段但未使用的ip)inside(允许内网的哪个ip出去)
- 查看静态ip的配置
- display nat static
注意:注意,你在配置静态NAT的时候不要使用当前接口上正在使用的NAT地址,你想呀,你如果这么做了?那下面的其它主机怎么上网
“与外网接口的IP处于同一网段的未使用地址”并不用直接配置到接口上,你只要在接口上实现NAT之后地址就会自动生效的。
当配置完之后,通过dis nat static就会发现生成两条永久信息,如下图所示:
[R1]dis nat session protocol icmp #查看关于icmp的nat会话
Protocol : ICMP(1)
SrcAddr Vpn : 192.168.0.1 #源ip是192.168.0.1
DestAddr Vpn : 9.9.9.9
Type Code IcmpId : 0 8 12611
NAT-Info
New SrcAddr : 12.1.1.2 #把源IP给转换成了12.1.1.2
NOTE:此会话是缓存的,在nat不工作的时候是看不出来的,只有当nat一直工作的时候,这个缓存才会有,所以要在客户端一直ping 9.9.9.9才可以看到
静态NAT的用途?
极少情况下你需要做一对一的映射,一般是这样的场景,公司里面向运营商购买了一个网段,这个网段共有10多个地址,那我们公司平时上网用一个也就足够了,那还有那么多地址怎么办呢?其实很简单,当公司再有长时间的,需要做端口映射的服务,那你就直接让他直接剩下的公网地址,这样比较贴近于真实的场景,开发人员也比较喜欢这种方式。
动态NAT
动态NAT就是把可用的公网IP放在一个地址池里面,当主机需要公网地址的时候,从地址池里面拿一个,用完会自动释放,如果同时有多台主机在上网把地址池里面的公网IP地址耗尽,那新的主机需要上网的话,就得排队等前面的主机释放地址,就像我们去比较火的餐馆吃饭,没有桌了只能等前面的客人吃完。
nat address-gruop 1 58.57.50.51 58.57.50.55
acl 2000
rule 0 permit source 192.168.0.0 0.0.0.255
int g0/0/0 # 出接口
nat outbound 2000 address-group 1 no-pat # no-pat就是不转换端口
dis nat address-group # 查看NAT地址池配置信息
dis nat outbound # 查看动态NAT配置信息
dis nat seeesion all # 查看nat转换表,在ping的时候查看
NAT
“所谓的no-pat就是不去做端口转换,只做IP转换,也是一对一的映射,一个私有IP对应一个公有IP,只不过是动态的映射,所谓的动态映射,就是假设申请到一个公网地址区间,200.1.1.100-200.1.1.110这个10个IP,我把这个10个IP放到一个池里边,这个池现在有10个公网IP地址,当有私网用户访问外网时,就会从地址池中拿一个地址出来给他用,形成一个动态的映射关系。”
动态NAT有个细节需要注意,如果你是单个主机,PING了五次,那每一次都单独对应一个IP地址,并不是每一个IP地址单独对应一台主机,并不会绑定某个主机,而是每一个数据包都会占用一个公网IP地址,这就会导致大量的占用公网IP和内存会话。你内网有三台主机需要上网,但是你公网地址只有三个,做这种动态NAT地址是不够的。
no-pat的真正含义,是不需要转端口,你想一下,A访问谷歌的443端口,B也同时访问谷歌的443端口,同时访问的话,如果路由器不转换端口的话,就必须一个公网地址对一个私网地址。
NAPT/PAT
全称:NAPT(network address port translation)
动态NAT我们看到了,非常消耗IP地址,这种方式其实是不适合我们上网的,所以动态NAT发展出了另一种NAT叫NAPT或是PAT,网络地址端口转换,允许多个地址映射到同一个公网地址的不同端口。
配置的话,在前面的基础上不加no-pat就可以了,通过不同的ID进行标识(type code icmpID),如下图所示:
ICMP由于没有端口号,所以用ID号进行标识,http就直接用端口号进行标识了。
Easy-ip
上面三种用并不是接口地址,你需要搞一个地址池,而easy-ip就可以直接使用接口上的配置IP地址进行NAT转换,就不用配置地址池了。
而且,现在我们家用路由器都是动态拨号,是无法将一个固定的地方放到地址池里面的,所以前三种方式都不适用于我们现在的环境,所以才有的easy-ip。
思路与配置:
第一步:先写一个ACL做匹配,做匹配范围时没有隐含的允许所有通过,做访问控制时才有,比如我们上图的R1路由器让想内网的192.168.0.0/24这个网段都使用R1的12.1.1.1/19这个IP的话ACL就得这样写:
[R1]acl 2000 #定义一个ACL先把192.168.0.0/24这个网段给匹配上
[R1-acl-basic-2000]rule permit source 192.168.0.0 0.0.0.255
再次强调,ACL只有在做访问控制的时候才会有一个默认规则:没有配置住的都会允许,但是在这里我们没有做访问控制,只是做了匹配,所以并不会有用默认规则的存在。
第二步:到R1的外网接口(G0/0/1)上调用第一步定义的ACL。
当在G0/0/1接口调用了此ACL之后,每当这个接口匹配住一个数据报文,都会把其源地址转换为G0/0/1自己的IP
R1]int g0/1
[R1-GigabitEthernet0/1]nat outbound 2000 #出接口方向
原理:
192.168.0.1 ping 9.9.9.9的通信过程:当192.168.0.1的数据帧被R1的G0/0/1的接口给匹配住以后,都会向其网络层添加一个标记,如下所示:
那么此标记有什么用的?其实R1路由器内部会根据此标记维持一张表,假设是192.168.0.1ping9.9.9.9,R1给这个帧打的标记是2222,那么R1路由器会在内部生成这样一张表,如下图:
然后才把此数据包发出去,当此数据包回来的时候源IP成了9.9.9.9,目标IP成了R1的g0/0/1接口的IP也就是12.1.1.1,与数据发出时相比,源目标和目标IP都发生了变化,但是,序号依次还存在于ICMP的数据报文里面,此结果已经抓包验证过,如下图:
序号 | 源ip | 替换为 | 目的ip |
22222 | 192.168.0.1 | 12.1.1.1 | 9.9.9.9 |
然后才把此数据包发出去,当此数据包回来的时候源IP成了9.9.9.9,目标IP成了R1的g0/0/1接口的IP也就是12.1.1.1,与数据发出时相比,源目标和目标IP都发生了变化,但是,序号依次还存在于ICMP的数据报文里面,此结果已经抓包验证过,如下图:
可以此数据帧与上面的请求时的数据帧对比,发现此序号是相同的,于是R1路由器会根据此序号把此数据帧的目标IP替换成192.168.0.1。
以上阐述的都是ping包,也就是ICMP协议,我们知道ICMP是网络层的协议,没有端口的概念,但是当内网的PC访问外网的WWW服务器时,R1是怎样转换的呢?这时候R1就不是通过在ICMP里面打标记实现了,因为一旦有了端口之后,客户端源端口因为是随机的,所以客户端的端口号就是现成的标记,R1路由会把源端口号当做是标记
NAT-server
interface GigabitEthernet0/1
注意,这里的外网映射的IP不能是g0/0/1接口的IP
# 而应该替换成current-interface,就是这么设计的。
# nat server protocol tcp global 12.1.1.2 80 inside 192.168.0.2 80
# 验证,会发现直接”绑定死了“
所以应该配置成
nat server protocol tcp global current-interface 80 inside 192.168.0.2 80