前文我们了解了包过滤工具ACL相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15156308.html;今天我们来聊一聊地址转换技术NAT相关话题;
NAT技术背景
我们知道互联网上能够路由的地址都是公网地址,但随着互联网的发展和应用的增多,ipv4地址已经枯竭;尽管ipv6可以从根本上解决IPv4地址空间不足的问题,但目前众多的网络设备和网络应用仍是基于ipv4的,因此在ipv6广泛应用之前,一些过度技术的使用是解决这个问题的主要技术手段;NAT(network address translation)网络地址转换,主要用于实现位于内部网络的主机访问外部网络的功能。当局域网内的主机需要访问外部网络时,通过NAT技术可以将其私网地址转换为公网地址,并且多个私网地址用户可以共用一个公网地址,这样既可保证网络互通,同时也节省了公网地址;简单讲NAT主要作用就是用于把内网地址转换为公网地址,使得内网主机能够正常和外部主机通信;从转换地址的方向来讲,我们把转换源地址叫做SNAT(source network address translation),把转换目标地址叫做DNAT(destination network address translation);
NAT应用场景
提示:现在用nat最多的场景就是上述通过转换源ip地址,使得内网主机能够正常上外网;像这种SNAT一般我们也叫作正向代理;一般部署在连接内网和外网的网关设备上,如上图RTA;主机A要上外网,它首先把数据包发送给网关RTA,当RTA收到主机A发送的访问外部网络的请求时,首先它会把对应主机A的源地址转换为对应的公网地址(可以是某个接口上的公网地址,也可以是某个地址池中的公网地址),然后RTA就把对应转换的信息记录在一个NAT表中;然后把主机A的数据包再次封装后,发送出去;当对应公网主机回复的包到达RTA时,首先RTA会查询NAT表,看看对应的记录,然后根据记录把对应目标地址为公网地址再次转换为私网地址,然后把对应的数据包重新封装以后,发送给对应的私网地址主机(主机A);
提示:上图为NAT的另一种应用场景,主要用于外部主机访问内部某台服务器(或某些服务等);这个时候需要做DNAT;把对应目标地址为公网地址转换为对应的私网地址;通常我们叫这种DNAT技术为端口映射,或者叫反向代理;这里说明一点,在SNAT中是内网主机主动访问外部主机,在外部主机回复报文中对应目标地址转换为私网地址,这个是根据对应nat表中的记录转换的,是对应路由器自动维护的;我们这里说的DNAT是外部主机主动访问内部主机,此时在对应的路由器上是没有对应的转换信息的,所以需要我们管理手动去配置;
NAT类型
1、静态NAT
提示:静态NAT实现了私网地址和公网地址的一对一转换;一个公网ip只会分配给唯一且固定的内网主机;通常这种静态NAT一般用于一台优先使用某个关联地址,或者想要外部网络使用一个指定的公网地址访问内部服务器时;在大型网络中,这种一对一的ip地址转换是无法缓解公网地址短缺的问题,所以这种不适用大型网络环境中;
实验:如下拓扑图,在R1上手动配置静态NAT,实现内部pc1能够正常访问pc3
分析:要想实现pc1能够正常和pc3通信,首先对应链路上的路由必须得通;从上面的拓扑我们可以看到pc1和pc3首先不在同一个网段内,所以pc1和pc3通信首先得找网关;其次pc1发包,pc3能能正常收到,pc3回包,pc1能够收到;在不配置任何NAT的情况下,pc发包,对应经过R1时,会将数据包转发出去,因为r1有默认路由;R2有对应pc3所在网段的直连路由,但是pc3回包,源地址是pc3,目标地址是pc1,在数据包到达R2时,因为r2没有对应pc1的路由,所以pc3回包,pc1收不到;但是R2有到达R1的直连路由,而R1又有对应pc1所在网络的直连路由,所以我们只需要将对应pc1发送出来的包在R1上修改对应源地址,对应pc3的回包就能正常到达pc1;
验证:按照上图先配置好R1,R2和各pc地址,抓包看看对应通信过程
配置R1
sys sys R1 int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 2.0.0.1 24 q ip route-s 0.0.0.0 0 2.0.0.2View Code
提示:对于R1来说,我们一定要写一条默认路由(或者静态路由),这样能够匹配对应内网的所有流量;否则pc1的流量到达R1时,会被R1丢弃(因为没有路由);
配置R2
sys sys R2 int g0/0/1 ip add 12.0.0.254 24 int g0/0/0 ip add 2.0.0.2 24View Code
提示:我们这里模拟运营商的网络,所以在R2上我们只需要在对应的接口配置上对应的ip地址即可;
现在用pc1ping pc3,并在pc3上抓包,看看对应pc1的包是否能够正常到达pc3?
提示:可以看到在pc3上抓包能够看到pc1请求pc3,pc3回应pc1,但是对应pc1并没有收到pc3的回复包,所以pc1显示请求超时;
验证:在R2的g0/0/0上抓包,看看对应pc3的回包是否被丢弃?
提示:在R2的g0/0/0接口上抓包,我们只看到对应pc1请求pc3的包,并没有pc3回复pc1的包;说明R2丢弃了pc3回复pc1的包;其原因是R2上没有对应去往pc1的路由;
在R2的g0/0/1口配置静态nat,看看对应pc1是否可以正常和pc3通信呢?
int g0/0/1 nat static en nat static global 2.0.0.5 inside 192.168.10.1View Code
提示:在配置静态NAT时,必须在对应的接口下开启静态nat功能;上述命令表示,把内网192.168.10.1的源地址修改为外网地址2.0.0.5;
验证:现在pc1pingpc3在R2上的g0/0/0上抓包,看看对应通信过程
提示:可以看到现在pc1能够正常ping通pc3;在R2的g0/0/0口抓包也能看到现在pc1的数据包从R1发送出来对应源地址被修改成2.0.0.5,此时pc3回复pc1的包,对应目标地址就变成了2.0.0.5;而对应R2上有到达2.0.0.0/24网络的路由,所以最终pc3的回复报文能够正常从R2路由出去到达R1;而对应R1收到到达2.0.0.5的数据包,首先它会查看自己的NAT表,看看有没有对应的转换信息,如果有,则再把对应的数据包的目标ip地址修改成对应的私网地址;然后再从R1的g0/0/0口发送出去;对应pc1就能收到pc3的回复报文,所以pc1能够正常ping通pc3;这里需要注意,pc1能够正常ping通pc3,不代表pc3就能正常ping通pc1哦,要想实现互通,还需要在R2上配置对应路由才行;
此时pc2是否能够ping通pc3呢?
提示:pc2无法ping通pc3的原因是,pc3的回复包在R2上没有路由,被丢弃了;对应在R1上并没有对应pc2的静态nat信息,所以pc2此时通过R1时,并不会修改源ip;所以pc3的回复包其目标地址还是pc2,而对应回复包在R2上没有路由,所以会被R2丢弃;
查看静态nat表
2、动态NAT ,不转换端口地址(no-pat)
提示:动态NAT的工作原理是借助地址池来实现将内网地址转换为地址池公网地址,从而实现内网访问外网;这种类型的NAT有一个缺点是地址池中的地址用尽以后,只能等待被占用的公网地址被释放后,其他主机才能使用它来访问公网。
实验:还是上述拓扑,我们删除R1上的静态nat,然后创建一个地址池,里面放2.0.0.5-2.0.0.6这两个地址,看看对应pc1和pc2是否能够正常访问pc3呢?
删除上面配置的静态nat,并创建地址池
创建ACL,匹配pc1和pc2的流量
提示:上述acl表示允许任意流量;不管是pc1还是pc2的流量都会被该条acl所捕获;
在R1的g0/0/1接口下,将acl和地址池关联起来
提示:上述命令表示把acl 2000所捕获的流量做snat其转换的地址在对应1号编号的地址池里,并且不做端口地址转换;
验证:pc1ping pc3看看是否能正常ping通呢?
提示:可以看到pc1能够ping通pc3,但是丢包很严重;这里的原因是地址池里的地址个数太少了;导致地址不够用,所以有些包可以正常被转换,有些包不能被转换;
验证:用pc2pingpc3是否能够ping通呢?
提示:可以看到现在用pc2也能正常ping通pc3,但最多只能有两个包通,其原因是pc2每发送一次icmp的请求,都去地址池中拿一个地址进行转换;而地址池中的地址只有两个,后续的包没有地址可以转换,所以丢包了;
验证:查看动态nat会话表
提示:这个表需要边ping边看;从上面的信息可以看到,对应每一次icmp请求都会被从地址池中拿一个地址进行转换;从上面的实验可以看到,这种动态NAT也可实现转换源ip地址,从而实现内网地址可以访问外网;这种类型不转换端口的动态SNAT,首先需要有一个地址池,其次地址池中的地址如果少了,会影响通讯质量;所以这种方式也不是我们常用的上网方式;
3、动态NAT,转换端口地址(pat)
提示:NAPT(Network Address Port Translation),也称为NAT-PT或PAT,网络地址端口转换,允许多个私网地址映射到同一个公网地址的不同端口。pat和no-pat两种模式的区别是,一个转换了源端口,一个没有转换源端口;其工作原理都是一样的,都是从地址池中拿地址进行转换;
实验:把上述no-pat模式修改为pat模式
提示:pat是默认的模式,我们不需要在后面接pat;
验证:现在pc1pingpc3看看还会上上面的丢包情况吗?
提示:现在可以看到pc1pingpc3没有再丢包,并且都是用的2.0.0.5这个地址;其原因是现在是端口转换模式,每次pc1发包都会用掉一个源端口,对应会被R1转换成另一个源端口;我们知道端口有很多,一个ip地址有65535个端口;所以对应一个ip地址来说,它可以转换源端口65535个包;
查看动态nat会话表
提示:可以看到现在的nat会话表中就有对应被转换后端源端口;通过上述实验,我们可以看到端口转换的方式能够很大程度的节省公网ip地址;但这种方式也不是我们最常用的上网方式;其原因是这种方式依赖地址池,对应公网ip都是固定的,而我们现在上网绝大部分都是通过拨号上网,对应的公网ip地址并不是固定的;公网地址不是固定的我们该怎么配置动态NAT呢?
4、Easy IP
提示:Easy IP适用于小规模局域网中的主机访问Internet的场景。小规模局域网通常部署在小型的网吧或者办公室中,这些地方内部主机不多,出接口可以通过拨号方式获取一个临时公网IP地址。Easy IP可以实现内部主机使用这个临时公网IP地址访问Internet。easy ip本质上和napt工作原理是一样的,唯一的不同是easy ip是转换成对应接口上的ip地址,而napt是转换成地址池中的地址;使用接口地址的好处是,如果对应接口上的ip地址变换了,对应NAT的配置不用更改,它会随着接口地址的变化而变化;
实验:将上述napt模式更改为easy ip模式
提示:Easy IP的配置与动态NAT的配置类似,主要区别是Easy IP不需要配置地址池;
验证:用pc1pingpc3看看对应源地址是否转换成对应R1的g0/0/1的接口地址呢?
提示:可以看到现在pc1pingpc3,对应pc1的地址被转换成R1的g0/0/1的ip地址;
验证:查看动态NAT配置信息。
提示:可以看到现在的NAT配置信息中并没有使用地址池编号,对应是接口的ip地址,且类型为easyip ;
验证:查看nat会话表
提示:nat会话表和napt类型没有什么不同,都是将源地址和源端口进行了转换;
上述4中方式都是通过转换源ip地址和源端口来实现内网主机访问外网,都是SNAT;下面来说说另一种nat,端口映射也叫DNAT或nat服务器;
5、NAT服务器(DNAT或端口映射)
提示:NAT在使私网用户访问公网的同时,也屏蔽了公网用户访问私网主机的需求。所以当一个私网需要向公网用户提供各种网络服务时,私网中的服务器必须随时可供公网用户访问。NAT服务器可以实现这个需求,但是需要配置服务器私网地址和端口号转换为公网地址和端口号并发布出去。简单讲就是将对应私网的ip地址和端口和公网的ip地址和端口进行一一对应,使得公网用户访问对应公网的端口,就能访问到对应私网主机上的服务;
实验:如下拓扑,实现公网用户能够访问到局域网内部的服务器
配置服务器1
配置R1
sys sys R1 int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 2.0.0.1 24 nat server protocol tcp global 2.0.0.5 8080 inside 192.168.10.80 80 q ip route-s 0.0.0.0 0 2.0.0.2View Code
提示:上述命令表示把内网主机192.168.10.80的80端口映射到公网ip的2.0.0.5的8080端口上;
配置R2
sys sys R2 int g0/0/1 ip add 12.0.0.254 24 int g0/0/0 ip add 2.0.0.2 24View Code
配置客户端
验证:用客户端访问2.0.0.5的8080端口,看看是否能够访问到对应的http服务呢?
提示:可以看到现在访问公网地址的2.0.0.5的8080端口能够正常访问到内部192.168.10.80的80服务;
更改公网地址为对应接口地址
验证:查看端口端口映射表
提示:可以看到对应映射表中全局公网ip地址和端口对应的内网ip地址和端口;