用戶平分帶寬例子(pcq)

這個例子示範瞭如何將10mbps下載2mbps上傳,均分給網絡192.168.0.0/24中的活動的用戶。
如果主機A下載2Mbps,主機B就只能獲得8mbps,反之亦然。
有這樣一種情況,他們都想獲得最大帶寬(10mbps),他們將各自獲得5mbps,上傳也一樣。這個設置同樣是用於更多用戶的情形。


首先,所有來自本地網絡192.168.0.0/24的流,標記 一個用戶標記。
/ip firewall mangle add chain=forward src-address=192.168.0.0/24 \
action=mark-connection new-connection-mark=users-con
/ip firewall mangle add connection-mark=users-con action=mark-packet \
new-packet-mark=users chain=forward

現在我們將添加兩個新的PCQ類型。第一個命名pcq-download,將依據目的地址聚合所有流。我們將給本地接口使用這個queue type。它將爲那些目的地址是網絡192.168.0.0/24的下載,創建一個動態隊列。
第二個命名爲pcq-upload,將依據源地址聚合所有流。我們將給公網接口使用,所以它將爲來自本地網絡192.168.0.0/24到internet的上傳,創建以一個動態隊列。
/queue type add name=pcq-download kind=pcq pcq-classifier=dst-address
/queue type add name=pcq-upload kind=pcq pcq-classifier=src-address

最後,給下載流創建一個queue tree。
/queue tree add name=Download parent=Local max-limit=10240000
/queue tree add parent=Download queue=pcq-download packet-mark=users

給上傳流的:
/queue tree add name=Upload parent=Public max-limit=2048000
/queue tree add parent=Upload queue=pcq-upload packet-mark=users

注意:如果你的ISP不能提供一個固定的流量,你可以在上傳QUEUE規則和下載QUEUE規則中,直接在接口上使用QUEUE。
/queue tree add parent=Local queue=pcq-download packet-mark=users
/queue tree add parent=Public queue=pcq-upload packet-mark=users

 

 

 

 

 

 

 

 

 


/ip fir fil
add chain=forward src-address=192.168.0.0/24 action=add-src-to-address-list   address-list=pcq_list address-list-timeout=5s comment="pcq_list_add"

/que typ
add name="pqc_http_down" kind=pcq pcq-rate=824000 pcq-limit=50   pcq-classifier=dst-address pcq-total-limit=200000
add name="pcq_up" kind=pcq pcq-rate=284000 pcq-limit=50    pcq-classifier=src-address pcq-total-limit=20000


/que sim
#取消對網關的限制#
add name="admin" target-addresses=192.168.0.0/24 dst-address=192.168.0.0/24  interface=all parent=none direction=both priority=1 queue=default/default    limit-at=0/0 max-limit=0/0 total-queue=default disabled=no
#PCQ分配#
add name="pcq" target-addresses=192.168.0.0/24 dst-address=0.0.0.0/0    interface=LAN parent=none direction=both priority=8  queue=pcq_up/pqc_http_down limit-at=0/0 max-limit=384000/1000000    burst-limit=384000/1000000 burst-threshold=64000/256000 burst-time=3s/3s    total-queue=default-small disabled=no

腳本1秒1次
:global maxdown
:global maxup
:global mindown
:global minup
:global resDown
:global resUp
:global yz
:global pcqup
:global pcqdown
:global pcqdownold
:global pcqupold
:global a
:global testup
:global testdown
:global pcqitem
:global curUp
:global curDown
:set maxdown 1024000
:set maxup 384000
:set mindown 120000
:set minup 80000
:set resDown 200000
:set resUp 100000
:set yz 100
:set pcqitem [:len [/ip firewall address-list find list=pcq_list]]
:if ($pcqitem!=0) do={
:set pcqdown [/queue type get [/queue type find name=pqc_http_down] pcq-rate]
:set pcqdownold $pcqdown
:set pcqup [/queue type get [/queue type find name=pcq_up] pcq-rate]
:set pcqupold $pcqup
:set curDown 1
:set curUp 1
/int mon PPPOE once do={:set curDown $"received-bits-per-second"}
/int mon PPPOE once do={:set curUp $"sent-bits-per-second"}
:set testdown ($maxdown+-$curDown+-$resDown)
:if ($testdown>0) do={
:set pcqdown ($pcqdown+($testdown/$yz))
}
:if ($testdown<=0) do={
:set pcqdown ($pcqdown+$testdown)
}
:set a ($maxdown+-$resDown)
:if ($pcqdown>$a) do={:set pcqdown $a}
:set a ($maxdown/$pcqitem)
:if ($pcqdown<$a) do={:set pcqdown $a}
:set testup ($maxup+-$curUp+-$resUp)
:if ($testup>0) do={
:set pcqup ($pcqup+($testup/$yz))
}
:if ($testup<=0) do={
:set pcqup ($pcqup+$testup)
}
:set a ($maxup+-$resUp)
:if ($pcqup>$a) do={:set pcqup $a}
:set a ($maxup/$pcqitem)
:if ($pcqup<$a) do={:set pcqup $a}

:if ($pcqdown!=$pcqdownold) do={
:if ($pcqdown>$mindown) do={
/queue type set [/queue type find name="pqc_http_down"] pcq-rate=$pcqdown
} else={
/queue type set [/queue type find name="pqc_http_down"] pcq-rate=$mindown
}
}

:if ($pcqup!=$pcqupold) do={
:if ($pcqup>$minup) do={
/queue type set [/queue type find name="pcq_up"] pcq-rate=$pcqup
} else={
/queue type set [/queue type find name="pcq_up"] pcq-rate=$minup
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章