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

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


Боковая панель

Разделы

Общее описание
История изменений
Рекомендации к обновлению
Планы на будущее
Известные проблемы
Онлайн демо
Случайная статья
Видео
Помощь проекту
Люди

FAQ



Редактировать сайдбар

mgmikrotikdhcp

Авторизация абонентов DHCP на MikroTik методом IP + MAC при помощи КучаГен

Сразу следует оговорится, что информация ниже создана больше для развлекательных целей в общеобразовательных целях и к применению в реальной жизни рекомендуется не особо. Потому мы принимаем как данность, что все, кто все же решиться применить это в продакшине, скорее всего, понимают все возможные боль и безисходность последствия и ограничения, с которыми они всенепременно столкнутся:

  • Абсолютная невозможность какого либо управления абонентом после получения им DHCP lease от микротика. Никаких CoA и PoD. Только таймаут выданного лиза может изменить состояние подключения абонента.
  • Обязательное использование фаерволла и address lists для предоставления/ограничения доступа абоненту. Ну или каких либо других ухищрений на ваш вкус.
  • Никакого Walled Garden и прочих удобств, как у того же HotSpot. Так что, например, перенаправление должников будете мастерить сами.

В то же время нельзя не отметить и положительных моментов(такой себе островок надежды посреди тьмы и грусти):

  • Простота реализации. Применение мозга глубоких мыслительных процессов практически не требуется.
  • Очень большая(практически идентичная) схожесть в работе Ubilling с Mikrotik по API и авторизацией IP + MAC. Только IPшки и address lists теперь выдает радиус, а не Ubilling.

Конфигурация Ubilling

Уже должен быть настроен КучаГен.
Не забываем добавить словарь для Mikrotik в /usr/local/etc/raddb/dictionary

$INCLUDE        /usr/local/etc/raddb/dictionary_preset/mikrotik.dictionary

После чего перезапускаем FreeRADIUS

Настраиваем биллинг стандартно как и для любых других устройств

в справочнике (сети и услуги) добавляем сети, создаем услуги(тип сети можете указать как «DHCP static» или «Other type»)

добавляем NAS

В конфигурации КучаГен для нашего NAS настраиваем атрибуты:

Как уже упоминалось выше - для NAS MikroTik + DHCP НЕ работают Coa\PoD, поэтому отключатся\включатся абоненты будут по истечении lease time (Session-Timeout). Время выберите подходящее для себя. В нашем примере абоненты, у которых баланс положительный, будут получать IP на 2 часа.

Конфигурация Mikrotik

Включаем RADIUS, и его работу с DHCP

В поле Address вписываем адрес нашего Ubilling(именно там ведь живет наш радиус?). В поле Secret вводим секрет, который можно посмотреть в Ubilling:

На интерфейс, который смотрит в сторону клиентов вешаем сеть:

И создаем на этом же интерфейсе dhcp-server(в поле Address Pool указываем static-only. В поле Use RADIUS ставим yes):

В IP → DHCP Server → Networks Настраиваем добавляем нашу абонентскую сеть и указываем адреса Default gateway и DNS, которые будут выдаваться клиентам:

Базовая минимальная настройка завершена. Теперь абоненты будут получать IP из биллинга. Абоненты с положительным состоянием счета будут добавлены в IP → Firewall → Address-List, в список ALLOW, а с отрицательным, соответственно, в NOT_ALLOW. Список ALLOW логично выпустить в инет в фаерволле, в то время как для NOT_ALLOW - заблокировать доступ в инет там же. Сделать это можно как-то так:

Получение графиков по статистике трафика абонента с Mikrotik

Если вы очень хотите получать графики по статистике трафика абонента с Mikrotik так же, как при работе с Mikrotik по API - можете использовать следующий костыль:

Включаем опцию alter.ini

MULTIGEN_USE_ROS_TRAFFIC_GRAPHS=1

Далее:

Когда DHCP-сервером у нас сам Mikrotik NAS - DEPRECATED и настоятельно не рекомендуется к использованию

Итак, поскольку у этого метода внезапно(за почти год, ага) был обнаружен ФАТАЛЬНЫЙ НЕДОСТАТОК, который заключается в том, что микрот запускает этот скрипт только в момент НЕПОСРЕДСТВЕННОГО получения девайсом DHCP-лиза и НЕ запускает его при автопродлении(автообновлении) лиза. Это приводит к тому, что если у юзера девайс(скажем роутер) включен постоянно и лиз он не переполучает, а автоматически продляет - то, например, при смене тарифа у юзера изменения лимитов скорости в шейпере не произойдет НИКОГДА. Ну, по крайней мере до тех пор, пока его устройство фактически не получит DHCP-лиз заново

