H3C防火墙NAT处理顺序

本文主要适用于H3C V7版本防火墙,介绍了NAT的基本类型和执行顺序。相关内容很多援引H3C官方产品文档,NAT类型及相关说明以官方文档为准。

1 NAT类型及配置说明

H3C V7产品支持的NAT按照组网方式可分为以下几种:

(1) 传统NAT
报文经过NAT设备时,在NAT接口上仅进行一次源IP地址转换或一次目的IP地址转换。对于内网访问外网的报文,在出接口上进行源IP地址转换;对于外网访问内网的报文,在入接口上进行目的地址IP地址转换。

(2) 两次NAT
报文入接口和出接口均为NAT接口。报文经过NAT设备时,先后进行两次NAT转换。对于内网访问外网的报文和外网访问内网的报文,均在入接口进行目的IP地址转换,在出接口进行源IP地址转换。这种方式常用于支持地址重叠的VPN间互访。

(3) 双向NAT
报文经过NAT设备时,在NAT接口上同时进行一次源IP地址转换和一次目的IP地址转换。对于内网访问外网的报文,在出接口上同时进行源IP地址和目的IP地址的转换;对于外网访问内网的报文,同时在入接口上进行目的地址IP地址和源IP地址的转换。这种方式常用于支持内网用户主动访问与之地址重叠的外网资源。

(4) NAT hairpin
NAT hairpin功能用于满足位于内网侧的用户之间或内网侧的用户与服务器之间通过NAT地址进行访问的需求。开启NAT hairpin的内网侧接口上会对报文同时进行源地址和目的地址的转换。它支持两种组网模式:
•P2P:位于内网侧的用户之间通过动态分配的NAT地址互访。
•C/S:位于内网侧的用户使用静态配置的NAT地址访问内网服务器。

按照实现方式,可将NAT分为以下几种

(1) 静态方式
静态地址转换是指外部网络和内部网络之间的地址映射关系由配置确定,该方式适用于内部网络与外部网络之间存在固定访问需求的组网环境。静态地址转换支持双向互访:内网用户可以主动访问外网,外网用户也可以主动访问内网。

(2) 动态方式
动态地址转换是指内部网络和外部网络之间的地址映射关系在建立连接的时候动态产生。该方式仅支持单向发起访问,通常适用于内部网络有大量用户需要访问外部网络的组网环境。动态地址转换存在两种转换模式:
•NO-PAT模式
NO-PAT(Not Port Address Translation)模式下,一个外网地址同一时间只能分配给一个内网地址进行地址转换,不能同时被多个内网地址共用。当使用某外网地址的内网用户停止访问外网时,NAT会将其占用的外网地址释放并分配给其他内网用户使用。该模式下,NAT设备只对报文的IP地址进行NAT转换,同时会建立一个NO-PAT表项用于记录IP地址映射关系,并可支持所有IP协议的报文。
•PAT模式
PAT(Port Address Translation)模式下,一个NAT地址可以同时分配给多个内网地址共用。该模式下,NAT设备需要对报文的IP地址和传输层端口同时进行转换,且只支持TCP、UDP和ICMP(Internet Control Message Protocol,互联网控制消息协议)查询报文。采用PAT方式可以更加充分地利用IP地址资源,实现更多内部网络主机对外部网络的同时访问。
目前,PAT支持两种不同的地址转换模式:
Endpoint-Independent Mapping(不关心对端地址和端口转换模式):只要是来自相同源地址和源端口号的报文,不论其目的地址是否相同,通过PAT映射后,其源地址和源端口号都被转换为同一个外部地址和端口号,该映射关系会被记录下来并生成一个EIM表项;并且NAT设备允许所有外部网络的主机通过该转换后的地址和端口来访问这些内部网络的主机。这种模式可以很好的支持位于不同NAT网关之后的主机进行互访。
Address and Port-Dependent Mapping(关心对端地址和端口转换模式):对于来自相同源地址和源端口号的报文,相同的源地址和源端口号并不要求被转换为相同的外部地址和端口号,若其目的地址或目的端口号不同,通过PAT映射后,相同的源地址和源端口号通常会被转换成不同的外部地址和端口号。与Endpoint-Independent Mapping模式不同的是,NAT设备只允许这些目的地址对应的外部网络的主机可以通过该转换后的地址和端口来访问这些内部网络的主机。这种模式安全性好,但由于同一个内网主机地址转换后的外部地址不唯一,因此不便于位于不同NAT网关之后的主机使用内网主机转换后的地址进行互访。

