在 Linux 系统中进行流量整形时,iptables 与 tc 堪称黄金搭档。前者负责为数据包添加标记,后者则依据标记执行精确的带宽控制。要将两者协同使用,只需按以下步骤操作即可实现高效的 Linux 流量整形与带宽管理。

1. 安装必要的软件包
首先需确认系统中已安装这两个工具。大多数 Linux 发行版默认均已预装。若未安装,通过包管理器快速安装即可:
sudo apt-get install iproute2 iptables # Debian/Ubuntu
sudo yum install iproute iptables # CentOS/RHEL
2. 配置网络接口
确定需要施加流量控制的网络接口,例如最常见的 eth0,确保其处于激活状态:
ip link set eth0 up
3. 创建队列规则
使用 tc 命令在目标网卡上附加一个队列规则,这相当于搭建流量调度的基础框架:
sudo tc qdisc add dev eth0 root handle 1: htb default 30
这里选用 HTB(分层令牌桶)算法,适用于带宽限制与优先级管理,是实现 Linux 流量整形的主流方案。
4. 创建类
框架建立后,接下来划分不同带宽通道——各类流量各行其道。例如为 HTTP 流量设置专用子通道:
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil 2mbit
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 512kbit ceil 1mbit
此命令含义清晰:父类保障至少 1Mbps,最高可至 2Mbps;子类则以 512Kbps 为基本带宽,上限 1Mbps。参数 rate 与 ceil 分别定义了带宽的“保底线”与“爆发线”。
5. 使用 iptables 标记流量
现在轮到 iptables 登场,它的任务是为目标数据包打上标记,告诉 tc “此包需特殊处理”:
sudo iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 10
该规则将所有目标端口为 80 的 TCP 流量标记为“10”。mangle 表专用于修改数据包,PREROUTING 链确保数据包在路由前即被标记,这是 iptables 与 tc 配合的关键环节。
6. 将标记的流量绑定到类
标记完成后,最后一步是将标记与已创建的类关联,使带有标记“10”的流量自动进入 1:10 子通道:
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw flowid 1:10
7. 监控和调整
一切就绪后,需要验证整形效果是否达标。通过 tc 可随时查看队列与类的实时状态:
sudo tc -s qdisc ls dev eth0
sudo tc -s class ls dev eth0
这些命令会显示发送字节数、丢包、超时等关键统计信息,便于判断整形策略是否生效,或哪些参数需要微调。
示例:限制特定 IP 的带宽
假设办公室某台设备(IP: 192.168.1.100)占满下行带宽,需单独限速。操作流程与上文完全一致,仅将标记依据从端口改为源 IP:
创建队列规则:
sudo tc qdisc add dev eth0 root handle 1: htb default 30创建类,为该 IP 分配更低带宽的子类:
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil 2mbit sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 256kbit ceil 512kbit此处将子类带宽压缩至 256Kbps,上限 512Kbps,实现精准的 IP 带宽控制。
用 iptables 打标记,这次基于源 IP:
sudo iptables -t mangle -A PREROUTING -s 192.168.1.100 -j MARK --set-mark 10绑定标记到类:
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw flowid 1:10
注意事项
- 流量整形本质上是让数据包有序排队,高负载下必然引入一定延迟或丢包,这是不可避免的副作用。
- 切勿直接在线上环境操作。建议先在测试环境完整跑一遍,评估对应用体验的实际影响。
- 所有操作均需 root 权限,普通用户无法执行。
上述是最基础的用法,实际生产环境可能涉及多队列、混入 SFQ 公平调度,或借助 connmark 实现更精细的连接跟踪。但从这套框架出发,绝大多数带宽管理场景都能覆盖。
