RouterOS Mangle 小包优先规则与带宽配置生成器

整理 RouterOS Mangle 小包规则和 Queue Tree 流控思路,解释 default-small 的适用边界,并提供一个可输入上下行带宽自动生成配置的工具。

本文整理自旧文 ROS 的 Mangle 小包规则 和本站现有的 RouterOS 使用 queue tree 配置流量整形

这套规则的目标不是让测速数字更好看,而是在下载、上传、BT/PT、代理网关同时工作的情况下,让 DNS、握手、小包和网页交互别被大流量挤死。家庭宽带场景下,最重要的是先把总带宽控制在真实带宽略低一点的位置,再按包类型分优先级。

什么时候需要小包规则

如果家里只有一两台设备轻量上网,RouterOS 默认队列通常够用。小包优先适合下面这些场景:

  • 宽带上传比较小,例如 30M、50M,但家里有 NAS、PT、网盘同步或代理节点。
  • 一测速或下载,网页打开、DNS 查询、SSH、游戏延迟明显抖动。
  • RouterOS 作为主路由,LAN 侧还有 sing-box、mihomo、旁路网关或 Docker 服务。
  • 想保留总带宽限制,例如下载 300M 设置成 285M,上传 30M 设置成 28M,避免把运营商侧队列打满。

不要把这套规则理解成“神奇加速”。它只是把拥塞点尽量留在 RouterOS 自己可控的队列里,并且给关键小包更高优先级。

default-small 为什么可能变慢

RouterOS 自带的 default-smallpfifo-limit=10。这个队列很短,低带宽或小流量时反应很快,但在 300M 以上的下载、网页测速、多连接下载时,10 个包的队列太容易被打满,TCP 会频繁误判拥塞并回退。

更稳妥的选择:

  • 普通家庭宽带:先用 default,默认 pfifo-limit=50,不激进,容易排查。
  • RouterOS 版本支持 fq-codel:可以参考本站 Queue Tree 文章做更细的队列类型。
  • 极低延迟优先并且带宽不高:才考虑 default-small 或更小队列,但要用实际下载和延迟一起验证。

这也是为什么我现在更倾向于把基础小包规则的叶子队列设为 default:优先保证稳定吞吐,再在稳定基础上调延迟。

规则结构

基础版规则分三层:

  1. mangle 给包打标:DNS、小包、中包、大包。
  2. queue tree 建立上传总队列和下载总队列。
  3. 子队列按优先级分配:DNS 最高,小包其次,中包居中,大包最低。

这里使用的 packet mark:

标记 用途 优先级
dns DNS、DoT 基础查询 1
small-packet ICMP、0-128 字节的小包 2
medium-packet 129-512 字节的中小包 3
large-packet 剩余流量兜底 8

如果你的网络里有独立代理网关,例如 sing-box 机器,也可以另加 proxy-packet 标记,但基础版先不强行加入,避免规则互相覆盖。

队列类型怎么选

生成器里可以选择 defaultdefault-smallfq-codelcake。简单建议如下:

带宽环境 建议队列 说明
100M 以下 可以尝试 default-small 小带宽下更容易感受到低延迟收益,但要实测吞吐是否被压得太狠。
300M 左右家宽 优先用 default default-small 更稳,测速和大流量下载不容易被队列长度限制拖慢。
1000M 家宽 先用 default 起步 千兆下更考验 CPU,能用 fq-codelcake 并且路由器性能足够的话,体验通常更好。

关键不是哪个队列绝对最好,而是看满速下载、满速上传时延迟是否稳定。default-small 更偏低延迟,但队列太短,带宽高时可能影响吞吐;default 更均衡,适合作为通用默认值;fq-codel / cake 更适合现代 SQM,但前提是 RouterOS 版本支持、设备 CPU 扛得住。

RouterOS 默认通常只有 defaultdefault-smallpcq-*sfqred 等队列类型,不一定会预置名为 fq-codelcake 的 queue type。本文生成器在选择 fq-codelcake 时,会先创建 qos-gen-fq-codelqos-gen-cake,后面的 Queue Tree 再引用这个名字。

配置生成器

下面输入你的真实宽带上下行、RouterOS 的 WAN/LAN parent 名称和队列类型,点击生成即可。下载和上传建议填运营商标称值,例如 300M/30M;生成器会默认按 95% 和 93% 收敛,避免打满运营商侧缓冲。

生成的命令会先删除 comment 中带有 qos-gen: 的旧规则,不会清理你手工建立的其它 mangle 或 queue tree。

手工配置模板

如果你不需要网页生成器,也可以按下面的结构手工改。这里以 300M/30M 宽带为例,实际总上限收敛成 285M/28M

/system backup save name=before-small-packet-qos
/ip firewall mangle remove [find comment~"qos-gen:"]
/queue tree remove [find comment~"qos-gen:"]

/ip firewall mangle
add chain=prerouting action=mark-packet comment="qos-gen: dns udp" new-packet-mark=dns passthrough=no protocol=udp dst-port=53
add chain=prerouting action=mark-packet comment="qos-gen: dns tcp" new-packet-mark=dns passthrough=no protocol=tcp dst-port=53,853
add chain=prerouting action=mark-packet comment="qos-gen: icmp small" new-packet-mark=small-packet passthrough=no protocol=icmp
add chain=prerouting action=mark-packet comment="qos-gen: small" new-packet-mark=small-packet packet-mark=no-mark packet-size=0-128 passthrough=no
add chain=prerouting action=mark-packet comment="qos-gen: medium" new-packet-mark=medium-packet packet-mark=no-mark packet-size=129-512 passthrough=no
add chain=prerouting action=mark-packet comment="qos-gen: large" new-packet-mark=large-packet packet-mark=no-mark passthrough=no

