Mikrotik: скрипт для динамического и ровного деления скорости
Mikrotik: скрипт для динамического и ровного деления скорости
автор: Inlarion
Задача:
Порезать поровну между всеми пользователями скорость,еще и ухитрится это сделать так, чтобы не резервировалась скорость на ИПы которые на данный момент не пользуются, можно сказать — делилась между теми кто реально в онлайне
.
Работаем с PPTP/РРРоЕ клиентами
Пул пользователей 172.16.1.2-172.16.1.254
Адрес сервера 192.168.1.1
Добавляем пользователей:
1 2 3 4 5 6 | / ppp secret add name="user1" service=pptp password="null" profile=default-encryption local-address=192.168.1.1 remote-address=172.16.1.2 disabled=no / ppp secret add name="user2" service=pptp password="null" profile=default-encryption local-address=192.168.1.1 remote-address=172.16.1.3 disabled=no / ppp secret add name="user3" service=pptp password="null" profile=default-encryption local-address=192.168.1.1 remote-address=172.16.1.4 disabled=no / ppp secret add name="user4" service=pptp password="null" profile=default-encryption local-address=192.168.1.1 remote-address=172.16.1.5 disabled=no / ppp secret add name="user5" service=pptp password="null" profile=default-encryption local-address=192.168.1.1 remote-address=172.16.1.6 disabled=no / ppp secret add name="user6" service=pptp password="null" profile=default-encryption local-address=192.168.1.1 remote-address=172.16.1.7 disabled=no |
Добавляем корни дерева:
1 2 | / queue tree add name="Download" parent=global-out limit-at=0 queue=hotspot-default priority=8 max-limit=0 burst-limit=0 burst-threshold=0 burst-time=0s disabled=no / queue tree add name="Upload" parent=global-out limit-at=0 queue=hotspot-default priority=8 max-limit=0 burst-limit=0 burst-threshold=0 burst-time=0s disabled=no |
Этот скрипт автоматически создаст PPTP сервера для каждого из пользователей, автоматом пропишет правила в Mangle, автоматом пропишет ветки в Queue tree, и в конце переподключит активных пользователей.
В настройках всего три пункта: MangleDstAddr -Указывает на диапазон адресов являющихся большой сетью, т.е. Инет или локалка прова или что у вас там.
ParentDownload и ParentUpload указывают на имя корней заданных в / queue tree
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #Settings ######################### :local MangleDstAddr ("0.0.0.0/0"); :local ParentDownload ("Download"); :local ParentUpload ("Upload"); ######################### #Internal Var ################ :local z; :local userX; :local clientaddr; :local qtr; :local mgr; :local pptpr; :local disu; :set qtr (0); :set mgr (0); :set pptpr (0); ################ #Loop ########################### :foreach z in=[/ppp secret find] do={ ########################### #Get Name and IP ########################### :set userX [/ppp secret get $z name]; :set clientaddr [/ppp secret get $z remote-address]; ########################### #Remove-Add PPTP Servers ########################### :if ([/interface pptp-server find name=$userX] != "") do={/interface pptp-server remove [/interface pptp-server find name=$userX];} /interface pptp-server add user=$userX name=$userX; :set pptpr ($pptpr+1); ########################### #Remove-Add Mangle Rules ########################### :if ([/ip firewall mangle find src-address=$clientaddr] !="") do={/ip firewall mangle remove [/ip firewall mangle find src-address=$clientaddr]; } :if ([/ip firewall mangle find dst-address=$clientaddr] !="") do={/ip firewall mangle remove [/ip firewall mangle find dst-address=$clientaddr]; } / ip firewall mangle add chain=forward src-address=$clientaddr dst-address=$MangleDstAddr action=mark-packet new-packet-mark=($userX . "_up") passthrough=no disabled=no comment=("Outing Traffic " . $userX); :set mgr ($mgr+1); / ip firewall mangle add chain=forward src-address=$MangleDstAddr dst-address=$clientaddr action=mark-packet new-packet-mark=($userX . "_down") passthrough=no disabled=no comment=("Incoming Traffic " . $userX); :set mgr ($mgr+1); ########################### #Remove-Add Queue ########################### :if ([/ queue tree find name=($userX . "_down")] !="") do={/ queue tree remove [/ queue tree find name=($userX . "_down")] }; / queue tree add name=($userX . "_down") parent=$ParentDownload packet-mark=($userX . "_down") disabled=no :set qtr ($qtr+1); :if ([/ queue tree find name=($userX . "_up")] !="") do={/ queue tree remove [/ queue tree find name=($userX . "_up")] }; / queue tree add name=($userX . "_up") parent=$ParentUpload packet-mark=($userX . "_up") disabled=no :set qtr ($qtr+1); ########################### #End of loop ########################### } ########################### #Disconnect Active PPTP Users ########################### :foreach z in=[/ppp active find] do={ :set userX [/ppp active get $z name]; /ppp active remove [/ppp active find name=$userX]; } ########################### #Logging ################################ :log warning ("Creater:") :log info ("Queue tree records created: " . $qtr); :log info ("Mangle records created: " . $mgr); :log info ("PPTP Servers created: " . $pptpr); ################################ ######################### #(C) Inlarion icq 429587 Copyright # ######################### |
Следующий скрипт позволит удалить правила из Mangle, Queue, PPTP автоматом, достаточно удалить пользователя из /ppp secret, а потом запустить скрипт, скрипт настраивается аналогично первому.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #Settings ############################ :local MangleDstAddr ("0.0.0.0/0"); :local ParentDownload ("Download"); :local ParentUpload ("Upload"); ############################ #Internal Var ################ :local z; :local mark; :local userX; :local qtr; :local mgr; :local pptpr; :set qtr (0); :set mgr (0); :set pptpr (0); ################ #Loop to search Queue tree records DOWN ############################### :foreach z in=[/ queue tree find parent=$ParentDownload] do={ :set mark [/ queue tree get $z packet-mark]; :if ($mark !="") do={ :set mark ([:pick $mark 0 ([:len $mark]-5)]); :if ([/ppp secret find name=$mark] = "") do={/ queue tree remove [/ queue tree find packet-mark=($mark . "_down")]; :set qtr ($qtr+1); }}} ############################### #Loop to search Queue tree records UP ############################### :foreach z in=[/ queue tree find parent=$ParentUpload] do={ :set mark [/ queue tree get $z packet-mark]; :if ($mark !="") do={ :set mark ([:pick $mark 0 ([:len $mark]-3)]); :if ([/ppp secret find name=$mark] = "") do={/ queue tree remove [/ queue tree find packet-mark=($mark . "_up")]; :set qtr ($qtr+1); }}} ############################### #Loop to search Mangle records UP ############################### :foreach z in=[/ ip firewall mangle find dst-address=$MangleDstAddr action="mark-packet" chain="forward"] do={ :set mark [/ ip firewall mangle get $z new-packet-mark]; :if ($mark !="") do={ :set mark ([:pick $mark 0 ([:len $mark]-3)]); :if ([/ppp secret find name=$mark] = "") do={ :if ([/ ip firewall mangle find comment=("Outing Traffic " . $mark)] != "") do={/ ip firewall mangle remove [/ ip firewall mangle find comment=("Outing Traffic " . $mark)]; :set mgr ($mgr+1); }}}} ############################### #Loop to search Mangle records DOWN ############################### :foreach z in=[/ ip firewall mangle find src-address=$MangleDstAddr action="mark-packet" chain="forward"] do={ :set mark [/ ip firewall mangle get $z new-packet-mark]; :if ($mark !="") do={ :set mark ([:pick $mark 0 ([:len $mark]-5)]); :if ([/ppp secret find name=$mark] = "") do={ :if ([/ ip firewall mangle find comment=("Incoming Traffic " . $mark)] != "") do={/ ip firewall mangle remove [/ ip firewall mangle find comment=("Incoming Traffic " . $mark)]; :set mgr ($mgr+1); }}}} ################################ #Loop to search PPTP records ################################ :foreach z in=[/interface pptp-server find] do={ :set userX [/interface pptp-server get $z name]; :if ([/ppp secret find name=$userX] = "") do={/interface pptp-server remove [/interface pptp-server find name=$userX]; :set pptpr ($pptpr+1);}} ################################ #Logging ################################ :log warning ("Cleaner:") :log info ("Queue tree records deleted: " . $qtr); :log info ("Mangle records deleted: " . $mgr); :log info ("PPTP Servers deleted: " . $pptpr); ################################ ######################### #(C) Inlarion icq 429587 Copyright # ######################### |
И сам скрипт шейпера заталкиваем в планировщик на 5-15сек, как его настраивать можете прочитать в первом посте, в скрипте немного поправлен синтаксис, т.к. на тройках он не работал из за отсутствия кавычек в переменных
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | ###################### :local MaxRateDownload ("2000000"); :local MaxRateUpload ("2000000"); :local ActiveThresholddown ("5000"); :local ActiveThresholdup ("5000"); :local ParentDownload ("Download"); :local ParentUpload ("Upload"); ###################### ###################### :local z; :local i; :local ii; :local userX; :global onlineclientsdown (0); :global onlineclientsup (0); :global connected (0); ###################### ###################### :foreach i in=[/ppp active find] do={ :set userX [/ppp active get $i name]; :global connected ($connected+1); /interface monitor-traffic [/interface find name=$userX] once do {:if ($received-bits-per-second >=$ActiveThresholddown) do { :global onlineclientsdown ($onlineclientsdown+1);}} }; :foreach ii in=[/ppp active find] do={ :set userX [/ppp active get $ii name]; /interface monitor-traffic [/interface find name=$userX] once do {:if ($sent-bits-per-second >=$ActiveThresholdup) do { :global onlineclientsup ($onlineclientsup+1);}} }; :if ($onlineclientsdown = 0) do {:set onlineclientsdown (1)}; :if ($onlineclientsup= 0) do {:set onlineclientsup (1)}; :local ratelimitdown ($MaxRateDownload/$onlineclientsdown) :local ratelimitup ($MaxRateUpload/$onlineclientsup) :foreach z in=[/ppp active find] do={ :set userX [/ppp active get $z name]; /queue tree set [/queue tree find name=($userX . "_down")] parent=$ParentDownload packet-mark=($userX . "_down") queue=hotspot-default priority=8 max-limit=$ratelimitdown /queue tree set [/queue tree find name=($userX . "_up")] parent=$ParentUpload packet-mark=($userX . "_up") queue=hotspot-default priority=8 max-limit=$ratelimitup}; ###################### ###################### :local kbsmaxdown ($MaxRateDownload/1000); :local kbsmaxup ($MaxRateUpload /1000); :local kbsthr ($ActiveThresholddown/1000); :local kbsdown ($ratelimitdown/1000); :local kbsup ($ratelimitup/1000); :log warning ("Shaper:"); :log info ("MaxRate Download : " . $MaxRateDownload . " bps /" . $kbsmaxdown . " kbs / Upload : " . $MaxRateUpload . " bps /" . $kbsmaxup . " kbs"); :log info ("Threshold: Download : " . $ActiveThresholddown . " bps /" . $kbsthr . " kbs / Upload : " . $ActiveThresholdup . " bps /" . $kbsthr . " kbs"); :log info ("Connected Users : " . $connected); :log info ("Active Users : Download : " . $onlineclientsdown . " / Upload : " . $onlineclientsup); :log info ("User Speed Download : " . $ratelimitdown . " bps /" . $kbsdown . " kbs / Upload : " . $ratelimitup . " bps /" . $kbsup . " kbs"); ###################### # (C) Inlarion icq 429-587 Copyright! |
Принцип такой, добавил пользователя или несколько пользователей в /ppp secret запустил однократно первый скрипт.
Удалил пользователя или несколько пользователей из /ppp secret запустил однократно второй скрипт.
Третий скрипт крутится в планировщике.
Все скрипты проверены на версии 2,9,27 проблем не замечено, перед использованием настоятельно рекомендую сделать бекап конфигурации…..
Эти скрипты вы используете на свой страх и риск, и отвечаете самостоятельно за все поломки, потери, порчи оборудования и пр. шнягу, как говорится автор тут не причем
Поправки для mikrotik 3.22
mikrotik 3.22 + advanced-tools установлен
ошибка в синтаксисе с do= и global.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #### ###Поправки для mikrotik 3.22 на blog.wel.org.ua ###################### :local MaxRateDownload ("500000"); :local MaxRateUpload ("450000"); :local ActiveThresholddown ("5000"); :local ActiveThresholdup ("5000"); :local ParentDownload ("Download"); :local ParentUpload ("Upload"); ###################### ###################### :local z; :local i; :local ii; :local userX; :global onlineclientsdown (0); :global onlineclientsup (0); :global connected (0); ###################### ###################### :foreach i in=[/ppp active find] do={ :set userX [/ppp active get $i name]; :global connected ($connected+1); :foreach i in=[/ppp active find] do={ :set userX [/ppp active get $i name]; :global connected ( $connected + 1 ); /interface monitor-traffic [/interface find name=$userX] once do={ :if ( $"received-bits-per-second" >= $ActiveThresholddown ) do={ :set onlineclientsdown ( $onlineclientsdown + 1 ); } } } :foreach ii in=[/ppp active find] do={ :set userX [/ppp active get $ii name]; /interface monitor-traffic [/interface find name=$userX] once do={ :if ( $"sent-bits-per-second" >= $ActiveThresholdup ) do={ :set onlineclientsup ( $onlineclientsup + 1 ); } } } :if ( $onlineclientsdown = 0 ) do={:set onlineclientsdown ( 1 ) }; :if ( $onlineclientsup = 0 ) do={:set onlineclientsup ( 1 ) }; :if ($onlineclientsdown = 0) do {:set onlineclientsdown (1)}; :if ($onlineclientsup= 0) do {:set onlineclientsup (1)}; :local ratelimitdown ($MaxRateDownload/$onlineclientsdown) :local ratelimitup ($MaxRateUpload/$onlineclientsup) :foreach z in=[/ppp active find] do={ :set userX [/ppp active get $z name]; /queue tree set [/queue tree find name=($userX . "_down")] parent=$ParentDownload packet-mark=($userX . "_down") queue=hotspot-default priority=8 max-limit=$ratelimitdown /queue tree set [/queue tree find name=($userX . "_up")] parent=$ParentUpload packet-mark=($userX . "_up") queue=hotspot-default priority=8 max-limit=$ratelimitup}; ###################### ###################### :local kbsmaxdown ($MaxRateDownload/1000); :local kbsmaxup ($MaxRateUpload /1000); :local kbsthr ($ActiveThresholddown/1000); :local kbsdown ($ratelimitdown/1000); :local kbsup ($ratelimitup/1000); :log warning ("Shaper:"); :log info ("MaxRate Download : " . $MaxRateDownload . " bps /" . $kbsmaxdown . " kbs / Upload : " . $MaxRateUpload . " bps /" . $kbsmaxup . " kbs"); :log info ("Threshold: Download : " . $ActiveThresholddown . " bps /" . $kbsthr . " kbs / Upload : " . $ActiveThresholdup . " bps /" . $kbsthr . " kbs"); :log info ("Connected Users : " . $connected); :log info ("Active Users : Download : " . $onlineclientsdown . " / Upload : " . $onlineclientsup); :log info ("User Speed Download : " . $ratelimitdown . " bps /" . $kbsdown . " kbs / Upload : " . $ratelimitup . " bps /" . $kbsup . " kbs"); ###################### # © Inlarion icq 429-587 Copyright! |
нюансы на 3.30 и 4.6
Менять нужно
received-bits-per-second заменили на rx-bits-per-second
sent-bits-per-second на tx-bits-per-second
Соответственно:
$»rx-bits-per-second»
$»tx-bits-per-second»Так же в функциях поменять :global на :set для тех кто не поменял
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #адаптация для 3.30 и 4.6 #без проверки на http://blog.wel.org.ua #scheduler SCRIPT ###################### :local MaxRateDownload ("4000000"); :local MaxRateUpload ("50000"); :local ActiveThresholddown ("5000"); :local ActiveThresholdup ("5000"); :local ParentDownload ("Download"); :local ParentUpload ("Upload"); ###################### ###################### :local z; :local i; :local ii; :local userX; :global onlineclientsdown (0); :global onlineclientsup (0); :global connected (0); ###################### ###################### :foreach i in=[/ppp active find] do={ :set userX [/ppp active get $i name]; :global connected ( $connected + 1 ); /interface monitor-traffic [/interface find name=$userX] once do={:if ($rx-bits-per-second >= $ActiveThresholddown ) do={:set onlineclientsdown ( $onlineclientsdown + 1 );}}} :foreach ii in=[/ppp active find] do={:set userX [/ppp active get $ii name]; /interface monitor-traffic [/interface find name=$userX] once do={:if ($tx-bits-per-second >= $ActiveThresholdup ) do={:set onlineclientsup ( $onlineclientsup + 1 );}}} :if ( $onlineclientsdown = 0 ) do={:set onlineclientsdown ( 1 ) }; :if ( $onlineclientsup = 0 ) do={:set onlineclientsup ( 1 ) }; :local ratelimitdown ($MaxRateDownload/$onlineclientsdown) :local ratelimitup ($MaxRateUpload/$onlineclientsup) :foreach z in=[/ppp active find] do={ :set userX [/ppp active get $z name]; /queue tree set [/queue tree find name=($userX . "_down")] parent=$ParentDownload packet-mark=($userX . "_down") queue=hotspot-default priority=8 max-limit=$ratelimitdown /queue tree set [/queue tree find name=($userX . "_up")] parent=$ParentUpload packet-mark=($userX . "_up") queue=hotspot-default priority=8 max-limit=$ratelimitup}; ###################### .............................................................. # © Inlarion icq 429-587 Copyright! |
На 3.30 незаводится =(
Уже имеется более свежая копия этого скрипта на сайте разработчика:
http://mikrotik.axiom-pro.ru/scripts/shaperv1.php
Протестировано на версиях:
2.9.27, 2.9.51, 3.20, 3.22, 3.30, 4.13, 5.0rc3
Предлагаю обновить топик и копирайы.
Спасибо за внимание!
Спасибо