
在分享NAT地址池之前,我们要知道源NAT转换的方式包括很多,如图所示:
我们可以看到,如果不转换端口我们可以称之为1V1映射。



针对图中的Easy-IP这种转换方式,是比较常用的,利用端口号来区分内网不同的客户机,端口号有会随之进行转换,是NAPT的变种。

在华为NAT策略(Easy-ip)中,我们很明显的可以看到,转换方式就是出接口的地址,并没有去指定其公网地址,这样的话,私网地址就会转换为接口所在的地址。


NAT地址池
NAT地址池是一个虚拟的概念,它形象的把“公网IP地址的集合”比喻成一个“放IP地址的容器”,防火墙在进行地址转换时,就是从NAT地址池中挑选出一个公网IP地址,然后对私网IP地址进行转换。挑选的哪个公网IP地址是随机的,和配置顺序,IP地址大小等因素没有关系。
NAT地址池的建设适用于大量的私网用户访问互联网..(内网数量最起码有几万人或者运营商架构)。

配置NAT地址池实验拓扑图:我们需要配置防火墙的缺省路由,开启http服务。这里不在详细介绍。


在防火墙配置一条去往中国电信的缺省路由:
[Firewall-1]ip route-static 0.0.0.0 0.0.0.0 219.0.0.254


拓扑中server4开启HTTP服务,并指定路径:

这张图中存在两个Utrust区域,所以,我需要在防火墙中在定义一个untrust1的区域,命令行如下:
[Firewall-1]firewall zone name untrust1
[Firewall-1-zone-untrust1]set priority 6
[Firewall-1-zone-untrust1]add interface GigabitEthernet 1/0/3

注意的是,我们定义的这个安全级别是不允许和系统缺省安全值相同,所以这里我选择安全级别为6.


图形化界面如下:

这个拓扑中,我们可以看到的是有两个外网接口,因此,我需要做两条源NAT策略。
根据拓扑,我先做一条去往电信线路的地址池,我模拟出我向运营商申请购买了6个公网IP。地址池的名字叫做NAT_DX,端口转换默认开启。


调用刚才建立好的地址池配置一条去往中国电信链路的源NAT策略:


在防火墙上,我先做一条静态路由指向中国电信的下一跳地址:
ip route-static 219.0.1.0 255.255.255.0 219.0.0.254

安全策略也必须是放行的:

在客户端上去访问219.0.1.250这个http服务:如如所示,转换成功

站在防火墙上用命令行查看会话表:观察NAT转换过程,
[Firewall-1]display firewall session table
我们可以看到http的流量源地址和源IP都被转换成公网(这个公网地址是我地址池中的地址,这个地址是随机分配的,不是出接口的地址)的地址和端口

为了证明是随机分配的,我让图中的PC1去访问219.0.1.250.随之查看会话表,看看是不是分配给了地址池中的某个地址,如如所示,证明随机分配了地址池中的某个地址。
从图中,我们能看到ICMP(icmp是没有端口号)报文的源地址和源识别号字段都发生了变化。公网地址也是地址池中的地址。


NAT No-PAT
No-PAT在华为官方中表示不进行端口转换,所以NAT No-PAT方式只转换IP地址,也可以叫做“一对一地址转换”。这种方式应用场景比较少。
站在华为防火墙的地址池配置页面中,我们可以看到这个选项:不勾选允许端口转换的话,源端口不能转换的话,问题会出现在不同用户之间会发生端口冲突!

上图中的允许端口地址转换为灰色不可选择,我们需要到源NAT策略中,将转换方式转为出接口方式,取消原有的地址池方式。

到地址池中,我们定义一个地址池,并将允许端口转换状态去掉。并且地址池中的地址定义为一个219.0.0.3公网地址。

这样,我们配置完成之后,明显的看到NAT的类型为No-PAT的方式了:也可以看到端口地址转换方式为一个不允许的状态。

最后,我们还是要修改回源NAT策略中地址池的方式:


为了更好清楚的看清防火墙会话表的情况,我先清理下会话表:
<Firewall-1>reset firewall session table


查看会话表:源地址的源端口竟然没有发生转换,和转换出的公网端口号保持一致。

但是,我们发现其他客户端去访问这个网站的时候,就无法访问了,原因在于刚才我们看到会话表中,这个公网地址已经被Client 1占用了,这时候pc1再去访问这个外网就无法访问了。(谁先发出数据包,谁就占用这个地址池中唯一的公网地址。)

注意的是:NAT No_PAT会生成 server-map表,而且生成了正向和反向的两条表项:
这里生成的正向Server map表作用是保护特定私网用户访问Internet时,可以快速转换地址,,因为转换方式为No-pat,一个私网用户就对应一个公网地址,那么在一段时间之内,私网用户在访问Internet报文,直接命中server-map表进行地址转换,提高了处理效率!同理,外网用户访问私网用户,也是直接命中servermap表,值得注意的是,命中Server-mapbiao 之后,报文还要经过安全策略的检查,所以配置的时候一定要注意!


目的NAT(重定向)
应用场景不常用,转换为目的地址!主要应用在转换手机用户WAP网关地址,使手机用户可以正常上网。了解一下,不做演示!
美版或者国外的手机内置WAP网关地址会指向国外的运营商,这时候可以在设备中做一个重定向,改变手机默认网关地址。这里不做详细介绍

