给飞牛NAS系统进行上行带宽限制

在飞牛NAS上用命令行部署了PCDN,为了宽带安全防止上传量过大而被运营商限速,需要对上行带宽进行分时限速。暂定的策略是每晚8点至10点15分间不限速,其余时间一律限速2Mbps,重启系统后自动执行限速策略。

以下所有操作均在sudo -i以管理员权限运行的。

一,在飞牛中查看网卡名称

比如我的物理网卡名是enp2s0,运行ip link show也可以查看确认一下物理网卡名称。

二,创建限速脚本

nano /usr/local/bin/limit_vm.sh

填入如下脚本。

#!/bin/bash
# 根据实际情况替换接口名
INTERFACE="enp2s0"

# 删除原有 tc 规则(避免重复添加)
tc qdisc del dev $INTERFACE root 2>/dev/null

# 添加 TBF 限速规则:平均速率 2Mbit/s
tc qdisc add dev $INTERFACE root tbf rate 2mbit burst 64kbit latency 400ms

echo "$(date): $INTERFACE 上行带宽已限制为 2Mbps" >> /var/log/vm_bandwidth.log

Ctrl+O, 回车,Ctrl+X退出.

二,创建解除限速脚本

nano /usr/local/bin/unlimit_vm.sh

代码如下:

#!/bin/bash
INTERFACE="enp2s0"

tc qdisc del dev $INTERFACE root 2>/dev/null

echo "$(date): $INTERFACE 上行带宽限制已解除" >> /var/log/vm_bandwidth.log

三,创建自动重启策略

nano /usr/local/bin/apply_bandwidth_policy.sh

代码如下:

#!/bin/bash

INTERFACE="enp2s0"
CURRENT_HOUR=$(date +%H)
CURRENT_MIN=$(date +%M)

# 将当前时间转换为从00:00开始的分钟数
CURRENT_MINUTES=$((10#$CURRENT_HOUR * 60 + 10#$CURRENT_MIN))

# 限速开始时间 22:15 = 1335 分钟
LIMIT_START=1335
# 限速结束时间 20:00 = 1200 分钟
LIMIT_END=1200

# 判断是否在限速时间段内(22:15 到次日 20:00)
if [ $CURRENT_MINUTES -ge $LIMIT_START ] || [ $CURRENT_MINUTES -lt $LIMIT_END ]; then
    # 需要限速
    /usr/local/bin/limit_vm.sh
else
    # 不需要限速(解除)
    /usr/local/bin/unlimit_vm.sh
fi

四,添加到定时任务中

赋于执行权限

chmod +x /usr/local/bin/limit_vm.sh /usr/local/bin/unlimit_vm.sh /usr/local/bin/apply_bandwidth_policy.sh

创建定时任务

crontab -e

在crontab末尾添加如下代码:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

*/30 * * * * /usr/sbin/logrotate /etc/logrotate.d/rsyslog > /dev/null 2>&1
# 每日 22:15 起限制上行带宽至 2Mbps
15 22 * * * /usr/local/bin/limit_vm.sh

# 每日 20:00 解除限速(在限速生效之前解除,确保 20-22:15 之间不限速)
0 20 * * * /usr/local/bin/unlimit_vm.sh

* * * * * /usr/local/bin/apply_bandwidth_policy.sh

五,测试脚本

手动运行脚本,观察是否符合当前时间段的预期:

/usr/local/bin/apply_bandwidth_policy.sh
tc qdisc show dev enp2s0 #同样替换为实际网卡名称,重启设备后也可同样运行此行命令查看限速状态

如果是在非限速时段,预期输出结果类似为:

qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

在限速时段内,应类似为:

qdisc tbf 8001: root refcnt 2 rate 2Mbit burst 8Kb lat 400ms

此方法也可以应用于对虚拟机的限速,替换为对应的虚拟网卡(或网桥)即可。