全站qos限速需先用iptables mangle表按端口、方向、连接状态精准标记http/https流量(如--dports 80,443或--sports 80,443),再通过tc htb队列与fw过滤器将mark映射至子类实现带宽控制,仅作用于本机出口。

要用 iptables 的 mangle 表打标 + tc 实现全站 QoS 限速,关键不是“全站”一词本身,而是把网站所有相关流量(HTTP/HTTPS、静态资源、API、后台管理)识别出来、统一标记,再交由 tc 按类调度。它不靠域名或 URL,而依赖端口、协议、连接状态和方向等内核可识别特征。
一、在 mangle 表中精准打标网站流量
全站流量通常走 80/443 端口,但需区分入向(用户访问)与出向(服务器响应),并避免重复打标或误标本地环回:
- 对入向 HTTP/HTTPS 请求打标(适合网关或反向代理场景):
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x100 - 对出向 Web 响应打标(适合源站服务器):
iptables -t mangle -A OUTPUT -p tcp -m multiport --sports 80,443 -j MARK --set-mark 0x100 - 排除 lo 接口,防止本机 curl 或健康检查干扰:
iptables -t mangle -I PREROUTING -i lo -j RETURN
iptables -t mangle -I OUTPUT -o lo -j RETURN - 若使用 HTTPS 且后端有 TLS 终止(如 Nginx),建议额外匹配 Host 头特征(需 nf_conntrack_extra 启用)或结合 connmark 保障会话一致性;否则仅靠端口已足够稳定。
二、配置 tc 根队列与子类结构
tc 必须作用于出口网卡(如 eth0),且只能控制本机发出的流量。全站限速本质是限制 Web 服务对外输出带宽:
- 清空旧规则:
tc qdisc del dev eth0 root 2>/dev/null || true - 添加 HTB 根队列(总出口带宽设为物理上限的 95%,留余量):
tc qdisc add dev eth0 root handle 1: htb default 30 - 创建根类(例如总出口限 100Mbps):
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit - 为 Web 流量建子类(保证 30Mbps,峰值可用至 50Mbps):
tc class add dev eth0 parent 1:1 classid 1:100 htb rate 30mbit ceil 50mbit prio 1 - 为其他流量(如 SSH、监控、备份)保留类,避免 Web 限速影响运维。
三、用 filter 将标记映射到对应 class
tc 无法直接读取 iptables 规则,必须通过 fw 分类器识别 skb->mark 字段:
- 添加基于 mark 的过滤规则:
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 0x100 fw flowid 1:100 - 确保该 filter 优先级高于其他规则(prio 数值越小越先匹配);
若已有其他 mark 规则(如 VoIP 标 0x200),需按业务优先级合理设置 prio。 - 可选:为 Web 类绑定低延迟队列(如 fq_codel),提升首包响应:
tc qdisc add dev eth0 parent 1:100 handle 100: fq_codel
四、验证与持续观察
打标和限速是否生效,不能只看命令是否成功,要查实际路径:
- 确认标记是否写入:
watch -n1 'cat /proc/net/nf_conntrack | grep :443 | head -5'(查看连接跟踪中标记) - 查看 tc 分类统计:
tc -s class show dev eth0(重点关注 1:100 的 packets、bytes、drops) - 模拟压测验证效果:
用 curl + time 或 wrk 对站点发起并发请求,对比限速前后响应时间与吞吐变化。 - 注意:tc 限速只作用于出口方向;若需限制用户上行(即客户端上传),需在用户侧或上游网关部署,本机无法干预。











