0%

VRRP协议简析

知其所以然,故志不惑。

名词解释

  • VRRP:Virtual Router Redundancy Protocol,虚拟路由冗余协议
  • RFC:Request For Comments,是由互联网工程任务组(IETF)发布的一系列备忘录。文件收集了有关互联网相关信息,以及UNIX和互联网社群的软件文件,通常被用作指导网络协议和软件开发的参考文献。
  • HA:High Availability,高可用性

VRRP是什么

Virtual Router Redundant Protocol 虚拟路由冗余协议,运行在TCP/IP体系网络层的协议,VRRP协议可以让多个设备按一定的优先级来共享一个虚拟IP技术,当主节点失效的时候,其他节点会根据配置的优先级竞争这个虚拟IP,从而保证这个IP的访问可靠性,保证了网络的高可用性。

graph LR
0[客户端]
1[网关]
2[服务]
0-->1
1-->2

我们用上面的图表示一个简单的客户端访问服务的过程。

假如上图中,网关 这个角色出现了异常,客户端就没有办法正常访问服务。

而假如有VRRP协议出现

graph LR
0[客户端]
1[虚拟IP网关]
2[服务]
3[VRRP-master]
4[VRRP-backup]

0-->1
1-->2
subgraph VRRP
    3-->|抢占|1
    4-.-|等待|1
end

即便master设备无法服务,只要backup服务正常,用户也能正常访问服务。

我认为,VRRP的优点在于,只需要参与虚拟IP竞争的设备配置VRRP即可,而对于其他设备,他们只需要访问虚拟IP就可以了,因此,这个方案非常容易在现有的方案中搭建起来。

VRRP工作位置

VRRP工作在TCP/IP网络模型的网络层,基于IP协议。

VRRP的RFC

VRRP协议我搜到两个RFC,一个是V2版本,一个是V3版本

V1版本去哪里了???

其中RFC3768 对应VRRP v2版本,这个版本只支持IPv4。
RFC5798对应VRRP v3版本,这个版本支持IPv4和IPv6。

相关RFC链接放在文末引用。

需要注意的是,RFC2338也是VRRP的定义,但是被RFC3768代替。

我在家里使用的是VRRP v2版本,下文主要基于VRRP v2版本进行展开

VRRP名称定义与解释

以下定义翻译自RFC3768,即VRRP v2

VRRP Router

运行VRRP协议的路由设备,可能又一个或多个 Virtual Router 组成

Virtual Router

一个被VRRP协议管理的抽象路由器对象,又一个Master节点和多个Backup节点组成。

IP Address Owner

IP地址拥有者,这个设备对应着master状态的VRRP节点,会响应所有跟这个IP关联的网络数据包。

Primary IP Address

VRRP节点本身的IP地址,当发送VRRP广播信息时,通过这个IP地址发送

Virtual Router Master

运行在Master模式的VRRP节点,拥有VRRP组IP的使用权,承担对访问这个IP的响应。

Virtual Router Backup

运行在Backup模式的VRRP节点,监听Master的运行状态并在Master节点失效时尝试竞争。


以下内容在RFC文档1.3章节上没看到定义,但在后面的章节中有解释,并且在实际应用中需要

虚拟IP地址

VRRP设备组会共享使用一个IP地址,并由Master节点获得使用权,这个IP地址我称作虚拟IP。

虚拟MAC地址

这个地址是根据VRID生成的虚拟MAC地址,格式为

1
00-00-5E-00-01-{VRID} (in hex in internet standard bit-order)

VRID

RFC3768 5.3.3章节
虚拟路由器的ID,范围0~255。在VRRP组内每个节点应该有唯一ID标识符。

Priority

RFC3768 5.3.4章节
VRRP节点的优先级,用于在竞选时确定master节点。

VRRP客户端状态机

对于运行VRRP客户端的机器,他们有三种运行状态

  • Initialize:初始化状态,这个状态VRRP是不可用的,当服务刚启动或异常时会进入这个状态
  • Master:工作设备,接管虚拟IP的所有流量,并定期发送VRRP通告报文
  • Backup:待命状态,接收master的报文,判断是否需要进行新的master设备竞选

这三个状态时可以互相切换的

graph LR
0[Initialize]
1[Master]
2[Backup]

0<-->1
1<-->2
2<-->0

Initialize 状态

