VPS网站出站流量控制/预警/限度

阿里云的VPS按照流量计费的时候,每天都会担心会不会被别人恶搞,导致流量超标,信用卡被干爆,等等问题,所以需要找到方案:VPS服务器如何设置每天服务器的出站流量上限,达到上限后,控制网速,然后每天0点流量统计重置。

为在 Linux VPS 上实现每天流量统计重置和基于出站流量上限控制网速的功能,需要结合流量监控工具(如 vnstat)和网速限制工具(如 tc)。以下是一个完整的解决方案。


整体实现思路

  1. 使用 vnstat 监控网络流量:记录并统计每天的出站流量。
  2. 使用 tc(Traffic Control)工具限制带宽:达到流量上限后,限制网速。
  3. 设置每天 0 点重置流量统计和限制规则:确保每天的流量统计从头开始。

1. 配置流量监控

通过 vnstat ,它会自动开始监测网络接口流量。您可以检查哪些网络接口正在被监控:

vnstat --iflist

假设您的网络接口名为 eth0(可以根据实际情况修改),查看流量统计:

vnstat -i eth0 --days

输出示例:

eth0  /  traffic statistics for the last 30 days
day         rx      |     tx      |  total
--------------------+-------------+---------
2023-10-10   500 MB |   1200 MB  | 1.7 GB

2. 编写流量限制脚本

我们需要一个脚本来监控出站流量,并在达到每天的上限后动态限制网速。以下脚本实现了这一功能。

创建脚本

创建一个脚本文件 limit_traffic.sh

sudo nano /usr/local/bin/limit_traffic.sh

脚本内容

将以下内容复制到文件中:

#!/bin/bash

# 配置参数
INTERFACE="eth0"                       # 网络接口名称
LIMIT_MB=5000                          # 每日出站流量上限(单位:MB)
TARGET_SPEED="100kbit"                 # 达到上限后限制的网速
VNSTAT_LOG="/var/log/vnstat_limit.log" # 日志文件

# 获取当天的出站流量(单位:MB)
TX_BYTES=$(vnstat --oneline -i $INTERFACE | awk -F';' '{print \$7}' | cut -d' ' -f1)

# 判断出站流量是否超过限制
if (( $(echo "$TX_BYTES > $LIMIT_MB" | bc -l) )); then
    echo "$(date): 出站流量已达到每日上限(${TX_BYTES}MB),限制网速至 $TARGET_SPEED" | tee -a $VNSTAT_LOG
    # 使用 tc 限制带宽
    tc qdisc del dev $INTERFACE root 2>/dev/null   # 删除旧规则(如果有)
    tc qdisc add dev $INTERFACE root tbf rate $TARGET_SPEED burst 32kbit latency 400ms
else
    echo "$(date): 当前出站流量为 ${TX_BYTES}MB,未达到每日上限" | tee -a $VNSTAT_LOG
    # 如果未达到上限,确保带宽无限制
    tc qdisc del dev $INTERFACE root 2>/dev/null
fi

保存并赋予执行权限

sudo chmod +x /usr/local/bin/limit_traffic.sh

3. 配置每天 0 点重置统计和规则

为了确保流量统计每天重置,我们需要设置一个定时任务清除统计数据并移除 tc 限制。

创建重置脚本

创建一个 reset_traffic.sh 脚本:

sudo nano /usr/local/bin/reset_traffic.sh

脚本内容

将以下内容复制到文件中:

#!/bin/bash

INTERFACE="eth0"
VNSTAT_LOG="/var/log/vnstat_limit.log"

# 重置流量统计
vnstat --reset -i $INTERFACE
echo "$(date): 流量统计已重置" | tee -a $VNSTAT_LOG

# 移除网络限制
tc qdisc del dev $INTERFACE root 2>/dev/null
echo "$(date): 网速限制已解除" | tee -a $VNSTAT_LOG

保存并赋予执行权限

sudo chmod +x /usr/local/bin/reset_traffic.sh

5. 设置定时任务

使用 cron 配置两项任务:

  1. 每小时运行 limit_traffic.sh,检查是否超出每日流量上限。
  2. 每天 0 点运行 reset_traffic.sh,重置流量统计并解除网速限制。

编辑根用户的 crontab

sudo crontab -e

添加以下任务

# 每小时运行流量限制脚本
0 * * * * /usr/local/bin/limit_traffic.sh

# 每天 0 点重置流量统计和网速限制
0 0 * * * /usr/local/bin/reset_traffic.sh

保存退出,cron 将自动加载这些任务。

总结

通过 vnstat 监控出站流量,结合 tc 实现网速限制,并通过 cron 计划任务每天 0 点重置流量统计。这个配置适用于大多数 Linux VPS 环境,能够实现自动化的流量管理和控制。如果您有进一步需求或疑问,欢迎随时下方留言讨论!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注