You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动