В связи с чем настоятельно рекомендуется во всех случаях использовать обновлённый и тщательнейше протестированный(но это не точно) скрипт для Mikrotik NAS в режиме RELAY

А эту штуку оставим чисто для понимания «каким образом хотелось бы, чтобы оно работало»

в Mikrotik NAS НЕ добавляем

  • в System → Scripts скрипт примерно такого содержания(назовем его, скажем, SimpleQueueRebuild)
  1. # getting global vars
  2. :global leaseBound;
  3. :global leaseActIP;
  4.  
  5. :local speed "";
  6. :local newSpeed "";
  7. :local queueRec "";
  8. :local alreadyExists false;
  9.  
  10. :if ($leaseBound = 1) do={
  11. /queue simple
  12. # looking for an "incorrect" queue simple rec with currently leased IP
  13. :foreach tQueue in=[/queue simple find where (target="$leaseActIP/32" && name!="mlg_$leaseActIP")] do={
  14. # if "incorrect" queue rec was found - then we need to get it's speed
  15. # 'cause it may be a tariff change and new speed settings may appear
  16. :set newSpeed [get $tQueue max-limit];
  17. remove $tQueue;
  18. }
  19.  
  20. # looking for a "correct" queue simple rec with currently leased IP
  21. :foreach tQueue in=[/queue simple find where (target="$leaseActIP/32" && name="mlg_$leaseActIP")] do={
  22. :set queueRec [$tQueue];
  23. :set speed [get $tQueue max-limit];
  24. :set alreadyExists true;
  25.  
  26. # if $newSpeed is still empty - then no incorrect record was found
  27. # and we need to make $newSpeed and $speed equal to avoid excess speed change action
  28. :if ($newSpeed = "") do={
  29. :set newSpeed [$speed];
  30. }
  31. }
  32.  
  33. # if any of "speeds" were set - we need to perform some actions
  34. # otherwise we can't do a thing
  35. :if ($speed != "" || $newSpeed != "") do={
  36. # if found queue has correct name - just check it's speed and correct if needed
  37. # else - create a new queue with correct name and speed
  38. :if ($alreadyExists) do={
  39. :if ($newSpeed != $speed) do={
  40. set $queueRec max-limit=$newSpeed disabled=no;
  41. } else={
  42. :log warning ("mlg_ changer: nothing to change for $leaseActIP - already exists with such speed");
  43. }
  44. } else={
  45. add name="mlg_$leaseActIP" max-limit=$newSpeed target="$leaseActIP/32";
  46. }
  47. }
  48. }
  • в IP → DHCP Server → DHCP в конфиг DHCP сервера в секцию Lease script(вкладка Script в боле поздних версиях ROS) название только что созданного скрипта SimpleQueueRebuild