(3) 内部服务器
在实际应用中,内网中的服务器可能需要对外部网络提供一些服务,例如给外部网络提供Web服务,或是FTP服务。这种情况下,NAT设备允许外网用户通过指定的NAT地址和端口访问这些内部服务器,NAT内部服务器的配置就定义了NAT地址和端口与内网服务器地址和端口的映射关系。

(4) NAT444端口块方式
NAT444是运营商网络部署NAT的整体解决方案,它基于NAT444网关,结合AAA服务器、日志服务器等配套系统,提供运营商级的NAT,并支持用户溯源等功能。在众多IPv4向IPv6网络过渡的技术中,NAT444仅需在运营商侧引入二次NAT,对终端和应用服务器端的更改较小,并且NAT444通过端口块分配方式解决用户溯源等问题,因此成为了运营商的首选IPv6过渡方案。

以下仅介绍入方向静态地址转换(nat static inbound)、出方向静态地址转换(nat static outbound)、入方向动态地址转换(nat inbound)、出方向动态地址转换(nat static outbound)、NAT服务器映射(nat server)等五种常用NAT类型。

1.1 入方向静态地址转换(nat static inbound)

入方向静态地址转换用于实现一个内部私有网络地址/网段/地址对象组与一个外部公有网络地址/网段/地址对象组之间的转换,具体过程如下:
• 对于经过该接口发送的内网访问外网的报文,将其目的IP地址与指定的内网IP地址/网段/地址对象组进行匹配,并将匹配的目的IP地址转换为指定的外网地址/网段/地址对象组中的地址。
• 对于该接口接收到的外网访问内网的报文,将其源IP地址与指定的外网IP地址/网段/地址对象组进行匹配,并将匹配的源IP地址转换为指定的地址/网段/地址对象组中的地址。

如果接口上配置的静态地址转换映射中指定了acl参数,则仅对符合指定ACL permit规则的报文进行地址转换。
基于地址对象组的入方向静态地址转换引用的IPv4地址对象组中,只能存在一个主机对象(host)或者一个子网对象(subnet),否则引用不生效。

1.2 出方向静态地址转换(nat static outbound)

出方向静态地址转换通常应用在外网侧接口上,用于实现一个内部私有网络地址到一个外部公有网络地址的转换,具体过程如下:
• 对于经过该接口发送的内网访问外网的报文,将其源IP地址与指定的内网IPv4地址/网段/地址对象组进行匹配,并将匹配的源IP地址转换为外网IPv4地址/网段/地址对象组中的地址。
• 对于该接口接收到的外网访问内网的报文,将其目的IP地址与指定的外网IPv4地址/网段/地址对象组进行匹配,并将匹配的目的IP地址转换为内网IPv4地址/网段/地址对象组中的地址。
如果接口上配置的静态地址转换映射中指定了acl参数,则仅对符合指定ACL permit规则的报文进行地址转换。
基于地址对象组的出方向静态地址转换引用的IPv4地址对象组中,只能存在一个主机对象(host)或者一个子网对象(subnet),否则引用不生效。

1.3 入方向动态地址转换(nat inbound)

入方向动态地址转换功能通常与接口上的出方向动态地址转换(nat outbound)、内部服务器(nat server)或出方向静态地址转换(nat static outbound)配合,用于实现双向NAT应用,不建议单独使用。
入接口动态地址转换的具体过程如下:
• 对于该接口接收到的外网访问内网的首报文,将与指定的ACL permit规则匹配的报文的源IP地址转换为地址组中的地址。
• 在指定了no-pat reversible参数,并且已经存在NO-PAT表项的情况下,对于经过该接口发送的内网访问外网的首报文,将其目的IP地址与NO-PAT表项进行匹配,并将目的IP地址转换为匹配的NO-PAT表项中记录的外网地址。
需要注意的是,该方式下的地址转换不支持Easy IP功能。