/queue tree
# 这里示例使用 queue=default;如果你确认 RouterOS 有 fq-codel 或 cake,也可以替换成对应队列类型。
add comment="qos-gen: upload parent" name=Upload-Total parent=pppoe-out1 limit-at=0 queue=default priority=8 max-limit=28M bucket-size=0.1
add comment="qos-gen: upload dns" name=U1-Dns parent=Upload-Total packet-mark=dns limit-at=2M queue=default priority=1 max-limit=28M bucket-size=0.1
add comment="qos-gen: upload small" name=U2-Small parent=Upload-Total packet-mark=small-packet limit-at=5M queue=default priority=2 max-limit=28M bucket-size=0.1
add comment="qos-gen: upload medium" name=U3-Medium parent=Upload-Total packet-mark=medium-packet limit-at=10M queue=default priority=3 max-limit=28M bucket-size=0.1
add comment="qos-gen: upload large" name=U4-Large parent=Upload-Total packet-mark=large-packet limit-at=0 queue=default priority=8 max-limit=28M bucket-size=0.1
add comment="qos-gen: download parent" name=Download-Total parent=bridge1 limit-at=0 queue=default priority=8 max-limit=285M bucket-size=0.1
add comment="qos-gen: download dns" name=D1-Dns parent=Download-Total packet-mark=dns limit-at=5M queue=default priority=1 max-limit=285M bucket-size=0.1
add comment="qos-gen: download small" name=D2-Small parent=Download-Total packet-mark=small-packet limit-at=23M queue=default priority=2 max-limit=285M bucket-size=0.1
add comment="qos-gen: download medium" name=D3-Medium parent=Download-Total packet-mark=medium-packet limit-at=57M queue=default priority=3 max-limit=285M bucket-size=0.1
add comment="qos-gen: download large" name=D4-Large parent=Download-Total packet-mark=large-packet limit-at=0 queue=default priority=8 max-limit=285M bucket-size=0.1

应用顺序

建议按下面顺序操作:

  1. 在 RouterOS 里先导出或保存备份。
  2. 确认 parent 名称。下载 parent 通常是 LAN bridge,比如 bridge1;上传 parent 通常是 pppoe-out1 或实际 WAN 口。
  3. 粘贴生成的命令。
  4. 执行测速,同时开一个终端看队列状态。
/queue tree print stats
/ip firewall mangle print stats where comment~"qos-gen:"

如果 large-packet 长期大量 drop,而测速远低于总上限,先不要急着降低总带宽。可以先把队列从 default-small 改成 default,再观察单连接和多连接下载的区别。

验证方法

单看网页测速不够。至少做三类验证:

  • 浏览器测速:Speedtest、fast.com、运营商测速各测一次。
  • 普通下载:找一个稳定的大文件源,跑单连接和多连接。
  • 延迟观察:下载时持续 ping 常用 DNS 或游戏服务器。

RouterOS 侧重点看:

/queue tree print stats
/tool profile

如果 CPU 很低、WAN 物理口没有错误、普通多连接下载能跑满,但某个测速站只有几十兆,那通常是测速站或线路互联问题,不要把它误判成家里网关限速。

常见问题

Queue Tree 会不会影响 FastTrack

会。需要被 Queue Tree 管理的流量不能走 FastTrack,否则队列看不到流量。很多家庭路由为了流控稳定,会禁用 FastTrack 或让需要整形的流量绕开 FastTrack。

packet-size 应该怎么分

基础版用 0-128129-512 是为了简单稳定。旧方案里也可以用 0-512 + connection-bytes=0-256k 来定义初始小连接,这种规则更偏交互体验,但要注意不要误把大量下载前段一直提到高优先级。

上传为什么要收敛更多

上传小的时候,运营商侧缓冲一旦被打满,DNS、ACK、SSH、游戏包都会一起抖。300M/30M 宽带可以先设成 285M/28M,上传宁可少一点,也比满速时延迟爆炸更可控。

RouterOS 支持 fq-codel 或 cake 怎么办

如果版本支持 fq-codelcake,可以直接在生成器里选择对应队列类型。生成器会先创建 qos-gen-fq-codelqos-gen-cake,再让 Queue Tree 引用它们。应用前仍建议确认当前 RouterOS 是否支持对应 kind:

/queue type print

如果 RouterOS 提示 kind 不支持,就先改回 default。如果创建成功但性能不稳,说明设备 CPU 或队列参数不适合当前带宽,也先回到 default 再继续调。

回滚

本文生成的规则都带有 qos-gen: 注释,回滚时可以只删这批规则:

/ip firewall mangle remove [find comment~"qos-gen:"]
/queue tree remove [find comment~"qos-gen:"]
/queue type remove [find name="qos-gen-fq-codel"]
/queue type remove [find name="qos-gen-cake"]

如果你已经有复杂 mangle、代理标记、PT 限速或 VLAN 分流,建议不要直接覆盖;先把生成结果当模板,把 packet mark 和 parent 名称并入现有规则。