Linux shapecfg命令

shapecfg 是一个传统的Linux流量整形配置工具,用于控制网络接口的输出带宽。它通过实现一种称为"shaping"的技术来限制网络接口的数据传输速率,确保网络流量的公平性和服务质量(QoS)。

注意:shapecfg是较旧的流量整形工具,现代Linux系统通常使用更先进的tc(Traffic Control)命令配合HTB(Hierarchical Token Bucket)或CBQ(Class-Based Queuing)调度器。但在一些旧系统中,shapecfg仍然可用。

安装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
注意:shapecfg在现代Linux发行版中可能已不提供,因为它的功能已被tc命令完全替代。

语法格式

shapecfg [选项] attach 接口 [速率]
shapecfg [选项] speed 接口 速率
shapecfg [选项] detach 接口
shapecfg [选项] show 接口

命令选项

选项 说明
attach 接口 [速率] 为指定接口附加流量整形器
speed 接口 速率 设置接口的整形速率
detach 接口 从接口分离流量整形器
show 接口 显示接口的整形状态
-h, --help 显示帮助信息
-V, --version 显示版本信息

速率单位

shapecfg支持多种速率单位:

后缀 说明 示例
无后缀 比特/秒 (bps) 64000 (64 kbps)
kK 千比特/秒 (kbps) 64k (64 kbps)
mM 兆比特/秒 (mbps) 2m (2 mbps)
gG 千兆比特/秒 (gbps) 1g (1 gbps)

基本使用示例

示例1:为接口附加流量整形器

# 为eth0接口附加整形器,限制为1 Mbps
sudo shapecfg attach eth0 1m

# 不指定速率,使用默认值
sudo shapecfg attach eth1

示例2:设置接口的整形速率

# 设置eth0接口的整形速率为512 kbps
sudo shapecfg speed eth0 512k

# 设置eth1接口的整形速率为2 Mbps
sudo shapecfg speed eth1 2m

# 设置eth2接口的整形速率为10 Mbps
sudo shapecfg speed eth2 10m

示例3:查看接口的整形状态

# 查看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

示例4:从接口分离流量整形器

# 从eth0接口分离整形器
sudo shapecfg detach eth0

# 分离后,接口将不再受速率限制
sudo shapecfg show eth0

示例5:完整的配置流程

# 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

流量整形的基本原理

流量整形是通过控制数据包发送的时间来限制带宽使用的技术:

流量整形工作原理:
  1. 令牌桶算法:shapecfg使用令牌桶算法,系统以恒定速率生成令牌,每个令牌允许发送一定数量的数据
  2. 队列管理:当数据包到达时,需要消耗令牌才能发送,如果没有足够令牌,数据包将被延迟
  3. 平滑流量:通过控制令牌生成速率,可以平滑突发流量,避免网络拥塞
  4. 公平性:确保多个流共享带宽时的公平性

实际应用场景

场景1:限制上传带宽

限制特定网络接口的上传带宽,防止占用全部带宽:

# 限制eth0接口的上传带宽为256 kbps
sudo shapecfg attach eth0 256k
echo "eth0接口上传带宽已限制为256 kbps"

# 验证限制效果
sudo shapecfg show eth0

# 测试带宽限制(需要iperf或其他工具)
# iperf -c 目标主机 -t 30

场景2:确保关键应用带宽

通过限制非关键应用的带宽,确保关键应用有足够的带宽:

#!/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' 取消限制"

场景3:防止DDoS攻击影响

通过限制入站流量速率,减轻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命令

tc(Traffic Control)是现代Linux系统的标准流量控制工具,功能远超shapecfg:

使用tc进行基本速率限制

# 安装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

使用tc限制特定IP的带宽

# 创建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

故障排除

问题1:命令不存在

shapecfg: command not found

解决方案:

# 1. 安装iproute包
sudo apt-get install iproute

# 2. 如果不可用,使用tc替代
# tc是现代的标准工具

# 3. 从源码编译(如果可用)
# 参考安装部分

问题2:权限不足

shapecfg: Cannot attach shaper: Operation not permitted

解决方案:

# 使用sudo
sudo shapecfg attach eth0 1m

# 或添加用户到特定组
sudo usermod -aG root $USER
# 注销重新登录(不推荐,有安全风险)

问题3:接口不存在

shapecfg: Interface eth0 not found

解决方案:

# 查看可用接口
ip link show
# 或
ifconfig -a

# 使用正确的接口名
sudo shapecfg attach enp3s0 1m
sudo shapecfg attach wlp2s0 1m

问题4:速率限制无效

# 配置了速率限制,但实际速度没有变化

解决方案:

# 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 - 简化的流量整形工具

wondershaper是一个简化的流量整形脚本,比shapecfg更易用:

# 安装wondershaper
sudo apt-get install wondershaper

# 限制eth0接口带宽:下载2Mbps,上传1Mbps
sudo wondershaper eth0 2048 1024

# 清除限制
sudo wondershaper clear eth0

# 查看状态
sudo wondershaper status eth0

实用脚本示例

脚本1:自动带宽限制脚本

#!/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

脚本2:带宽监控和自动调整

#!/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

安全注意事项

  1. 过度限制带宽可能影响网络服务的正常运行
  2. 在生产环境中应用前,应在测试环境验证配置
  3. 记录所有带宽限制变更,便于故障排查
  4. 考虑使用现代tc工具,它提供更精细的控制和更好的稳定性
  5. 定期监控带宽使用情况,调整限制策略
  6. 确保有恢复机制,避免配置错误导致网络中断

迁移到tc工具

如果您正在使用shapecfg,建议迁移到tc工具。以下是等价配置示例:

shapecfg到tc的迁移示例

shapecfg命令 tc等价命令
shapecfg attach eth0 1m
sudo tc qdisc add dev eth0 root tbf \
    rate 1mbit latency 50ms burst 1540
shapecfg speed eth0 512k
sudo tc qdisc change dev eth0 root tbf \
    rate 512kbit latency 50ms burst 1540
shapecfg detach eth0 sudo tc qdisc del dev eth0 root
shapecfg show eth0 sudo tc qdisc show dev eth0

最佳实践建议

流量整形最佳实践:
  1. 明确目标:明确流量整形的目的(公平性、服务质量、防止滥用等)
  2. 渐进实施:从小范围开始,逐步扩大应用范围
  3. 监控效果:持续监控整形效果,确保达到预期目标
  4. 文档记录:记录所有配置和变更,便于维护和故障排除
  5. 定期评估:定期评估整形策略,根据网络变化进行调整
  6. 使用现代工具:优先使用tc等现代工具,它们提供更多功能和更好的性能
  7. 备份配置:备份所有网络配置,包括流量控制规则

shapecfg命令速查表

用途 命令示例
附加整形器 sudo shapecfg attach eth0 1m
设置速率 sudo shapecfg speed eth0 512k
查看状态 sudo shapecfg show eth0
分离整形器 sudo shapecfg detach eth0
帮助信息 shapecfg -h
查看所有接口 sudo shapecfg show all