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

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


mgmikrotikdhcp

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
mgmikrotikdhcp [2019/11/27 22:10]
bobr [Конфигурация Mikrotik]
mgmikrotikdhcp [2021/01/16 08:53] (текущий)
bobr [Когда DHCP-сервер у нас где-то там, а сам Mikrotik NAS - всего лишь relay]
Строка 7: Строка 7:
 В то же время нельзя не отметить и положительных моментов(такой себе островок надежды посреди тьмы и грусти):​ В то же время нельзя не отметить и положительных моментов(такой себе островок надежды посреди тьмы и грусти):​
   * Простота реализации. Применение <​del>​мозга</​del>​ глубоких мыслительных процессов практически не требуется.   * Простота реализации. Применение <​del>​мозга</​del>​ глубоких мыслительных процессов практически не требуется.
-  * Очень большая(практически идентичная) схожесть в работе ​Убиллинг ​с Mikrotik по API и авторизацией IP + MAC. Только IPшки и address lists теперь выдает радиус,​ а не Ubilling.+  * Очень большая(практически идентичная) схожесть в работе ​Ubilling ​с Mikrotik по API и авторизацией IP + MAC. Только IPшки и address lists теперь выдает радиус,​ а не Ubilling.
  
 ====== Конфигурация Ubilling ====== ====== Конфигурация Ubilling ======
  
 Уже должен быть настроен [[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
Строка 21: Строка 21:
 Настраиваем биллинг стандартно как и для любых других устройств Настраиваем биллинг стандартно как и для любых других устройств
  
-в справочнике (сети и услуги) добавляем сети, создаем услуги(тип сети можете указать как "DHCP static"​ или "Other type"+в справочнике (сети и услуги) добавляем сети, создаем услуги(тип сети можете указать как "DHCP static"​ или "Other type")
  
 {{:​ub_add_network.png?&​300|}} {{:​ub_add_service.png?&​300|}} {{:​ub_add_network.png?&​300|}} {{:​ub_add_service.png?&​300|}}
Строка 50: Строка 50:
  
  
-Базовая минимальная настройки завершена. Теперь абоненты будут получать IP из биллинга. Абоненты с положительным состоянием счета будут добавлены в IP -> Firewall -> Address-List,​ в список **ALLOW**, а с отрицательным,​ соответственно,​ в **NOT_ALLOW**. Список **ALLOW** логично выпустить в инет в фаерволле,​ в то время как для **NOT_ALLOW** - заблокировать доступ в инет там же. Сделать это можно как-то так:\\+Базовая минимальная настройка завершена. Теперь абоненты будут получать IP из биллинга. Абоненты с положительным состоянием счета будут добавлены в IP -> Firewall -> Address-List,​ в список **ALLOW**, а с отрицательным,​ соответственно,​ в **NOT_ALLOW**. Список **ALLOW** логично выпустить в инет в фаерволле,​ в то время как для **NOT_ALLOW** - заблокировать доступ в инет там же. Сделать это можно как-то так:\\
 {{:​ros_firewall_allow_not_allow.png?&​300|}} {{:​ros_firewall_allow_not_allow.png?&​300|}}
  
Строка 61: Строка 61:
 </​code>​ </​code>​
  
-Далее, в Mikrotik NAS __добавляем__ +Далее:\\ 
-  * в System -> Scripts ​ скрипт примерно такого содержания(назовем его, скажем,​ //​SimpleQueueRebuild//​) +===== Когда DHCP-сервером у нас сам Mikrotik NAS - DEPRECATED и настоятельно не рекомендуется к использованию ===== 
-<​code>​+**Итакпоскольку у этого метода ​внезапно(за почти год, ага) был обнаружен ФАТАЛЬНЫЙ НЕДОСТАТОК,​ который заключается в том, что микрот запускает этот скрипт только в момент НЕПОСРЕДСТВЕННОГО получения девайсом DHCP-лиза и НЕ запускает его при автопродлении(автообновлении) лиза. Это приводит к тому, что если у юзера девайс(скажем роутер) включен постоянно и лиз он не переполучает,​ а автоматически продляет - то, например,​ при смене тарифа у юзера изменения лимитов скорости в шейпере не произойдет НИКОГДА. Ну, по крайней мере до тех пор, пока его устройство фактически не получит DHCP-лиз заново**  
 + 
 +**В связи с чем настоятельно рекомендуется во всех случаях использовать обновлённый и тщательнейше протестированный(но это не точно) скрипт для [[mgmikrotikdhcp#​когда_dhcp-сервер_у_нас_где-то_там_а_сам_mikrotik_nas_-_всего_лишь_relay|Mikrotik NAS в режиме RELAY]]** 
 + 
 +**А эту штуку оставим чисто для понимания "​каким образом хотелось бы, чтобы оно работало"​** 
 + 
 + в Mikrotik NAS **НЕ** ​__добавляем__ 
 +  * в **System -> Scripts**  ​скрипт примерно такого содержания(назовем его, скажем,​ //​SimpleQueueRebuild//​) 
 +<​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"; ​       ​
 +        }
     }     }
 +}
 +</​code>​
 +  * в **IP -> DHCP Server -> DHCP** ​ в конфиг DHCP сервера в секцию Lease script(вкладка Script в боле поздних версиях ROS) название только что созданного скрипта //​SimpleQueueRebuild//​
 +Логика работы данного скрипта следующая:​ в момент выдачи //​DHCP-lease//​ абоненту мы ищем в //simple queues// запись с таким же IP, который мы вот сейчас выдаем,​ и правим эту запись под свои нужды: точнее - удаляем и добавляем такую же, но с нужными нам параметрами. И да, **очень важно отметить**,​ что наличие префикса **mlg_** в наименовании //simple queue-записи//​ - **строго ОБЯЗАТЕЛЬНО**.\\
 +Естественно,​ это только пример и в своем конкретном случае вы можете модифицировать его под ваши задачи и реалии(например,​ устанавливать burst'​ы и прочее).\\
  
-    ​:if (!alreadyExists ​&& $speed != ""​) do={         +\\ 
-        ​add name="​mlg_$leaseActIP" max-limit=$speed target="​$leaseActIP/​32";+ 
 +===== Когда DHCP-сервер у нас где-то там, а сам Mikrotik NAS - всего лишь relay ===== 
 +Этот способ,​ кстати,​ может подойти и для [[http://​wiki.ubilling.net.ua/​doku.php?​id=mgmikrotik|MikroTik IPoE (Hotspot)]]\\ 
 +\\ 
 +Как и в предыдущем случае в Mikrotik NAS __добавляем__ 
 +  * в **System -> Scripts** ​ скрипт примерно такого содержания(назовем его, скажем,​ //​SimpleQueueRebuild//​) 
 +<code tcl [enable_line_numbers="​true"​]>​ 
 +:local qSpeed "";​ 
 +:local qTarget "";​ 
 +:local qIP "";​ 
 +:local currentSpeed "";​ 
 +:local leaseDynPrefix "​dhcp-ds<";​ 
 + 
 +/queue simple 
 +# get all of the simple queues which have no "​mlg_"​ prefix in their names 
 +#:local tQueueList [find where (name~"​^mlg_"​ = false)]; 
 + 
 +# 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=
 +    :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={ 
 +        :set qSpeed [get $tQueue max-limit]; 
 +        ​:set qTarget [get $tQueue target]; 
 +        :set qIP [:pick [:tostr $qTarget] 0 [:find [:tostr $qTarget] "/"​]];​ 
 + 
 +        remove $tQueue; 
 + 
 +# 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 $tQueueMLG] > 0) 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;​ 
 +        }       
     }     }
 } }
 </​code>​ </​code>​
-  * в IP -> DHCP Server -> DHCP  в конфиг DHCP сервера в секцию Lease script(вкладка Script ​в боле поздних версиях ROS) название только что ​созданного скрипта //SimpleQueueRebuild// +  * дальше идем ​в **System ​-> Scheduler** и создаем там задачу, ​которая будет запускать ​наш //​SimpleQueueRebuild//, ​скажем, раз в 30 сек. Можно и чаще. Можно и реже - всецело на ваш ​вкус.\\  
-Естественно, ​это только пример и в своем конкретном случае вы можете ​модифицировать его под ваши задачи ​и реалии(например, устанавливать burst'​ы ​и прочее).\\+По сути, эта штука следует тому же принципу,​ что и предыдущая,​ только ​вот в силу того, что DHCP lease выдается не нашим НАСом и "поймать",​ собственно,​ этот момент мы не можем - мы производим периодическую проверку ​на наличие "​неправильных" наименований шейперов и делаем из них "​правильные"​.  
 + 
 +Стоит отметить,​ что переменная **leaseDynPrefix** призвана отфильтровать выборку записей //simple queue//, ​ограничив её только теми, в наименовании которых присутствует префикс __//dhcp-ds<//__ - именно ​так именовал динамически созданные записи //simple queue// микротикна котором этот скрипт тестировался и **СТОИТ ИМЕТЬ В ВИДУ, что в вашем конкретном случае ​этот префикс может ОТЛИЧАТЬСЯ**. В принципе - вы вообще ​можете ​не полагаться на эту переменную ​и не использовать её, закомментировав в скрипте строку **12** и раскомментировав строку **9**. 
 + 
 +И конечно же, **нужно не забыть об очень важном моменте**,​ а именно о том, что наличие префикса **mlg_** в наименовании //simple queue-записи// - **строго ОБЯЗАТЕЛЬНО**.\\
 \\ \\
 +Стоит ли говорить,​ что если у вас на каком-то конкретном микротикоНАСе в simple queue есть какие-то свои, нужные вам записи - то приведенный выше скрипт не остановится ни перед чем, лишь бы переделать их полностью. Так что - осторожнее в продакшене,​ а дополнительное фильтрование в него внедряйте уже самостоятельно... ​
  
-Отдельная благодарность за помощь в создании данного мануала - [[https://​local.com.ua/​forum/​profile/​40843-mohax_kh_ua/​|mohax_kh_ua]]+\\ 
 + 
 +===== Включаем сами графики на Mikrotik NAS ===== 
 +Ну и, как показывает практика,​ нужно не забыть включить эти самые графики на каждом отдельном Mikrotik NAS. Сделать это можно следующим образом:​ 
 + 
 +**Tools -> Graphing** 
 + 
 +Нажимаем "​__Graphing Settings__"​\\ 
 +{{:​ros_graphs1.png?&​300|}}\\ 
 +и устанавливаем желаемую частоту сбора и записи статистических данных. Обычно это - 5 минут. Многим,​ наверное,​ хотелось бы чаще, но Микротик пока чаще не умеет.\\ 
 + 
 +Далее обращаем внимание на вкладки "__... Rules__"​\\  
 +{{:​ros_graphs2.png?&​300|}}\\ 
 +здесь мы можем указать детали сбора статистики(для сущностей типа интерфейсы,​ правила шейперов и системные ресурсы) и доступа к этой статистике. Поскольку нас интересуют графики трафика наших юзеров - нам нужна вкладка "​__Queue Rules__"​. Тыкаем по ней, потом по кнопке с синим плюсом "​Добавить":​\\ 
 +{{:​ros_graphs3.png?&​300|}}\\ 
 +и добавляем правило для наших будущих графчиков:​\\ 
 +  * **Simple Queue** - шейперы,​ для которых будет собираться статистика. Здесь логично оставить **all**. ​  
 +  * **Allow Address** - адрес/​подсеть с которых будет разрешен доступ к этим графикам. Логично указать здесь адрес нашего Убиллинг сервера. Значение **0.0.0.0/​0**,​ естественно,​ разрешит доступ всем. ​  
 +  * **Store On Disk** - хранить ли данные статистики на диске. Лучше включить - мы ведь не хотим, чтобы при каждом перезапуске НАСа у нас обнулялась стата?​ 
 +  * **Allow Target** - очень интересная опция, определяющая разрешено ли юзеру, чья стата собирается этим правилом,​ смотреть свою же статистику. Если вашим пользователям разрешен доступ к **http://​ROS_NAS_IP/​graphs/​** ​ и эта опция включена - они смогут видеть каждый свой график. ИРЛ такое, как правило,​ не практикуется. 
 +Теперь,​ когда "​графичковая тулза"​ у нас настроена и правило сбора статы добавлено - можем перейти на **http://​ROS_NAS_IP/​graphs/​** и лицезреть там наши графички.\\ 
 +А если не лицезреем - значит что-то не так и [[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/​16438-reductor/​|reductor]]
    
mgmikrotikdhcp.1574885448.txt.gz · Последние изменения: 2019/11/27 22:10 — bobr