Відразу слід зазначити, що інформація нижче створена більше для розважальних цілей в загальноосвітніх цілях і до застосування в реальному житті рекомендується не дуже. Тому ми приймаємо як даність, що всі, хто все ж таки наважиться застосувати це в продакшині, найімовірніше, розуміють усі можливі біль і безвихідь наслідки й обмеження, з якими вони неодмінно зіткнуться:
Водночас не можна не відзначити і позитивних моментів (такий собі острівець надії посеред темряви і смутку):
Вже має бути налаштований КупаГен.
Не забуваємо додати словник для Mikrotik в /usr/local/etc/raddb/dictionary
$INCLUDE /usr/local/etc/raddb/dictionary_preset/mikrotik.dictionary
Після чого перезапускаємо FreeRADIUS
Налаштовуємо білінг стандартно як і для будь-яких інших пристроїв
у довіднику (мережі та послуги) додаємо мережі, створюємо послуги (тип мережі можете вказати як “DHCP static” або “Other type”)
У конфігурації КупаГен для нашого NAS налаштовуємо атрибути:
Як уже згадувалося вище - для NAS MikroTik + DHCP НЕ працюють Coa\PoD, тому відключаться\включаться абоненти будуть після закінчення lease time (Session-Timeout). Час виберіть відповідний для себе. У нашому прикладі абоненти, у яких баланс позитивний, отримуватимуть IP на 2 години.
Вмикаємо 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 через API, можете використати наступну костиль:
Вмикаємо опцію alter.ini
MULTIGEN_USE_ROS_TRAFFIC_GRAPHS=1
Далі:
Отже, оскільки у цього методу раптово (за майже рік, ага) було виявлено ФАТАЛЬНИЙ НЕДОЛІК, який полягає в тому, що мікрот запускає цей скрипт тільки в момент БЕЗПОСЕРЕДНЬОГО отримання девайсом DHCP-лізу і НЕ запускає його під час автоподовження (автооновлення) лізу. Це призводить до того, що якщо у користувача девайс (скажімо, роутер) увімкнено постійно, а ліз він не переотримує, а автоматично подовжує, то, наприклад, у разі зміни тарифу у користувача зміни лімітів швидкості в шейпері не відбудеться НІКОЛИ. Ну, принаймні доти, доки його пристрій фактично не отримає DHCP-ліз заново .
У зв'язку з чим настійно рекомендується у всіх випадках використовувати оновлений і ретельно протестований (але це не точно) скрипт для Mikrotik NAS у режимі RELAY
Тобто - так - навіть коли DHCP-сервером у нас сам Mikrotik NAS - використовуємо методологію та скрипт для Mikrotik NAS у режимі RELAY.
А цю штуку залишимо суто для розуміння “яким чином хотілося б, щоб воно працювало”.“
в Mikrotik NAS НЕ додаємо
# 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"; } } }
Логіка роботи цього скрипта така: у момент видачі DHCP-lease абоненту ми шукаємо в simple queues запис із таким самим IP, який ми ось зараз видаємо, і правимо цей запис під свої потреби: точніше - видаляємо і додаємо такий самий, але з потрібними нам параметрами. І так, дуже важливо зазначити, що наявність префікса mlg_ у найменуванні simple queue-запису - строго ОБОВ'ЯЗКОВО.
Звісно, це тільки приклад, і у своєму конкретному випадку ви можете модифікувати його під ваші завдання і реалії (наприклад, встановлювати burst'и та інше).
Цей спосіб, до речі, може підійти і для MikroTik IPoE (Hotspot)
Як і в попередньому випадку в Mikrotik NAS додаємо
: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; } } }
По суті, ця штука слідує за тим самим принципом, що й попередня, тільки ось через те, що DHCP lease видається не нашим НАСом і “спіймати”, власне, цей момент ми не можемо - ми проводимо періодичну перевірку на наявність “неправильних” найменувань шейперів і робимо з них “правильні”….
Варто зазначити, що змінна leaseDynPrefix покликана відфільтрувати вибірку записів simple queue, обмеживши її лише тими, у найменуванні яких присутній префікс dhcp-ds< - саме так іменував динамічно створені записи simple queue мікротик, на якому цей скрипт тестували, і БАЖАНО ВЗЯТИ ДО УВАГИ, що у вашому конкретному випадку цей префікс може ВІДРІЗНЯТИСЯ. У принципі - ви взагалі можете не покладатися на цю змінну і не використовувати її, закоментувавши в скрипті рядок 12 і розкоментувавши рядок 9.
І звичайно ж, потрібно не забути про дуже важливий момент, а саме про те, що наявність префікса mlg_ у найменуванні simple queue-запису - строго ОБОВ'ЯЗКОВО.
Чи варто говорити, що якщо у вас на якомусь конкретному мікротикоНАСі в simple queue є якісь свої, потрібні вам записи - то наведений вище скрипт не зупиниться ні перед чим, аби переробити їх повністю. Тож - обережніше в продакшені, а додаткове фільтрування в нього впроваджуйте вже самостійно…
Ну і, як показує практика, потрібно не забути ввімкнути ці самі графіки на кожному окремому Mikrotik NAS. Зробити це можна таким чином:
Tools → Graphing
Натискаємо “Graphing Settings“
і встановлюємо бажану частоту збору та запису статистичних даних. Зазвичай це - 5 хвилин. Багатьом, напевно, хотілося б частіше, але Мікротік поки частіше не вміє.
Далі звертаємо увагу на вкладки “…. Rules“
тут ми можемо вказати деталі збору статистики (для сутностей типу інтерфейси, правила шейперів і системні ресурси) і доступу до цієї статистики. Оскільки нас цікавлять графіки трафіку наших юзерів - нам потрібна вкладка “Queue Rules”. Тикаємо по ній, потім по кнопці з синім плюсом “Додати”:\
і додаємо правило для наших майбутніх графчиків:
Тепер, коли “графічкова тулза” у нас налаштована і правило збору стати додано - можемо перейти на http://ROS_NAS_IP/graphs/ і споглядати там наші графічки.
А якщо не споглядаємо - значить, щось не так і йдемо переробляємо, бо в такому разі в Убілінгу ми їх, найімовірніше, теж не побачимо. Ну або ми забули додати в Allow Address адресу свого хоста, з якого намагаємося ці графічки побачити.
Окрема подяка за допомогу у створенні цього мануала - mohax_kh_ua
Головний мікротико-скрипто-тестер - reductor