上期强叔为大家讲解了网络可靠性的作用,以及防火墙与路由器可靠性的区别,并初步介绍了防火墙双机热备功能的基本概念。我想小伙伴们一定已经迫不及待地想要了解双机热备功能是如何实现的了。

熟悉路由器和交换机的小伙伴们一提到网络可靠性,首先想到的肯定是VRRP协议,其实防火墙的双机热备功能也是在VRRP协议的基础上扩展而来的。所以本节我们会首先介绍VRRP的基本概念和实现原理,之后我们会讲解VRRP在防火墙双机热备应用中遇到的问题,以及如何通过双机热备的核心VGMP协议来解决VRRP的问题。最后我们会通过VGMP报文结构的详解来初步揭开VGMP实现原理的面纱,并体会VRRP报文在防火墙中的变化。

1  VRRP的来龙去脉

在上期讲的路由器或防火墙可靠性组网(双机热备)中,流量被引导到主用还是备用设备都是由上下行设备的路由表决定的。这是因为动态路由可以根据链路状态动态调整路由表,自动将流量引导到正确的设备上。但如果上下行设备运行的是静态路由呢?静态路由可是无法动态调整的啊。

下面我们就来看一个例子:如下图所示,主机将Router设置为默认网关。这样当主机想访问外部网络时,就会先将报文先发送给网关,再由网关传递给外部网络,从而实现主机与外部网络的通信。正常的情况下,主机可以完全信赖网关的工作,但是当网关故障时,主机与外部的通信就会中断。

如下图所示,如果想要解决网络中断的问题,我们就需要添加多个网关(Router1Router2)。但一般情况下主机不能配置动态路由,而且只会配置一个默认网关。如果我们把Router1设置成默认网关,那么当Router1出现故障时,流量无法被自动引导到Router2上。这时只有手工调整主机的默认网关为Router2,才能将主机的流量引导到Router2上。但是这样必然会导致主机访问外网的流量中断一段时间,从而影响用户业务的正常运行。而且大型网络中的主机是成百上千的,通过手动调整网络实现网关备份显然是不切实际的。

 

为了更好地解决由于网关故障引起的网络中断问题,网络开发者提出了VRRP协议。VRRP是一种容错协议,它保证当主机的下一跳路由器(默认网关)出现故障时,由备份路由器自动代替出现故障的路由器完成报文转发任务,从而保持网络通信的连续性和可靠性。

如下图所示,我们将局域网内的一组路由器(实际上是路由器的下行接口)划分在一起,形成一个VRRP备份组。VRRP备份组相当于一台虚拟路由器,这个虚拟路由器有自己的虚拟IP地址和虚拟MAC地址(格式:00-00-5E-00-01-{VRID}VRIDVRRP备份组的ID)。所以,局域网内的主机可以将默认网关设置为VRRP备份组的虚拟IP地址。在局域网内的主机看来,他们就是与虚拟路由器进行通信的,然后通过虚拟路由器与外部网络进行通信。


VRRP备份组中的多个路由器会根据管理员指定的VRRP备份组优先级确定各自的VRRP备份组状态。优先级最高的VRRP备份组状态为Master,其余VRRP备份组状态为BackupVRRP备份组的状态决定了路由器的主备状态。VRRP备份组状态为Master的路由器称为Master路由器VRRP备份组状态为Backup的路由器称为Backup路由器Master路由器正常工作时,局域网内的主机通过Master路由器与外界通信。当Master路由器出现故障时,一台Backup路由器VRRP优先级次高的)将成为新的Master路由器,接替转发报文的工作,保证网络不中断。

2  图解VRRP工作过程

强叔在这里采取一种图说的方式来呈现VRRP工作的全流程,借此帮助小伙伴们来理解VRRP的实现原理。大家只要看完并记住下面的图,就一定能理解并记忆VRRP协议。

1、 管理员在路由器上配置完VRRP备份组和优先级后,VRRP备份组会短暂的工作在Initialize状态。当VRRP备份组收到接口Up的消息后,会切换成Backup状态,等待定时器超时后再切换至Master状态。


2、在VRRP备份组的多个路由器中,率先将VRRP备份组状态切换成Master的路由器将会成为Master路由器。VRRP备份组优先级越高的路由器,他的定时器长越短,越容易成为Master路由器。这个根据VRRP备份组优先级确定Master路由器的过程称为Master路由器选举。

选举成功后,Master路由器会立即周期性(缺省为1秒)地向VRRP备份组中内的所有Backup路由器发送VRRP报文,以通告自己的Master状态和优先级。


3、同时Master路由器会发送免费ARP报文,将VRRP备份组的虚拟MAC地址通知给与它连接的交换机。下行的交换机的MAC表项会记录虚拟MAC地址与端口Eth0/0/1的对应关系。


