在我们所熟悉的局域网中,通常采用下图的拓扑进行布线配置。
路由器R可以使用PC机充当,它的eth0和eth1分别是连接外网和内网的接口,IP地址设置如上图所示。因而eth1就成为下面主机(H)的网关,也即下一路的地址,故下面主机的网关都要手工配置为eth1的IP,192.168.0.1。
为主机配置网关,也即决定路由的下一跳路由,方法有很多,如运态路由算法,ICMP发现机制和上述这种手工配置方法等等。通常在一个局域网中,主机数多不会很多,如果采用动态路由算法的话,则会产生大量的数据包,并且如果有主机(路由器)出现中断时,由于协议收敛需要一定的时间,因而会出现网络所谓的“黑洞”。而采用静态配置方法而减少为维护协议而产生的数据包,但是会产生单点失效的现象,如果网送受到攻击或失效,那整个网络都不能与外界通信。
VRRP(Virtual Router Redundancy Protocol)协议正是解决静态网关出现单点失效现象的路由协议。VRRP在一个局域网中由多个路由器共同实现一个虚拟路由器,并指定一个竞选协议动态把该虚拟路由器分配到一个VRRP路由器中。在下文中把用于共同实现VRRP的路由器称为VRRP路由器。VRRP通过指定竞选协议来提供一个虚拟路由器的功能,并且协议所有通信都采用IP多播报文。虚拟路由器由VRID(virtual router identifier)唯一标识,即一个标识标记一个虚拟路由器。在参与的VRRP路由器中,通过包装在IP多播报文中的VRRP报文中的ID值来标识该虚拟路由器,并且在局域网中每个VRID只能对应一个虚拟路由器。
所有的VRRP路由器,都有三种状态,分别是Initiation, Master和backup。第一种状态Initiation表明该VRRP路由器还没有进行竞选,所对应的接口没有正常工作。Master状态表示该VRRP路由器为主控状态,它肩负着虚拟路由器的重任,所有对虚拟路由器的请求它都要一一回复。backup状态表明该VRRP路由器处理备份状态,它不能处理任何对虚拟路由器的请求,相对主处于Master状态的VRRP而言,它充当备份的角色,如果Master状态的VRRP路由器突然失效或掉线,那么它有会从backup状态切换成master状态,处理对虚拟路由器的任何请求。
虚拟路由器通常由多个VRRP路由器至少两个组成,在稳定状态时只有一个为Master状态,多个为Backup状态。每个VRRP路由器通过预设的优先级(Priority)进行竞选进而成为主控路由器或备份路由器。既然由所有VRRP路由共同组成一个虚拟路由器,那么该虚拟路由器的工作方式与实现路由器应该是一样的,故虚拟路由器会一个或多个虚拟IP地址和一个虚拟MAC地址。同样处于Master状态的VRRP路由器称为主控路由器,而处于backup状态的称为备份路由器。
前面提过,每个VRID只能对应一个虚拟路由器,但是局域网内是可以有多个虚拟路由器。因为每个虚拟路由器表现为一真实的路由器,有自己的IP地址和MAC地址。同样,每个真实路由器是可参与到多个虚拟路由的。它会根据接收到的VRRP报文中的VRID值来识别虚拟路由器,并进行状态的切换。
使用VRRP协议后,局域网的拓扑结构也变为如下图如所示:
+-----------+ +-----------+
| Rtr1 | | Rtr2 |
|(MR VRID=1)| |(BR VRID=1)|
| | | |
VRID=1 +-----------+ +-----------+
IP A,vIP ---------->* *<--------- IP B
| |
| |
------------------+------------+-----+--------+--------+--------+--
^ ^ ^ ^
| | | |
(vIP) (vIP) (vIP) (vIP)
| | | |
+--+--+ +--+--+ +--+--+ +--+--+
| H1 | | H2 | | H3 | | H4 |
+-----+ +-----+ +--+--+ +--+--+
图例:
---+---+---+-- = 以太网,令牌网或FDDI
H = 主机
MR = 主控路由器
BR = 备份路由器
* = IP Address
(IP) = 主机的默认路由
在上图中,Rtr1和Rtr2运行VRRP协议,组成一个虚拟路由器,VRID值为1。根据设置的优先级,此时Rtr1为主控路由器,它除了具有自身的IP地址外,还有具有vIP(虚拟IP地址),即虚拟路由器的IP地址;而Rtr2为备份路由器,只具有自己的IP地址。下面的主机只需把虚拟IP作为自己的网关。如Rtr1丢线或失效,那么Rtr2会成为主控路由器,处理所有对虚拟路由器的请求,这样它除了本身的IP地址,还具有 vIP,可以及时地为下面的主机进行转发数据包。
从上面的例子可以看到,路由器Rtr1和Rtr2运行VRRP协议,共同组成一个虚拟路由器。此虚拟路由器由一个主控路由器和多个备份路由器组成。它们过能VRRP的竞选协议进行自已切换状态。无论VRRP路由的状态如何改变,对于下面的主机,它们组成的虚拟路由器是不会发生变化的,因为它的虚拟IP地址和MAC地址是不会发生改变的,即使主控路由器发生了变化,新的主控路由器会把虚拟路由器所对应虚拟IP地址和虚拟MAC地接管过来,处理对虚拟IP和MAC的请求。
在上图中,只有当Rtr1失效或丢线时,Rtr2才充当主控路由器;否则所有从主机通向外网的流量都通过Rtr1,从而使得Rtr1和Rtr2负载不均衡。依此,可以使Rtr1和Rtr2参与到两个VRRP中去,对于每个路由器,在参与的两个虚拟路器中分别为主控路由器和备份路由,就可以实现负载均衡了,如下图所示:
+-----------+ +-----------+ | Rtr1 | | Rtr2 | |(MR VRID=1)| |(BR VRID=1)| |(BR VRID=2)| |(MR VRID=2)| VRID=1 +-----------+ +-----------+ VRID=2 IP A, vIP1 ---->* *<-------- IP B,vIP2 | | | | ------------------+------------+-----+--------+--------+--------+-- ^ ^ ^ ^ | | | | (vIP1) (vIP1) (vIP2) (vIP2) | | | | +--+--+ +--+--+ +--+--+ +--+--+ | H1 | | H2 | | H3 | | H4 | +-----+ +-----+ +--+--+ +--+--+ 图例: ---+---+---+-- = 以太网,令牌网或FDDI H = 主机 MR = 主控路由器 BR = 备份路由器 * = IP Address (IP) = 主机的默认路由
在此图中,Rtr1和Rtr2参与两个VRRP, VRID分别是1和2。Rtr1在VRID=1的虚拟路由器中允当主控路由器,而在VRID=2的虚拟路由器中充当备份路由器;相反,Rtr2在VRID=1的虚拟路由器中充当备份路由器,在VRID=2的虚拟路由器充当主控路由器。两个虚拟路由器的虚拟IP分别是vIP1和vIP2。一部分主机使用vIP1为网关,而另一半部使用vIP2为网关。这样主机通往外面的流量由Rtr1和Rtr2平均分担。而当其中某一路由器失效时,另一个路由器会在VRID=1和2的两个虚拟路由器中成为主控路由,所有主机的通往外面的流量都由它来处理。因此,在VRRP协议中,某一路由器失效或掉线都不会影响下面主机的正常通信。故VRRP的使用路由的冗余来使得网络更加可靠。
在本节中介绍VRRP协议的通信方式和报文,在下节将会介绍它的竞选机制。
VRRP协议的通信报文用于与其它的VRRP路由器进行通信,用于向其它VRRP路由器告知自己参与的VRID以及在此VRID对应虚拟路由器中的优先级和状态。VRRP报文封装在IP报文中,目标地址为分配给VRRP协议使用的IPv4的多播地址。
下面是VRRP协议通信的报文格式,它封装在IP报文中。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Type | Virtual Rtr ID| Priority | Count IP Addrs|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Auth Type | Adver Int | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP Address (1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| . |
| . |
| . |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP Address (n) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication Data (1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication Data (2) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
下面介绍VRRP报文中各字段的意义:
Version(4bit): 描述VRRP协议报文的版本,当前最新版本为2。
Type(4bit):表明VRRP报文的类,版本2的VRRP协议只定义唯一一种VRRP报文,值如下:
1 ADVERTISEMENT(广播)
如果报文中的Type不是为1,则该报文将被丢弃。
Virtaul Rtr ID(VRID)(1Byte):VRID用于标识它参与的虚拟路由器,大小为1到255。
Priorty:表示该VRRP路由器的优先级,数值越大则优先级越高,该字段为8位的无符号整数。
其中优先级为0表示主控路由器停止参与VRRP,用于让备份路由器迅速切换成主控路由器,而不用等到原来主控路由器信息超时才切换。
Count IP Addrs:表示虚拟IP地址的个数
Authentication Type:表示验证采用的方法。8位级成的无符号整数,当前的值如下:
0 - 不使验证方法
1 - 保留
2 - 保留
在早期的VRRP规范说明[RFC2338]中定义了几种验证方法,其中值为1和2是与早期的VRRP协议相互兼容,至现在为止,最新的规范[RFC3768]将它值限制为0,但同时对1和2不再作验证处理,只是与原来的协议相一致。
Advertisement Interval (Adver Int):表示两个ADVERTISEMENT报文的时间间隔(单位为秒),默认为1。如果VRRP路由器配置出错或状态不正确,通过竞选协议和该字段值可使VRRP路由切换到正确的状态。
Checksum:用于检测VRRP报文中的数据是否出错。
IP Address(es):虚拟路由器的IP地址列表,可为一个或多个IP地址。
Authentication Data:验证数据,在当前最新的VRRP规范说明中不使用该字段,只需设置为全0。它只是与早期的VRRP协议相互兼容。
刚才说过,VRRP报文封装在IP报文中,VRRP协议对它的承载体IP报文有严格的限制,要求如下:
Source Address(源地址):应为路由器的真实IP地址
Destionation Address(目标地址):使用由IANA分配给VRRP的IP多播地址:224.0.0.18。这是局域网内的多播地址,路由器不能转发目标地址为224.0.0.18的报文,不管它的TTL是否不为0。
TTL(生存周期):承载VRRP的IP报文中的TTL必须为255。如果VRRP路由器接收到任一个TTL不为255的IP报文将丢弃它。
Protocol(协议):VRRP协议在IP报文中的编号,值为112(由IANA分配)。
运行VRRP协议的VRRP路由器对外组成一个虚拟路由器,其中之一处于Master状,称为主控路由器,而其它的处于backup状态,称为备份路由。起初没有主控路由器,或者主控路由器丢线,再者主控路由器不参考VRRP协议,那么将选择一个优选级最高的备份路由器成为主控路由器,这需VRRP的竞选机制来维护各个VRRP路由器的状态。
为了方便描述,下面是每个VRRP路由器都具有的参数。
VRID 它所参与的虚拟路由器的ID,它决定发出的VRRP报文中的irtual Rtr ID (VRID)。
Priority VRRP路由器的优先级,它决定发出的VRRP报文中的Priority。
IP_Address 虚拟路由器的虚拟IP地址,同样它决定发出的VRRP报文中IP地址的个数和IP地址值。
Advertisement_Interval:两个ADEVERTISEMENTS报文的时间间隔,默认为1,决定VRRP报文中的Adver Int。
Skew_Time 主控路由放弃参与VRRP时备份路由器切换成主控里面所需等待的时间,值用如下公试计算:
( (256 - Priority) / 256 )
Master_Down_Interval:处于backup状态的VRRP路由器会用到此值,如果在一段长为Master_Down_Interval时间内没有收到主控中路由器的ADEVERTISEMENT报文将认为它失效或丢掉。该值计算机如下:
(3 * Advertisement_Interval) + ( (256 - Priority) / 256 )
Preempt_Mode:表明竞选机制是否可抢占的。当一个备份路由器的优先级比主控路由器的优先级还要高时,如果是可抢占,则备份路由器则把状态变为Master,原来的主控路由器状态变为backup;如果是不可抢占,则只有等主控路由器失效或掉线时,高优先级的备份路由器才能变为Master状态。
与上面定义的两个时间间隔对应,定义两个定时器,一个在主控路由器使用,另一个在备份路由器使用:
Master_Down_Timer 如果在时间段为Master_Down_Interval内没有收到主控路由器的ADVERTISEMENT报文,此定时间器激活。在备份路由器中使用。
Adver_Timer 此定时时用于主控路由器广播一个ADVERTISEMENT报文,时间间隔为Advertisement_Interval。在主控路由器中使用。
VRRP路由器在竞选机制中,将会在三种状态中相互转换。下介绍依次介绍处于三种状态向其它状态转换的条件和过程。
Initialize状态表明该路由器还没有正常工作,它不做任何事情,它只等待一个start up事件。如果一个start up事件到来(如ifup命令),它将完成如下事件:
处于Master状态的VRRP路由器,必须肩负虚拟路由器的任务,转发地址为虚拟路由器IP地址的所有报文。处于此状态的VRRP路由器,必须:
回复目标为虚拟路由器IP地址的ARP请求。
转发数据链路层目的MAC地址为虚拟路由器MAC地址的报文
如果报文的目的地址为虚拟路由器的IP地址,而不是路由器的真实地址,则不接受。
如果报文的目的地址为虚拟路由器的IP地址,同时路由器的真实地址,则接受。