有什么路由器/协议/方案能做到基于链路质量的故障切换

hxdyxd 2026-08-15 13:37 1

假如有两条 VPN 线路:


R1 ===== R3 ===== R4  
PRIMARY (成本可接受,低延迟,大宽带,假设 100Mbps )

R1 ----- R2 ----- R4
BACKUP (成本超高按流量计费,更稳定,主要做备份)

我希望能保障 R1-R4 的链路高可用


故障


假如今天:
R1 ───────── R3
100M

未来某天:
R1 ───────── R3

20M

丢包/延迟暴涨

根据链路质量快速切换


     正常
R1 ─────── R3 ────── R4
100M

↓ 质量恶化

R1 ─────── R2 ────── R4
BACKUP

目标


R1-R3 正常

所有业务走 R3

R1-R3 拥塞,丢包 > 5%| RTT 大于 50ms (只是举例,可能有其他判断办法)

优先走 R1-R2

R1-R3 恢复

再切回 R1-R3

我发现普通的多 wan 路由器做的很差

大多只能负载均衡(类似 ECMP )

或者主备(类似 ospf ),主链路“断线”才切,丢包很高也不认为是异常


我在几个节点之间做了 ospf ,确实能做到切换

不过因为“断线”才切换,实际体验很差


感觉这个需求非常常见,一直不到合理而且主流的方案

最新回复 (15)
  • r6cb 08-15 13:54
    1
    跑个脚本监控丢包率然后做切换不就行了?想要更智能的可以参考 clash 的 smart 内核那样用机器学习判断什么时候切换
  • cyaki 08-15 13:58
    2
    用这个 https://frrouting.org/; 能做到断开时自动切换
  • isbase 08-15 13:59
    3
    surge 的 Smart Group 最好用 只要有一个线路正常就不会感知到挂了
  • anyplace 08-15 14:00
    4
    IP 层方案,有偿
  • kome 08-15 14:53
    5
    写个脚本,如果两个 VPN 链路均 UP ,当前路由的这一条路由条目,如果不满足要求,则将当前路由条目的优先级降低。
    应用层去做监控,调整网络层的路由优先级。没玩过软件定义网络 SDN ,可能 SDN 能做到,
  • lsylsy2 08-15 15:13
    6
    mptcp 算一个,但是我实测公网并不是特别好用,你可以调研一下
  • Yien 08-15 15:20
    7
    fortigate vm 试试?看起来 SDWAN 可以满足。
  • titanium98118 08-15 16:30
    8
    fortigate 的 sd-wan 可以满足你的需求
  • yayoi 08-15 16:46
    9
    这不是路由的基本功能吗,关键词 路由 选路 开销,慢慢玩去吧。
  • ixiaoyui 08-15 16:47
    10
    华为 nqa 与静态路由联动,设置 icmp 探测,连续失败 X 次触发联动切换静态路由,可以达到秒级切换,但几乎无法避免断线,切换路由后 nat 表大概率也需要重建。
  • JiangT 08-15 17:18
    11
    华为路由器的智能路由策略 Smart Policy Routing ,其他网络厂商肯定也有类似的功能或者解决方案,我这就抛个砖
    https://support.huawei.com/hedex/hdx.do?docid=EDOC1100408788&id=ZH-CN_TASK_0177871837
  • vopsoft 08-15 17:34
    12
    Babel 可以看下这个动态路由协议

    对于非专业用户 easytier 其实做的也错了,它是自己实现的类 ospf 更轻
  • someonesnone 08-15 18:06
    13
    装 openwrt 搓一个脚本定时检查, 然后用不同口的 metric 来调节优先级就行了, 我甚至写了个脚本让 openclash 自动检查然后帮我选不需要 cf 人工校验的节点
  • SAGAN 08-15 18:37
    14
    我试过 bgp (Linux bird) over wireguard 。能用。但是本质上也是断线才切,做不到根据链路质量自动切换线路。

    可以自己用脚本动态改变各个线路的路由 priority / metric ,其实都不用上动态路由协议。但是难点在于 vpn 链路质量很难准确检测:

    - 简单的主动 ping / tcp ping 测试的延迟和丢包无法真实反映线路质量。特别是如果测试的线路现在是闲置状态,你把流量负载切过去后的真实质量可能完全是另一回事。
    - 被动检测 vpn 里跑的 tcp 连接的延迟、重传等指标判断链路状态:理论上可行,但是找到的几个开源项目都比较老,都没有用 eBPF 。而且最关键的是这种方式不 future proof ,因为未来的趋势是 quic 这种全加密,网络层根本拿不到可以检测的元信息。
    - 用脚本定期跑 iperf 测试:这个我觉得甚至可能是实际效果最准确的链路质量检测方式。但是不优雅。而且会占用较多网络带宽。
  • Frankom 08-16 10:56
    15
    已经有在这方面研究,你可以期待一下: https://github.com/FrankoonG/rendr

    目标正是达成 故障 无感切换的“无损迁移”机制,等这框架完成的同时,我也会去写配套的面板。
* 帖子来源V2EX
返回