[原创] MikroTik RouterOS下 利用VRRP协议 做到旁路与主路网关之间几乎无感切换
众所周知,传统旁路的实现方式需要将网关修改为旁路由的地址,这就导致了一个弊端:
当旁路需要升级系统或者宕机等各种原因不工作后,所有需要旁路功能等终端都会断网,手动修改网关又非常繁琐。
为了解决这个问题需要用到一个协议 VRRP
什么是VRRP?
虚拟路由冗余协议VRRP(Virtual Router Redundancy Protocol)是一种用于提高网络可靠性的容错协议。通过VRRP,可以在主机的下一跳设备出现故障时,及时将业务切换到备份设备,从而保障网络通信的连续性和可靠性。
简述下VRRP是如何工作的,以下图为例:
HostA :
IP Address : 10.1.1.100/24
Gateway : 10.1.1.111/24
两台三层设备都运行 VRRP 协议,使用相同的 VRID 以及 Virtual IP Address,并且他们之间会以 Priority 来选出 Master 和Backup 设备
当HostA要访问一个地址,但是本地没有路由时就需要网关了,首先ARP请求网关的IP(10.1.1.111)所对应的MAC地址:
VRRP的MAC地址格式为:00:00:5E:00:01:VRID
得到MAC地址后就把数据包发送给VRRP虚拟出来的网关(10.1.1.111),根据两台VRRP设备的选举结果来选择到底往哪里走。
详细原理可以阅读各个厂商的手册
实操环节
实验环境概述
Requirements :
两台能运行VRRP的设备
我的实验设备 :
MikroTik CCR2004-16G-2S+ (路由器)
IP Address : 10.0.0.1/24
MikroTik CRS317-1G-16S+ (交换机)
IP Address : 10.0.0.254/24
Gateway :
CCR2004
Mac mini m2
Mac mini m2 (旁路由)
IP Address : 10.0.0.2/24
Gateway :
CCR2004
接线方式 :
CCR2004 (Bridge) <------> CRS317(Bridge) <------> Mac mini m2
路由器与交换机之间的Bridge两两之间用SFP+相连接,然后再把Mac mini m2 以光转电模块插到交换机上
配置阶段
规划设备角色 :
由于我们要把旁路由作为网关,所以连接了旁路由的交换机(CRS317)为 Master
那么当旁路由宕机后,我们要切换为主路由设备(CCR2004),所以主路由为 Backup
路由器配置 :
首先我们配置 VRRP
interface/vrrp/add name="vrrp1" interface="bridge1(LAN)" vrid=1 priority=90 preemption-mode=no

