Цель статьи — подтолкнуть коллег к отказу от управления сетевыми устройствами с помощью ужасных граблей и костылей, в виде самописных скриптов, Dude, Ansible и пр. И, по этому поводу, вызвать салюты и массовое ликование на площадях.
0. Выбор
Почему freeacs, а не genie-acs, упомянутый в mikrotik-wiki, как более живой?
Потому, что по genie-acs с mikrotik есть публикации испанцев. Вот их pdf и видео с прошлогоднего MUM. Автошаржи на слайдах — это круто, но я бы хотел уйти от концепции написания скриптов, для запуска скриптов, для запуска скриптов…
1. Установка freeacs
Ставить будем в Centos7, а так как устройства передают достаточно много данных, и ACS активно работает с базой данных — жадничать с ресурсами не будем. Для комфортной работы выделим 2 ядра CPU, 4GB RAM и 16GB быстрого хранилища ssd raid10. Я буду ставить freeacs в lxc-контейнере Proxmox VE, а вы можете работать в любом, удобном вам инструменте.
Не забудьте настроить правильное время на машине с ACS.
Система будет тестовая, поэтому не будем мудрить, и просто воспользуемся любезно предоставленным скриптом установки, как есть.
wget https://raw.githubusercontent.com/freeacs/freeacs/master/scripts/install_centos.sh
chmod +x install_centos.sh
./ install_centos.sh
Как только работа скрипта завершится — вы тут же сможете попасть в веб-интерфейс по ip машины, с учетными данными admin/freeacs
Вот такой приятный минималистичный интерфейс, и как здорово и быстро все получилось
2. Первичная настройка freeacs
Базовая единица управления для ACS — это юнит или CPE(Customer Premises Equipment). А самое главное, что нам нужно для управления юнитами — это их Unit Type, т.е. модель оборудования, определяющая совокупность настраиваемых параметров юнита и его ПО. Но пока мы не знаем как правильно завести новый Unit Type, лучше всего будет спросить об этом у самого юнита, включив Discovery Mode.
В продакшн такой режим использовать категорически нельзя, но нам надо скорее завести мотор и посмотреть возможности системы. Все основные настройки хранятся в /opt/freeacs-*. Поэтому, открываем
vi /opt/freeacs-tr069/config/application-config.conf
, находим
discovery.mode = false
и меняем на
discovery.mode = true
Кроме того, нам желательно увеличить максимальные размеры файлов, с которыми будут работать nginx и mysql. Для mysql добавляем в /etc/my.cnf строчку
max_allowed_packet=32M
, а для nginx, в /etc/nginx/nginx.conf добавляем
client_max_body_size 32m;
в секцию http. Иначе мы сможем работать с прошивками не более 1М.
Перезагружаем, и мы готовы работать с устройствами.
А в роли устройства(CPE) у нас будет малыш-трудяга hAP AC lite.
Перед тестовым подключением, желательно вручную настроить CPE до минимальной рабочей конфигурации, чтобы параметры, которые вы в будущем захотите конфигурировать, были непустыми. Для роутера минимально можно включить dhcp-клиент на ether1, установить пакет tr-069client и поставить пароли.
3. Подключаем Mikrotik
Все юниты желательно подключать, используя в качестве логина валидный серийный номер. Тогда вам в логах все будет понятно. Кто-то советует использовать WAN MAC — не верьте. Кто-то использует общую для всех пару логин/пасс — обходите их стороной.
Открываем лог tr-069 для мониторинга «переговоров»
tail -f /var/log/freeacs-tr069/tr069-conversation.log
Открываем winbox, пукт меню TR-069.
ACS URL:
http://10.110.0.109/tr069/prov
(заменить на ваш IP) Username: 9249094C26CB (копируем серийник из system>routerboard)
Password: 123456 (для discovery не нужен, но чтобы был)
Periodic inform interval мы не меняем. Эту настройку мы выдадим через наш ACS
Ниже идут настройки для удаленной инициализации соединения, но с наскока заставить mikrotik с этим работать я не смог. Хотя с телефонами remote request работает «из коробки». Надо будет разбираться.
После нажатия кнопки Apply — в терминале пойдет обмен данными, а в веб-интерфейсе Freeacs можно будет увидеть наш роутер с автоматически созданным Unit Type «hAPaclite».
Роутер подключен. Можно заглянуть в автоматически созданный Unit Type. Открываем
Easy Provisioning > Unit Type > Unit Type Overview > hAPaclite
. Чего там только нет! Целых 928 параметров (я подсмотрел в shell). Много это или мало — разберемся потом, а пока просто бегло посмотрим. Вот, что значит Unit Type. Это список поддерживаемых параметров с ключами, но без значений. Значения задаются в уровнях ниже — Профилях и Юнитах.4. Конфигурируем Mikrotik
Пришла пора скачать руководство по веб-интерфейсу Это руководство 2011 года — как бутыль хорошего, выдержанного вина. Давайте его откроем и оставим подышать.
А сами, в веб-интерфейсе кликнем на карандашик рядом с нашим юнитом и перейдем в режим конфигурации юнита. Выглядит это так:
Кратенько разберем что есть интересного на этой страничке:
Блок Unit configuration
- Profile: Это профиль внутри Unit Type. Иерархия такая:
UnitType > Profile > Unit
. То есть, мы можем завести, например, профилиhAPaclite > hotspot
иhAPaclite > branch
, но в пределах модели устройства
Блок Provisioning с кнопками
Подсказки намекают, что все кнопки в блоке Provisioning могут моментально применять конфигурацию через ConnectionRequestURL. Но, как я говорил выше, это не работает, поэтому после нажатия кнопок надо будет перезапустить tr-069 клиент на mikrotik для ручного старта provision.
- Freq/Spread: Сколько раз в неделю доставлять конфигурацию ± %, чтобы снизить нагрузку на сервер и каналы связи. По дефолту стоит 7/20, т.е. каждый день ± 20% и подсказка как это в секундах. Пока нет смысла менять частоту доставки, т.к. будет лишний шум в логах и не всегда ожидаемое применение настроек
Блок Provisioning history (last 48 hours)
- С виду история, как история, но кликнув по заголовку — попадаешь в удобный инструмент поиска по бд, с regexp и плюшками
Блок Parameters
Самый большой и важный блок, где, собственно, задаются и читаются параметры для данного юнита. Сейчас мы видим только самые важные системные параметры, без которых работа ACS с юнитом невозможна. Но мы-то помним, что у нас в Unit Type их — 928. Давайте посмотрим все значения, и решим с чем это все едят у микротика.
4.1 Читаем параметры
В блоке Provisioning нажимаем кнопку Read all. В блоке — красная надпись. Справа появится столбец CPE (current) value. В системных параметрах ProvisioningMode сменился на READALL.
И… ничего не произойдет, кроме сообщения в System.X_FREEACS-COM.IM.Message
Kick failed at...
. Перезапустите TR-069 client или перезагрузите роутер, и продолжайте обновляйте страничку браузера, пока не получите справа параметры в жизнерадостных серых прямоугольниках
Если кто захотел глотнуть старого выдержанного — этот режим в мануале описан, как 10.2 Inspection mode. Включается и работает немного не так, но суть описана вполне
Режим READALL сам выключится через 15 минут, а мы попробуем разобраться что же тут есть полезного, и что можно подправить «на лету», пока мы в этом режиме.
Можно изменить IP-адреса, включать/отключать интерфейсы, правила фаервола, которые с комментариями (иначе полный бардак), вай-фай и так по мелочи.
То есть, вменяемо конфигурировать mikrotik только средствами TR-069 пока нельзя. Но можно весьма неплохо мониторить. Доступна статистика по интерфейсам и их статус, свободная память и т.д.
4.2 Доставляем параметры
Давайте теперь попробуем доставить параметры в роутер, через tr-069, «естественным» путем. Первой жертвой станет Device.DeviceInfo.X_MIKROTIK_SystemIdentity. Находим его в параметрах юнита All. Как видно — он не задан. Это значит, что любой юнит может сам по себе иметь любой Identity. Хватит это терпеть!
Тыкаем галку в столбце create, задаем имя Mr.White и тыкаем кнопку Update parameters. Что будет дальше вы уже догадались. При очередном сеансе связи со штабом, роутер должен поменять свой Identity.
Но нам этого мало. Такой параметр, как Identity, хорошо всегда иметь под рукой при поиске нужного юнита. Тыкаем в имя параметра и ставим там галки Display(D) и Searchable (S). Ключ параметра меняется на RWSD (Помните, имена и ключи задаются на самом высоком уровне Unit Type)
Значение теперь не только отображается в общем списке поиска, но и доступно для поиска в
Support > Search > Advanced form
Инициируем provision и смотрим на Identity. Здравствуйте, Mr.White! Теперь вы не сможете сами сменить личину, пока работает tr-069client
4.3 Исполняем скрипты
Раз уж мы выяснили, что без них никак, — давайте их исполнять.
Но прежде, чем приступать к работе с файлами — нам надо поправить директиву
public.url
в файле /opt/freeacs-tr069/config/application-config.conf
У нас ведь до сих пор тестовая конфигурация, установленная одним скриптом. Не забыли?
# --- Public url (used for download f. ex.) ---
public.url = "http://10.110.0.109"
public.url: ${?PUBLIC_URL}
Перезагружаем ACS и направляемся прямиком в
Files & Scripts
. Но то, что открывается у нас сейчас — принадлежит Unit Type, т.е. глобально ко всем роутерам hAP ac lite, будь то роутер филиала, хотспот или капсман. Нам такой высокий уровень пока не нужен, поэтому, прежде, чем работать со скриптами и файлами — следует создать профиль. Можно это себе назвать, как «должность» устройства.
Давайте сделаем нашего малыша сервером времени. Достойная должность c отдельным пакетом ПО и небольшим количеством параметров. Идем в
Easy Provisioning > Profile > Create Profile
и создаем в Unit Type:hAPaclite профиль timeserver. Параметров у нас в дефолтном профиле не было, поэтому и копировать нечего Copy parameters from: «don't copy...»Тут параметров пока нет совсем, но можно будет задать те, что мы позже захотим видеть на наших серверах времени, слепленных из hAPaclite. Например, общие адреса NTP-серверов.
Перехотим в конфигурацию юнита, и перемещаем его в профиль timeserver
Наконец-то идем в
Files & Scripts
, делать скрипты, и тут нас ждут потрясающе удобные плюшки. Для того, чтобы исполнить скрипт на юните, нам нужно выбрать Type:TR069_SCRIPT а Name и Target Name должны иметь расширение .alter
При этом, для скриптов, в отличие от ПО, можно как загрузить готовый файл, так и просто написать/отредактировать его в поле Content. Давайте попробуем написать прямо там.
А чтобы сразу было видно результат — добавим роутеру vlan на ether1
/interface vlan
add interface=ether1 name=vlan1 vlan-id=1
Вбиваем, нажимаем Upload и готово. Наш скрипт
vlan1.alter
ждет своего часа.Ну что, погнали? Нет. Надо еще добавить для нашего профиля группу. Группы не входят в иерархию оборудования, но нужны для поиска юнитов в UnitType или Profile и обязательны для исполнения скриптов через Advanced Provisioning. Обычно, группы связаны с локациями, и имеют вложенную структуру. Давайте сделаем группу Russia.
Представляете мы только что смогли сузить поиск с «Все серверы времени мира на hAPaclite» до «Все серверы времени России на hAPaclite». Там еще огромный пласт всего интересного с группами, но нам некогда же. Погнали уже в скрипты.
Advanced Provisioning > Job > Create Job
Поскольку мы как-никак в Advanced режиме, то тут можно указать кучу разных условий начала задания, поведения при ошибках, повторов и таймаутов. Рекомендую это все прочитать в руководствах или позже обсудим при внедрении в продакшн. Пока лишь поставим n1 в Stop rules, чтобы задание остановилось, как только выполнится на нашем 1 юните.
Заполняем необходимое, и осталось только запустить!
Нажимаем START и ждем. Сейчас резво побежит счетчик убитых недоотлаженным скриптом устройств! Нет, конечно. Такие задания даются надолго, и в этом их отличие от скриптов, Ansible и проч. Юниты сами обращаются за заданиями по расписанию или по мере появления в сети, ACS ведет учет какие юниты уже получили задания, и как они завершились, и записывает это в параметры юнита. В нашей группе 1 юнит, а будь их 1001 — админ запустил бы это задание и уехал на рыбалку
Ну же. Перезагрузите уже роутер или перезапустите TR-069 клиент. Все должно пройти гладко и Mr.White получит новый vlan. А наше задание по Stop rule перейдет в статус PAUSED. То есть, его еще можно будет перезапустить или изменить. Если нажать FINISH — задание спишется в архив
4.4 Обновляем ПО
Это очень важный пункт, так как прошивка микротика модульная, но добавление модулей не меняет общую версию прошивки устройства. Наш ACS нормальный, и к такому не привык.
Сейчас мы сделаем в стиле quick&dirty, и запихнем модуль NTP в общую прошивку сразу, но как только на устройстве обновится версия — мы не сможем добавить еще модуль таким же путем.
В продакшн такой трюк лучше не применять, и устанавливать необязательные для Unit Type модули только скриптами.
Итак, первое, что нам нужно сделать — это подготовить пакеты ПО нужных версий и архитектуры, и положить на какой-то доступный веб-сервер. Для теста пойдет любой, до которого сможет дотянуться наш Mr.White, а для продакшн лучше собрать автообновляемое зеркало нужного ПО, которое не страшно выставить в web
Важно! Не забывайте всегда включать в обновления пакет с tr-069client!
Как выяснилось, длина пути до пакетов очень важна! При моих попытках использовать что-то типа
http://192.168.0.237/routeros/stable/mipsbe/routeros-mipsbe-6.45.6.npk
, mikrotik падал в циклическое соединение с ресурсом, отдавая в tr-069 лог повторяющиеся TRANSFERCOMPLETE. И я затратил некоторое количество нервных клеток, пытаясь выяснить что не так. Поэтому, пока положим в корень, до выясненияИтак, у нас должно быть три npk-файла, доступных по http. У меня вышло так
http://192.168.0.241/routeros-mipsbe-6.45.6.npk
http://192.168.0.241/routeros/stable/mipsbe/ntp-6.45.6-mipsbe.npk
http://192.168.0.241/routeros/stable/mipsbe/tr069-client-6.45.6-mipsbe.npk
Теперь это нужно оформить в xml-файл с FileType=«1 Firmware Upgrade Image», который мы скормим микротику. Имя пусть будет ros.xml
Делаем по инструкции из mikrotik-wiki:
<upgrade version="1" type="links">
<config />
<links>
<link>
<url>http://192.168.0.241/routeros-mipsbe-6.45.6.npk</url>
</link>
<link>
<url>http://192.168.0.241/ntp-6.45.6-mipsbe.npk</url>
</link>
<link>
<url>http://192.168.0.241/tr069-client-6.45.6-mipsbe.npk</url>
</link>
</links>
</upgrade>
Бросается в глаза нехватка
Username/Password
для доступа к серверу загрузки. Можно либо попробовать вписать это как в пункте A.3.2.8 протокола tr-069:<link>
<url>http://192.168.0.237/routeros/stable/mipsbe/ntp-6.45.6-mipsbe.npk</url>
<Username>user</Username>
<Password>pass</Password>
</link>
Или спросить напрямую у официалов микротика, как и о максимальной длине пути до *.npk
Идем в известные нам
Files & Scripts
, и создаем там файл типа SOFTWARE с Name:ros.xml, Target Name:ros.xml и Version:6.45.6Внимание! Версия здесь должна быть указана именно в таком формате, в каком она отображается на устройстве и передается в параметре
System.X_FREEACS-COM.Device.SoftwareVersion
.Выбираем для загрузки наш xm-файл и готово.
Теперь у нас есть масса способов обновить устройство. Через Wizard в главном меню, через Advanced Provisioning и задания с типом SOFTWARE, или просто зайти в конфигурацию юнита и нажать Upgrade. Выберем самый простой путь, а то и так статья распухла.
Нажимаем кнопку, инициируем provision и готово. Тестовая программа завершена. Теперь мы умеем делать с mikrotik больше.
5. Заключение
Когда начинал писать, хотел сначала описать подключение ip-телефона, и на его примере объяснить как классно может быть, когда tr-069 работает легко и без усилий. Но потом, по мере продвижения и копания в материалах, подумал, что тому, кто подключил микротик — уже никакой телефон не будет страшен для самостоятельного изучения.
В принципе Freeacs, который мы тестировали — уже можно применять в продашн, но для этого надо настроить безопасность, SSL, надо настроить микротики для автоконфигурации после reset, надо отладить корректное добавление Unit Type, разобрать работу webservices и fusion shell, и еще много чего. Пробуйте, изобретайте, и пишите продолжение!
Всем, спасибо за внимание! Буду рад поправкам и комментариям!
Список использованных материалов и полезные ссылки:
Ветка форума, на которую я натолкнулся в начале поисков по теме
TR-069 CPE WAN Management Protocol Amendment-6
Freeacs wiki
Параметры tr-069 в микротик, и их соответствие командам терминала
Комментарии (15)
alexkuzko
26.09.2019 15:32Очень интересно, познавательно, но… Отказаться от нормальных и полноценных систем в пользу такого ограниченного (и сложного!) решения?..
Louie Автор
26.09.2019 17:18Не знаю что вы имеете в виду под нормальными средствами, и какими протоколами описана их нормальность. Но про ограниченность TR-069 было интересно услышать.
rionnagel
26.09.2019 18:13Я думаю вам стоит описать какой-нибудь кейс, чтобы стало понятно как использовать. Например у вас 500 микротиков. Вам нужно поднять везде хотспот с вайт листом. В каждой сотне своя конфигурация, но в большинстве случаев она почти одинакова. На каждом микротике свои переменные, на каждой десятке из сотни тоже свои переменные. Например я могу использовать шаблоны на ansible и решить эту проблему, оставя себе конфиг на всё в виде кода. Тут как это сделать?
Louie Автор
26.09.2019 19:58Понятно. Спасибо. Я просто так обрадовался работоспособности протокола в микротик, что не сделал описания мощи самого протокола. Нормальный кейс для tr-069 ACS — 23 тысячи устройств разных моделей, с разными условиями подключения к сети (нат, коммутируемый доступ, спутник, wifi). На всех нужно сменить параметры и обновить ПО. Это другой уровень и подход.
Задача на 500 хотспотов решается вообще элементарно через группы. Не надо даже лезть в shell. Тут же все в БД. Мало того, я могу тем же инструментом дополнительно сконфигурировать и обновить 500 свитчей разных вендоров, 500 телефонов и парочку холодильников.
Вообще практические кейсы, шелл, веб-api, триггеры, мониторинг и интеграцию с crm я хотел уже на продакшн-варианте описать. В этой статье чисто поднятие тест-сервера и совсем базовые штуки с mikrotik. Но вот руководство по shell. Вы можете сделать скрипт с переменными, стандартно обращающийся к бд, и выполнить его в терминале или в Job типа SHELL.rionnagel
26.09.2019 23:25Ок, спасибо, буду ждать минимум еще одной статьи) по какой-то причинине tr-069 я до сих пор не рассматривал вообще.
Но боюсь вы меня вынудили всё-таки тестить это).Louie Автор
27.09.2019 09:20Не рассматривали потому, что это пока (без ложной скромности) единственная статья, где есть практика от и до. А насчет челендж tr-069 vs Ansible — хорошая идея. Давайте возьмем по действительно сложному кейсу и посмотрим сравнение. Мне самому интересно
rionnagel
26.09.2019 16:03Выглядит крайне стрёмно. В данный момент ansible+gitlab ci/cd использую.
Коллеги, кто пользовался? Как вам это решение? Жить можно?CherryPah
28.09.2019 03:27Можно, если первым шагом выкинуть микротик.
Самым забавным тут будет то, что адекватные рекомендации типа
Перестаньте писать говнокод и научитесь в git будут заплюсованы.
А комменты типа перестаньте использовать микротик в вашей инфраструктуре, и переходите на нормальное железо — будут награждены минусами в карму, от свидетелей тика.
Причем к роутерос, у меня претензий нет, суперская вещь
А вот железо к ней адекватное завезти — слишком дорого для ца тика. В результате получаем 10г порт с максимальной скоростью в 30мбит. Хотя кому-то нравится.
CarrolCox
26.09.2019 22:54+1Спасибо за статью, хотел увидеть что-то интересное и свежее и увидел, хотя с 2011 года в протоколе ничего особо не поменялось :D
Кмк, стоило сделать акцент на том, что tr-069 — общий стандарт для многих вендоров и с помощью freeacs можео заменять multivendor unit и настраивать автопровижингом.
PS: как в коментарии #comment_20677209
Louie Автор
26.09.2019 23:21Да я думал над акцентами, но всего полезного настолько много, что получилось бы «а вот что еще можно было бы сделать!», начиная с выдачи адреса сервера конфигурации по dhcp, и заканчивая автотестированием устройств. Поэтому, пока только практика и только микротик. Чем больше людей руками пощупает — тем лучше
HarDCorP
27.09.2019 09:40Ну не знаю… смысл в этом freeacs, в бытность еще openacs и т.п. как только появилась свалили для тестов на GenieACS, т.к. есть удобный API и можно реализовать практически все извращенные пожелания возникающие у провайдеров. GUI как таковой и не нужен… А так стоит для тестов сейчас. У всех крупных Axiros (Ростелеком, МГТС) — там питон на сколько я знаю для расширений и т.п.
Louie Автор
27.09.2019 22:30Во freeacs тоже без gui можно сделать больше, чем с gui. Самая большая проблема не в выборе acs, а в микротиках как CPE. Например, микротик не отдает список установленных модулей npk по tr-069. То есть, в проде легко можно поймать «Ну и что, что это старая точка доступа из туалета. мы ее отмыли, и она у нас ups управляла и время в домене раздавала».
alexkuzko
Очень интересно, познавательно, но… Отказаться от провижинга нормальными средствами?.. тут же все равно нельзя ничего настроить полностью…
HarDCorP
Обычно в нормальных CPE — конфиг и веб (чаще как раз в вебе ограничений больше) == tr069/98/ и т.д. сущностям, соответственно прочитав все дерево параметров, можно настроить по сути все тоже самое у абонента. Например проброс портов и т.п. построить карту его сети и т.п., статистику по интерфейсам… много чего