1.4 出方向动态地址转换(nat outbound)

出方向动态地址转换通常应用在外网侧接口上,用于实现一个内部私有网络地址到一个外部公有网络地址的转换,具体过程如下:
• 对于经过该接口发送的内网访问外网的报文,将与指定ACL permit规则匹配的报文源IP地址转换为地址组中的地址。
• 在指定了no-pat reversible参数,并且已经存在NO-PAT表项的情况下,对于经过该接口收到的外网访问内网的首报文,将其目的IP地址与NO-PAT表项进行匹配,并将目的IP地址转换为匹配的NO-PAT表项中记录的内网地址。

1.5 NAT服务器映射(nat server)

通过在NAT设备上配置内部服务器,建立一个或多个内网服务器内网地址和端口与外网地址和端口的映射关系,使外部网络用户能够通过配置的外网地址和端口来访问内网服务器。内部服务器通常配置在外网侧接口上。
H3C V7产品中,NAT服务器映射可分为普通内部服务器、负载分担内部服务器和基于ACL的内部服务器三种。
若普通内部服务器或者负载分担内部服务器配置中引用了acl参数,则表示与指定的ACL permit规则匹配的报文才可以使用内部服务器的映射表进行地址转换。需要注意的是,NAT仅关注ACL规则中定义的源IP地址、源端口号、目的IP地址、目的端口号、传输层协议类型和VPN实例,不关注ACL规则中定义的其它元素。
普通的内部服务器是将内网服务器的地址和端口映射为外网地址和端口,允许外部网络中的主机通过配置的外网地址和端口访问位于内网的服务器。

2 NAT类型的应用说明

2.1 单一类型的特性与应用

NAT各类型对报文的处理方式各有不同,其在不同方向的处理方式决定了最终应用的效果。具体区别可见下表:

华三防火墙vlan定义 华三防火墙配置nat_处理顺序

由此可知,以上各种类型的NAT中,静态NAT适用于部分网络双向访问,动态NAT适用于单方面发起对访问,NAT Server适用于单方面提供特定服务。

2.2 多种NAT类型的单次转换组合应用

对于一个复杂的网络,其NAT需求往往并不单一,需要将多种NAT类型结合使用来达到相应目的。以下介绍在不存在IP地址重叠的情况下,常见的单次NAT类型组合应用:

场景一、内网访问外网,同时内网对外提供特定的服务
该场景下,要求对内网出局的流量进行源地址转换,对外网访问内网服务的流量进行目的地址转换。可实现的方案如下:
方案一:在外网接口同时部署NAT Outbound和NAT Server,最优方案,推荐;
方案二:在内网接口部署NAT Inbound,外网接口部署NAT Server;
方案三:在外网接口部署NAT Outbound和NAT Static Outbound,服务器对于外网来说处于完全可访问状态,不推荐;
方案四:在外网接口部署NAT Outbound,内网接口部署NAT Static Inbound,服务器对于外网来说处于完全可访问状态,不推荐;
方案五:在内网接口部署NAT inbound和NAT Static Inbound,服务器对于外网来说处于完全可访问状态,不推荐;
方案六:在内网接口部署NAT Inbound,外网接口部署NAT Static Outbound,服务器对于外网来说处于完全可访问状态,不推荐。
针对以上六种方案,综合安全性和部署维护的复杂度来考虑,推荐首选方案一,并将方案二作为备选。

