FastTrack-Friendly QoS Script
Добавлено: 29 июн 2022, 12:06
https://forum.mikrotik.com/viewtopic.php?t=113308
Код: Выделить всё
# this is based on IntrusDave's QoS script, but modified
# qosClasses are largely based on Cisco Wireless QoS mappings/guide
#Set outbound (WAN) interface here
:local outboundInterface "ether1"
#Set UPLOAD bandwidth of the outbound (WAN) interface
:local outInterfaceBandwidth 4900k
#Set inbound (LAN) interface here
:local inboundInterface "bridge"
#Set DOWNLOAD bandwidth of the outbound (WAN) interface
:local inInterfaceBandwidth 34500k
#Set type of queue here
:local queueType wireless-default
#Set where in the chain the packets should be mangled
:local mangleChain postrouting
#Don't mess with these. They set the parameters for what is to follow
:local queueName ("QoS_" . $outboundInterface)
:local inQueueName ("QoS_" . $inboundInterface)
# qosClasses from highest to lowest priority
:local qosClasses [:toarray "Network Control (Top Priority),Internetwork Control (High Priority),Voice (Medium-High Priority),Interactive Video (Medium Priority),Critical Data or Call Signaling (Medium-Low Priority),Best Effort (Low Priority),Background (Very Low Priority),Scavenger (Bottom Priority)"]
# maps queue priorities from highest to lowest to IP precedence values
:local priorityToIpPrecedenceMappings [:toarray "7,6,5,4,3,0,2,1"]
# queue priority used for best effort traffic (IP precedence 0)
:local beQueuePriority 6
/ip firewall mangle add action=set-priority \
chain=postrouting new-priority=from-dscp-high-3-bits \
passthrough=yes comment="Respect DSCP tagging"
/ip firewall mangle add action=set-priority \
chain=postrouting new-priority=6 packet-size=0-123 \
passthrough=yes protocol=tcp tcp-flags=ack comment="Prioritize ACKs"
/ip firewall mangle add action=accept \
chain=postrouting priority=0 \
comment="IP Precedence (aka Packet Priority) 0 - Best Effort (Low Priority) (default)"
:for indexA from 1 to 7 do={
:local qosIndex (7-$indexA)
# skip best effort in list
:if ($indexA <= (8-$beQueuePriority)) do={ :set qosIndex (8-$indexA) }
:local subClass ([:pick $qosClasses $qosIndex] )
/ip firewall mangle add action=mark-packet chain=$mangleChain comment=("IP Precedence (aka Packet Priority) " . $indexA . " - " . $subClass . " (apply packet mark ip_precedence_" . $indexA . ")") \
disabled=no priority=($indexA) new-packet-mark=("ip_precedence_" . $indexA) passthrough=no
}
:if ([/system package find name=ipv6 disabled=no] = "") do={
:log info "IPv6 package is not installed - skipping IPv6 mangle rules";
} else={
:for dscpValue from 0 to 7 do={
/ipv6 firewall mangle add action=accept \
chain=postrouting dscp=$dscpValue \
comment="IP Precedence 0 (DSCP $dscpValue) - Best Effort (Low Priority) (default)"
}
:for indexA from 1 to 7 do={
:local qosIndex (7-$indexA)
# skip best effort in list
:if ($indexA <= (8-$beQueuePriority)) do={ :set qosIndex (8-$indexA) }
:local subClass ([:pick $qosClasses $qosIndex] )
:for dscpValue from ($indexA*8) to (($indexA*8)+7) do={
/ipv6 firewall mangle add action=mark-packet chain=$mangleChain comment=("IP Precedence " . $indexA . " (DSCP " . $dscpValue . ") - " . $subClass . " (apply packet mark ip_precedence_" . $indexA . ")") \
disabled=no dscp=$dscpValue new-packet-mark=("ip_precedence_" . $indexA) passthrough=no
}
}
}
/queue tree add max-limit=$outInterfaceBandwidth name=$queueName parent=$outboundInterface comment="Uplink QoS" queue=$queueType
:for queuePriority from=1 to=8 do={
:local qosIndex ($queuePriority-1)
:local subClass ([:pick $qosClasses $qosIndex] )
:local ipPrecedence ([:pick $priorityToIpPrecedenceMappings $qosIndex])
:local ipPrecedenceMark ("ip_precedence_" . $ipPrecedence)
:if ($ipPrecedence = "0") do={ :set ipPrecedenceMark ("no-mark") }
/queue tree add \
name=("IP Precedence " . $ipPrecedence . ". " . $subClass . " - " . $outboundInterface ) \
parent=$queueName \
priority=($queuePriority) \
queue=$queueType \
packet-mark=$ipPrecedenceMark \
comment=("Queue Priority " . $queuePriority)
}
/queue tree add max-limit=$inInterfaceBandwidth name=$inQueueName parent=$inboundInterface comment="Downlink QoS" queue=$queueType
:for queuePriority from=1 to=8 do={
:local qosIndex ($queuePriority-1)
:local subClass ([:pick $qosClasses $qosIndex] )
:local ipPrecedence ([:pick $priorityToIpPrecedenceMappings $qosIndex])
:local ipPrecedenceMark ("ip_precedence_" . $ipPrecedence)
:if ($ipPrecedence = "0") do={ :set ipPrecedenceMark ("no-mark") }
/queue tree add \
name=("IP Precedence " . $ipPrecedence . ". " . $subClass . " - " . $inboundInterface ) \
parent=$inQueueName \
priority=($queuePriority) \
queue=$queueType \
packet-mark=$ipPrecedenceMark \
comment=("Queue Priority " . $queuePriority)
}