在 CentOS 系统中配置 IP 流量限速,最常用且灵活的工具是 tc(Traffic Control),它基于 Linux 内核的 iptables/netfilter 和 tc 模块,支持精细的流量控制。以下是具体步骤:
✅ 前提条件
- 确保系统已安装
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 阻断)定制方案吗?
PHPWP博客