随机推荐

RouterOS 家用 QoS 配置实战与核心概念

RouterOS 家用 QoS(网页优先)配置实战

MikroTik 家用(300M 下行 / 50M 上行)

透明代理 + ACK/DNS/小包优先 —— 最终模板

目标:上传打满不拖慢交互,CPU 省、规则不打架、长期稳定


一、设计原则(先记住这 5 条)

  1. 只标一次:所有 mark-packet 都带 packet-mark=no-mark
  2. 命中即停:所有 mark-packetpassthrough=no
  3. 优先级只在 UPLOAD 树里竞争
  4. ACK 只抓“纯 ACK”
  5. UPLOAD = 真实上行的 90%

二、mangle 规则模板(顺序即优先级)

统一在 chain=forward,只做 LAN → WAN

路由/代理相关(已有,略)


DNS(UDP)

add chain=forward action=mark-packet new-packet-mark=dns_pkt passthrough=no 
    protocol=udp dst-port=53 in-interface-list=LAN out-interface-list=WAN 
    packet-mark=no-mark comment="DNS high prio (LAN->WAN)"

DNS TCP 在透明代理下可禁用(你已确认)


TCP ACK(纯 ACK-only)

add chain=forward action=mark-packet new-packet-mark=ack_pkt passthrough=no 
    protocol=tcp tcp-flags=ack,!syn,!fin,!rst,!psh 
    in-interface-list=LAN out-interface-list=WAN packet-mark=no-mark 
    comment="TCP ACK top prio (LAN->WAN)"

小包(兜底前的交互优化)

add chain=forward action=mark-packet new-packet-mark=small_pkt passthrough=no 
    packet-size=0-512 in-interface-list=LAN out-interface-list=WAN 
    packet-mark=no-mark comment="Small packet prio (LAN->WAN)"

大 UDP(明确降级)

add chain=forward action=mark-packet new-packet-mark=big_pkt passthrough=no 
    protocol=udp packet-size=1400-1500 in-interface-list=LAN out-interface-list=WAN 
    packet-mark=no-mark comment="BIG UDP large packets (LAN->WAN)"

Web 连接 / 包

add chain=forward action=mark-connection new-connection-mark=web_conn passthrough=yes 
    protocol=tcp dst-port=80,443 in-interface-list=LAN out-interface-list=WAN 
    connection-mark=no-mark packet-mark=no-mark comment="WEB conn (LAN->WAN)"

add chain=forward action=mark-packet new-packet-mark=web_pkt passthrough=no 
    connection-mark=web_conn in-interface-list=LAN out-interface-list=WAN 
    packet-mark=no-mark comment="WEB pkt (LAN->WAN)"

大流量 TCP(下载/大文件)

add chain=forward action=mark-connection new-connection-mark=big_conn passthrough=yes 
    protocol=tcp connection-bytes=5000000-0 
    in-interface-list=LAN out-interface-list=WAN 
    connection-mark=no-mark comment="BIG conn (LAN->WAN)"

add chain=forward action=mark-packet new-packet-mark=big_pkt passthrough=no 
    connection-mark=big_conn in-interface-list=LAN out-interface-list=WAN 
    packet-mark=no-mark comment="BIG pkt (LAN->WAN)"

OTHER(最终兜底)

add chain=forward action=mark-packet new-packet-mark=other_pkt passthrough=no 
    connection-mark=!web_conn,!big_conn 
    in-interface-list=LAN out-interface-list=WAN packet-mark=no-mark 
    comment="OTHER pkt (LAN->WAN)"

三、Queue Tree 模板(只做 UPLOAD)