Логика работы данного скрипта следующая: в момент выдачи DHCP-lease абоненту мы ищем в simple queues запись с таким же IP, который мы вот сейчас выдаем, и правим эту запись под свои нужды: точнее - удаляем и добавляем такую же, но с нужными нам параметрами. И да, очень важно отметить, что наличие префикса mlg_ в наименовании simple queue-записи - строго ОБЯЗАТЕЛЬНО.
Естественно, это только пример и в своем конкретном случае вы можете модифицировать его под ваши задачи и реалии(например, устанавливать burst'ы и прочее).


Когда DHCP-сервер у нас где-то там, а сам Mikrotik NAS - всего лишь relay

Этот способ, кстати, может подойти и для MikroTik IPoE (Hotspot)

Как и в предыдущем случае в Mikrotik NAS добавляем

  • в System → Scripts скрипт примерно такого содержания(назовем его, скажем, SimpleQueueRebuild)
  1. :local qSpeed "";
  2. :local qTarget "";
  3. :local qIP "";
  4. :local currentSpeed "";
  5. :local leaseDynPrefix "dhcp-ds<";
  6.  
  7. /queue simple
  8. # get all of the simple queues which have no "mlg_" prefix in their names
  9. #:local tQueueList [find where (name~"^mlg_" = false)];
  10.  
  11. # get all of the simple queues which have no "mlg_" prefix in their names but do have $leaseDynPrefix
  12. :local tQueueList [find where (name~"^mlg_" = false && name~$leaseDynPrefix)];
  13. :local tQueueMLG "";
  14.  
  15. # if some of the simple queues with no "mlg_" prefix in their names found
  16. :if ([:len $tQueueList] > 0) do={
  17. :log warning ("Not mlg_ queues found: " . [:len $tQueueList]);
  18. # conditionally step through the list
  19. # get the necessary prameters into local vars
  20. # remove the "incorrectly" named queue rec
  21. :foreach tQueue in=$tQueueList do={
  22. :set qSpeed [get $tQueue max-limit];
  23. :set qTarget [get $tQueue target];
  24. :set qIP [:pick [:tostr $qTarget] 0 [:find [:tostr $qTarget] "/"]];
  25.  
  26. remove $tQueue;
  27.  
  28. # try to find simple queue with such IP address and "mlg_" prefix
  29. :set tQueueMLG [find where (name="mlg_$qIP")];
  30.  
  31. # as far as we can rely on that fact that simple queues names are unique
  32. # we can be sure that there will be only one rec with such IP address and "mlg_IP" prefix
  33. # and so if we found one - we can just change it's speed, enabled status and (just in case) - target IP
  34. # and not to create new one
  35. :if ([:len $tQueueMLG] > 0) do={
  36. :foreach eachQueueMLG in=$tQueueMLG do={
  37. :set currentSpeed [get $eachQueueMLG max-limit];
  38.  
  39. :if ($currentSpeed != $qSpeed) do={
  40. set $eachQueueMLG max-limit=$qSpeed target=$qTarget disabled=no;
  41. } else={
  42. :log warning ("mlg_ changer: nothing to change for $qIP - already exists with such speed $qSpeed");
  43. }
  44. }
  45. } else={
  46. # create a new queue with correct name and speed
  47. add name="mlg_$qIP" max-limit=$qSpeed target=$qTarget;
  48. }
  49. }
  50. }
  • дальше идем в System → Scheduler и создаем там задачу, которая будет запускать наш SimpleQueueRebuild, скажем, раз в 30 сек. Можно и чаще. Можно и реже - всецело на ваш вкус.

По сути, эта штука следует тому же принципу, что и предыдущая, только вот в силу того, что DHCP lease выдается не нашим НАСом и «поймать», собственно, этот момент мы не можем - мы производим периодическую проверку на наличие «неправильных» наименований шейперов и делаем из них «правильные».

Стоит отметить, что переменная leaseDynPrefix призвана отфильтровать выборку записей simple queue, ограничив её только теми, в наименовании которых присутствует префикс dhcp-ds< - именно так именовал динамически созданные записи simple queue микротик, на котором этот скрипт тестировался и СТОИТ ИМЕТЬ В ВИДУ, что в вашем конкретном случае этот префикс может ОТЛИЧАТЬСЯ. В принципе - вы вообще можете не полагаться на эту переменную и не использовать её, закомментировав в скрипте строку 12 и раскомментировав строку 9.

И конечно же, нужно не забыть об очень важном моменте, а именно о том, что наличие префикса mlg_ в наименовании simple queue-записи - строго ОБЯЗАТЕЛЬНО.

Стоит ли говорить, что если у вас на каком-то конкретном микротикоНАСе в simple queue есть какие-то свои, нужные вам записи - то приведенный выше скрипт не остановится ни перед чем, лишь бы переделать их полностью. Так что - осторожнее в продакшене, а дополнительное фильтрование в него внедряйте уже самостоятельно…


Включаем сами графики на Mikrotik NAS

Ну и, как показывает практика, нужно не забыть включить эти самые графики на каждом отдельном Mikrotik NAS. Сделать это можно следующим образом:

Tools → Graphing

Нажимаем «Graphing Settings«

и устанавливаем желаемую частоту сбора и записи статистических данных. Обычно это - 5 минут. Многим, наверное, хотелось бы чаще, но Микротик пока чаще не умеет.

Далее обращаем внимание на вкладки «… Rules«

здесь мы можем указать детали сбора статистики(для сущностей типа интерфейсы, правила шейперов и системные ресурсы) и доступа к этой статистике. Поскольку нас интересуют графики трафика наших юзеров - нам нужна вкладка «Queue Rules». Тыкаем по ней, потом по кнопке с синим плюсом «Добавить»:

и добавляем правило для наших будущих графчиков:

  • 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/ и лицезреть там наши графички.
А если не лицезреем - значит что-то не так и идем переделываем, ибо в таком случае в Убиллинге мы их, скорее всего, тоже не увидим. Ну или мы забыли добавить в Allow Address адрес своего хоста, с которого пытаемся эти графички увидеть.

Копирайт

Отдельная благодарность за помощь в создании данного мануала - mohax_kh_ua
Главный микротико-скрипто-тестер - reductor

mgmikrotikdhcp.txt · Последние изменения: 2021/01/16 08:53 — bobr