Користувальницькькі налаштування

Налаштування сайту


mgmikrotikdhcp

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Порівняння попередніх версій Попередня ревізія
Наступна ревізія По сторонах наступні версії
mgmikrotikdhcp [2021/01/16 08:53]
mgmikrotikdhcp [2022/09/24 14:39]
127.0.0.1 зовнішнє редагування
Рядок 1: Рядок 1:
 +====== Авторизация абонентов DHCP на MikroTik методом IP + MAC при помощи КучаГен ======
 +Сразу следует оговорится, что информация ниже создана больше <del>для развлекательных целей</del> в общеобразовательных целях и к применению в реальной жизни **рекомендуется не особо**. Потому мы принимаем как данность, что все, кто все же решиться применить это в продакшине, скорее всего, понимают все возможные <del>боль и безисходность</del> последствия и ограничения, с которыми они всенепременно столкнутся:
 +  * Абсолютная невозможность какого либо управления абонентом после получения им DHCP lease от микротика. Никаких CoA и PoD. Только таймаут выданного лиза может изменить состояние подключения абонента.
 +  * Обязательное использование фаерволла и address lists для предоставления/ограничения доступа абоненту. Ну или каких либо других ухищрений на ваш вкус.
 +  * Никакого Walled Garden и прочих удобств, как у того же HotSpot. Так что, например, перенаправление должников будете мастерить сами.
 + 
 +В то же время нельзя не отметить и положительных моментов(такой себе островок надежды посреди тьмы и грусти):
 +  * Простота реализации. Применение <del>мозга</del> глубоких мыслительных процессов практически не требуется.
 +  * Очень большая(практически идентичная) схожесть в работе Ubilling с Mikrotik по API и авторизацией IP + MAC. Только IPшки и address lists теперь выдает радиус, а не Ubilling.
  
 +====== Конфигурация Ubilling ======
 +
 +Уже должен быть настроен [[multigen|КучаГен]].\\
 +Не забываем добавить словарь для Mikrotik в /usr/local/etc/raddb/dictionary 
 +<code>
 +$INCLUDE        /usr/local/etc/raddb/dictionary_preset/mikrotik.dictionary
 +</code>
 +После чего перезапускаем FreeRADIUS
 +
 +
 +Настраиваем биллинг стандартно как и для любых других устройств
 +
 +в справочнике (сети и услуги) добавляем сети, создаем услуги(тип сети можете указать как "DHCP static" или "Other type")
 +
 +{{:ub_add_network.png?&300|}} {{:ub_add_service.png?&300|}}
 +
 +добавляем NAS\\
 +{{:ub_add_nas.png?&300|}}
 +
 +В конфигурации КучаГен для нашего NAS настраиваем атрибуты:\\
 +{{:ub_mlg_nas_ros_dhcp1.png?&300|}}
 +
 +Как уже упоминалось выше - для NAS MikroTik + DHCP **НЕ работают Coa\PoD**, поэтому отключатся\включатся абоненты будут по истечении lease time (Session-Timeout). Время выберите подходящее для себя. В нашем примере абоненты, у которых баланс положительный, будут получать IP на 2 часа.
 +
 +====== Конфигурация Mikrotik ======
 +Включаем RADIUS, и его работу с DHCP\\
 +{{:mlg_ros_radius_cfg.png?&300|}}
 +
 +В поле **Address** вписываем адрес нашего Ubilling(именно там ведь живет наш радиус?). В поле **Secret** вводим секрет, который можно посмотреть в Ubilling:\\ 
 +{{:multigen_nas.png?&300|}}
 +
 +На интерфейс, который смотрит в сторону клиентов вешаем сеть:\\ 
 +{{:ros_net_add.png?&300|}}
 +
 +И создаем на этом же интерфейсе dhcp-server(в поле Address Pool указываем **static-only**. В поле Use RADIUS ставим **yes**):\\
 +{{:mlg_ros_dhcp_cfg.png?&300|}}
 +
 +В IP -> DHCP Server -> Networks Настраиваем добавляем нашу абонентскую сеть и указываем адреса Default gateway и DNS, которые будут выдаваться клиентам:\\
 +{{:mlg_ros_dhcp_net.png?&300|}}
 +
 +
 +Базовая минимальная настройка завершена. Теперь абоненты будут получать IP из биллинга. Абоненты с положительным состоянием счета будут добавлены в IP -> Firewall -> Address-List, в список **ALLOW**, а с отрицательным, соответственно, в **NOT_ALLOW**. Список **ALLOW** логично выпустить в инет в фаерволле, в то время как для **NOT_ALLOW** - заблокировать доступ в инет там же. Сделать это можно как-то так:\\
 +{{:ros_firewall_allow_not_allow.png?&300|}}
 +
 +====== Получение графиков по статистике трафика абонента с Mikrotik ======
 +Если вы очень хотите получать графики по статистике трафика абонента с Mikrotik так же, как при работе с Mikrotik по API - можете использовать следующий **костыль**:\\
 +
 +Включаем опцию [[alteriniconf|alter.ini]]
 +<code>
 +MULTIGEN_USE_ROS_TRAFFIC_GRAPHS=1
 +</code>
 +
 +Далее:\\
 +===== Когда DHCP-сервером у нас сам Mikrotik NAS - DEPRECATED и настоятельно не рекомендуется к использованию =====
 +**Итак, поскольку у этого метода внезапно(за почти год, ага) был обнаружен ФАТАЛЬНЫЙ НЕДОСТАТОК, который заключается в том, что микрот запускает этот скрипт только в момент НЕПОСРЕДСТВЕННОГО получения девайсом DHCP-лиза и НЕ запускает его при автопродлении(автообновлении) лиза. Это приводит к тому, что если у юзера девайс(скажем роутер) включен постоянно и лиз он не переполучает, а автоматически продляет - то, например, при смене тарифа у юзера изменения лимитов скорости в шейпере не произойдет НИКОГДА. Ну, по крайней мере до тех пор, пока его устройство фактически не получит DHCP-лиз заново** 
 +
 +**В связи с чем настоятельно рекомендуется во всех случаях использовать обновлённый и тщательнейше протестированный(но это не точно) скрипт для [[mgmikrotikdhcp#когда_dhcp-сервер_у_нас_где-то_там_а_сам_mikrotik_nas_-_всего_лишь_relay|Mikrotik NAS в режиме RELAY]]**
 +\\
 +\\
 +//То есть - да - даже когда DHCP-сервером у нас сам Mikrotik NAS - используем методологию и скрипт для [[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 leaseActIP;
 +
 +:local speed "";
 +:local newSpeed "";
 +:local queueRec "";
 +:local alreadyExists false;
 +
 +:if ($leaseBound = 1) do={
 +    /queue simple
 +# looking for an "incorrect" queue simple rec with currently leased IP                  
 +    :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; 
 +    } 
 +
 +# looking for a "correct" queue simple rec with currently leased IP    
 +    :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={
 +                :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'ы и прочее).\\
 +
 +\\
 +
 +===== Когда 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>
 +  * дальше идем в **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__"\\
 +{{: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.txt · Востаннє змінено: 2023/09/04 19:34 повз bobr