UPLOAD 父队列(关键

add name=UPLOAD parent=pppoe-out1 max-limit=45M queue=pcq-upload

45M = 50M × 0.9(你已验证最稳)


子队列优先级(固定梯度)

add name=ACK   parent=UPLOAD packet-mark=ack_pkt   priority=1 queue=pcq-upload
add name=DNS   parent=UPLOAD packet-mark=dns_pkt   priority=2 queue=pcq-upload
add name=SMALL parent=UPLOAD packet-mark=small_pkt priority=4 queue=pcq-upload
add name=WEB   parent=UPLOAD packet-mark=web_pkt   priority=5 queue=pcq-upload
add name=OTHER parent=UPLOAD packet-mark=other_pkt priority=6 queue=pcq-upload
add name=BIG   parent=UPLOAD packet-mark=big_pkt   priority=8 queue=pcq-upload

不需要限速子队列,只靠 priority 排队即可。


四、健康检查(以后只看这 4 条)

CPU

/tool profile
  • firewall + queuing <15%:健康

队列是否堆积

/queue tree print stats where name="UPLOAD"
  • queued=0 / dropped=0:理想

ACK 是否在跑

/queue tree print stats where name="ACK"
  • packets 在涨、queued=0:正常

真实体验验证

  • 上传打满 + 打开网页 / 视频 / SSH
  • RTT 不暴涨:成功

五、迁移/备份清单(强烈建议保存)

导出配置(文本)

/export file=final-qos

记录 3 个关键值

  • 上行最差值:50M
  • UPLOAD max-limit:45M
  • ACK 规则:ack,!syn,!fin,!rst,!psh

换设备时只需要改的 2 处

  • parent=pppoe-out1 → 新设备的 WAN 接口名
  • UPLOAD 的 max-limit → 新线路上行 × 0.9

六、什么时候才“需要再动它”

  • 上行 ≥ 100M
  • CPU 长期 >70%
  • 引入 大量 UDP / QUIC
  • 多 WAN / VPN 大流量

否则:不用再改

RouterOS QoS 核心概念:什么是 New Packet Mark?

New Packet Mark 的作用是:

单个数据包贴一个内部标签, 让后面的 Queue Tree / Queue 能“认出来、区别对待”。

它本身:

  • 不限速
  • 不丢包
  • 不决定优先级

它只是一个 分类标签(classification tag)


一、先分清:RouterOS 里的三种「标记」

理解 New Packet Mark 之前,必须先知道 RouterOS 并不只有一种“标记”。

标记类型mangle 选项标记对象主要用途
Connection Marknew-connection-mark一个连接(五元组)判断“这条连接是什么类型”
Packet Marknew-packet-mark每一个数据包QoS / Queue Tree
Routing Marknew-routing-mark路由决策策略路由

本文讨论的就是 第二种:Packet Mark


二、什么是 Packet(数据包)?

这是 QoS 里一个非常容易被忽略、但极其重要的概念。

一个“网页请求”:

  • 不是一个包
  • 甚至不是几个包

真实情况是:

  • 一个 TCP 连接
  • 里面包含 成百上千个数据包
  • 每个包:
    • 大小不同
    • 方向不同
    • 到达时间不同

关键事实:

Queue Tree 只能处理“包” 它根本看不到“连接”

因此结论非常明确:

想让 QoS 生效,必须使用 Packet Mark。


三、New Packet Mark 在 mangle 中到底做了什么?

一条典型规则:

action=mark-packet new-packet-mark=web_pkt

它的真实含义等价于:

“凡是匹配到这条规则的每一个数据包, 都在 RouterOS 内部标记为:web_pkt

之后:

  • Queue Tree
  • Simple Queue(部分场景)
  • Torch / 统计信息

都可以根据这个标记对流量进行分类处理。


四、为什么不能只用 Connection Mark?

在标准 QoS 配置中,通常是两步走

# 第一步:判断“这是什么连接”
action=mark-connection new-connection-mark=web_conn

# 第二步:给这个连接里的每个包打标
action=mark-packet new-packet-mark=web_pkt

原因在于两种标记的职责不同:

Connection Mark:

  • 只在连接建立时标一次
  • CPU 开销小
  • 适合做复杂判断 (端口、协议、连接字节数等)

Packet Mark:

  • 每一个包都会被打标
  • Queue Tree 只能识别它
  • 用于精确调度

这是 RouterOS 官方和社区长期验证过的标准写法。


五、passthrough=no 和 Packet Mark 的关系

你在规则中使用了:

passthrough=no

它的含义是:

一个包一旦被打上这个 packet-mark后续的 mangle 规则将不再处理这个包。

这样做的目的只有一个:

  • 防止同一个包被多次打不同的 packet-mark
  • 保证:一个包 → 只进入一个队列

如果没有这一步,QoS 行为会变得不可预测。


六、为什么 Queue Tree 只认 Packet Mark?

Queue Tree 的核心匹配条件是:

packet-mark=web_pkt

它的逻辑非常“死板”:

“我只接收 packet-mark = web_pkt 的包”

Queue Tree 完全不关心

  • 端口
  • IP
  • 连接状态
  • connection-mark

所有复杂判断,必须在 mangle 阶段提前完成


七、结合「网页优先 QoS」走一遍完整流程

以“打开网页”为例:

浏览器发起 TCP SYN → mangle 命中 80/443 → 连接被标记为 web_conn

后续网页数据包 → 根据 connection-mark=web_conn → 每个包被标记为 web_pkt

包进入 Queue Tree → 命中:

packet-mark=web_pkt
priority=2

同时存在的下载 / 视频包 → priority=8 → 被高优先级网页包插队

最终效果:网页始终流畅


八、常见误解澄清

New Packet Mark = 限速 不是。 限速只发生在 Queue / Queue Tree。

New Packet Mark 会改变包内容 不会。 它只是 RouterOS 内部的逻辑标签。

一个包可以有多个 packet-mark 不可以。 后打的会覆盖前一个,所以必须合理使用 passthrough=no


九、一句话终极记忆

Connection Mark:这是哪一条路 Packet Mark:这是哪一辆车 Queue Tree:哪条道先走