4、由于内网的PC将网关设置为VRRP备份组1的虚拟IP地址,所以当内网PC访问Internet时,首先会在广播网络中广播ARP报文,请求虚拟IP地址对应的虚拟MAC地址。这时只有Master路由器会回应此ARP报文,将虚拟MAC地址回应给PC


5PC使用虚拟MAC地址作为目的MAC地址封装报文,然后将其发送至交换机。交换机根据MAC表记录的MAC地址与端口的关系,将PC发送的报文通过端口Eth0/0/1转发给Router1

 

      以上讲的是正常情况下,Master路由器和Backup路由器的状态建立和运行过程。下面将介绍Master路由器和Backup路由器的状态切换和运行过程。

1、当Master路由器发生故障(Router1整机或接口GE1/0/1故障)时,他将无法发送VRRP报文通知Backup路由器。Backup路由器有这样一个机制:如果Backup路由器在定时器超时后仍不能收到Master路由器发送的VRRP报文,则认为Master路由器故障,从而将自身状态切换为Master


还有一种情况:当Master路由器主动放弃Master地位(如Master路由器退出VRRP备份组)时,会立即发送优先级为0VRRP报文,使Backup路由器快速切换成Master路由器。

2、当VRRP备份组状态切换完成后,新的Master路由器会立即发送携带VRRP备份组虚拟MAC地址和虚拟IP地址信息的免费ARP报文,刷新与它连接的设备(下行交换机)中的MAC表项。下行的交换机的MAC表项会记录虚拟MAC地址与新的端口Eth0/0/2的对应关系。

 

3、当内网PC将报文发送给交换机后,交换机会将PC发送的报文通过端口Eth0/0/2转发给Router2。这样内网PC的流量就都通过新的Master路由器Router2转发了。这个过程对用户是完全透明的,内网PC感知不到Master路由器已经由Router1切换成Router2

4、当原Master路由器(现Backup路由器)故障恢复后,优先级会高于现在的Master路由器。这时如果配置了抢占功能,原Master路由器会将状态切换成Master,重新成为Master路由器;如果没有配置抢占功能,原Master路由器将仍然保持Backup状态。


3  多个VRRP状态相互独立产生问题

上面强叔为大家讲解了VRRP协议,描述了如何通过VRRP实现网络的可靠性。VRRP的图解看起来确实美如画,那么VRRP一定是完美无瑕了吗?其实并不是这样的。VRRP本身还是存在问题的,而我们下面讲到的VGMP正是为了解决VRRP的问题而诞生的。

上面讲到通过在网关的下行接口运行VRRP,可以解决网关的可靠性问题。如果我们在网关的上行和下行接口上同时运行VRRP,这时情况会是怎样的呢?

现在我们就一起来看一下:如下图所示,两台FW(作为内外网用户的网关)的下行接口加入VRRP备份组1,上行接口加入VRRP备份组2。正常情况下,FW1VRRP备份组1的状态为ActiveVRRP备份组2的状态为Active,所以FW1VRRP备份组1中的Active路由器,也是VRRP备份组2Active路由器。这样由我们上面讲的VRRP原理可知,内外网之间的业务报文都会通过FW1转发。


【强叔问答】上面我们在讲解VRRP时提到的状态都是“Master”和“Standby”,这里为什么都变成“Active”和“Standby”了呢?

答:防火墙在NGFW版本中统一将双机热备(原为“Master”和“Slave”)和VRRP(原为“Master”和“Standby”)的状态修改为“Active”和“Standby”。所以当你在某些文档中看到这些以前的状态请不要奇怪,按本文描述的“Active”和“Standby”理解即可。

    如下图所示,当FW1GE1/0/1接口故障时,VRRP备份组1发生状态切换:FW1VRRP备份组1状态切换成InitializeFW2VRRP备份组1状态切换成Active。这样FW2成为VRRP备份组1中的Active路由器,并向LSW1发送免费ARP报文,刷新LSW1中的MAC表项。这时PC1访问PC2(内网访问外网)的报文就通过FW2转发了。

但是由于FW1LSW2之间的链路是正常的,所以VRRP备份组2的状态是不变的,FW1仍然是VRRP备份组2中的Active路由器,而FW2仍是VRRP备份组2中的Standby路由器。因此PC2返回给PC1的回程报文依然会转发给FW1,而FW1的下行接口GE1/0/1是故障的,所以FW1只能丢弃此回程报文,这就导致了业务流量的中断。


看完这个过程后,聪明的小伙伴们就会发现VRRP问题的所在了:VRRP备份组之间是相互独立的,当一台设备上出现多个VRRP备份组时,他们之间的状态无法同步。

