NAT
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NAT相关的知识,希望对你有一定的参考价值。
NAT作为目前为止提供安全,防止地址重叠,防止地址资源耗尽的主要手段,在网络中被广泛的应用。NAT的主要思想,是通过地址之间的映射,来达到安全性的增强,地址重叠的避免以及防止地址资源耗尽。在NAT中,inside为内,outside为外,内和外是根据NAT功能定义的,开启了NAT功能的设备为一个桥接了内网和外网的节点,连接内部的接口被定义为inside,连接外部的接口被定义为outside。地址分为local和global两类,其中local内网设备所能看到的和使用的IP地址,global是外网设备所能看到和使用的IP地址。主要定义有以下四个地址:
inside local:本地内部地址,本地服务器在内网的真实地址,是一个私有地址。
inside global:本地全局地址,ISP分配给本地网关的外网地址,外网设备看到的本地设备IP地址。本地向外访问时,需要将源IP地址由inside local地址转换为inside global地址。通过NAT转换,外网设备也可以通过该地址访问内网服务器。
outside local:内网设备对外网设备发起访问时使用的IP地址,可以是公网地址,也可以是私有地址,甚至可以是一个虚拟IP地址。
outside global:外网设备使用的真实IP地址。
注意:outside或inside是针对地址位置来说,local或global是针对inside设备还是outside设备来说的,inside设备能看到的IP地址为local,outside设备能看到的IP地址为global。
通过上面对地址的描述,我们可以看到,在存在NAT转换时,本地内网设备访问外网设备,可以通过outside local访问(经过NAT转换目的IP后到达),也可以直接访问outside global。本地内网设备可以以inside local作为源去访问(不做NAT转换),也可以以inside global作为源去访问(做NAT源转换)
其次,需要明确一点,在命令中涉及到的inside source,inside destination,outside source和outside destination,都是针对于地址位置来说的,比如:inside source是从内网发起的流量到达本地网关(inside local--->inside global),inside destination是外网发起的流量(inside global--->inside local)到达本地网关,这里也可以看到,是inside地址之间的转换,也就是说,是inside local和inside global之间的转换,地址位置全部都是本端的,inside local或inside global。所以,在配置ip nat inside source或ip nat inside destination只能转换本地网关的源或目的地址,外部到达本地的inside global(本地目的地址)地址转换(可以通过ip nat inside destination或ip nat inside source static进行转换),本地去往外部的inside local(本地源地址)地址转换(可以通过ip nat source static或ip nat inside source list <list-id> interface <interface-id> overload进行转换)。
通过上面的描述,就可以看到,通过ip nat inside定义的流量不能针对远端即outside端的IP地址进行转换,比如,希望将outside local转换为outside global,就不能通过ip nat inside来实现。也就是说,当源或目的IP地址为远端outside地址时,不能通过ip nat inside转换,ip nat inside只能转换源或目的是inside local或inside global的地址。如果需要在本地转换outside地址,就需要使用ip nat outside来完成。
下面,详细描述思科设备在进行NAT转换时,具备的NAT转换功能:
1、ip nat inside source static a.a.a.a(inside local) b.b.b.b(inside global) //静态NAT映射//:
对于目的IP地址的修改:
配置该命令后,在网关R2中会静态的出现一个NAT映射表:show ip nat translation //查看NAT映射表//该命令中,将目的IP地址b.b.b.b(inside global)转换成a.a.a.a(inside local),在进行目的地址转换时,流量必须从外网向内网访问时,才会生效,该命令与下列命令具有相同的效果:ip nat source static a.a.a.a b.b.b.b,因为思科默认在不配置inside还是outside的时候,就是使用inside。实验如下图:
图中,R2、R3作为两个网关,在其上做NAT映射。地址规划:下面实验地址规划相同:
R1:
F0/0:192.168.1.2/24
R2:
F0/0:192.168.1.1/24
F1/0:202.1.1.1/24
R3:
F0/0:202.1.1.2/24
F1/0:172.16.1.1/24
R4:
F0/0:172.16.1.2/24
此时,在R2中配置NAT为:ip nat inside source static 192.168.1.2 202.1.1.1 //将inside global全局地址202.1.1.1转换为inside local本地地址192.168.1.2//
在配置完成后,从R4访问过来的流量可以直接将R2的F1/0接口202.1.1.1作为目的IP地址,经过R2进行NAT转换后,能够到达R1。此时,通过DEBUG信息查看地址的变化情况:
R4:
此时,在R4中,发出的PING包,SIP为172.16.1.2,DIP为202.1.1.1。
R1:
此时可以看到,在数据包抵达R1后,SIP为172.16.1.2,DIP为192.168.1.2。在R2中,数据包经过了一次NAT转换,通过R2中的配置和现象,我们可以发现,该NAT将外网发送过来的数据包,由原来的inside global地址202.1.1.1转换为inside local地址192.168.1.2。
对于源IP地址的修改:
该命令同样会对源IP地址产生映射关系,当在R2中配置该命令时,如果访问是从内网发起的,也就是说,访问是从R1发起的,在这种情况下,会通过该命令,在R2上将该流量的源IP地址,由inside local(192.168.1.2)转换为inside global(202.1.1.1)。现象如下图:
R1:
此时,R1中发出PING包,包中的源IP地址为192.168.1.2,目的IP地址为202.1.1.2,通过网关R2去往R3。那么继续在R3中开启DEBUG信息查看:
R3:
此时在R3中,可以看到,从R1发起,经过R2做NAT访问过来的流量,在经过R2时,源IP地址由原来的192.168.1.2被映射成了202.1.1.1,并且R3在收到该数据包后,会以202.1.1.1为目的进行回包,当回包到达R2后,会继续进行一次转换,将202.1.1.1(inside global)转换为192.168.1.2(inside local)并最终回到R1。
结论:
关于ip nat inside source static a.a.a.a b.b.b.b有以下结论:
①、会对外网访问b.b.b.b(inside global)的地址做一次目的IP地址转换,变为a.a.a.a(inside local)。在上例中,通过静态配置的该NAT,从外网访问到内网的流量,R2会直接抓取数据包中的目的IP地址,查看目的地址是否为202.1.1.1,如果是,那么直接转换为192.168.1.2。
②、会对内网主动发起,访问出去的流量做一次源IP地址转换,a.a.a.a(inside local)变为b.b.b.b(inside global)。在上例中,通过静态配置的该NAT,从内网访问到外网的流量,R2会直接抓取数据包中的源IP地址,查看源IP地址是否为192.168.1.2,如果是,那么直接转换为202.1.1.1。
③、一般在进行该NAT转换时,使用ISP分配IP地址同一网段的虚拟IP(不存在的公网同网段IP),如果直接静态的将网关真实的公网IP地址配置为inside global地址,那么网关的公网地址将无法正常访问(所有访问网关公网IP的数据包都会被映射为inside local地址,并送入内网。在本例中,网关的真实公网IP就无法访问)。
④、这种映射方式,仅仅是在本地去往外部的时候,转换源IP地址。在外部去往本地的时候转换目的IP地址,并没有提供双向转换。
⑤、这种映射方式是静态的映射,默认会将static中包含的一个地址所使用的全部端口都映射到转换后IP地址的全部端口。
⑥、在静态映射中可以使用以下命令实现关于端口的映射:
在此命令中,可以通过TCP和UDP的配置,将某个IP地址的某个端口静态的映射到另一个IP地址的另一个端口中。
2、ip nat inside source list <list-id> interface <outside interface> overload //基本源转换//:
动态的NAT映射,是最基本的映射方式。映射方式如下图:
图中,R1作为内部PC,IP地址为12.1.1.1,设置网关为R2,在R2中配置此类NAT,F0/0为inside接口,F1/0为outside接口。R3为ISP路由器,R4为对端网关。需求为R1通过网关R2,经NAT转换后,访问对方网关R4的F0/0接口。在R2中配置默认路由指向ISP路由器R3,在R3中配置默认路由指向对方网关R4,在R4中配置静态路由:ip route 23.1.1.2 255.255.255.255 34.1.1.3。观察实验现象(注意,实验中开启了端口复用,所谓端口复用是指,在此配置中所有ACL所匹配的源IP地址所使用的端口都能够正确的映射到R2的F1/0接口所使用IP地址的端口中)。
命令解释:ip nat inside source list <list-id> interface <outside interface> overload //将ACL所有抓取的源IP地址,全部映射为outside接口的IP地址,并开启端口复用//
实验中相关NAT配置:
在实验中,配置ACL 10,其中匹配R1的IP地址12.1.1.1,作为NAT的匹配流量。
配置R2的F0/0接口为inside接口,F1/0为outside接口。并配置上述命令,调用ACL 10,并配置端口复用。
注释:端口复用的主要作用是,在动态NAT中,可以实现多个IP地址共同使用同一个IP地址的一组端口。在此例中,R2为网关,如果R2内部链接了两个或两个以上主机,如果这些主机同时发起访问,就需要在R2中开启端口复用,保证这些主机的IP地址在映射后都可以使用R2的F1/0接口IP地址的全部端口,如果不使用端口复用,那么在多台主机的环境中,只有一台能够正常的通过NAT访问TCP或UDP的特定端口服务。
配置后实验现象如下图:
配置完成后,R1主动发起访问:PING 34.1.1.4,在发起访问时,源IP地址为12.1.1.1,目的IP地址为34.1.1.4。查看R4中收到的数据包情况:
此时,R4中收到的数据包,源IP地址为23.1.1.2,此为映射后IP地址。R4在进行回包的时候,目的地址会设定为23.1.1.2,到达R2后,进行反向映射,重新映射为12.1.1.1,并送达R1,如下图:
注意:此中映射仅仅能够完成从内网主动发起流量去往外网,当外网R4主动发起目的IP地址为12.1.1.1的访问时,由于R4与R3中无路由,所以无法正常通信。而当R4主动发起目的IP地址为23.1.1.2的访问时,仅仅能够访问到网关R2的F1/0接口,R2不会做NAT转换。这样保证了内网的安全性。同时也能看出此种NAT是一种状态化的NAT,只有内网主动发起访问34.1.1.4的时候,R4回包以23.1.1.2为目的才会被转换成12.1.1.1,R4主动发起以23.1.1.2为目的的访问则不会进行转换。此种状态化的转换在PING包中是通过ICMP报文中的标志位Identifier位(16位 0x0000)来实现的,R1发出的第一个PING包,ICMP报文中的Identifier会被置为,R4回包的时候也会置为1,并依此增加,R2在收到去包和回包相同的Identifier标志后,会对回包进行转换。否则不予转换。
在进行TCP或UDP连接的时候,NAT映射表会记录本地始发的源端口号,以及目的端口号,只有返回流量的源端口号为始发流量的目的端口号,目的端口号为始发流量的源端口号的时候才会进行NAT转换,换句话说,当外部主动发起访问的时候,在NAT映射表中绝对不会出现内部去往外部的源目端口号,所以一定不会匹配,就更加不会完成NAT转换了。对于traceroute流量来说,即要匹配ICMP的Identifier,也要匹配UDP的源目端口号。
这种映射方式与ip nat inside source static a.a.a.a b.b.b.b的映射方式不同,此种映射根据NAT映射表的状态化控制实现。而static则是抓取数据包中的源目IP地址实现NAT转换,只要源或目的IP地址满足转换需求,那么就会进行NAT转换。
3、ip nat inside destination list <list-id> pool <pool-name> //外网访问过来的流量,将目的IP,inside global转换为inside local,只对TCP流量有效,支持轮询//:
针对外网主动发起访问的数据包,到达本地网关后,如果希望将外网发起访问的目的IP地址,转换为内部服务器真实的目的IP地址,可以使用此条命令,当然,使用ip nat inside source static也可以完成,但是与本条有一定区别,使用本条命令可以完成负载均衡(内部相同服务的服务器之间的轮询),并且本命令仅对TCP流量有效。通过实验进行验证,实验如下图:
图中,R1为外网路由器,IP为12.1.1.1。R2为网关路由器,F1/0为12.1.1.2,F0/0为192.168.1.1。R3、R4和R5为内网提供相同服务的服务器,IP地址分别为192.168.1.2、192.168.1.3、192.168.1.4。此时,配置本NAT,查看实验现象。
相关配置:本实验中,对R1设置了一个虚拟IP地址10.1.1.1
R2:网关配置,包含相关NAT,pool和ACL配置:
ACL:
使用ACL抓取了对R1设置的虚拟IP地址10.1.1.1
pool:
设置了地址池为R3~R5的地址,类型为转换池(轮询)。
NAT:
将F0/0设置为inside接口,F1/0设置为outside接口。并配置将ACL抓取的inside global地址转换为池内的inside local地址,采用轮询的方式。注意,NAT地址池的类型必须为rotary。
R1:配置静态路由ip route 10.1.1.1 255.255.255.255 12.1.1.2。
实验现象:
1、R3~R5内部服务器主动向R1发起访问(以R3为例):
R3:
R3无法PING通R1。在R1中开启debug ip packet查看:
R1:
由于实验结构,R1能够收到R3发过来的PING包,但是通过debug信息查看,源IP地址和目的IP地址并没有发生变化。再去R2中查看NAT映射表:
R2:
可以发现,在R2中没有任何转换表项,所以此条命令不会提供内网主动发起访问时,源目IP地址的映射。
2、R1对内部服务器主动发起访问(PING访问),PING 10.1.1.1:
R1:
可以发现主机不可达,此时可以说明,R1发出的去往10.1.1.1的PING包到达了R2,但是由于R2中没有去往10.1.1.1的路由,所以反馈主机不可达。可以间接说明R2没有对该目的为10.1.1.1的PING包做NAT转换,再查看R2中的NAT映射表:
R2:
NAT映射表为空,所以说明R2并没有对该目的IP为10.1.1.1的PING包进行NAT转换。
3、R1对内部服务器发起telnet访问,telnet 10.1.1.1:
三次telnet分别访问到了R3、R4和R5,能够正常访问,继续查看R2中的NAT映射表:
在R2的NAT映射表中有内容,并且为对应映射。根据以上现象可以得出以下结论:
结论:
① 使用ip nat inside destination不会对内网去往外网的流量进行NAT映射。
② 使用ip nat insdie destination仅对外部到达网关的TCP流量进行NAT映射,并会采取轮询的机制,逐个服务器进行映射。
4、ip nat outside source static a.a.a.a b.b.b.b //内网访问出去的流量,做目的IP,outside global转换为outside local,a.a.a.a为outside global,b.b.b.b为outside local//:
从该命令开始,进入对outside地址的映射,上面提到的命令:ip nat inside source/ip nat inside destination都是在inside local/inside global之间相互完成映射,而使用ip nat outside source/ip nat outside destination可以在本地完成outside local/outside global之间相互完成映射,也就是说在本地可以完成对端的地址映射。以下图为例:
图中,R1为内网PC,R2为网关,R3为外网server。此时R1主动发起一个访问流量希望去往R3,对于R3来说,希望将自己的真实IP地址保护起来,也就是说,R3不希望R1知道自己的真实IP地址,但是允许R1能够通过某种方式访问自己。在这种情况下,R3的IP地址就相当于outside global地址,那么就需要一种NAT来实现这样一个需求,设置一个虚拟的outside local,然后R1通过访问虚拟的outside local能够最终访问到R3的outside global地址。R1的IP地址为:12.1.1.1,R2的F0/0接口IP地址为12.1.1.2,F1/0接口IP地址为23.1.1.2。R3的IP地址为23.1.1.3。
解析:此处对命令进行一下解释,ip nat outside source static <outside global IP> <outside local IP> add-router,该命令思科的解释为将outside global IP映射为outside local IP,注意,这里思科的解释是针对于内网服务器而言的,也就是针对此实验中的R1而言,outside global IP:23.1.1.3被映射为了outside local IP:10.1.1.1,而R1在发起访问时,由于对自己来说,23.1.1.3已经映射成了10.1.1.1,那么R1只需要访问10.1.1.1就可以了,也就是说,在数据包处理过程中,R2(NAT设备),将outside local IP:10.1.1.1映射成了outside global IP:23.1.1.3。在命令后边的add-router,是说自动添加一条去往outside local IP:10.1.1.1的静态路由,方向是指向outside global IP方向,在做ip nat outside source映射时,设备会首先检查是否有一条去往outside local IP的路由,如果没有那么数据包会被直接丢弃,而不会做NAT转换,可以通过这种方式添加,也可以通过手动配置默认或静态。方向一定要指向outside global IP方向。(即一定要指向outside接口所连接的下一跳)。在进行此种NAT转换时,思科规定,收到数据包后,首先检查outside local IP是否有静态路由,路由方向是否从网关的outside接口指向外面(指向公网),如果没有,那么数据包被丢弃,指的方向不对,数据包被丢弃。如果存在一条正确的静态路由,执行目的NAT转换,数据包被转发。
实验配置:
R2:
在R2中,设置F0/0接口为inside接口,F1/0接口为outside接口。配置NAT转换为,在本地网关转换outside位置的IP地址,在对数据包进行处理时,将outside local转换为outside global地址,在定义配置时,将outside global定义为转换成outside local。并且通过add-router添加一条静态路由,目的为10.1.1.1指向outside global方向。
实验现象:
R2中的NAT映射表项:
此时,在R2中会静态的生成一个NAT映射表项,记录对outside地址的映射。
在R1中对10.1.1.1这个虚拟地址发起访问,观察R3中收到数据包的情况:
此时可以看到,在R1中发起访问的时候,目的IP地址为10.1.1.1,在R2中,根据outside地址的NAT转换表,执行outside local映射outside global地址,映射完成后,数据包的目的IP地址变为23.1.1.3,并正常送达R3,完成访问。
在R3中,对内网R1的IP地址12.1.1.1发起访问,观察R1中收到数据包的情况:
当R3对R1的F0/0接口12.1.1.1主动发起访问时,源IP地址为23.1.1.3,目的IP地址为12.1.1.1。当数据包到达R2时,根据静态NAT映射表中的内容,会抓取outside地址23.1.1.3,一旦抓取到了,就会对该地址根据静态NAT映射表执行映射,所以R2会将此数据包的源IP地址23.1.1.3映射为10.1.1.1,并送达R1,R1在进行数据包回复的时候,会将数据包封装成目的IP地址为10.1.1.1,源IP地址为12.1.1.1。
特别注意:无论在使用ip nat inside source static还是在使用ip nat outside source static命令,都会执行两个方向的NAT转换。
ip nat inside source static:该命令会对外部抵达本地网关的数据包,进行目的IP地址的inside global转inside local映射。会对内部抵达本地网关的数据包,执行源IP地址的inside local转inside global映射。
ip nat outside source static:该命令会对外部抵达本地网关的数据包,进行源IP地址的outside global转outside local映射。会对内部抵达本地网关的数据包,执行目的IP地址的outside local转outside global映射。
根据上面特定我们可以发现,这两种静态映射,都是直接抓取数据包中相应的IP地址,无论该IP地址是源IP地址还是目的IP地址,都会根据静态映射表进行一个映射,并且可以完成local和global双向的映射,映射的规则就是上面所描述的两条规则。
5、ip nat outside source list <list-id> pool <pool-name> //动态的映射,完成外网始发的流量源IP地址从outside global到outside local的映射。完成从内网始发的流量目的IP地址从outside local到outside global的映射(在思科的定义中,此处定义与ip nat outside source static一样,对内网PC来说,也是反过来的//:
看下图:
图中,R1为内部PC,IP地址为12.1.1.1,网关为12.1.1.2。R2为网关,在R2中进行NAT配置,F1/0接口为inside interface,F0/0接口为outside interface。R3与R4为外网服务器,IP地址分别为192.168.1.3和192.168.1.4。在R2中配置NAT转换,配置如下:
R2:
配置ACL,抓取outside global地址,分别为R3与R4的IP地址192.168.1.3、192.168.1.4。
配置NAT pool,在pool中配置outside local地址10.1.1.1,并写NAT,outside global转为outside local地址,并添加静态路由,该静态路由在发生NAT转换时被触发。
实验现象:
1、内网R1主动发起访问,访问outside local地址:
R1能够正常访问,并且源IP地址为12.1.1.1,目的IP地址为映射的虚拟IP地址10.1.1.1。
R4收到该数据包,可以看到在R2中进行了outside local映射到outside global的NAT转换,在R4中,目的IP地址变为192.168.1.4。
2、外网主动发起访问,访问inside local地址:
R4发起访问,去往内网PC R1,此时,源IP地址为192.168.1.4,目的IP地址为12.1.1.1。再继续查看R1中的数据包接收情况,
此时,R1中收到的数据包,源IP地址为10.1.1.1,目的IP地址为12.1.1.1。根据此实验现象可以得出以下结论:
1、从内网主动发起的访问,去往外部目的,将目的地址从outside local映射为outside global。
2、从外网主动发起的访问,去往内部目的,将源IP地址从outside global映射为outside local。
3、此种NAT配置方式仅能完成一次映射,例如,在本实验中,如果R3先使用R2进行NAT映射,那么在R2中就会形成关于此ACL和pool的NAT映射表,那么R4就无法再次使用此NAT进行映射。
4、此种NAT配置方式必须针对outside local产生一条静态路由,路由需指向outside global方向,才能够正常进行NAT转换,否则转换无法完成。
5、根据此种特点,在进行outside地址映射时,使用ip nat outside source static进行映射更优化,建议使用静态映射。
6、综合实验:
如上图,图中,R2、R4为网关,R1、R5为内网PC,通过R3(ISP路由器)互相访问。R1与R2内网地址为192.168.1.0/24,R4与R5内网地址为172.16.1.0/24,
R2与R3为GW1与ISP连接,网段为202.1.1.0/24,R3与R4为ISP与GW2之间连接,网段为202.1.2.0/24。此时,需要实现需求如下:
1、R1在访问R5时,到达R2时,将源IP地址由inside local映射为一个虚拟的inside global地址,将目的IP地址outside global映射为一个虚拟的outside local地址。
2、在数据包到达R4(GW2)后,将R1发送过来的数据包(此时针对R5来说),源IP地址outside global映射为outside local,目的IP地址inside global映射为inside local地址。
3、R5在访问R1的时候同样实现以上需求。通过实验完成以上需求。
使用静态方式实现该需求:查看R2与R4中的配置:
R2:
R4:
根据以上配置,有以下解释:
1) R1发出PING包,目的IP为10.1.1.1,源IP为192.168.1.2,到达R2。
2) R2中进行NAT转换,将目的IP映射为202.1.2.2,源IP映射为202.1.1.1,送达R3并到达R4。
3) 数据包到达R4后,目的IP地址变为172.16.1.2,源IP映射为10.1.1.2,并送达R5。
4) R5进行回包,目的IP为10.1.1.2,源IP为172.16.1.2,到达R4。
5) 在R4中执行NAT映射,将目的IP 10.1.1.2映射为202.1.1.1,源IP 172.16.1.2映射为202.1.2.2。
6) 数据包映射后通过R3到达R2,将目的IP 202.1.1.1映射为192.168.1.2,源IP 202.1.2.2映射为10.1.1.1,并最终到达R1。完成一次通信。
在思科设备中定义NAT时,如果使用ip nat inside source来定义NAT,那么流量在经过inside接口进入路由器时实现源IP地址映射,流量在经过outside接口进入路由器时实现目的地址转换。如果使用ip nat outside source来定义NAT,那么流量在经过inside接口进入路由器时实现目的IP地址映射,流量在经过outside接口进入路由器时,实现源IP地址转换。
以上是关于NAT的主要内容,如果未能解决你的问题,请参考以下文章