在 CentOS 上实现流量控制的思路与工具
在 Linux 环境中,嗅探工具(如 tcpdump、tshark、iftop、nethogs)负责“看见”流量;真正的“控制”需要借助内核的 TC(Traffic Control) 框架或用户态工具(如 trickle、wondershaper)。TC 以 qdisc/class/filter 的树形结构实现限速、整形与优先级;需要注意的是,TC 主要作用于发送队列,通常“控发不控收”,下载侧限速常需借助 ingress 过滤或上游设备配合。若你是网关/NAT 场景,还需开启 IP 转发 并结合 iptables mangle/fwmark 做策略分流。
方案一 接口级限速与整形(TC + HTB)
# 1) 出方向 eth0:整体 10M,保留 1M 应急,按 class 整形
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 10Mbit ceil 10Mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 8Mbit ceil 9Mbit prio 0
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 1Mbit ceil 1Mbit prio 1
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
# 将某业务(示例:源 IP 192.168.0.10)打标并导入 class 1:20
iptables -t mangle -I PREROUTING -s 192.168.0.10 -j MARK --set-mark 0x20
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 0x20 fw classid 1:20
# 2) 入方向 eth1:对 192.168.0.10 限速 2Mbit(ingress 不能直接“整形”,用 policer 丢包近似限速)
tc qdisc del dev eth1 ingress 2>/dev/null
tc qdisc add dev eth1 handle ffff: ingress
tc filter add dev eth1 parent ffff: protocol ip prio 1 u32 \
match ip src 192.168.0.10/32 \
police rate 2Mbit burst 10k drop \
flowid :1
说明:上述出方向使用 HTB 实现多速率与优先级;入方向通过 ingress policer 丢包来“限入”。若需更复杂的入方向整形,通常在网关上游或本机做 ifb 伪设备配合 HTB 实现。方案二 按进程限速(trickle)
# 安装(EPEL)
sudo yum install -y epel-release
sudo yum install -y trickle
# 限制命令
trickle -u 100 scp backup.tgz alice@192.168.4.93:/home/wslu
提示:先用 ldd /usr/bin/your_app | grep libc.so 检查是否使用 libc.so,否则 trickle 不会生效。方案三 一键接口限速(wondershaper)
# 安装(EPEL)
sudo yum install -y epel-release
sudo yum install -y wondershaper
# 设置限速
sudo wondershaper -a eth0 -d 1024 -u 512
# 清除限速
sudo wondershaper -a eth0 -c
# 或
sudo wondershaper clear eth0
说明:wondershaper 适合“快速落地”,如需细粒度策略(多用户/多业务/优先级),建议直接使用 TC 手工编排。验证与排错
tc -s qdisc ls dev eth0
tc -s class ls dev eth0
tc filter show dev eth0
tc qdisc del dev eth0 root
tc qdisc del dev eth1 ingress
sudo yum install -y iftop nethogs
sudo iftop -i eth0
sudo nethogs eth0