场景二、外网访问内网,并对内网提供特定服务
该场景刚好与场景一类似,只是访问方向相反。事实上,无论是出于安全的角度还是出于管理维护的角度,都应该避免该类场景的出现,如果确定有这样的需求,也应该尽量由外网来完成NAT部署。该场景要求对外网入局的流量进行源地址转换,对内网访问外网服务的流量进行目的地址转换。可实现的方案如下:
方案一:在内网接口同时部署NAT Outbound和NAT Server,最优方案,推荐;
方案二:在外网接口部署NAT Inbound,内网接口部署NAT Server;
方案三:在内网网接口部署NAT Outbound和NAT Static Outbound,服务器对于内网来说处于完全可访问状态,不推荐;
方案四:在内网接口部署NAT Outbound,外网接口部署NAT Static Inbound,服务器对于内网来说处于完全可访问状态,不推荐;
方案五:在外网接口部署NAT inbound和NAT Static Inbound,服务器对于内网来说处于完全可访问状态,不推荐;
方案六:在外网接口部署NAT Inbound,内网接口部署NAT Static Outbound,服务器对于内网来说处于完全可访问状态,不推荐。
针对以上六种方案,综合安全性和部署维护的复杂度来考虑,推荐首选方案一,并将方案二作为备选。

场景三、内网和外网完全互访
该场景要求对外网入局的流量和内网出局的流量都进行单向源地址转换。出于安全考虑,实际部署时也应避免该场景的发生,如果必要,应尽量由外网完成入局流量的NAT。可实现的方案如下:
方案一:在外网接口和内网接口都部署NAT Outbound,最优方案,推荐;
方案二:在外网接口和内网接口都部署NAT Inbound,最优方案,推荐;
方案三:在外网接口同时部署NAT Outbound和NAT Inbound;
方案四:在内网接口同时部署NAT Outbound和NAT Inbound。
针对以上四种方案,出于部署维护的复杂度来考虑,推荐首选方案一。

2.3 多种NAT类型的两次转换组合应用

除开常规需求场景外,还往往存在一些特殊的组网环境,需要更复杂的处理方式。如出于安全要求、或者因为地址重叠的原因,要求我们在单向流量中同时对源地址和目的地址进行NAT。该情况下,通常不存在完全访问的可能,或者说访问目标必须是明确的一个地址或地址集合。出于运维管理的考虑,也应该尽量避免使用该场景的NAT,不能避免的也应尽量由访问方进行源地址转换,被访问方进行目的地址转换。对于确定需要同时进行源和目的地址NAT的,V7有两种实现方式:可以通过在流量入口和出口各自进行目的地址NAT和源地址NAT,即两次NAT的方式来实现;也可以通过在一个接口上同时进行源地址和目的地址NAT,即双向NAT来实现。

场景一、内网单向访问外网,地址重叠
方案一:在内网接口部署NAT Static Outbound,在外网接口部署NAT Outbound,两次NAT;
方案二:在外网接口部署NAT Static Inbound,在内网接口部署NAT Inbound,两次NAT;
方案三:在外网接口同时部署NAT Static Inbound和NAT Outbound,双向NAT;
方案四:在内网接口同时部署NAT Static Outbound和NAT Inbound,双向NAT。

场景二、外网单向访问内网,地址重叠
方案一:在外网接口部署NAT Static Outbound,在内网接口部署NAT Outbound,两次NAT;
方案二:在内网接口部署NAT Static Inbound,在外网接口部署NAT Inbound,两次NAT;
方案三:在内网接口同时部署NAT Static Inbound和NAT Outbound,双向NAT;
方案四:在外网接口同时部署NAT Static Outbound和NAT Inbound,双向NAT。

场景三、外网单向访问内网特定服务,地址重叠
方案一:外网接口同时部署NAT Static Inbound和NAT Server,双向NAT;
方案二:外网接口同时部署NAT Inbound和NAT Server,双向NAT;
方案三:外网接口部署NAT Server,内网接口部署NAT Static Outbound,两次NAT;
方案四:外网接口部署NAT Server,内网接口部署NAT Outbound,两次NAT。

场景四、内网和外网双向互访,地址重叠
方案一:在外网接口和内网接口都部署NAT Static Outbound,两次NAT;
方案二:在外网接口和内网接口都部署NAT Static Inbound,两次NAT;
方案三:在外网接口同时部署NAT Static Outbound和NAT Static Inbound,双向NAT;
方案四:在内网接口同时部署NAT Static Outbound和NAT Static Inbound,双向NAT。
以上方案通常用于一一对应的互访,此外还可以组合使用本小节中场景一和场景二的解决方案来实现本场景的访问需求,只是会加大实施难度,并放大访问发起者的范围,降低安全性(可通过ACL减缓)。

