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!

Comments to Mikrotik: скрипт для динамического и ровного деления скорости

  • На 3.30 незаводится =(

    LBT 11.10.2010 09:15 Ответить
  • Уже имеется более свежая копия этого скрипта на сайте разработчика:
    http://mikrotik.axiom-pro.ru/scripts/shaperv1.php
    Протестировано на версиях:
    2.9.27, 2.9.51, 3.20, 3.22, 3.30, 4.13, 5.0rc3
    Предлагаю обновить топик и копирайы.
    Спасибо за внимание!

    Inlarion 18.11.2010 21:17 Ответить

Leave a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Загрузка...
Menu Title