这个问题是VRRP无法适应防火墙的致命因素,既然VRRP自身无法克服这两点,自然会有高手及时登场。一方唱罢,一方登场,这一点上IP江湖跟现实世界没什么不同!

4  VGMP的产生解决了VRRP的问题

为了解决多个VRRP备份组状态不一致的问题,华为防火墙引入VGMPVRRP Group Management Protocol)来实现对VRRP备份组的统一管理,保证多个VRRP备份组状态的一致性。我们将防火墙上的所有VRRP备份组都加入到一个VGMP组中,由VGMP组来集中监控并管理所有的VRRP备份组状态。如果VGMP组检测到其中一个VRRP备份组的状态变化,则VGMP组会控制组中的所有VRRP备份组统一进行状态切换,保证各VRRP备份组状态的一致性。

VGMP 有状态和优先级两个基本属性,并且有三条基本运行原则:

VGMP的状态决定了组内VRRP备份组的状态,也决定了防火墙的主备状态。

VGMP组的状态是由两台防火墙的VGMP组通过比较优先级来决定的。优先级高的VGMP组状态为Active,优先级低的VGMP组状态为Standby。

VGMP组会根据组内VRRP备份组的状态变化来更新自己的优先级。每个VRRP备份组的状态变成Initialize VGMP组的优先级就会降低2

了解并熟记了VGMP的基本原则后,下面我们一起来看VGMP如何解决VRRP问题。

如下图所示,我们在FW1上将VRRP备份组1VRRP备份组2都加入状态为ActiveVGMP组,在FW2上将VRRP备份组1VRRP备份组2都加入状态为StandbyVGMP组。由于VGMP组的状态决定了组内VRRP备份组的状态,所以FW1VRRP备份组12的状态都为ActiveFW2VRRP备份组12的状态都为Standby。这样FW1就是VRRP备份组1VRRP备份组2中的Active路由器(也就是两台防火墙中的主用设备),而FW2就是他们的Standby路由器(也就是两台防火墙中的备用设备),所以上下行的业务流量都会被引导到主用设备FW1转发。


如下图所示,当FW1的接口故障时,VGMP组控制VRRP备份组状态统一切换的过程如下:

1、  FW1GE1/0/1接口故障时,FW1上的VRRP备份组1发生状态切换(由Active切换成Initialize)。

2、  FW1VGMP组感知到这一故障后,会降低自身的优先级,然后与FW2VGMP组比较优先级,重新协商主备状态。

3、  协商后,FW1VGMP组状态由Active切换成StandbyFW2VGMP组状态由Standby切换成Active

4、  同时,由于VGMP组的状态决定了组内VRRP备份组的状态,所以FW1VGMP组会强制组内的VRRP备份组2Active切换成Standby状态,FW2VGMP组也会强制组内的VRRP备份组12Standby切换成Active状态。

这样FW2就成为了VRRP备份组1VRRP备份组2中的Active路由器,也就成了为两台防火墙中的主用设备;而FW2则成为了VRRP备份组1VRRP备份组2中的Standby路由器,也就成为了两台防火墙中的备用设备。

5、  FW2会分别向LSW1LSW2发送免费ARP,更新他们的MAC转发表,使PC1访问PC2的上行报文和回程报文都转发到FW2。这样就完成了VRRP备份组状态的统一切换,并且保证业务流量不会中断。


详解VGMP报文结构

看到以上内容大家应该明白,VGMP不仅完成了VRRP备份组的统一管理,还借势取代VRRP接管了对防火墙主备状态的管理权。那么这时问题来了:

两台防火墙的VGMP组是如何传递VGMP的优先级信息的?

两台防火墙的VGMP组的状态协商和切换过程,以及报文交互过程到底是怎样的呢?

在前面的VRRP图解中讲到两台路由器的VRRP备份组是通过VRRP报文来传递优先级信息的。那么两台防火墙的VGMP组还是通过VRRP报文和机制来传递优先级信息的吗?这当然不太可能,新的领导自然有新的方法。两台防火墙的VGMP组是通过VGMP报文来传递优先级信息的。VGMP是华为的私有协议,他为了实现防火墙双机热备功能对VRRP报文进行了扩展和修改,并衍生出多种使用VGMP报文头封装的报文。理解VGMP报文和报文头是理解VGMP状态协商和切换的基础,所以让我们先看一下VGMP报文的结构。

说明:本篇所讲到的VGMP报文结构适用于适用于USG2000/5000/6000系列防火墙和USG9000系列防火墙的V1R3版本。


      如上图所示,从VGMP报文封装顺序中我们可以发现,VGMP报文是根植于VRRP报文的,是由VRRP报文头封装的。但这个VRRP报文并不是标准的VRRP报文,是经过华为扩展和修改的,具体有以下几点变化:

