====== Авторизація абонентів 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 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]]