Инструменты пользователя

Инструменты сайта


mgmikrotikdhcp

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
mgmikrotikdhcp [2020/05/14 16:32]
bobr [Авторизация абонентов DHCP на MikroTik методом IP + MAC при помощи КучаГен]
mgmikrotikdhcp [2021/01/16 08:53] (текущий)
bobr [Когда DHCP-сервер у нас где-то там, а сам Mikrotik NAS - всего лишь relay]
Строка 12: Строка 12:
  
 Уже должен быть настроен [[multigen|КучаГен]].\\ Уже должен быть настроен [[multigen|КучаГен]].\\
-Не забываем добавить словарь для Mikrotik /​usr/​local/​etc/​raddb/​dictionary ​+Не забываем добавить словарь для Mikrotik ​в /​usr/​local/​etc/​raddb/​dictionary ​
 <​code>​ <​code>​
 $INCLUDE ​       /​usr/​local/​etc/​raddb/​dictionary_preset/​mikrotik.dictionary $INCLUDE ​       /​usr/​local/​etc/​raddb/​dictionary_preset/​mikrotik.dictionary
Строка 62: Строка 62:
  
 Далее:​\\ Далее:​\\
-===== Когда DHCP-сервером у нас сам Mikrotik NAS ===== +===== Когда DHCP-сервером у нас сам Mikrotik NAS - DEPRECATED и настоятельно не рекомендуется к использованию ​===== 
- в Mikrotik NAS __добавляем__+**Итак, поскольку у этого метода внезапно(за почти год, ага) был обнаружен ФАТАЛЬНЫЙ НЕДОСТАТОК,​ который заключается в том, что микрот запускает этот скрипт только в момент НЕПОСРЕДСТВЕННОГО получения девайсом DHCP-лиза и НЕ запускает его при автопродлении(автообновлении) лиза. Это приводит к тому, что если у юзера девайс(скажем роутер) включен постоянно и лиз он не переполучает,​ а автоматически продляет - то, например,​ при смене тарифа у юзера изменения лимитов скорости в шейпере не произойдет НИКОГДА. Ну, по крайней мере до тех пор, пока его устройство фактически не получит DHCP-лиз заново**  
 + 
 +**В связи с чем настоятельно рекомендуется во всех случаях использовать обновлённый и тщательнейше протестированный(но это не точно) скрипт для [[mgmikrotikdhcp#​когда_dhcp-сервер_у_нас_где-то_там_а_сам_mikrotik_nas_-_всего_лишь_relay|Mikrotik NAS в режиме RELAY]]** 
 + 
 +**А эту штуку оставим чисто для понимания "​каким образом хотелось бы, чтобы оно работало"​** 
 + 
 + в Mikrotik NAS **НЕ** ​__добавляем__
   * в **System -> Scripts** ​ скрипт примерно такого содержания(назовем его, скажем,​ //​SimpleQueueRebuild//​)   * в **System -> Scripts** ​ скрипт примерно такого содержания(назовем его, скажем,​ //​SimpleQueueRebuild//​)
-<​code>​+<​code ​tcl [enable_line_numbers="​​true"​​]> 
 +# getting global vars
 :global leaseBound; :global leaseBound;
 :global leaseActIP; :global leaseActIP;
 +
 :local speed "";​ :local speed "";​
 +:local newSpeed "";​
 +:local queueRec "";​
 :local alreadyExists false; :local alreadyExists false;
  
 :if ($leaseBound = 1) do={ :if ($leaseBound = 1) do={
     /queue simple     /queue simple
-    ​:foreach tQueue in=[/queue simple find target="​$leaseActIP/​32"​] do={ +# looking for an "​incorrect"​ queue simple rec with currently leased IP                   
-            :set speed [get $tQueue max-limit]; ​       ​+    ​:foreach tQueue in=[/queue simple find where (target="​$leaseActIP/​32" ​&& name!="​mlg_$leaseActIP"​)] do={ 
 +# if "​incorrect"​ queue rec was found - then we need to get it's speed 
 +# 'cause it may be a tariff change and new speed settings may appear  
 +        ​:set newSpeed ​[get $tQueue max-limit]; ​       ​ 
 +        remove $tQueue;  
 +    } 
  
-            ​:if ([get $tQueue ​name] != "mlg_$leaseActIP") do={             +# looking for a "​correct"​ queue simple rec with currently leased IP     
-                ​remove ​$tQueue+    ​:foreach tQueue in=[/queue simple find where (target="​$leaseActIP/​32"​ && name="​mlg_$leaseActIP"​)] do={ 
 +        :set queueRec [$tQueue];​ 
 +        :set speed [get $tQueue ​max-limit]
 +        :set alreadyExists true; 
 + 
 +# if $newSpeed is still empty - then no incorrect record was found 
 +# and we need to make $newSpeed and $speed equal to avoid excess speed change action 
 +        :if ($newSpeed = ""​) do={ 
 +            :set newSpeed [$speed]; 
 +        } 
 +    } 
 +     
 +# if any of "​speeds"​ were set - we need to perform some actions 
 +# otherwise we can't do a thing 
 +    :if ($speed ​!= "" || $newSpeed != "") do={         
 +# if found queue has correct name - just check it's speed and correct if needed 
 +# else - create a new queue with correct name and speed 
 +        :if ($alreadyExists) do={         
 +            :if ($newSpeed != $speed) do={ 
 +                ​set $queueRec max-limit=$newSpeed disabled=no;
             } else={             } else={
-                :set alreadyExists true;+                :log warning ("mlg_ changer: nothing to change for $leaseActIP - already exists with such speed"​);
             }             }
-    ​} +        ​else={ 
- +            add name="​mlg_$leaseActIP"​ max-limit=$newSpeed ​target="​$leaseActIP/​32"; ​        
-    :if (!alreadyExists && $speed != ""​) do={         +        }
-        add name="​mlg_$leaseActIP"​ max-limit=$speed target="​$leaseActIP/​32";​+
     }     }
 } }
Строка 99: Строка 132:
 Как и в предыдущем случае в Mikrotik NAS __добавляем__ Как и в предыдущем случае в Mikrotik NAS __добавляем__
   * в **System -> Scripts** ​ скрипт примерно такого содержания(назовем его, скажем,​ //​SimpleQueueRebuild//​)   * в **System -> Scripts** ​ скрипт примерно такого содержания(назовем его, скажем,​ //​SimpleQueueRebuild//​)
-<​code>​+<​code ​tcl [enable_line_numbers="​true"​]>
 :local qSpeed "";​ :local qSpeed "";​
 :local qTarget "";​ :local qTarget "";​
 :local qIP "";​ :local qIP "";​
 +:local currentSpeed "";​
 +:local leaseDynPrefix "​dhcp-ds<";​
  
 /queue simple /queue simple
-:local tQueueList [find where (name~"​^mlg_"​ = false)];+# get all of the simple queues which have no "​mlg_"​ prefix in their names 
 +#:local tQueueList [find where (name~"​^mlg_"​ = false)];
  
-:log warning ​("Not mlg_ queues found: ​" ​. [:len $tQueueList]);+# get all of the simple queues which have no "​mlg_"​ prefix in their names but do have $leaseDynPrefix 
 +:local tQueueList [find where (name~"^mlg_" ​= false && name~$leaseDynPrefix)]; 
 +:local tQueueMLG ""​;
  
 +# if some of the simple queues with no "​mlg_"​ prefix in their names found
 :if ([:len $tQueueList] > 0) do={ :if ([:len $tQueueList] > 0) do={
 +    :log warning ("Not mlg_ queues found: " . [:len $tQueueList]);​
 +# conditionally step through the list
 +# get the necessary prameters into local vars
 +# remove the "​incorrectly"​ named queue rec
     :foreach tQueue in=$tQueueList do={     :foreach tQueue in=$tQueueList do={
         :set qSpeed [get $tQueue max-limit];         :set qSpeed [get $tQueue max-limit];
Строка 117: Строка 160:
         remove $tQueue;         remove $tQueue;
  
-        ​:if ([:​len ​[find where (name="​mlg_$qIP"​)]] ​<= 0) do={            ​+# try to find simple queue with such IP address and "​mlg_"​ prefix 
 +        ​:set tQueueMLG ​[find where (name="​mlg_$qIP"​)]
 + 
 +# as far as we can rely on that fact that simple queues names are unique  
 +# we can be sure that there will be only one rec with such IP address and "​mlg_IP"​ prefix 
 +# and so if we found one - we can just change it's speed, enabled status and (just in case) - target IP 
 +# and not to create new one 
 +        :if ([:len $tQueueMLG0) do={ 
 +            :foreach eachQueueMLG in=$tQueueMLG do={                 
 +                :set currentSpeed [get $eachQueueMLG max-limit];​ 
 + 
 +                :if ($currentSpeed != $qSpeed) do={ 
 +                    set $eachQueueMLG max-limit=$qSpeed target=$qTarget disabled=no;​ 
 +                } else={ 
 +                    :log warning ("mlg_ changer: nothing to change for $qIP - already exists with such speed $qSpeed"​);​ 
 +                }                
 +            } 
 +        } else={ 
 +# create a new queue with correct name and speed
             add name="​mlg_$qIP"​ max-limit=$qSpeed target=$qTarget;​             add name="​mlg_$qIP"​ max-limit=$qSpeed target=$qTarget;​
-        }        +        }       ​
     }     }
 } }
 </​code>​ </​code>​
   * дальше идем в **System -> Scheduler** и создаем там задачу,​ которая будет запускать наш //​SimpleQueueRebuild//,​ скажем,​ раз в 30 сек. Можно и чаще. Можно и реже - всецело на ваш вкус.\\ ​   * дальше идем в **System -> Scheduler** и создаем там задачу,​ которая будет запускать наш //​SimpleQueueRebuild//,​ скажем,​ раз в 30 сек. Можно и чаще. Можно и реже - всецело на ваш вкус.\\ ​
-По сути, эта штука следует тому же принципу,​ что и предыдущая,​ только вот в силу того, что DHCP lease выдается не нашим НАСом и "​поймать",​ собственно,​ этот момент мы не можем - мы производим периодическую проверку на наличие "​неправильных"​ наименований шейперов и делаем из них "​правильные"​.\\+По сути, эта штука следует тому же принципу,​ что и предыдущая,​ только вот в силу того, что DHCP lease выдается не нашим НАСом и "​поймать",​ собственно,​ этот момент мы не можем - мы производим периодическую проверку на наличие "​неправильных"​ наименований шейперов и делаем из них "​правильные"​. ​ 
 + 
 +Стоит отметить,​ что переменная **leaseDynPrefix** призвана отфильтровать выборку записей //simple queue//, ограничив её только теми, в наименовании которых присутствует префикс __//​dhcp-ds<//​__ - именно так именовал динамически созданные записи //simple queue// микротик,​ на котором этот скрипт тестировался и **СТОИТ ИМЕТЬ В ВИДУ, что в вашем конкретном случае этот префикс может ОТЛИЧАТЬСЯ**. В принципе - вы вообще можете не полагаться на эту переменную и не использовать её, закомментировав в скрипте строку **12** и раскомментировав строку **9**. 
 И конечно же, **нужно не забыть об очень важном моменте**,​ а именно о том, что наличие префикса **mlg_** в наименовании //simple queue-записи//​ - **строго ОБЯЗАТЕЛЬНО**.\\ И конечно же, **нужно не забыть об очень важном моменте**,​ а именно о том, что наличие префикса **mlg_** в наименовании //simple queue-записи//​ - **строго ОБЯЗАТЕЛЬНО**.\\
 \\ \\
-Стоит ли говорить,​ что если у вас на каком-то конкретном микротикоНАСе в simple queue есть какие-то свои, нужные вам записи - то приведенный выше скрипт не остановится ни перед чем, лишь бы переделать их полностью. Так что - осторожнее в продакшене,​ а фильтрование в него внедряйте уже самостоятельно... ​+Стоит ли говорить,​ что если у вас на каком-то конкретном микротикоНАСе в simple queue есть какие-то свои, нужные вам записи - то приведенный выше скрипт не остановится ни перед чем, лишь бы переделать их полностью. Так что - осторожнее в продакшене,​ а дополнительное ​фильтрование в него внедряйте уже самостоятельно... ​
  
 \\ \\
Строка 152: Строка 216:
 А если не лицезреем - значит что-то не так и [[http://​instantsite.ru/​gallery/​image.php?​album_id=5&​image_id=729|идем переделываем]],​ ибо в таком случае в Убиллинге мы их, скорее всего, тоже не увидим. Ну или мы забыли добавить в **Allow Address** адрес своего хоста, с которого пытаемся эти графички увидеть. А если не лицезреем - значит что-то не так и [[http://​instantsite.ru/​gallery/​image.php?​album_id=5&​image_id=729|идем переделываем]],​ ибо в таком случае в Убиллинге мы их, скорее всего, тоже не увидим. Ну или мы забыли добавить в **Allow Address** адрес своего хоста, с которого пытаемся эти графички увидеть.
 \\ \\
-\\ +======Копирайт======
-\\+
 Отдельная благодарность за помощь в создании данного мануала - [[https://​local.com.ua/​forum/​profile/​40843-mohax_kh_ua/​|mohax_kh_ua]]\\ Отдельная благодарность за помощь в создании данного мануала - [[https://​local.com.ua/​forum/​profile/​40843-mohax_kh_ua/​|mohax_kh_ua]]\\
 Главный микротико-скрипто-тестер - [[https://​local.com.ua/​forum/​profile/​16438-reductor/​|reductor]] Главный микротико-скрипто-тестер - [[https://​local.com.ua/​forum/​profile/​16438-reductor/​|reductor]]
    
mgmikrotikdhcp.1589463171.txt.gz · Последние изменения: 2020/05/14 16:32 — bobr