本节书摘来自异步社区《Cisco防火墙》一书中的第8章,第8.2节,作者 【巴西】Alexandre M.S.P. Moraes,更多章节内容可以访问云栖社区“异步社区”公众号查看
8.2 出站NAT分析
Cisco防火墙
在前面的章节中,本书已经反复讨论过入站访问和出站访问的概念,这一概念在本章中仍会反复使用。只不过在本章中,只要配置了 nat-control,连接就只允许通过转换(translations)的方式来建立(在ASA算法中,“转换”往往也称为xlates)。
例8-2中的基本配置是参照图8-1中的拓扑执行的,同时例8-2也显示了ASA设备所支持的各类NAT。
注释 本书在第7章曾经介绍过,ICMP本质上是一个无状态协议,而(外部接口发来的)echo响应数据包会被看作是入站连接。外部主机会始终对转换后的源地址进行响应,本书在名为OUT的ACL上使用了log可选项,这样做很有必要,因为通过这种方式,只要有数据包与这条ACE相匹配,设备就会发送一条日志消息,这样就可以得到外部接口上看到的(转换后)地址了。
注释 在分析ICMP转换和穿越防火墙的连接时,可以使用命令debug icmp trace来查看相关信息。该命令会在后面的案例中反复用到。
提示 在读者开始按照后面的案例进行实施之前,应该首先输入下列命令clear access-list OUT counters、clear xlate、clear nat counters和clear local-host all。
8.2.1 动态NAT
本书要分析的第一个选择是动态NAT,它可以将一组内部(真实的)源地址(通过nat命令定义),转换为一个(转换后)地址池中的地址(这个地址池需要通过命令global进行定义)。将这两组地址进行绑定的参数是一个非0的地址池编号(pool number),如例8-3所示。
ASA会随机从global地址池中选择一个地址,并将其与连接的初始地址(为nat地址池中的地址)进行关联。在xlate超时时间到期之后,这个映射关系就会从转换表中删除,在发起新的出站连接时,这类NAT不能保证原始的内部主机(laddr)还能分配到相同的全局地址(gaddr)。
例8-3动态NAT的配置与验证
例8-3所示为两大重要的情形。
动态NAT规则中出现匹配的情形:源地址10.10.10.150属于10.10.10.128/25的地址范围,因此该地址会分配到global地址池中的一个随机地址(在本例中为172.16.16.253)。(与echo请求相对应的)出站ICMP连接是通过动态转换建立的。命令show xlate debug 可以显示出活动转换的具体信息。该命令也可以显示出相关的转换标记(translation flags)和转换超时时间(xlate timeout)值。
有一个数据包不匹配NAT规则的情形:数据包的源地址为10.10.10.80,该地址不在子网10.10.10.128/25中。由于没有其他的NAT规则,因此不会建立地址转换,该数据包会被丢弃,同时设备会发送一条syslog(系统日志)消息,表示没有找到转换组(no translation group was found)。
注释 动态NAT是一种单向转换技术,这种技术很适合私有主机不希望被外部网络看到但又需要访问外部网络的情形。
注释 动态NAT很适合为那些不同于TCP和UDP的协议(即不包含四层端口这种概念的协议)执行单向转换。
8.2.2 动态PAT
动态PAT可以将一组内部(真实的)源地址(通过nat命令的定义),转换为一个(转换后的)的源地址(这个地址池需要通过命令global进行定义)。为了将每个与该PAT规则匹配的内部主机区分开来,并且能够正确地转发返程数据包,ASA使用了global地址与源端口的组合来定义不同的内部主机。PAT这种多对一的特性使其成为了一项有能力缓解公共IPv4地址耗竭问题的技术。
图8-2所示为一个包含了两个内部客户端(C1和C2)的PAT解决方案,这两台客户端都需要访问外部服务器S1。要注意在该图中,两台主机都选择了同一个源端口来建立连接。在这种情况下,就必须回答这样一个问题:如果ASA只保存源端口(就像ASA在NAT技术中的操作方式那样),那么从同一个外部主机返回的数据包会出现什么情况?
在例8-4中,nat和global命令的作用是让所有位于dmz接口且源地址位于子网10.10.10.0/24中的主机在穿越out接口与外部可达地址建立连接时,其地址都会被转换为172.16.16.126。
例8-4动态PAT的配置与验证
例8-4所示为生效的PAT技术。
它的特点是将从真实源地址(laddr)发来的ICMP ID看作源端口(类似于UDP和TCP),并映射为一个转换后的源端口,而在转换后,这个转换后的源端口就会成为ICMP ID。当一个ID为9的ICMP数据包从主机10.10.10.140发来时,该数据包就会被映射为172.16.16.126,端口号为55957。
命令show xlate debug显示出了示例ICMP数据包和TCP PAT转换。同时也显示出了与portmap(端口映射)相关的r标记。读者不妨将该例的输出信息与例8-3的输出信息进行比较。
例8-5所示为通过Packet Tracer模拟一数据包从dmz主机10.10.10.90/4000到out主机172.16.16.200端口53建立UDP连接的过程。在本例中,源端口4000在执行PAT后被映射为25393。Phase5显示有大量的数据包都匹配了NAT规则。
例8-5通过Packet Tracer显示UDP连接的建立过程
注释 在使用NAT的环境中,那些在上层头部中嵌入了IP地址信息的应用有可能会出现一些问题(启用PAT的话,问题甚至可能更加严重)。为了很好地解决这类问题,负责执行转换的设备就必须理解协议的特征,并且弥补从三层到上层头部之间IP地址不匹配的问题。本书第12章介绍了一些相关的示例。
例8-6同时配置了例8-3和例8-4中的NAT规则。命令show nat可以清晰地显示出动态NAT的优先级高于动态PAT。于是,如果NAT地址池的定义存在重叠,那么动态NAT会优先进行匹配。比如,一台属于10.10.10.128/25(即子网10.10.10.0/24子网的后半部分)的主机会被转换为地址池global 2中的一个地址。位于10.10.10.0/25子网中的主机只符合PAT规则(global1),而不属于子网10.10.10.0/24的源地址则会被隐式拒绝规则过滤。
例8-6动态NAT的优先级高于动态PAT
注释 建议读者用大量时间来阅读并理清NAT处理的顺序(Order of NAT Processing),因为这个问题常常被人们误解。作者曾经看到很多客户部署了大量的ACL和NAT,而这些客户并未掌握NAT的分类及相关的优先级规则。这可能会导致有些转换命令永远都不会用到(因为它们比某些其他类型的NAT优先级要低),于是这些客户最后会得出一个错误的结论,即设备出了故障。
8.2.3 Identity NAT
Identity NAT是一项用来避免某些主机地址被转换的技术。由于这项技术可以让真实地址(laddr)与全局地址(gaddr)相同,因此这个有条件的绕过NAT(NAT Bypass)机制可以看作是nat-control模型中对于地址转换需求的一种有效的响应。地址池编号参数值0用来指定哪些源地址不应该进行转换。
根据例8-7所示,Identity NAT也是一种动态转换技术。在这个示例中,有一个Telnet会话和一个ping会话,分别来自于地址10.10.10.140和10.10.10.150,它们的目的都是172.16.16.200。命令debug icmp trace的输出信息显示出本地地址(laddr)和全局地址(gaddr)是相同的。
例8-7Identity PAT的配置与验证
注释 命令show xlate debug中显示有转换标记I,表示此处使用了Identity NAT。
注释 Identity NAT也是一项单向转换技术,这一点与动态转换类似。尽管全局地址和本地地址相同,因此从较低sec-lvl接口向全局地址(gaddr)发起的连接不会被放行。
例8-8是基于配置在例8-3和例8-7中的规则进行设计的,它的设计旨在在10.10.10.128/26范围内创建一个动态NAT和Identity NAT的重叠规则。根据命令show nat的显示信息,源地址属于该子网的主机执行Identity转换,而来自10.10.10.192/26的主机则执行动态NAT转换(pool 2)。不在网络10.10.10.128/25的主机则会被隐式拒绝。
例8-8Identity NAT的优先级高于动态NAT
8.2.4 静态NAT
静态NAT可以在位于防火墙两个不同接口的私有地址(laddr)和公有地址(gaddr)之间定义一个永久的一对一的对应关系。由于这个映射关系不会发生变化,因此静态NAT本质上是双向转换,可以让外部网络向内部发起连接(如果需要实现这一功能,必须用ACL创建一条明确的放行条目)。
例8-9显示了静态NAT两种可能的配置。
例8-9静态NAT的配置与验证
主机到主机的映射:虽然/32也会在运行配置(running-config)中显示出来,但是在输入static命令时,其实没有必要输入掩码的位数(这个掩码位数是默认的)。
从一个范围到一个范围的映射:映射后的地址数量必须和实际地址的数量相等。在该示例中,管理员选择使用26位掩码来创建真实地址10.10.10.0/26到全局地址172.17.17.0/26之间的转换关系。
关于静态NAT,还有一些地方值得注意。
在命令static中的第一个接口是私有接口(即真实地址所在的接口),而第一个地址则是虚拟(或映射后的)地址。这一点听上去可能违背常规,但是语法命令就是这么设计的。存在即合理。
在(全局配置模式下)输入static命令时,静态转换就会立刻建立起来。这就是在连接建立之时没有转换建立(built translation)这条系统日志消息的原因。命令show xlate debug显示出该条目超时时间是无穷大(0:00:00),这就是静态转换的特点。
8.2.5 策略NAT
策略NAT属于一种条件转换(conditional translation)技术,因为这项技术在判断转换后地址(gaddr)时,不只考虑原地址(laddr),同时也会考虑目的地址(faddr)。转换的标准需要通过ACL进行定义。
静态策略NAT
这种方式与静态NAT类似,因为它创建的也是一对一的映射关系。但静态策略NAT的特性是映射后地址可能有所不同,该地址取决于目的主机(即来自真实地址的数据包发往的那个地址)。
例8-10所示为一条符合以下定义的策略。
来自真实地址(laddr)10.10.10.148并且去往172.16.16.200(faddr)的数据包会在out接口被转换为172.18.18.148。
例8-10静态策略NAT
来自地址10.10.10.148并且去往172.16.16.200之外主机的数据包会被转换为172.16.16.148。读者可以将从10.10.10.148发往172.16.16.200的ping数据包与发往172.16.16.220的数据包进行比较。
虽然在静态NAT和静态策略NAT的配置出现重叠时,防火墙会出现提示信息,但防火墙仍然会执行转换。这些重叠的配置会按照配置的顺序来执行,因此在下面的示例中应该先定义策略NAT(因为策略NAT更加具体)。
动态策略NAT
这项技术与动态NAT类似,但是该技术在选择转换后的地址(gaddr)时,除了考虑laddr(原地址)之外,也会将目的地址(faddr)列入考虑。
例8-11所示为向外部(out)主机172.16.16.200发送数据包时,将位于10.10.10.128/27范围内的主机转换为global pool 4中地址的过程。
例8-11动态策略NAT
动态策略PAT
这项技术与动态PAT类似,但是该技术在选择转换后的地址(gaddr)时,会同时考虑laddr(原地址)和目的地址(faddr)。
例8-12所示的转换策略为,当来自10.10.10.128/26范围内的主机向目的地址172.16.16.200建立连接时,主机地址应该被映射为全局地址172.16.16.125。
例8-12动态策略PAT
注释 动态策略PAT和动态策略NAT的优先级规则取决于定义这些策略的顺序。因此,一定要先配置最精确的源地址范围。
8.2.6 NAT免除
NAT免除技术与Identity NAT的范围相反,这种有条件的绕过NAT的技术在本质上就是双向的。NAT免除技术要使用命令nat 10 access-list来进行配置。通过配置该技术,access-list列表中定义的源地址和目的地址之间不会进行转换。
例8-13所示为NAT免除技术的工作方式。应该看到:
设备在任何情况下都不会创建地址转换,读者不妨将这一行为与例8-7中的Identity NAT进行比较;
ACL中的permit语句定义了哪些流量应该免于NAT转换。显然,deny语句意味着这类流量不在免除NAT转换之列(即该流量需要进行转换)。由于ACL在末尾存在隐式拒绝,因此显式拒绝的条目应该在配置需要放行的流量之前。
例8-13NAT免除
例8-14所示为如何为(位于NAT免除范围10.10.10.128/28内的)主机10.10.10.140执行静态转换。在该案例中有一条deny语句,因为NAT免除技术的优先级高于其他一切类型的NAT规则。
例8-14 使某个特定的静态转换不受NAT免除技术的影响
8.2.7 NAT优先级规则
本书在前文中已经对各种类型的NAT技术进行了详细的介绍,在接下来的内容中,本书需要对ASA的NAT处理次序(Order of NAT Processing)进行描述。读者必须对这个主题有所掌握,因为在实际应用场合中,网络中往往同时存在多种类型的转换技术,因此转换规则出现重叠是极为常见的现象。
例8-15根据例8-6和例8-8所描述的方式,创建了一个多种NAT类型存在规则冲突的情形。
图8-3总结了从例8-2到例8-14中定义的转换类型(这些技术在例8-15中会同时启用)。例8-16所示为对该案例的分析。图8-4所示为通过ASDM来配置例8-15对应的NAT规则时,显示的配置界面。
例8-15对出站流量进行NAT优先级分析
例8-16所示为在配置了nat-control的情形下,通过命令show nat dmz显示出站访问NAT优先级的输出信息。设备的处理顺序如下。
例8-16出站访问的NAT优先级规则
步骤1NAT免除:该技术永远是检查的第一项,它的优先级高于与其产生冲突的其他任何类型的NAT。
步骤2 静态策略NAT:这类规则的作用是可以为一个给定的原地址(转换前的真实地址)根据其通信的目的地址(faddr)选择特定的全局地址。该技术可以视为是给普通的staic语句配置一个例外,因此它需要在常规的static语句之前进行配置。
步骤3 静态NAT:这种类型的NAT优先级高于动态NAT、动态策略NAT和Identity NAT规则。如果在NAT免除范围之内的一些主机需要进行静态换换,那么就需要通过命令nat 0 access-list来为这些主机创建一些相应的例外,如前文中的例8-14所示。
步骤4 动态策略NAT/PAT:这种类型的转换技术优先级高于动态NAT和Identity NAT规则。如果存在两条这种类型的规则,那么它们的处理顺序取决于配置它们的次序(无论这两条规则是策略PAT还是策略NAT)。
步骤5 Identity NAT:这种单向绕过转换技术的优先级高于动态NAT或动态PAT规则。
步骤6 动态NAT:这类技术的优先级仅高于动态PAT。
步骤7 动态PAT:如果在检查了前面各种类型的NAT之后,ASA都没有找到匹配项,ASA仍然会搜索似乎否有匹配的动态PAT。如果还是没有找到匹配,NAT-control模型中的隐式拒绝规则就会生效。
为了进一步阐明上述概念,本书设计了一系列的测试实验,在实验环境中,出现了很多的规则冲突(所有实验均以图8-3作为参考拓扑)。在这个环境中,原地址(转换前的真实地址)试图访问目的地址172.16.16.200的情况最有可能出现规则冲突,因为172.16.16.200是所有策略NAT语句的目的地址。各测试的推荐源和目的主机如下。
T1 从10.10.10.150到172.16.16.200:包含这个原地址(转换前的真实地址)的最精确的范围是10.10.128/27,而该地址配置了动态策略NAT转换技术。由于没有为这台源主机定义任何静态转换或NAT免除技术,因此设备会选择全局地址池#4的地址作为转换后的地址。
T2 从10.10.10.180到172.16.16.200:原地址属于10.10.10.128/26,因此当它连接到该目的地址时,会被转换为172.16.16.125(动态策略PAT)。
T3 从10.10.10.180到172.16.16.220:原地址属于10.10.10.128/26,但不满足任何策略NAT的规则,因此会采取Identity转换。
T4 从10.10.10.148到172.16.16.200:原地址与ACL STATIC-POLICY1中定义的策略相匹配,因此不会执行NAT免除。为其选择的转换后地址为172.18.19.148。
T5 从10.10.10.148到172.16.16.220:与T4类似,原地址会使用常规的static条目转换为目的地址172.16.16.148。
T6 从10.10.10.240到172.16.16.200:原地址的最精确的范围是10.10.128/25,而目的地址会从地址池2(动态NAT)中进行选择。。
T7 从10.10.10.25到172.16.16.220:由于原地址没有与为子网10.10.10.128/25定义的规则产生冲突,因此会对该原地址执行动态PAT转换(地址池1)。
T8 从10.10.10.140到172.16.16.200:原地址与目的地址的组合与NAT免除技术的设置相匹配,因此连接可以建立起来,同时设备不会对其执行地址转换。
提示 在执行T1到T8的测试工作时,可以使用Packet Tracer工具。比如,在执行T6的测试时,可以输入packet-tracer input dmz tcp 10.10.10.240 6000 172.16.16.200 443。我们强烈建议读者反复进行上述测试。