2.4 多种NAT类型组合应用的注意事项

一、当需要添加新的需求时,应当遵循安全、易管理、维护便捷的原则,尽量避免过于繁琐的实现方式。能够通过单一NAT类型实现的功能,尽量不用NAT类型组合。对于地址重叠问题,应尽量通过沟通协调的方式来避免,技术手段仅作为最终妥协的实现方式。
二、在复杂的NAT应用场景中需要注意,当采用NAT Outbound时会产生一条NAT地址去往NULL0的黑洞路由,如果该NAT地址也同时被用于入方向的NAT,在做了入方向的NAT所在接口上,其出方向的流量会因为黑洞路由而不被NAT模块处理,进而造成NAT失效。解决该问题的方法为严格规划NAT地址,避免在多种NAT类型中重复利用NAT地址。
三、由于入方向NAT涉及到额外路由配置的问题,又存在上述可能造成故障的风险,在实际应用场景中不推荐包含此类NAT的部署方式。
四、在存在地址重叠的情况下,建议在流量入口处进行双向NAT部署,避免引入路由冲突的风险。

3 NAT相关的安全策略处理

防火墙中存在大量的NAT和安全策略,因为不同厂商在数据处理流程上的差异,其产品NAT和安全策略之间的影响不尽相同。以下对H3C V7(后文简称V7)产品的NAT和策略相关性进行说明。

3.1 策略相关说明

V7中地址对象组、服务对象组,在策略定义中都是以名称进行调用的,除系统自定义的常用协议名、多数服务对象需自行定义和命名。

1、地址对象组定义:V7中地址和地址组对象定义方式完全一致,或者说在实现上不存在地址和地址组对象的区别,在一个对象组中可以添加一个主机、一段地址或者嵌套另一个对象组作为成员。
object-group ip address 地址对象组名2
network host address 地址 //地址对象定义对象为主机
network subnet 地址段 掩码 //地址对象定义对象为地址段
network group-object地址对象组名1 //地址对象组名1为预先定义的地址对象组

2、服务对象组定义:V7中服务对象组定义与地址对象组定义类似。
object-group service 服务对象组名2
service 协议 destination eq目的端口号 //指定端口号
service 协议 destination gt参考端口号 //比参考端口号大
service 协议 destination lt参考端口号 //比参考端口号小
service 协议 destination rang 目的起始端口号 目的结束端口号 //指定端口号范围
service group-object服务对象组名1 //服务对象名1为系统预定义或手工预定义的服务对象组

3、策略定义说明:V7策略中地址只能以地址对象组的方式进行指定,不能直接使用IP地址或网段。
object-policy ip 策略名
rule 1 pass source-ip源地址对象组名 destination-ip 目的地址对象组名 service服务对象组名/系统预定义的服务名
rule 2 pass source-ip 源地址对象组名destination-ip目的地址对象组名 service 服务对象组名/系统预定义的服务名

4、区域定义
security-zone name 定义的区域名
import interface 端口类型和端口号

5、域间应用策略:策略定义后需要在安全域间应用才能生效。
zone-pair security source 定义的区域名1 destination 定义的区域名2
object-policy apply ip 定义的策略名

3.2 策略定义中与NAT相关地址对象的处理

H3C在处理路由、NAT和安全策略和ACL时遵循如下处理顺序:

华三防火墙vlan定义 华三防火墙配置nat_处理顺序_02

由此可知,当NAT和策略并存时,要使访问符合预期,策略中地址对象的定义遵循如下原则:

华三防火墙vlan定义 华三防火墙配置nat_处理顺序_03


以上表格可能并不方便实际部署实施时的理解,下表从报文中IP地址的变化角度对不同类型NAT相关的策略处理进行了描述。

华三防火墙vlan定义 华三防火墙配置nat_NAT_04