在飞牛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.logCtrl+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此方法也可以应用于对虚拟机的限速,替换为对应的虚拟网卡(或网桥)即可。