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

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


mgmikrotikdhcp

Розбіжності

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

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

Порівняння попередніх версій Попередня ревізія
Попередня ревізія
mgmikrotikdhcp [2020/10/05 12:35]
mgmikrotikdhcp [2023/09/04 19:34] (поточний)
bobr [Коли DHCP-сервер у нас десь там, а сам Mikrotik NAS - усього лише relay]
Рядок 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/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]]
 +