iQoS 是一个基于 OpenWrt 的灵活QoS(服务质量)控制系统,通过组合不同的队列算法 (如 CAKE、HFSC、HTB、FQ-CoDel)实现精细的带宽管理和流量整形。支持openwrt 22.03以上版本,即nftables版本 > 0.9.6,最大支持上下各16个分类,默认4个分类。
- ACK 限速:
防止上行方向 ACK 包拥塞,通过限制每 IP/连接的 ACK 速率,减轻对数据流的影响。超过阈值的 ACK 将被随机丢弃或直接丢弃,可有效改善上传方向延迟。
- TCP 升级:
检测已建立的 TCP 连接中,发送速率超过阈值的流,将其标记为高优先级类别(通常为 voice 或 video)。这有助于识别大流量业务(如文件上传、视频推流)并给予更好的带宽保障。
- UDP 限速:
对 UDP 流量(如游戏、DNS、流媒体)进行速率限制,超过阈值的 UDP 流被降级到低优先级队列或直接丢弃,防止 UDP 洪水占用过多带宽。
- 动态分类:
-
批量客户端检测:监测每个源 IP 的连接建立速率和字节速率。当检测到异常高连接数或高吞吐时,将该 IP 的所有流量降级到最低优先级(如
bulk类)。 -
高吞吐服务检测:监测目标服务(IP+端口+协议)的连接建立速率和字节速率。当某个服务被大量连接请求或高吞吐时,将其标记为高优先级(如
video类),提升服务质量。
动态分类的规则自动插入到 nftables 链的头部或尾部(可配置),确保在用户规则之前或之后执行。
- 支持主动拥塞控制
-
CAKE-MQ: 纯 CAKE 算法,支持多队列(MQ)和多种高级参数,适合现代高带宽网络。
-
HFSC+CAKE: HFSC(层次化公平服务曲线)与 CAKE 组合,提供精确的带宽分配和低延迟。
-
HTB+CAKE: HTB(令牌桶)与 CAKE 组合,实现灵活的类层次结构和流量整形。
-
HTB+FQ_CODEL: HTB 与 FQ-CoDel 组合,适用于需要精细分类和拥塞管理的场景。
算法特定参数:
CAKE 参数(config cake)
option diffserv_mode 'diffserv4' # besteffort/diffserv3-8
option rtt '50ms' # 目标 RTT
option memlimit '64Mb' # 内存限制
option overhead '0' # 链路开销(字节)
option mpu '0' # 最小包长(字节)
option ack_filter '0' # ACK过滤(0/1)
option nat '1' # NAT支持(0/1)
option wash '0' # 清洗标记(0/1)
option split_gso '0' # 分割 GSO(0/1)
HFSC 参数(config hfsc)
option latency_mode 'dynamic' # normal/priority/dynamic
option minrtt_enabled '1' # 最小RTT启用(0/1)
HTB 参数(config htb)
option r2q '10' # R2Q 因子(默认10)
option drr_quantum 'auto' # DRR量子(auto 或具体值)
FQ-CoDel 参数(config fq_codel)
option limit '10240' # 队列长度限制
option target '5000' # 目标延迟(us)
option interval '100000' # 间隔(us)
option flows '1024' # 流数量
option quantum '1514' # 量子(字节)
option memory_limit '32Mb' # 内存限制(auto 或具体值)
option ce_threshold '0' # CE阈值(us)
option ecn '1' # ECN模式(1/0)
-
内存限制: CAKE 的 memlimit 参数可通过 auto 自动计算(系统总内存的 1/16,上限 128MB,下限 8MB)。也可手动指定,如 64mb。
-
自定义规则限制: 内联自定义规则(egress_custom.nft / ingress_custom.nft)不能包含 table、chain、type、hook、priority 等顶层关键字,只允许规则语句。
完整表自定义规则(custom_rules.nft)可以定义任意 nftables 结构,但需确保不与 iqos-priority 表冲突。
- 硬件/软件流加速(SFO):
启用 SFO(flow_offloading)后,数据包可能绕过 nftables 和 TC 的某些处理。iQoS 通过以下机制保持兼容:
- 在入口重定向中使用
ctinfo或connmark动作,从连接跟踪恢复数据包标记。 - 在出口方向使用
ctinfo将连接标记写入数据包。 - 当 SFO 启用且
ctinfo不可用时,CAKE 的 diffserv 模式会被强制设为besteffort,避免内部队列分类失效。
建议:如需完整 QoS 功能,请禁用流加速。
-
查看日志: logread -e iqos
-
检查 TC 队列: tc qdisc show dev eth0 tc class show dev eth0 tc -s qdisc show dev ifb0
-
检查 nftables 规则: nft list table inet iqos-priority
-
检查连接标记: conntrack -L | grep mark=
欢迎提交问题报告和功能改进。请确保代码风格与现有脚本一致,并包含必要的注释。
感谢所有为 Linux 流量控制、CAKE、HFSC、HTB、FQ-CoDel 等开源项目做出贡献的开发者。