NAT黑洞路由
所谓的黑洞路由,就是一个让报文“有去无回”的路由(实际上一个环路,下文会详细演示。),配置NAT黑洞路由的效果就是让防火墙丢弃命令黑洞路由的报文。
简单介绍下,NAT黑洞路由是如何产生的?
在企业的实际应用场景中,一个出口网关的实际接口IP地址可能和NAT地址池中的地址会配置两个不同网段的Ip 地址如图所示:我分配的一个地址和我接口上的地址是不在一个网段。我图中会分配一个210.0.0.1或者220.0.0.1的这个地址,反正就是与接口地址不在一个网段罢了。

先在企业防火墙中的网络接口配置一个IP地址:(实际应用上镜中,防火墙的一个接口可以配置多个IP地址,这个IP地址一定是从运营商处合法申请而来的IP地址)这里,我就写一个地址。

防火墙设备上配置一条缺省路由条目:保证私网用户能够对外网服务器的路由可达!
ip route-static 0.0.0.0 0.0.0.0 219.0.0.254

拓扑中运营商的的路由器上配置两条条去往这个地址的静态路由:因为运营商敢给你这个地址,一定是有去往这个地址的路由条目,就可以用动态路由来操作。
ip route-static 219.0.0.0 255.255.255.0 GigabitEthernet0/0/0
ip route-static 220.0.0.0 255.255.255.0 219.0.0.1



那么,会有初学者认为,如果是这样的情况私网用户用的是NAT地址池中的地址的不能够正常的去访问外网。因为你用的是地址池中的220.0.0.1这个地址去访问的外网,而你接口的地址却是219.0.0.1。


先来验证客户端是否能够和外网服务器通讯:如图所示,PC1是能够和外网服务器取得联系。

在Pc1访问外网219.0.1.250的时候,我抓取防火墙外网接口地址报文,查看下NAT转换的情况,看看是不是源地址被转换成了NAT地址池中的220.0.0.1这个地址:

嗅探到的报文如下,如图所示,抓取到的ICMP报文中的源地址就编程了220.0.0.1这个地址,回程路由的源地址也是这个。因此,以认为在华为NAT转换中,转换的地址可以出接口的IP地址不在同一个网段之中!

这时候黑洞路由就产生了,当网络管理员申请了一个在防火墙出接口上不在同一网段的公网地址,会出现外网某个用户在Ping这个公网地址时,会产生如下问题:
模拟外网用户Ping 220.0.0.1这个地址

这里,我只Ping一次!因为防火墙接口没有配置这个IP地址,这里ping包会失败。其实,这里Ping不通最主要的原因在于:因为NAT地址池中的地址,只有在转换私网地址的时候才会用到,相当于企业中内网用户必须先发起访问请求,防火墙收到该请求后才会为其转换地址,NAT地址池并不对外提供任何的单独服务,所以,这里我用公网用户访问这个NAT地址池中的地址,报文是无法穿越过防火墙的,因此肯定是Ping不通的!

Ping的同时,我抓取防火墙的外网接口报文:真是不看不知道,一看吓一跳!来自外网的219.0.1.250这个用户就对着我这个220.0.0.1这个IP地址Ping了一次,如图所示:
产生了好多个icmp的请求报文!数量多达255个!

经过报文分析,报文中中的TTL值逐一递减,最后变为1,众所周知,TTL是报文的盛传时间,每经过一台设备的转发,TTL的值减1,当TTL值为0时,就会被设备丢弃,这说明公网的这个用户是主动访问NAT地地址中的地址,在防火墙和运营商路由器之间相互转发,形成环路报文!

形成环路的原因在于:当外网用户访问的数据包(源地址是219.0.0.1目的地址是220.0.0.1)达到防火墙时

防火墙会查看自己的路由表:发现该数据包中的目的地址不是自己的直连网段(防火墙没有意识到该报文的目的地址是自己NAT地址池中的地址),最后只能通过默认路由进行转发,这样的话,这个报文就从同一个接口进同一个接口出!!相当于这个报文在同一个安全区域流动,默认情况下,这样的行为是不受安全策略的控制,这个数据报文又被出接口发送到了运营商路由器。

中国电信这台路由器接收到这个报文,再次查找自己的路由条目,找到去往220.0.0.1这个路由条目,还是发给了防火墙,这样如此反复,这个ICMP的请求报文,就被可怜的像踢皮球一样在防火墙和运营商之间来回传递,直到TTL值为0!

因此,如果大量的类似报文涌进防火墙,将会对防火墙性能造成严重影响!
为避免这个情况,我们需要配置一条基于NULL0口的精确的静态路由条目:
[Firewall-1]ip route-static 220.0.0.1 32 NULL 0
这个Null0口,我们叫做垃圾接口,作用就是:当外网用户Ping这个地址,设备会把这个报文送到这个黑洞接口中去,让报文一去不复返!


实验结果演示:还是让外网用户去访问这个NAT地址池中得地址,抓取防火墙外网接口报文:图中结果只产生了一条ICMP请求报文(因为我在外网中只发起了一条icmp报文请求)
但是抓取的报文除了一条ICMP请求报文,我还意外的发现了一条ARP广播报文,华为官方解释的是:当运营商路由器收到公网PC访问这个防火墙NAT地址池的报文,会发送ARP请求,防火墙也会回应着个ARP请求,只是为了建立一个交互过程,这个无需担心。







