iptables仅负责流量标记,tc执行带宽控制;需通过iptables的mark与tc的filter联动实现限速,如用postrouting打标、htb类限1mbps上行。

iptables 本身不直接限制带宽,它只负责匹配和标记流量;真正执行带宽控制的是 tc(Traffic Control)。两者必须配合使用:iptables 在 mangle 表中打 MARK,tc 根据标记把流量导向不同限速类。这是 Linux 下稳定、细粒度控制出口/入口带宽的主流方案。
明确角色分工:iptables 负责“认人”,tc 负责“限速”
很多人误以为 iptables 的 -m limit 或 --limit 能做带宽限速,其实它只能控制**包速率**(如每秒最多 10 个 SYN 包),单位是“包/秒”,不是“bit/s”。它无法保证带宽上限,也不适用于大流量场景。真正的带宽整形(比如限 2Mbps 下载)必须靠 tc 的 HTB、TBF 等队列算法。
- iptables 是“交通协管员”:只看 IP、端口、协议,给符合条件的包贴标签(如 --set-mark 1)
- tc 是“收费站+车道调度员”:按标签把包分到不同限速车道(class),并严格执行速率、突发、优先级等策略
- 关键衔接点是
tc filter ... handle X fw flowid Y:Z—— 把 iptables 打的 mark X 映射到 tc 类 Y:Z
典型出口限速配置流程(以 eth0 为例)
假设要限制内网用户 192.168.1.100 的**上行总带宽为 1Mbps**:
-
清空旧规则:
tc qdisc del dev eth0 root 2>/dev/null -
建 HTB 根队列:
tc qdisc add dev eth0 root handle 1: htb default 30 -
设总出口带宽类(1:1):
tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit(预留余量) -
建子类限速(1:10):
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1mbit -
用 iptables 打标:
iptables -t mangle -A POSTROUTING -s 192.168.1.100 -j MARK --set-mark 1(注意链选 POSTROUTING,因是本机发出的上行流量) -
用 tc filter 关联:
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:10
支持多种匹配方式的灵活限速
除了源 IP,你还能按需组合条件,只需调整 iptables 的匹配规则即可:
-
按目标端口限速:如限制所有发往 80/443 的 Web 流量为 5Mbps:
iptables -t mangle -A POSTROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2 -
按协议类型区分:如单独限 UDP 视频流:
iptables -t mangle -A POSTROUTING -p udp --sport 10000:20000 -j MARK --set-mark 3 - 双向独立控制:入口(下载)用 PREROUTING 打标 + ingress qdisc;出口(上传)用 POSTROUTING 打标 + root qdisc。注意 ingress 需额外加载 ifb 模块
验证与持久化不能跳过
配置完立刻验证,避免白忙活:
-
查 tc 状态:
tc -s qdisc ls dev eth0(看队列是否挂载)、tc -s class ls dev eth0(看各 class 的 bytes/packets 是否增长) -
查 iptables 命中数:
iptables -t mangle -L PREROUTING/POSTROUTING -v -n(看 pkts 列是否递增) -
持久化方案:写成 shell 脚本(含清空+重建逻辑),放入
/etc/rc.local或 systemd service;Debian/Ubuntu 推荐用iptables-persistent存 iptables 规则,tc 命令则用 systemd service 启动时执行








