下载脚本文件:queue_tree
# 在这里设置您的外接口列表名称(所设置外网接口必须存在,如果有多个则用逗号分隔)
:local pppoeInterfaces “pppoe-out1”
# 设置桥接接口或LAN接口名称(用于下载队列根,一般为内网网关所在接口)
:local bridgeInterface “bridge1”
# 设置最大下载带宽,请根据实际网络带宽修改。(单位:Mbps)
:local maxDownloadMbps 350
# 设置最大上传带宽,请根据实际网络带宽修改。(单位:Mbps)
:local maxUploadMbps 60
# ==================== 检查接口是否存在 ====================
# 检查pppoeInterfaces中的每个接口
:foreach i in=[:toarray $pppoeInterfaces] do={
:if ([/interface find name=$i] = “” && [/interface list member find list=$i] = “”) do={
:error “Interface ‘$i’ not found”
}
}
# 检查桥接接口
:if ([/interface find name=$bridgeInterface] = “”) do={
:error “Interface ‘$bridgeInterface’ not found”
}
# 清空 Mangle 列表
/ip firewall mangle remove [find comment~”Mark|Download|Upload”]
# 首先创建所有连接标记规则(只需要创建一次)
/ip firewall mangle
add action=mark-connection chain=prerouting comment=\
“Mark Real-time UDP Connections” dst-port=\
27000-27030,3478,3479,3659,5060 new-connection-mark=\
realtime_conn protocol=udp
add action=mark-connection chain=prerouting comment=”Mark UDP Connections” \
connection-mark=!realtime_conn new-connection-mark=udp_conn protocol=udp
add action=mark-connection chain=prerouting comment=”Mark HTTP Connections” \
dst-port=80,8080,8000,8081,443,8443 new-connection-mark=http_conn \
protocol=tcp
add action=mark-connection chain=prerouting comment=”Mark TCP Connections” \
connection-mark=!http_conn new-connection-mark=tcp_conn protocol=tcp
# 将接口列表转换为数组并遍历
:foreach interface in=[:toarray $pppoeInterfaces] do={
# 下载方向规则
add action=mark-packet chain=prerouting comment=\
“Download Real-time UDP Traffic Packets ($interface)” connection-mark=realtime_conn \
in-interface=$interface new-packet-mark=”dl_realtime_traffic($interface)” passthrough=\
no protocol=udp
add action=mark-packet chain=prerouting comment=\
“Download UDP Small Packets – High Priority ($interface)” connection-mark=udp_conn \
in-interface=$interface new-packet-mark=”dl_udp_small($interface)” packet-size=0-512 \
passthrough=no protocol=udp
add action=mark-packet chain=prerouting comment=\
“Download UDP Large Packets – Medium Priority ($interface)” \
in-interface=$interface new-packet-mark=”dl_udp_large($interface)” passthrough=no \
protocol=udp
add action=mark-packet chain=prerouting comment=\
“Download Large File Traffic Packets ($interface)” connection-bytes=5000000-0 in-interface=\
$interface new-packet-mark=”dl_large_file_traffic($interface)” passthrough=no protocol=tcp
add action=mark-packet chain=prerouting comment=\
“Download HTTP Traffic Packets ($interface)” connection-mark=http_conn in-interface=\
$interface new-packet-mark=”dl_http_traffic($interface)” passthrough=no protocol=tcp
add action=mark-packet chain=prerouting comment=\
“Download TCP Small Packets – Highest Priority ($interface)” connection-mark=tcp_conn \
in-interface=$interface new-packet-mark=”dl_tcp_small($interface)” packet-size=0-128 \
passthrough=no protocol=tcp
add action=mark-packet chain=prerouting comment=”Download Other TCP Traffic ($interface)” \
in-interface=$interface new-packet-mark=\
“dl_other_tcp($interface)” passthrough=no protocol=tcp
# 上传方向规则
add action=mark-packet chain=postrouting comment=\
“Upload Real-time UDP Traffic Packets ($interface)” connection-mark=realtime_conn \
new-packet-mark=”up_realtime_traffic($interface)” out-interface=$interface passthrough=\
no protocol=udp
add action=mark-packet chain=postrouting comment=\
“Upload UDP Small Packets – High Priority ($interface)” connection-mark=udp_conn \
new-packet-mark=”up_udp_small($interface)” out-interface=$interface packet-size=0-512 \
passthrough=no protocol=udp
add action=mark-packet chain=postrouting comment=\
“Upload UDP Large Packets – Medium Priority ($interface)” \
new-packet-mark=”up_udp_large($interface)” out-interface=$interface passthrough=no \
protocol=udp
add action=mark-packet chain=postrouting comment=\
“Upload Large File Traffic Packets ($interface)” connection-bytes=5000000-0 \
new-packet-mark=”up_large_file_traffic($interface)” out-interface=$interface passthrough=no \
protocol=tcp
add action=mark-packet chain=postrouting comment=\
“Upload HTTP Traffic Packets ($interface)” connection-mark=http_conn new-packet-mark=\
“up_http_traffic($interface)” out-interface=$interface passthrough=no protocol=tcp
add action=mark-packet chain=postrouting comment=\
“Upload TCP Small Packets – Highest Priority ($interface)” connection-mark=tcp_conn \
new-packet-mark=”up_tcp_small($interface)” out-interface=$interface packet-size=0-128 \
passthrough=no protocol=tcp
add action=mark-packet chain=postrouting comment=”Upload Other TCP Traffic ($interface)” \
new-packet-mark=”up_other_tcp($interface)” out-interface=\
$interface passthrough=no protocol=tcp
:log info “Mangle rules created for interface: $interface”
}
:log info “Mangle rules creation completed for all interfaces: $pppoeInterfaces”
# ==================== 清理现有配置 ====================
:log info “开始清理现有的队列配置…”
/queue type remove [find name~”PCQ-“]
/queue tree remove [find]
:log info “队列配置清理完成”
# ==================== 创建队列类型 ====================
:log info “创建队列类型…”
/queue type
add kind=pcq name=PCQ-Download pcq-classifier=dst-address
add kind=pcq name=PCQ-Upload pcq-classifier=src-address
# 如果内网用户较多时,比较学校等机构中,5000KiB可以适当再改大
set [find name=”PCQ-Download”] pcq-total-limit=5000KiB
set [find name=”PCQ-Upload”] pcq-total-limit=5000KiB
# ==================== 为每个PPPoE接口创建队列树 ====================
:local interfaceCount 0
# 将接口列表转换为数组并遍历
:foreach interface in=[:toarray $pppoeInterfaces] do={
:set interfaceCount ($interfaceCount + 1)
:log info “为接口 $interface 创建队列树配置…”
#=================== 计算出常用的带宽 =================
:local downloadMbps90 ((($maxDownloadMbps *9 / 10 +5)/10*10) . “M”)
:local downloadMbps75 ((($maxDownloadMbps *3 / 4 +5)/10*10) . “M”)
:local downloadMbps50 ((($maxDownloadMbps / 2 +5)/10*10) . “M”)
:local downloadMbps25 ((($maxDownloadMbps / 4 +5)/10*10) . “M”)
:local uploadMbps90 ((($maxUploadMbps *9 / 10 +5) /10*10) . “M”)
:local uploadMbps75 ((($maxUploadMbps *3 / 4 +5) /10*10) . “M”)
:local uploadMbps50 ((($maxUploadMbps / 2 +5) /10*10) . “M”)
:local uploadMbps25 ((($maxUploadMbps / 4 +5) /10*10) . “M”)
# ==================== 下载队列树 ====================
/queue tree
# 下载根队列(所有下载流量共享同一个根,基于桥接接口)
add name=”download_root($interface)” parent=$bridgeInterface priority=1 queue=default
# TCP小包(最高优先级)
add burst-limit=$downloadMbps75 burst-threshold=$downloadMbps25 burst-time=30s limit-at=2M max-limit=\
$downloadMbps50 name=”tcp_small_dl($interface)” packet-mark=”dl_tcp_small($interface)” parent=”download_root($interface)” \
priority=1 queue=default
# 实时UDP流量(最高优先级)
add burst-limit=$downloadMbps75 burst-threshold=$downloadMbps25 burst-time=30s limit-at=2M \
max-limit=$downloadMbps50 name=”realtime_dl($interface)” packet-mark=”dl_realtime_traffic($interface)” parent=\
“download_root($interface)” priority=1 queue=default
# UDP小包(高优先级)
add burst-limit=$downloadMbps75 burst-threshold=$downloadMbps25 burst-time=30s limit-at=2M \
max-limit=$downloadMbps50 name=”udp_small_dl($interface)” packet-mark=”dl_udp_small($interface)” parent=\
“download_root($interface)” priority=2 queue=default
# HTTP流量(中优先级)
add limit-at=5M max-limit=$downloadMbps90 name=”http_dl($interface)” packet-mark=”dl_http_traffic($interface)” \
parent=”download_root($interface)” priority=3 queue=PCQ-Download
# 大文件流量(中低优先级)
add limit-at=5M max-limit=$downloadMbps90 name=”large_file_dl($interface)” packet-mark=”dl_large_file_traffic($interface)” \
parent=”download_root($interface)” priority=6 queue=PCQ-Download
# UDP大包(低优先级)
add limit-at=5M max-limit=$downloadMbps90 name=”udp_large_dl($interface)” packet-mark=”dl_udp_large($interface)” \
parent=”download_root($interface)” priority=7 queue=PCQ-Download
# 其他TCP流量(中低优先级)
add limit-at=2M max-limit=$downloadMbps90 name=”other_tcp_dl($interface)” packet-mark=”dl_other_tcp($interface)” \
parent=”download_root($interface)” priority=5 queue=PCQ-Download
# ==================== 上传队列树 ====================
# 上传根队列 – 直接使用接口名称作为parent
add name=”upload_root($interface)” parent=$interface priority=1 queue=default
# TCP小包上传(最高优先级)
add limit-at=1M max-limit=$uploadMbps50 name=”tcp_small_ul($interface)” packet-mark=”up_tcp_small($interface)” \
parent=”upload_root($interface)” priority=1 queue=default
# 实时UDP流量上传(最高优先级)
add limit-at=1M max-limit=$uploadMbps50 name=”realtime_ul($interface)” packet-mark=\
“up_realtime_traffic($interface)” parent=”upload_root($interface)” priority=1 queue=default
# UDP小包上传(高优先级)
add limit-at=1M max-limit=$uploadMbps50 name=”udp_small_ul($interface)” packet-mark=”up_udp_small($interface)” \
parent=”upload_root($interface)” priority=2 queue=default
# HTTP流量上传(中优先级)
add limit-at=2M max-limit=$uploadMbps90 name=”http_ul($interface)” packet-mark=”up_http_traffic($interface)” \
parent=”upload_root($interface)” priority=3 queue=PCQ-Upload
# 大文件流量上传(中优先级)
add limit-at=2M max-limit=$uploadMbps90 name=”large_file_ul($interface)” packet-mark=”up_large_file_traffic($interface)” \
parent=”upload_root($interface)” priority=5 queue=PCQ-Upload
# UDP大包上传(低优先级)
add limit-at=1M max-limit=$uploadMbps90 name=”udp_large_ul($interface)” packet-mark=”up_udp_large($interface)” \
parent=”upload_root($interface)” priority=6 queue=PCQ-Upload
# 其他TCP流量上传(中优先级)
add limit-at=1M max-limit=$uploadMbps90 name=”other_tcp_ul($interface)” packet-mark=”up_other_tcp($interface)” \
parent=”upload_root($interface)” priority=5 queue=PCQ-Upload
:log info “接口 $interface 的队列树配置创建完成”
}







评论前必须登录!
注册