shapecfg 是一个传统的Linux流量整形配置工具,用于控制网络接口的输出带宽。它通过实现一种称为"shaping"的技术来限制网络接口的数据传输速率,确保网络流量的公平性和服务质量(QoS)。
tc(Traffic Control)命令配合HTB(Hierarchical Token Bucket)或CBQ(Class-Based Queuing)调度器。但在一些旧系统中,shapecfg仍然可用。
在基于Debian/Ubuntu的系统上,shapecfg通常包含在iproute软件包中:
sudo apt-get update
sudo apt-get install iproute
在某些系统中,可能需要从源码编译:
# 下载源码(如果可用)
wget http://example.com/shapecfg.tar.gz
tar -xzvf shapecfg.tar.gz
cd shapecfg
make
sudo make install
tc命令完全替代。
shapecfg [选项] attach 接口 [速率]
shapecfg [选项] speed 接口 速率
shapecfg [选项] detach 接口
shapecfg [选项] show 接口
| 选项 | 说明 |
|---|---|
attach 接口 [速率] |
为指定接口附加流量整形器 |
speed 接口 速率 |
设置接口的整形速率 |
detach 接口 |
从接口分离流量整形器 |
show 接口 |
显示接口的整形状态 |
-h, --help |
显示帮助信息 |
-V, --version |
显示版本信息 |
shapecfg支持多种速率单位:
| 后缀 | 说明 | 示例 |
|---|---|---|
| 无后缀 | 比特/秒 (bps) | 64000 (64 kbps) |
k 或 K |
千比特/秒 (kbps) | 64k (64 kbps) |
m 或 M |
兆比特/秒 (mbps) | 2m (2 mbps) |
g 或 G |
千兆比特/秒 (gbps) | 1g (1 gbps) |
# 为eth0接口附加整形器,限制为1 Mbps
sudo shapecfg attach eth0 1m
# 不指定速率,使用默认值
sudo shapecfg attach eth1
# 设置eth0接口的整形速率为512 kbps
sudo shapecfg speed eth0 512k
# 设置eth1接口的整形速率为2 Mbps
sudo shapecfg speed eth1 2m
# 设置eth2接口的整形速率为10 Mbps
sudo shapecfg speed eth2 10m
# 查看eth0接口的整形状态
sudo shapecfg show eth0
# 查看所有接口的整形状态
sudo shapecfg show all
输出示例:
Interface eth0
Shaping enabled: yes
Shaping rate: 1.00 Mbps
Current rate: 850 Kbps
Packets shaped: 12345
Bytes shaped: 98765432
# 从eth0接口分离整形器
sudo shapecfg detach eth0
# 分离后,接口将不再受速率限制
sudo shapecfg show eth0
# 1. 为接口附加整形器
sudo shapecfg attach eth0 1m
# 2. 验证配置
sudo shapecfg show eth0
# 3. 修改速率
sudo shapecfg speed eth0 512k
# 4. 再次验证
sudo shapecfg show eth0
# 5. 清理配置
sudo shapecfg detach eth0
流量整形是通过控制数据包发送的时间来限制带宽使用的技术:
限制特定网络接口的上传带宽,防止占用全部带宽:
# 限制eth0接口的上传带宽为256 kbps
sudo shapecfg attach eth0 256k
echo "eth0接口上传带宽已限制为256 kbps"
# 验证限制效果
sudo shapecfg show eth0
# 测试带宽限制(需要iperf或其他工具)
# iperf -c 目标主机 -t 30
通过限制非关键应用的带宽,确保关键应用有足够的带宽:
#!/bin/bash
# limit_background_traffic.sh - 限制后台流量带宽
INTERFACE="eth0"
BACKGROUND_LIMIT="100k" # 后台流量限制
CRITICAL_LIMIT="1m" # 关键应用限制
echo "配置流量整形..."
echo "接口: $INTERFACE"
echo "后台流量限制: $BACKGROUND_LIMIT"
echo "关键应用限制: $CRITICAL_LIMIT"
# 为接口附加整形器
sudo shapecfg attach "$INTERFACE" "$BACKGROUND_LIMIT"
echo "流量整形已启用"
echo "使用 'sudo shapecfg show $INTERFACE' 查看状态"
echo "使用 'sudo shapecfg detach $INTERFACE' 取消限制"
通过限制入站流量速率,减轻DDoS攻击的影响:
#!/bin/bash
# ddos_protection.sh - 简单的DDoS防护
INTERFACE="eth0"
# 限制入站流量为10 Mbps
# 注意:shapecfg主要控制出站流量
# 入站流量控制需要其他工具配合
RATE_LIMIT="10m"
echo "启用DDoS防护..."
echo "接口: $INTERFACE"
echo "速率限制: $RATE_LIMIT"
# 启用流量整形
sudo shapecfg attach "$INTERFACE" "$RATE_LIMIT"
# 记录日志
echo "$(date) - 启用速率限制: $RATE_LIMIT 在 $INTERFACE" >> /var/log/ddos_protection.log
echo "防护已启用"
echo "监控日志: tail -f /var/log/ddos_protection.log"
| 特性 | shapecfg(整形) | tc(控制) |
|---|---|---|
| 主要功能 | 速率限制(整形) | 完整的流量控制(整形、调度、过滤) |
| 复杂性 | 简单易用 | 功能强大但复杂 |
| 队列类型 | 基本令牌桶 | HTB、CBQ、PRIO、SFQ等多种队列 |
| 过滤能力 | 无 | 基于IP、端口、协议等过滤 |
| 分类 | 无分类,所有流量同等对待 | 支持多级分类,不同流量不同处理 |
| 现代性 | 已过时,较少使用 | 现代Linux标准工具 |
tc(Traffic Control)是现代Linux系统的标准流量控制工具,功能远超shapecfg:
# 安装tc(通常已安装)
# tc是iproute2包的一部分
sudo apt-get install iproute2
# 为eth0接口添加HTB队列规则,限制为1 Mbps
sudo tc qdisc add dev eth0 root handle 1: htb default 10
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil 1mbit
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit
# 查看tc配置
sudo tc qdisc show dev eth0
sudo tc class show dev eth0
# 删除tc配置
sudo tc qdisc del dev eth0 root
# 创建HTB队列
sudo tc qdisc add dev eth0 root handle 1: htb
# 创建主类
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
# 创建子类限制特定IP
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit
# 添加过滤器,将来自192.168.1.100的流量分类到1:10
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
match ip src 192.168.1.100 flowid 1:10
shapecfg: command not found
解决方案:
# 1. 安装iproute包
sudo apt-get install iproute
# 2. 如果不可用,使用tc替代
# tc是现代的标准工具
# 3. 从源码编译(如果可用)
# 参考安装部分
shapecfg: Cannot attach shaper: Operation not permitted
解决方案:
# 使用sudo
sudo shapecfg attach eth0 1m
# 或添加用户到特定组
sudo usermod -aG root $USER
# 注销重新登录(不推荐,有安全风险)
shapecfg: Interface eth0 not found
解决方案:
# 查看可用接口
ip link show
# 或
ifconfig -a
# 使用正确的接口名
sudo shapecfg attach enp3s0 1m
sudo shapecfg attach wlp2s0 1m
# 配置了速率限制,但实际速度没有变化
解决方案:
# 1. 验证配置
sudo shapecfg show eth0
# 2. 检查是否有其他流量控制规则
sudo tc qdisc show dev eth0
# 3. 清除可能冲突的tc规则
sudo tc qdisc del dev eth0 root 2>/dev/null
# 4. 测试带宽
# 使用iperf或speedtest-cli测试实际带宽
| 命令 | 说明 |
|---|---|
tc |
流量控制工具,现代替代方案 |
iptables |
防火墙和包过滤工具,可与流量控制配合 |
wondershaper |
简化的流量整形脚本 |
trickle |
用户空间带宽整形工具 |
pyshaper |
Python实现的流量整形工具 |
ifconfig |
配置网络接口 |
ip |
强大的网络配置工具 |
nethogs |
按进程显示网络带宽使用 |
iftop |
显示接口带宽使用情况 |
iperf |
网络带宽测试工具 |
wondershaper是一个简化的流量整形脚本,比shapecfg更易用:
# 安装wondershaper
sudo apt-get install wondershaper
# 限制eth0接口带宽:下载2Mbps,上传1Mbps
sudo wondershaper eth0 2048 1024
# 清除限制
sudo wondershaper clear eth0
# 查看状态
sudo wondershaper status eth0
#!/bin/bash
# auto_shaper.sh - 根据时间自动调整带宽限制
INTERFACE="eth0"
DAY_RATE="2m" # 白天速率
NIGHT_RATE="10m" # 夜间速率
CURRENT_HOUR=$(date +%H)
echo "自动带宽限制脚本"
echo "接口: $INTERFACE"
echo "当前时间: $(date)"
# 检查是否在夜间(22:00-06:00)
if [ $CURRENT_HOUR -ge 22 ] || [ $CURRENT_HOUR -lt 6 ]; then
RATE="$NIGHT_RATE"
PERIOD="夜间"
else
RATE="$DAY_RATE"
PERIOD="白天"
fi
echo "当前时段: $PERIOD"
echo "设置速率: $RATE"
# 检查是否已附加整形器
if shapecfg show "$INTERFACE" 2>/dev/null | grep -q "Shaping enabled: yes"; then
echo "更新现有整形器速率..."
sudo shapecfg speed "$INTERFACE" "$RATE"
else
echo "附加新整形器..."
sudo shapecfg attach "$INTERFACE" "$RATE"
fi
# 验证配置
echo "验证配置:"
sudo shapecfg show "$INTERFACE"
# 记录日志
echo "$(date) - 设置 $INTERFACE 带宽为 $RATE ($PERIOD)" >> /var/log/auto_shaper.log
#!/bin/bash
# bandwidth_monitor.sh - 监控带宽使用并自动调整
INTERFACE="eth0"
CHECK_INTERVAL=10 # 检查间隔(秒)
HIGH_THRESHOLD=80 # 高使用率阈值(%)
LOW_THRESHOLD=20 # 低使用率阈值(%)
MAX_RATE="10m" # 最大速率
MIN_RATE="1m" # 最小速率
CURRENT_RATE="5m" # 当前速率
LOG_FILE="/var/log/bandwidth_monitor.log"
echo "带宽监控脚本启动" | tee -a "$LOG_FILE"
echo "接口: $INTERFACE" | tee -a "$LOG_FILE"
echo "检查间隔: ${CHECK_INTERVAL}秒" | tee -a "$LOG_FILE"
# 初始化整形器
sudo shapecfg attach "$INTERFACE" "$CURRENT_RATE" 2>/dev/null
while true; do
# 获取当前带宽使用率(简化示例)
# 实际实现可能需要使用ifconfig、ip等工具计算
USAGE=$(python3 -c "
import random
print(random.randint(0, 100))
")
echo "$(date) - 带宽使用率: ${USAGE}%" | tee -a "$LOG_FILE"
# 根据使用率调整带宽
if [ $USAGE -gt $HIGH_THRESHOLD ]; then
# 使用率过高,降低带宽
NEW_RATE="$MIN_RATE"
echo "使用率过高,降低带宽到 $NEW_RATE" | tee -a "$LOG_FILE"
elif [ $USAGE -lt $LOW_THRESHOLD ]; then
# 使用率过低,提高带宽
NEW_RATE="$MAX_RATE"
echo "使用率过低,提高带宽到 $NEW_RATE" | tee -a "$LOG_FILE"
else
# 使用率正常,保持当前速率
NEW_RATE="$CURRENT_RATE"
fi
# 如果速率变化,更新配置
if [ "$NEW_RATE" != "$CURRENT_RATE" ]; then
sudo shapecfg speed "$INTERFACE" "$NEW_RATE"
CURRENT_RATE="$NEW_RATE"
echo "带宽已调整为: $CURRENT_RATE" | tee -a "$LOG_FILE"
fi
# 等待下一次检查
sleep $CHECK_INTERVAL
done
shapecfg需要内核支持流量整形功能。检查相关内核模块:
# 检查内核是否支持流量整形
lsmod | grep -i sch
# 常见相关模块:
# sch_netem - 网络仿真(延迟、丢包等)
# sch_htb - 层次令牌桶
# sch_sfq - 随机公平队列
# sch_tbf - 令牌桶过滤器
# sch_ingress - 入口流量控制
# 加载模块(如果需要)
sudo modprobe sch_htb
sudo modprobe sch_tbf
如果您正在使用shapecfg,建议迁移到tc工具。以下是等价配置示例:
| shapecfg命令 | tc等价命令 |
|---|---|
shapecfg attach eth0 1m |
|
shapecfg speed eth0 512k |
|
shapecfg detach eth0 |
sudo tc qdisc del dev eth0 root |
shapecfg show eth0 |
sudo tc qdisc show dev eth0 |
| 用途 | 命令示例 |
|---|---|
| 附加整形器 | sudo shapecfg attach eth0 1m |
| 设置速率 | sudo shapecfg speed eth0 512k |
| 查看状态 | sudo shapecfg show eth0 |
| 分离整形器 | sudo shapecfg detach eth0 |
| 帮助信息 | shapecfg -h |
| 查看所有接口 | sudo shapecfg show all |