====== Авторизація абонентів DHCP на MikroTik методом IP + MAC за допомогою КупаГен ======
Відразу слід зазначити, що інформація нижче створена більше для розважальних цілей в загальноосвітніх цілях і до застосування в реальному житті **рекомендується не дуже**. Тому ми приймаємо як даність, що всі, хто все ж таки наважиться застосувати це в продакшині, найімовірніше, розуміють усі можливі біль і безвихідь наслідки й обмеження, з якими вони неодмінно зіткнуться:
* Абсолютна неможливість будь-якого управління абонентом після отримання ним DHCP lease від мікротіка. Ніяких CoA і PoD. Тільки таймаут виданого лізу може змінити стан підключення абонента.
* Обов'язкове використання фаєрволла і address lists для надання/обмеження доступу абоненту. Ну або будь-яких інших хитрощів на ваш смак.
* Ніякого Walled Garden та інших зручностей, як у того ж HotSpot. Так що, наприклад, перенаправлення боржників будете майструвати самі.
Водночас не можна не відзначити і позитивних моментів (такий собі острівець надії посеред темряви і смутку):
* Простота реалізації. Застосування мозку глибоких розумових процесів практично не потрібно.
* Дуже велика (практично ідентична) схожість у роботі Ubilling з Mikrotik за API і авторизацією IP + MAC. Тільки IPшки і address lists тепер видає радіус, а не Ubilling.
====== Конфігурація Ubilling ======
Вже має бути налаштований [[multigen|КупаГен]].\\
Не забуваємо додати словник для Mikrotik в /usr/local/etc/raddb/dictionary
$INCLUDE /usr/local/etc/raddb/dictionary_preset/mikrotik.dictionary
Після чого перезапускаємо 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]]
MULTIGEN_USE_ROS_TRAFFIC_GRAPHS=1
Далі:\\
===== Коли 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//)
# 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";
}
}
}
* в **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//)
: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;
}
}
}
* далі йдемо в **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/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]]