网络实战 | MikroTik 基于多个目标丢包检测 提高SLA准确性 实现自动路由切换

网络实战 | MikroTik 基于多个目标丢包检测 提高SLA准确性 实现自动路由切换

3 周前 20 0 0℃

网络实战 | MikroTik 基于多个目标丢包检测 提高SLA准确性 实现自动路由切换

在多出口或冗余线路的网络环境中,仅依赖接口状态或网关 ping 进行链路检测,无法准确反映真实的网络质量。当线…

一、配置目的

在实际项目环境中,网络项目基本都会部署完全不同路径的冗余线路

很多情况下物理端口状态正常,但主用线路已经无法稳定承载业务。例如延迟明显升高、丢包率持续增加、网站访问断断续续。

依赖传统的检测方式,接口 up/down、gateway ping 或 BFD 等机制,很难发现这种问题。在这些情况下,接口状态仍然是 UP,网关地址也依然可以 ping 通,从设备层面看线路似乎是正常的,实际业务已经受到影响。

为了解决此问题,可以通过检测公网稳定节点的丢包率来判断线路的真实质量,当检测丢包率持续升高并并超过阈值时自动控制路由,实现线路保护切换机制(这个和飞塔fortigate sla功能差不多)。

二、检测存在的问题

常用设备在进行链路检测时,只会选择 ping 一个公网地址,例如 223.5.5.5。这种方式简单,适合对网络要求不高的企业,但对网络运营商来说存在明显问题。

单一检测目标本身可能出现异常,目标服务器自身故障、目标网络路径出现问题、或者该目标自身网络出现波动等情况。

举例来说,即使本地线路完全正常,如果 223.5.5.5 这个服务器出现丢包,就导致检测结果异常。设备会误以为是当前线路发生故障,从而触发错误的路由切换。这种误判在生产环境中经常遇到,因此依赖单一检测目标不能准确反映线路的真实质量。

三、多检测目标的优势

为降低误判概率,可以同时检测 两个不同网络的公共节点

例如选择阿里云 DNS(223.5.5.5)和腾讯云 DNS(119.29.29.29)作为检测目标。

这两个地址分别属于不同的云服务网络体系,稳定性较高,且网络路径也不相同。

MikroTik 同时对这两个地址进行丢包检测,只有在 两个目标的丢包率同时升高 的情况下,才认为当前线路可能出现问题。如果只有其中一个地址出现丢包,而另一个检测目标仍然正常,则更可能是目标节点自身或某一段公网路径出现异常,而不是本地线路的问题。

阿里云 DNS腾讯云 DNS判断
正常正常线路正常
异常正常目标问题,线路正常
正常异常目标问题,线路正常
异常异常线路问题

通过这种方式,可以降低单一检测目标带来的误判问题,使线路质量判断更加可靠。只有当 多个独立网络节点同时表现出明显丢包 时,才触发线路异常判断,避免不必要的路由切换。

四、实现原理

  • 每次检测 ping 两个公网节点
  • 统计 ping 成功次数
  • 计算丢包率
  • 判断是否触发线路保护

逻辑规则:

条件动作
两个目标丢包率 全部 都 > 40%主路由 已经 disabled → 不重复 disable
主路由 没有 disabled → 禁用主路由
两个目标丢包率 全部 都 < 40%主路由 已经 disabled → enable 主路由
主路由 没有 disabled → 忽略

这样可以避免频繁操作路由。

五、创建检测脚本

在 RouterOS 中 /system script 创建脚本:

:local count 10

# ping 两个目标
:local s1 [/ping 223.5.5.5 count=$count interval=500ms]
:local s2 [/ping 119.29.29.29 count=$count interval=500ms]

# 计算丢包率
:local loss1 (($count - $s1) * 100 / $count)
:local loss2 (($count - $s2) * 100 / $count)

# 丢包高,只有路由未禁用才 disable
:if (($loss1 > 40) and ($loss2 > 40)) do={
    :if ([/ip route get [/ip route find dst-address=0.0.0.0/0 gateway=192.168.3.5] disabled] = false) do={
        /log warning ("Primary link packet loss high ($loss1%,$loss2%), disable route")
        /ip route disable [find dst-address=0.0.0.0/0 gateway=192.168.3.5]
    }
} else={ # 丢包恢复,路由已禁用才 enable
    :if ([/ip route get [/ip route find dst-address=0.0.0.0/0 gateway=192.168.3.5] disabled] = true) do={
        /log warning ("Primary link recovered ($loss1%,$loss2%), enable route")
        /ip route enable [find dst-address=0.0.0.0/0 gateway=192.168.3.5]
    }
}

六、创建 Scheduler 定时执行

脚本需要定期执行,因此需要配置 Scheduler。例如每 30 秒执行一次

参数说明:

参数说明
name任务名称
interval执行周期
on-event调用脚本
/system/script/run link-check

七、Policy 权限说明

RouterOS 脚本需要声明执行权限。本脚本使用:policy=read,write,test

权限作用
read读取系统状态
write修改配置
test执行 ping

脚本涉及的命令包括:

/ping<br>/ip route get<br>/ip route enable<br>/ip route disable

八、方案特点

更真实的线路检测:通过公网节点检测真实网络质量。

误判率低:使用两个不同网络的检测目标。

自动保护:丢包严重时自动切换线路。

自动恢复:线路恢复后自动恢复主线路。

避免频繁操作:脚本会先检测当前路由状态。

通过这种方式,可以在 RouterOS 中实现比企业防火墙 SLA 链路监测 更好的功能,为多线路网络环境提供稳定可靠的自动保护机制。

已复制到剪贴板