这个状态的目的是为了等待一个启动事件,如果收到启动事件后,则会有两种情况
第一种 VRRP组配置的虚拟IP地址与节点物理地址一样
这种情况下,这个节点优先级自动更新为255,发送组播并进入master状态
如果不是第一种情况
则设置一个接收计时器,并进入Backup状态(计时器运行结束后仍然没收到Master的广播的话,就进入选举流程)

Backup状态

这个状态的的目的是为了监控Master节点的可用性,处于Backup模式时,RFC定义了必须执行以下的操作

  1. 不允许响应对虚拟IP的ARP请求
  2. 目的MAC地址与虚拟路由器MAC地址相同的请求必须被DROP掉
  3. 不允许ACCEPT接收对虚拟IP的访问请求
  4. 如果在这个模式收到关闭事件,则要取消接收计时器并回归Initialize状态
  5. 如果接收计时器到期但没有收到Master节点发送的”心跳包”,则发送组播,设置发送计时器并进入Master模式
  6. 如果在接收计时器到期之前收到组播数据包,在下面详细解析

收到的组播信息中优先级为0

重新设置接收计时器的倒计时为一个缓冲时间

优先级为0的包表明,master节点自己主动要放弃master位置

如果收到非0优先级的组播包

开启了抢占模式

如果优先级大于自己的,则重置接收计时器的倒计时
否则就丢弃这个组播包,这样当接收倒计时结束后,就会进入切换到master状态的流程。

没开启抢占模式

重置接收计时器的倒计时

Master状态

这个状态接管虚拟IP,扮演VRRP组内生效的路由器的身份。RFC文档定义必须满足如下要求

  • 必须响应针对虚拟IP地址的ARP请求
  • 必须FORWARD转发目的地MAC地址与虚拟MAC地址相同的数据包
  • 必须ACCEPT接受访问虚拟IP的数据包
  • MUST NOT accept packets addressed to the IP address(es) associated with the virtual router if it is not the IP address owner. 这个我没太看明白啥意思
  • 如果收到关闭事件,则取消发送计时器,并发送一个包含优先级为0的组播,然后切换到Initialize状态
  • 如果收到组播包中的优先级大于自身,则切换到Backup模式
  • 如果收到的组播中优先级与自身相等,则根据节点物理IP地址的大小来判断谁最终获取master节点权限,另一方则进入backup流程

需要注意的是,VRRP组内通信并不是广播,VRRP使用IANA分配的组播地址224.0.0.18,通过这个组播地址在组内进行消息通信。

VRRP工作模式

抢占模式

在抢占模式下,如果Backup设备的优先级比当前master设备的优先级高,则Backup设备竞争成为master设备

非抢占模式

这个模式下,只要master在正常运行,后加入的高优先级Backup设备,或者修改配置提高优先级的Backup设备,不会抢占master设备的位置,当master设备挂掉的时候,backup再重新选举竞争。

两种模式的选择

我认为,如果VRRP设备组内的工作能力不一样,比如一个设备的效果更好,另一个设备只能提供基本的服务,这种情况下,可以使用抢占模式,并且让效果更好的设备当master节点,这样一来,假如master设备出现故障又重新恢复,用户可以继续享受更高质量的服务。这种模式在master失效到恢复的过程中,会发生两次切换。

而如果VRRP组内设备提供的能力基本一致,这种时候可以考虑使用非抢占模式,因为VRRP虽然是提供高可用性的协议,但是当master节点失效或者重新竞争的时候,都会发生路由的切换,切换期间可能会导致用户的使用体验降低,所以尽可能当有设备失效时,只进行一次切换。

总结来说:
尽可能提供高质量服务: 抢占模式
尽可能提供稳定的服务: 非抢占模式

VRRP v2报文解析

VRRP v2报文结构
version:表明当前VRRP协议版本,在VRRP v2中,此字段为2。
type:表明报文类型,本协议中自定义了1(Advertisement),如果收到其他值则会丢弃
virtual Rtr ID:字段表明VRRP组内的ID标识符
priority:字段表明优先级,用于竞争master
Count IP Addrs:表明这个报文中包含的虚拟IP数量
AuthType:认证模式,0(None),1(Password),2(MD5)
Adver Int:宣告默认间隔,缺省配置为1秒
在Checksum后面包含IP地址,然后是用于认证的字段,如果认证模式为0(None),则认证字段为0。

备注

在Linux系统上,可以通过安装配置Keepalived功能实现VRRP。在Mikrotik RouterOS的路由器中,内置了VRRP的支持,在配置界面配置参数即可。