zl程序教程

您现在的位置是:首页 >  其他

当前栏目

learning:vrrp plugins (2)

2023-02-19 12:21:05 时间

上一节介绍了learning:vrrp基本配置(1),本文主要介绍vrrp 单播模式及vrrp上行链路监测功能。

vrrp 单播模式

VRRP默认工作在组播模式下,所有通告报文都会向224.0.0.18的组播地址发送,产生众多的无用信息,并且会产生干扰和冲突,所以需要将其组播的模式改为单播。这是一种安全的方法,避免局域网内有大量的vrrp造成虚拟路由id的冲突。

vpp的vrrp插件已支持单播模式,下面说一下配置单播模式的命令行如下:

vpp1配置

set interface state GigabitEthernet2/4/0 up
set interface ip address  GigabitEthernet2/4/0 192.168.90.100/24
#vrrp vr添加时增加单播模式,
vrrp vr add GigabitEthernet2/4/0 vr_id 1 priority 200  accept_mode 192.168.90.50 unicast
#设置对端IP地址,通告报文发送ip地址。
vrrp peers GigabitEthernet2/4/0 vr_id 1 192.168.90.101

vpp2配置同vpp1配置,这里就不再赘述了。

在测试中发现vrrp master设备上vrrp接口并不会落虚ip地址,分析代码确认是在通告报文处理流程中,判断如果是单播模式,不会下发虚拟ip地址。所以不清楚是代码bug还是单播模式使用场景的问题。但是通过修改代码是接口可以落虚拟ip地址,并且测试也没有发现问题。 修改diff文件如下:其中vrrp在删除时,存在内存泄漏,也进行了修改。

diff --git a/src/plugins/vrrp/vrrp.c b/src/plugins/vrrp/vrrp.c
index 2f6386242..01c324840 100644
--- a/src/plugins/vrrp/vrrp.c
+++ b/src/plugins/vrrp/vrrp.c
@@ -227,8 +227,8 @@ vrrp_vr_transition_addrs (vrrp_vr_t * vr, vrrp_vr_state_t new_state)
   if (vrrp_vr_is_owner (vr))
     return;

-  if (vrrp_vr_is_unicast (vr))
-    return;
+  //if (vrrp_vr_is_unicast (vr))
+    //return;

   /* only need to do something if entering or leaving master state */
   if ((vr->runtime.state != VRRP_VR_STATE_MASTER) &&
@@ -696,6 +696,7 @@ vrrp_vr_add_del (u8 is_add, vrrp_vr_config_t * vr_conf)
       vrrp_vr_tracking_ifs_add_del (vr, vr->tracking.interfaces, is_add);
       vrrp_vr_addrs_add_del (vr, is_add, vr->config.vr_addrs);
       mhash_unset (&vrm->vr_index_by_key, &key, 0);
+      vec_free (vr->config.peer_addrs);
       vec_free (vr->config.vr_addrs);
       vec_free (vr->tracking.interfaces);
       pool_put (vrm->vrs, vr);

vrrp track配置

VRRP网络传输功能有时需要额外的技术来完善其工作。如上图所以,Master路由器到达Internet网络的链路突然断掉时,主机无法通过此Master路由器远程访问远程网络。此时,可以通过监视指定接口上行链路功能,解决这个问题。当Master路由器发现上行链路出现故障后,主动降低自己的优先级(使Master路由器的优先级低于Backup路由器),并立即发送VRRP报文。Backup路由器接收到优先级比自己低的VRRP报文后,等待Skew_Time切换为新的Master路由器。从而,使得能够到达此网络的Backup路由器充当VRRP新的Master路由器,协助主机完成网络通讯。

VRRP利用BFD技术监视上行链路连接的远端主机或者网络状况。由于BFD的精度可以到达10ms,通过BFD能够快速检测到链路状态的变化,达到快速切换的目的。 vpp配置监视上行链路命令行如下:

vrrp vr track-if add  GigabitEthernet2/4/0 vr_id 1 track-index 1 priority 120

track-index:标识上行接口索引。 priority :需要降低优先级的大小。上行链路故障后,Master主链路新的优先级等于vrrp设置优先级减去当前配置的优先级。 注意:如果当前vrrp协议已经启动后,配置track功能是无法生效的,需要重启操作。

vpp代码中判断上行链路正常的标识接口管理状态up,物理link状态ip及接口配置对应ip地址。否则认为上行链路存在异常。代码判断函数如下:

static int
vrrp_intf_is_up (u32 sw_if_index, u8 is_ipv6, vrrp_intf_update_t * pending)
{
  int admin_up, link_up, ip_up;

  admin_up = vrrp_intf_sw_admin_up (sw_if_index, pending);
  link_up = vrrp_intf_hw_link_up (sw_if_index, pending);
  ip_up = vrrp_intf_ip_up (sw_if_index, is_ipv6, pending);

  return (admin_up && link_up && ip_up);
}