标准VRRP报文的“Type”字段只有“1”一个取值,我们增加了“2”取值。也就是说如果Type=1,就是标准的VRRP报文;如果Type=2,就是我们修改后的VRRP报文。

标准VRRP报文的“Virtual Rtr ID”字段代表VRRP备份组ID,而修改后的VRRP报文“Virtual Rtr ID”取值固定为“0”。

修改后的VRRP报文中去掉了标准VRRP报文的“IP Address”字段。

标准VRRP报文中的“Priority”字段在VRRP报文头中被修改成“Type2”字段 

Type2=1时,报文封装成心跳链路探测报文。心跳链路探测报文用于检测对端设备的心跳口能否正常接收本端设备的报文,以确定是否有心跳口可以使用。

Type2=5时,报文封装成一致性检查报文。一致性检查报文用于检测双机热备状态下的两台防火墙是否配置了相同的策略。

Type2=2时,VRRP报文才会进一步封装VGMP报文头,并根据VGMP报文头中“vType”字段继续分成以下三种报文:

VGMP报文(VGMP Hello报文)VGMP Hello报文用于两台防火墙间的VGMP组协商主备状态。这也正是我们问题的答案所在。

HRP心跳报文(HRP Hello报文)HRP心跳报文用于探测对端设备是否处于工作状态。主用设备会每隔一段时间(缺省为1s)向备用设备发送HRP心跳报文,用来通知主用设备处于工作状态。如果备用设备在三个周期内没有收到HRP心跳报文,则认为主用设备故障,而自身切换成主用设备。

HRP数据报文。我们还需要在VGMP报文头后继续增加HRP报文头,才能封装成HRP数据报文。HRP数据报文用于主备设备之间的数据备份,包括命令行配置的备份和各种状态信息的备份。

看到这里大家是否会问,在防火墙双机热备中VRRP报文是用来封装VGMP报文的,那标准的VRRP报文还存在么,它还有什么作用?答案是标准VRRP报文仍旧存在,它还是用于VRRP备份组内部通信。只是其中的优先级字段(Priority)已经为固定值,无法配置,所以标准VRRP报文实际上已名存实亡。优先级字段失去作用导致标准VRRP报文已经无法控制VRRP备份组的状态选举了,只能在主备防火墙之间通告一下VRRP备份组的状态和虚拟IP地址了。这跟宪政体制下的“皇帝”的作用相似,保留名号,但没有管理国家的权利。VGMP想要接管防火墙和VRRP备份组的状态管理,就意味着VGMP报文必须中要包含VGMP组优先级信息。我们再看一下VGMP报文头的结构:

mode”字段表示是请求类型报文还是应答类型报文。

vgmpID”字段表示VGMP组是Active组还是Standby组。

Priority”字段表示VGMP组的优先级。

    这点表明VGMP备具备接替标准VRRP报文管理VRRP备份组和防火墙状态的物质基础。

综上所述,VGMP协议修改了标准的VRRP报文并定义好了各种使用VGMP报文头封装的报文,那么这些报文是通过什么渠道在两台防火墙之间传递的呢?上面我们讲到两台防火墙通过备份通道(心跳线)来传递备份数据,可见HRP数据报文是通过备份通道传输的。实际上以上所讲各种报文(除标准VRRP报文),包括VGMP报文都是通过备份通道传输的

另外USG6000系列防火墙和USG2000/5000系列V3R1版本防火墙还支持将以上所讲的各种VGMP和HRP报文(除标准VRRP报文)封装成UDP报文,具体结构如下:

       

那么只使用VRRP封装的报文和使用UDP封装的报文有什么区别?前者是组播报文,不能跨越网段传输,不受安全策略控制;后者是单播报文,只要路由可达就可以跨越网段传输,但是受安全策略控制。具体点来说就是如果是组播报文,那么两台防火墙的心跳口之间就必须直连或通过二层交换机相连,但是不需要配置安全策略;如果是单播报文,那么两台防火墙的心跳口之间可以通过路由器这种三层设备相连,但是需要配置安全策略允许报文在local区域与心跳口所在安全区域间双向通过。

讲完VGMP的报文结构大家应该能回答“两台防火墙的VGMP组是如何传递VGMP的优先级信息的”这个疑问了吧?答案就是两台防火墙的VGMP组通过备份通道(心跳线),利用VGMP报文来传递优先级信息

这时小伙伴们一定还会关心第二个问题:两台防火墙的VGMP组的状态协商和切换过程,以及报文交互过程到底是怎样的呢?强叔是否能够像图解VRRP工作过程一样,图解VGMP的状态切换过程呢?欲知详情如何,且听下回分解。