拿这个图来说吧,上面是外网,下面是内网,内网使用两台防火墙做出口,然后在防火墙上面配置了NAT和NAT Server。我现在来就双机热备基础下,NAT会出现什么问题做一个讨论。
这个问题是什么意思呢?如果我们要访问nat server公布出来的外网地址,那么我们的第一步肯定是进行arp操作,如果我们没有进行其他的操作和修改,那么当arp请求报文发送两台防火墙上的时候,防火墙会发现这个arp请求的就是nat server公布出去的公网地址,于是它就会进行arp的单播应答。所以单播应答的对象可能是左边的防火墙,也可能是右边的防火墙。
第二个如果此时主墙down掉了,那么原先访问nat server公布出来的公网地址的主机或者路由器手里持有的是失效的arp,虽然备墙依然可以正常工作,但是还是要等待其arp失效后才可以正常通信。
将nat server和vrrp结合?什么意思呢,就是说两台防火墙之间通过hrp心跳线去协商哪台防火墙去进行nat server的响应。
主备模式
在主备模式下,因为因为只有active状态的防火墙下的nat server才是处于active状态的,也就是可以进行响应的,备墙当收到对应的arp请求报文的时候会进行忽略。默认情况下系统已经将与出接口同网段的nat server绑定到一个最小的vrrp id组下,因为是主备模式,所以防火墙之间的角色已经确定,所以系统自然而然地将主墙作为nat server的响应者,备墙就不会进行响应。而且和vrrp一样,其他终端学习到的nat server公布的公网地址的对应MAC地址是一个一个虚拟地址,和vrrp构造虚拟地址的规则一样为;01-00-5e-00-00-0x
负载模式
在负载模式下,如下图所示,因为nat server的配置命令是会周期同步过去的,所以两台防火墙上都会存在nat server的配置命令,这就导致若nat server公布出来的地址若与vrrp接口同网段,则会引发两台防火墙都进行arp响应的情况。其实和主备并没有什么十分大的差别,因为是负载模式,所以两台都可以正常地进行nat server的映射,所以此时就人为地进行指定哪个nat server与哪个vrrp组进行绑定。如下图所示,为了完成防火墙的对外负载,所以防火墙上联交换机的时候会做两个vrrp组,比如是组1和组2,那么我们就可以人为设定nat server1与vrrp组1进行绑定,nat server2与vrrp组2进行绑定,当然如果你只有一个nat server需要向外公布,那么就只需要绑定一个vrrp组。
如图nat server 和vrrp绑定并拥有了状态active和standby,只有active的nat server才能进行arp的响应和后续工作的进行,然后vrrp又和VGMP联动,进行相关组角色的管理,最终达成只有一台防火墙对外公布nat server的效果。下面是核心命令,因为我也没有操作过,但是大概的意思应该是这样。
在ensp进行拓扑还原的时候,发现使用主备模式的时候,我们在两台防火墙上进行nat server的公布,但是最终并没有达到文档中说的效果,外网去访问nat server公布的地址的时候,依然会学习到两台防火墙其中一台的arp映射,而不是说只学习到主墙的arp映射。
什么意思?看下面这个图:
上图中防火墙配置的是主备的模式,针对内网主机创建vrrp组1,针对外网创建vrrp组2。从上图看出左边的防火墙是主要的流量承载单位,那么若上图中的路由器想要ping地址池中的地址的时候,因为地址池的地址与vrrp组1的地址同网段,这就使得上图路由器发出arp请求的时候,两台防火墙都会进行应答,因为它们使用的是相同的nat 地址池,这就导致arp的频繁变动。
产品文档中说在主备模式下nat地址池会自动绑定到vrrp组号小的vrrp组中,我觉得最好还是手动绑定一下吧,如果上面的vrrp组号不是最小的,那不是绑定错了。将nat地址池与vrrp组绑定后,主要vrrp组是active的,它才会响应arp请求,于是右边的防火墙的nat地址池因为vrrp组的状态是standby所以就不会响应arp请求了。
如图所示,防火墙对外呈现两个IP地址,所以防火墙对外公布两个vrrp组,因为是负载模式,所以不可能说你对外呈现负载,对内就不负载了,所以对内也是使用两个vrrp组进行负载均衡。区域1使用vrrp组3为网关,区域2使用vrrp组4为网关,也就是说区域1走左边,区域2走右边。两个区域使用的是不同的地址池。当外网的路由器ping左边的防火墙的中地址池的地址,因为两个地址池的地址以及对外呈现的vrrp都是同网段的,所以当路由器发出有关左边防火墙地址池的arp请求的时候,两台防火墙都会做出回应,发出有关右边防火墙地址池的arp请求的时候,同样两台防火墙也会做出回应。所以此时就将左边防火墙的地址池与vrrp组1绑定,右边防火墙的地址池与vrrp组2绑定,那么同样的,只要绑定的vrrp组为active的时候才能进行arp的响应。这样就解决了问题。
答案是不好,因为如果使用了负载模式还只使用一个nat地址池,那么按照上面的做法,将一个nat地址池与一个vrrp组绑定,只有绑定了active的vrrp的地址池才做arp响应,那么这就导致如果进行arp响应的只有绑定了active的vrrp组的地址池会进行arp响应,所以另一台防火墙是不会做出关于这个地址池的任何arp回应。但是这样可不可以正常通信?其实是可以的,即便我在不做出arp响应的防火墙上进行地址转换,一般来说最终回来的时候还是从这台防火墙上回来,为什么?因为nat本来就有着屏蔽内网的作用,所以一般来说是内网主机做主动的访问,而不是外网主机做主动的访问,所以内网主机的流量做了nat后,流量在途径的过程中,设备记录的有关转换后的IP地址的对应的mac地址是不做arp回应的防火墙的出接口mac,而不会是响应arp请求的防火墙的出接口mac。除非说防火墙上的相关会话时间比arp死亡时间还长,而且在arp消亡的这个过程中,内部主机和外部主机之间还没有任何的流量通信,由此导致arp记录的清除需要重新申请arp,这时获取到的IP与mac地址的映射是做出回应的那台防火墙的出接口mac地址,即便如此还是可以正常通信的。那么当网络中若碰巧真有这么多这样的会话,那么是否会导致arp频繁改动呢?不见得吧,因为就如我所说,只有内部主机和外部主机之间还没有任何的流量通信,由此导致arp记录的清除需要重新申请arp,只有这种情况下才会发生arp的请求,除非说真的就这么巧,一大堆的会话都是这样。
什么叫使用相同的nat池资源?顾名思义就是比如我们配置了地址池,假设我们使用的源NAT技术是no-PAT,此时两台内网主机使用不同的防火墙进行nat上网,但是由于会话同步的不及时,导致两台主机使用了相同的nat地址,比如使用的地址都是1.1.1.22,那么数据包在回包的时候将会出现混乱转换的问题。对于NAPT也是一样,虽然NAPT对地址和端口进行了复用,但是还是有可能出现两台主机使用了相同的nat池资源的情况,比如:
主机1:源192.168.0.1 :11122 【1.1.1.1 :33333】 11.11.11.1 :80
主机2:源192.168.0.2 :11123 【1.1.1.1 :33333】 11.11.11.2 :80
这样的话与no-PAT出现的问题类似,在回包的时候依然会出现混乱转换的问题。
所以为了解决这个问题,于是就出现了下面这一条命令:
文档里面没有给出具体的例子,但是据我的理解应该是这样的。因为防火墙双方使用相同的源NAT配置,所以通过指定哪台防火墙是primary,哪台是secondary,于是primary防火墙在进行nat操作的时候,使用的nat资源是原有的nat资源中的一半,这一半是系统指定的,另一半nat资源在另一台防火墙上使用,这样就解决了下源nat资源错误分配的情况。
我在ensp里面做了测试,不知道和真机是否有差别。测试拓扑如下:
1、搭建好基本的互联环境,上面为外网,下面为内网
2、左边设置为主墙,右边为备墙,在主墙上配置NAT server并同步到备墙上
3、在外网主机PC17上去ping nat server公布出来的公网地址先进行第一步连通性测试
4、将主墙上联的接口去除,因为没有hrp track该接口,所以主墙的角色不会改变,此时再使用PC17去ping nat server公布出来的地址,最后发现可以ping通
1、搭建好基本的互联环境,上面为外网,下面为内网
2、左边设置为主墙,右边为备墙,在主墙上配置NAPT并同步到备墙上
3、在内网主机PC18上去外网主机PC17公布出来的公网地址先进行第一步连通性测试
4、将主墙上联的接口去除,因为没有hrp track该接口,所以主墙的角色不会改变,此时再使用内网主机PC18去ping外网主机PC17,最后发现可以ping通。
双机热备的整个套餐:VGMP,HRP,VRRP是互相仅仅依赖,互相帮助的,但是它们并不会直接影响防火墙上面的其他功能模块,我之前也在模拟器上测试过防火墙在备墙的角色下运行ospf,如果将流量强行引流到备墙上看它是否能够转发,最后发现是可以的。所以这和上面的nat测试结果也是一样的,备墙的身份并不会阻止它原有的功能。在防火墙三层上联路由下联路由的场景中,防火墙与其他路由器使用OSPF进行动态路由的建立,备墙通过增大OSPF的cost来使得流量不会从它那里经过,但是并不是说它本身就拒绝了数据的转发。当然这只是我在模拟器下测试出来的结果。很有可能在真机中通过双机热备模块的阻挠,使得防火墙上面的转发功能全部都被叫停,但是我觉得还是我这个更合理一些。因为我感觉完全没有必要。