在多出口或冗余线路的网络环境中,仅依赖接口状态或网关 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 链路监测 更好的功能,为多线路网络环境提供稳定可靠的自动保护机制。
基于真实环境整理,如需进一步沟通,可通过页面右侧方式与我联系。