EdgeRouter X 5口版基于带宽阈值的Failover配置求助
EdgeRouter X 5口版基于带宽阈值的Failover配置求助
问题描述
我现在用的是EdgeRouter X 5口版,已经配置了双WAN Failover:WAN1接eth0,WAN2接eth1,主备模式。目前WAN1带宽是10Mbps,WAN2是8Mbps。遇到的问题是:当WAN1没完全断网,只是带宽降到很低(比如1Mbps或0.5Mbps)时,Failover不会触发,WAN2无法切换上来。
我想要实现的是:当WAN1带宽降到自定义的XX Mbps时,自动切换到WAN2;当WAN1带宽回升到XX Mbps以上,且持续XX分钟的恢复时间后,切回WAN1,所有XX值都可手动设定。
我翻遍了Ubiquiti官方的用户手册,都没找到相关配置方法,求助各位大佬!
解决方案
EdgeRouter默认的Failover是基于链路连通性(比如ICMP检测),没法直接基于带宽阈值触发,但我们可以结合监控工具+自定义脚本+路由策略来实现这个需求,具体步骤如下:
1. 启用带宽监控
首先要开启对WAN1接口的带宽采集,用collectd工具来实现:
# 配置社区软件源 configure set system package repository community components main set system package repository community url http://packages.ubnt.com/community set system package repository community distribution er-rtos commit save exit # 安装collectd及相关工具 apt update && apt install collectd collectd-utils
编辑/etc/collectd/collectd.conf,添加接口监控配置(替换eth0为你的WAN1接口):
vi /etc/collectd/collectd.conf
加入以下内容:
LoadPlugin interface <Plugin interface> Interface "eth0" IgnoreSelected false </Plugin>
重启collectd服务:
systemctl restart collectd
2. 编写带宽检测脚本
创建一个脚本/config/scripts/wan-bandwidth-check.sh,用来检测WAN1实时带宽并触发路由切换:
#!/bin/bash # 自定义参数,按需修改 THRESHOLD=5 # 触发切换的带宽阈值(单位:Mbps) RECOVERY_TIME=300 # 恢复切回的等待时间(单位:秒,示例为5分钟) WAN1="eth0" # WAN1接口名 WAN1_GW="192.168.1.1" # WAN1网关地址 WAN2="eth1" # WAN2接口名 WAN2_GW="10.0.0.1" # WAN2网关地址 # 获取WAN1出口5秒平均带宽,转换为Mbps CURRENT_BW=$(collectdctl getval $WAN1/if_octets/tx | awk '{print $2 * 8 / 1000000}') CURRENT_BW=$(printf "%.1f" $CURRENT_BW) # 判断是否低于阈值,触发切换 if (( $(echo "$CURRENT_BW < $THRESHOLD" | bc -l) )); then # 切换到WAN2(调整路由优先级) ip route add default via $WAN2_GW dev $WAN2 metric 10 ip route del default via $WAN1_GW dev $WAN1 metric 1 echo "$(date): WAN1带宽$CURRENT_BW Mbps低于阈值,已切换到WAN2" >> /var/log/wan-failover.log else # 检查是否满足恢复时间,切回WAN1 LAST_SWITCH=$(grep "切换到WAN2" /var/log/wan-failover.log | tail -1 | awk '{print $1, $2}') if [ ! -z "$LAST_SWITCH" ]; then TIME_DIFF=$(($(date +%s) - $(date -d "$LAST_SWITCH" +%s))) if (( $TIME_DIFF > $RECOVERY_TIME )); then ip route add default via $WAN1_GW dev $WAN1 metric 1 ip route del default via $WAN2_GW dev $WAN2 metric 10 echo "$(date): WAN1带宽恢复至$CURRENT_BW Mbps,等待$TIME_DIFF秒后切回" >> /var/log/wan-failover.log fi fi fi
替换脚本中的网关地址为你的实际配置,然后赋予执行权限:
chmod +x /config/scripts/wan-bandwidth-check.sh
3. 设置定时任务
用cron定期执行脚本,比如每10秒检测一次:
crontab -e
添加以下内容:
* * * * * /config/scripts/wan-bandwidth-check.sh * * * * * sleep 10 && /config/scripts/wan-bandwidth-check.sh * * * * * sleep 20 && /config/scripts/wan-bandwidth-check.sh * * * * * sleep 30 && /config/scripts/wan-bandwidth-check.sh * * * * * sleep 40 && /config/scripts/wan-bandwidth-check.sh * * * * * sleep 50 && /config/scripts/wan-bandwidth-check.sh
4. 验证配置
手动执行脚本测试:
/config/scripts/wan-bandwidth-check.sh
查看日志确认运行状态:
cat /var/log/wan-failover.log
注意事项
- 如果需要检测入口带宽,可把脚本中的
if_octets/tx改成if_octets/rx - 阈值和恢复时间可根据实际网络情况灵活调整
- 操作前建议备份EdgeRouter配置,避免脚本出错导致网络中断
备注:内容来源于stack exchange,提问作者acgbox




