CentOS系统中怎么配置IP流量限速?

在 CentOS 系统中配置 IP 流量限速,最常用且灵活的工具是 tc(Traffic Control),它基于 Linux 内核的 iptables/netfiltertc 模块,支持精细的流量控制。以下是具体步骤:


✅ 前提条件

  • 确保系统已安装 iproute2(CentOS 7/8 默认包含):
    rpm -q iproute2
    # 若未安装,执行:sudo yum install -y iproute2
  • 需要 root 权限或 sudo 权限。

🛠 方法一:使用 tc 对指定接口进行整体限速(推荐)

假设要对网卡 eth0 设置上行方向最大带宽为 10 Mbps:

# 1. 清除现有规则(可选,避免冲突)
sudo tc qdisc del dev eth0 root 2>/dev/null

# 2. 添加根队列(使用 HTB 调度器)
sudo tc qdisc add dev eth0 root handle 1: htb default 30

# 3. 创建父类(总带宽限制)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit

# 4. 创建子类(可按需划分不同优先级/用途,此处简化为单类)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit ceil 10mbit

# 5. 将流量导向该类(所有流量走 default 30 → 实际可细化匹配)
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 0.0.0.0/0 flowid 1:10

💡 说明:

  • rate:承诺速率;ceil:最大可用速率(含突发)。
  • 下行(接收)限速需结合 ingress 链 + u32 过滤器,但较复杂,通常建议用 tc 做出站(egress)限速。

🎯 方法二:按源/目的 IP 单独限速(更精细)

例如:限制 192.168.1.100 的上行速度为 5 Mbps:

# 先清空旧规则(谨慎操作)
sudo tc qdisc del dev eth0 root 2>/dev/null

# 设置根 qdisc
sudo tc qdisc add dev eth0 root handle 1: htb default 30

# 定义总出口带宽(如 100M)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit

# 为该 IP 创建专属子类(5Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit ceil 5mbit

# 匹配该 IP 并定向到子类
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 
  match ip src 192.168.1.100/32 flowid 1:10

# 其他流量走默认通道(剩余带宽)
sudo tc class add dev eth0 parent 1:1 classid 1:30 htb rate 95mbit ceil 95mbit

✅ 验证规则:

tc -s qdisc show dev eth0
tc -s class show dev eth0
tc filter show dev eth0

🔁 持久化配置(重启后生效)

CentOS 7/8 推荐使用 /etc/sysconfig/network-scripts/ifcfg-eth0 配合自定义脚本,或直接写入 systemd 服务:

方案 A:创建 systemd 服务(推荐)

# /etc/systemd/system/tc-limit.service
[Unit]
Description=Traffic Control Limit for eth0
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/tc-limit.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
# /usr/local/bin/tc-limit.sh
#!/bin/bash
tc qdisc del dev eth0 root 2>/dev/null
tc qdisc add dev eth0 root handle 1: htb default 30
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit ceil 5mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.100/32 flowid 1:10
chmod +x /usr/local/bin/tc-limit.sh
systemctl daemon-reload
systemctl enable --now tc-limit.service

⚠️ 注意事项

  • 下行限速(入站)需使用 ingress 设备 + police 动作,示例:

    sudo tc qdisc add dev eth0 handle ffff: ingress
    sudo tc filter add dev eth0 parent ffff: protocol ip u32 
    match ip dst 192.168.1.100/32 police rate 5mbit burst 10k drop flowid :1

    注意:ingress 性能开销较大,生产环境慎用。

  • 避免与防火墙(firewalld/iptables)规则冲突,优先在 tc 层处理 QoS。

  • 测试时先用低带宽(如 100kbps)验证效果,再逐步调整。


需要我为你生成一个完整的、带注释的脚本模板(支持多 IP、多方向、自动备份当前配置),或针对特定场景(如 Web 服务器限流、P2P 阻断)定制方案吗?