Interface: 选择Bridge
VRID: VRID需要两台运行VRRP协议的设备设置相同的数值,我这里设置为 1
Priority: 取值范围0-255。这里建议按照我的配置来,配置为 90
0表示设备停止参与VRRP备份组,用来使备份设备尽快成为Master设备,而不必等到计时器超时
255则保留给IP地址拥有者。(也就是说如果当Bridge的IP与VRRP的
Virtual IP Address相同时,优先级就为255,直接成为Master设备)
Interval: Master设备定时(Advertisement_Interval)向组内的Backup设备发送VRRP通告报文,通告自己工作正常。如果Backup设备在Master_Down_Interval定时器超时后仍未收到VRRP通告报文,则重新选举Master。这里建议默认为 1
Master_Down_Interval定时器取值为:3×Advertisement_Interval+Skew_time,单位为秒。
Skew time,计算方式为:(256-Backup设备的优先级)/256,单位为秒。
Preemption Mode: 关闭
作为Master设备的交换机当从故障恢复后,需要从Backup切换为Master。而路由作为Backup不需要抢占。
抢占模式:在抢占模式下,如果Backup设备的优先级比当前Master设备的优先级高,则主动将自己切换成Master。
非抢占模式:在非抢占模式下,只要Master设备没有出现故障,Backup设备即使随后被配置了更高的优先级也不会成为Master设备。
接下来我们要给VRRP配置一个Virtual IP Address:
这里不推荐配置为Bridge相同的IP来加快Master的选举,因为这样会影响winbox的三层连接。
这里我配置的地址为 10.0.0.253/24
ip/address/add address=10.0.0.253/24 interface=vrrp1
解决旁路的某些软件需要手动给终端配置FakeDNS,但是VRRP又无法给DNS做冗余问题:
RouterOS 7.14 版本出来了一个新接口 lo(loopback)
当我们给loopback口配置上FakeDNS后。如果旁路由故障,我们就会去请求FakeDNS时,此时终端本地没有路由,就会走三层默认路由,转发给主路由的RouterOS,RouterOS发现自己本地有loopback,那么就会把请求给loopback,从而得到DNS的解析结果
ip/address/add address=198.18.0.2/24 interface=lo
然后我们需要配置一条防火墙去允许局域网设备进入主路由去请求DNS,
src-address改为自己的局域网地址ip/firewall/filter/add chain=input action=accept src-address=10.0.0.0/24 dst-address=198.18.0.2 log=no log-prefix=""
如果你的代理工具会创建虚拟网卡,那么按照下面方法为检测代理工具是否存活做准备
以我用的Surge为例, 虚拟网卡的地址为: 198.18.0.1
添加一条静态路由:
目标地址为: 198.18.0.1
下一跳为: 旁路由的IP地址
ip/route/add dst-address=198.18.0.1/32 gateway=10.0.0.2 # 如果CRS317为Master时有默认路由走旁路可以直接去往虚拟网卡, 但是当Master变成CCR2004时就没有去往虚拟网卡的路由, 导致Netwatch一直是Down # 关于Netwatch的配置在下面会说
交换机配置 :
首先我们配置VRRP
为了选举为Master设备, 所以我们设置的priority要比Backup大,可以和我一样配置为100
当自己变成Backup后, 为了使自己主动切换回Master模式, 所以要开启抢占模式 preemption-mode=yes
interface/vrrp/add name="vrrp1" interface="bridge" vrid=1 priority=100 preemption-mode=yes
Virtual IP Address配置和上面一样, 不演示了
上面的操作仅仅是对 旁路由自身 和 去往旁路由的链路 的检测并且冗余, 当代理软件挂掉后并无法感知,还是会导致网络故障
解决方案有两个:
旁路由系统直接开启IP报文转发(网上直接查教程)
直接检测代理软件的虚拟网卡可达性
操作方法:
Host
图形界面进入
Tools-Netwatch添加一个新的
Netwatch Host, 名字任意Host: 198.18.0.1 (虚拟网卡地址)
Intervel: 3 (不建议设置过快, 如果网络波动会导致频繁切换主备)
UP
interface/vrrp/set numbers=0 priority=100 # 当代理软件的虚拟网卡可以ping通后说明代理软件故障恢复, 那么我们就改大VRRP的优先级, 让旁路由变成MasterDown
interface/vrrp/set numbers=0 priority=80 # 当代理软件的虚拟网卡无法ping通就说明代理软件故障, 我们需要走备用线路, 那么我们就改小VRRP的优先级, 让旁路由变成Backup
配置路由:
当网络走Master设备时, 应当所有的数据交由旁路由处理, 所以我们添加一条默认路由, 下一跳为旁路由, 开销为 1, 开启ping检测网关.并且需要添加comment, 后面需要用
当旁路由故障后虽然下联设备都通过VRRP切换了, 但是交换机无法切换(此时会影响更新等操作). 所以我们要再添加一条默认路由, 指向主路由(CCR2004), 开销为 2(相同的目的地址, 优先走开销小的), 旁路由正常的情况下, 这条路由不会被优选使用, 当旁路由挂了后, 开销为 1的检测网关失败, 自动disable, 此时这条开销为 2的路由就会生效. 三层从主路由出去.
ip/route/add dst-address=0.0.0.0/0 gateway=10.0.0.2 check-gateway=ping distance=1 comment='Surge' ip/route/add dst-address=0.0.0.0/0 gateway=10.0.0.1 check-gateway=ping distance=2当代理软件故障后虽然通过Netwatch切换了VRRP的优先级, 此时终端上网无影响. 但是 CCR2004本身的默认路由还是没有变化, 还是默认走旁路由, 所以我们要在Netwatch中添加语句, 来Disable去往旁路由的默认. 让CCR2004可以三层可达.
UP
interface/vrrp/set numbers=0 priority=100 :foreach route in=[/ip route find comment="Surge"] do={ /ip route enable $route }Down
interface/vrrp/set numbers=0 priority=80 :foreach route in=[/ip route find comment="Surge"] do={ /ip route disable $route }
以上就是教程全部内容了, 如有帮助请留言点赞~🥳

评论区