iptables不直接限速,而是通过mangle表打标记;tc基于标记执行htb队列限速,二者配合实现qos。先清旧规则、建htb根队列和总带宽类,再用iptables标记流量,最后用tc filter将标记映射到子类限速。

iptables 本身不直接做带宽限速,它负责打标记;真正限制带宽靠的是 tc(Traffic Control)。两者配合,才能实现基于 IP、端口或协议的 QoS 流量控制。下面讲清楚怎么搭起来,不绕弯、不堆术语。
先配 tc 建立带宽控制骨架
tc 是执行限速的“手脚”,得先给网卡装上队列规则:
- 清掉旧规则(避免冲突):
tc qdisc del dev eth0 root 2>/dev/null - 加一个 HTB 根队列(推荐,支持分级限速):
tc qdisc add dev eth0 root handle 1: htb default 30 - 建一个基础类,设总出口带宽为 10Mbps:
tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit
注意:把 eth0 换成你实际对外的网卡名(如 ens33、enp0s3),可用 ip link show 查。
用 iptables 给流量贴标签
让 tc 知道该限谁的速,得靠 iptables 在 mangle 表里打标记:
- 给特定源 IP(比如内网用户 192.168.1.100)打标 1:
iptables -t mangle -A PREROUTING -s 192.168.1.100 -j MARK --set-mark 1 - 给目标端口 80/443 的流量打标 2(适合限 Web 出口):
iptables -t mangle -A POSTROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2
标记值(--set-mark 后的数字)要和后面 tc filter 的 handle 对应上。
把标记和限速类连起来
这一步是关键衔接,告诉 tc:“标 1 的包,走这个慢车道”:
- 为标 1 的流量建子类,限速 2Mbps:
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2mbit ceil 2mbit - 加过滤器,把标 1 的包导过去:
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:10 - 同理,标 2 的包可导到另一个类(比如 1:20),设不同速率
验证和保存配置
运行后立刻检查是否生效:
- 看队列状态:
tc -s qdisc ls dev eth0 - 看类统计:
tc -s class ls dev eth0 - 看标记是否命中:
iptables -t mangle -L -v -n(看 pkts 列是否在涨)
重启会丢配置,建议写成脚本并加入开机启动;Debian/Ubuntu 可用 iptables-save + tc qdisc show 输出存档,再用 systemd 或 rc.local 加载。











