Mikrotik api php примеры

Ближайшие
тренинги Mikrotik

MTCUMEUser Management Engineer

Места
проведения

г. Санкт-Петербург, Крестовский остров, Северная дорога, дом 12.

г. Санкт-Петербург, ст. м. «Приморская»,
ул. Одоевского, д. 24 к. 1, 2 этаж

Заключительная часть цикла посвящена использованию централизованного инструмента управления устройствами с помощью API RouterOS с примерами для языка Python3.

АНОНС

В цикле статей «Автоматизация при эксплуатации оборудования MikroTik RouterOS» представлен обзор средств автоматизации, применяемых при эксплуатации оборудования на базе RouterOS. Решения применимы как к аппаратным решениям MikroTik, так и к облачным решениям, построенным на базе RouterOS.

Заключительная часть цикла посвящена использованию централизованного инструмента управления устройствами с помощью API RouterOS с примерами для языка Python3.

Использование API RouterOS

В рамках этой статьи будет рассматриваться взаимодействие с устройством через специальный программный интерфейс управления (API — application programming interface). По функциональности этот интерфейс аналогичен конфигурации устройства через telnet или ssh. Отличие состоит в том, что telnet и ssh относятся к интерфейсам взаимодействия устройства и человека, а API — взаимодейтствия устройства и устройства, т.е. MikroTik API как нельзя лучше подходит для целей автоматизации.

Ранее было сказано, что в качестве языка программирования при демонстрации работы с API RouterOS будет использоваться Python 3. RouterOS API Python 3 поддерживает взаимодействие с сетевыми устройствами через протоколы telnet и ssh, однако работа с этими модулями трудоёмка, например, результат выполнения команды необходимо выделять с помощью регулярного выражения из общего ответа устройства. Одним из модулей, который значительно упрощает взаимодействие с сетевыми устройствами, является модуль netmiko, однако на текущий момент в нём не реализована поддержка RouterOS. Синтаксис языка Python 3 в рамках статьи рассматриваться не будет.

Для взаимодействия с устройством необходимо включить поддержку API непосредственно на устройстве, перейдя в раздел “/ip services”. По-умолчанию API работает через порт 8728. Кроме того, RouterOS поддерживает защищённый вариант программного интерфейса API over SSL (api-ssl по-умолчанию использует порт 8729).

Разработчики RouterOS не предоставили библиотеки для работы через API для популярных языков программирования, однако описали протокол взаимодействия в официальной документации. Помимо описания протокола взаимодействия представлены примеры программ, в том числе для языка Python 3.

Взяв за основу файл с примером, при подготовке статьи был описан файл с классом ApiRos, позволяющий выполнить подключение и взаимодействие с устройством через API. Помимо этого, были добавлены три функции: для открытия/закрытия сокета и вывода ответа устройства на экран. При демонстрации будут использованы следующие функции и классы:

  • libapi — файл библиотеки, подготовленный для статьи. Файл содержит основные функции и классы для взаимодействия с устройством;
  • ApiRos — класс устройств под управлением RouterOS;
  • socketOpen — функция открытия сокета;
  • socketClose — функция закрытия сокета;
  • login — функция авторизации на устройстве;
  • writeSentence — функция отправки команды на устройство;
  • readResponse — функция получения результата выполнения команды с устройства.
Читайте также:  Разгон видеокарты nvidia geforce 210

Следует упомянуть о формате команд, т.к. он отличается от синтаксиса, используемого при конфигурации вручную. Команды вводятся в виде списка, где первый элемент — команда, в которой пробелы заменяются на символ “/”, а последующие элементы уточняют запрос:

  1. команды просмотра: фильтр запроса начинается с вопросительного знака, после чего следует текст фильтра, например “?type=ether”. Уточняющих команд может быть несколько;
  2. команды изменения конфигурации: фильтр начинается с символа равенства, после чего следует имя параметра и его значение, например “=name=ISP1”. Уточняющих команд может быть несколько.

Во времена ROS 5.x была потребность поднимать туннель к роутеру с белым динамическим адресом. В ROS 5 мы задавали не имя, а IP-адрес. Варианта 2: сервис DDNS, реализацию которого рассмотрим вкратце и второй о котором и будет рассказ.

Появилась идея сделать центр куда бы роутеры рапортовали свои адреса, и считывали адреса других. Решено было пойти путем наименьшего сопротивления – сайт на РНР.

На данный момент реализовано пару несложных вещей.

Оглашение своего адреса

Реализовано через запрос к скрипту с указанием своего (роутера) имени и пароля:

Имя и пароль нужны что бы никто не мог замаскироваться под вас и не инициировал подключение вашего роутера к своему или не мог считать адрес вашего роутера. Через утилиту fetch мы открываем нужный скрипт на сервере и через GET передаем имя и пароль. Скрипт же через $_SERVER[‘REMOTE_ADDR’] получает внешний адрес роутера и записывает его в БД.

Считывание чужого адреса

Опять же через ту же утилиту вызываем веб-скрипт:

dst-path=«adr.txt» – указываем что полученные данные сохранять в файл. На самой веб-странице у нас сугубо текст с адресом запрашиваемого роутера:

$query=«SELECT address FROM table_routers WHERE (( ))»;
$adr=mysql_query($query) or die (mysql_error());
$router=mysql_fetch_assoc($adr);
echo $router[address];

:global routeradr [/file get adr.txt contents] – глобальной переменной присваиваем значение содержимого файла. Потом эту переменную можно при менять по потребности и желанию.

Считывание скрипта из БД

Всё так же как в предыдущем скрипте, но файл мы импортируем в конфиг роутера, а потом удаляем этот файл.

Для чего это необходимо? Например, Вы по невнимательности обрезали себе доступ к роутеру в фаерволе. Тогда можно добавить на сайте скрипт для этого роутера с котором указываете исправленные правила фаервола. Роутер следуя расписанию конектится к сайту, там РНР смотрит есть ли в БД непереданные скрипты для этого роутера:

Читайте также:  Чем очистить кузов автомобиля от краски

Сначала мы проверяем верно ли заданы пароль и номер роутера (чтобы никто другой не мог считать ваш скрипт, может вы там пароли в конфиге меняете), а потом смотрим какой скрипт стоит в очереди не переданных для этого роутера.

Этот метод не решает ВОЗНИКШИЕ проблемы, он помогает их предотвратить. То есть необходимо предварительно «подстелить соломки» и забить в scheduler раз в Х минут/часов проверку роутером наличия новых скриптов для него.

Так же этот метод хорош, когда роутер имеет серую айпишку, а доступ к нему надо получить из вне. Забиваем скрипт поднятия ВПН-туннеля к своей белой айпишке и через заданное время имеем доступ к устройству даже за 10-ю НАТами.

Вот такая вот коротенькая история. Буду раз замечаниям и идеям что еще можно прикрутить к такому сервису. В планах еще небольшая статистика – что бы роутер сливал в БД пару своих параметров, например температуру, загрузку процессора и прочие.

Как бонус кусок готовых скриптов, о которых я писал в начале, получения ip с имени хоста и добавления его в политику IPsec.

Плюс в том что работает в связке Mikrotik + мыльницы которые поддерживают ddns и ipsec (Dlink 804 на пример). Скрипт который достает из дднс имени удаленного пира IP адрес и вставляет его в нужную политику:

И скрипт который подставляет на удаленной стороне текущий ip в политику ipsec:

В этой статье рассмотрим подключение и взаимодействие с API Mikrotik с помощью библиотеки PEAR2_Net_RouterOS, написанной на PHP. Предварительная установка По умолчанию, на версиях RouterOS ниже 6.0, API выключено. Для того, чтобы включить API необходимо в консоли (терминале Mikrotik) выполнить следующую команду: где address – IP адрес, с которого будет разрешено подключение к микротику (в данном […]

В этой статье рассмотрим подключение и взаимодействие с API Mikrotik с помощью библиотеки PEAR2_Net_RouterOS, написанной на PHP.

Предварительная установка

По умолчанию, на версиях RouterOS ниже 6.0, API выключено. Для того, чтобы включить API необходимо в консоли (терминале Mikrotik) выполнить следующую команду:

где address – IP адрес, с которого будет разрешено подключение к микротику (в данном примере 192.168.170.157).

Если нужно включить API по умолчанию на все IP адреса, то необходимо выполнить следующую команду:

Кроме того, необходимо проверить, чтобы порт API не был закрыт фильтрами. Сделать это можно на вкладке: IP->Firewall->FilterRules.

Подключение библиотеки PEAR2_Net_RouterOS

Итак, будем производить подключение к API микротика с помощью библиотеки PEAR2_Net_RouterOS. Первым делом ей необходимо скачать. Вся библиотека, с документами и тестовыми скриптами доступна на GitHub по следующей ссылке: https://github.com/pear2/Net_RouterOS

Данный вид скачивания предоставит нам библиотеку в привычном архивном формате. Следующим шагом необходимо распаковать полученный архив в директорию с проектом PHP (в котором будем подключать библиотеку).

Читайте также:  Почему в водонагревателе быстро заканчивается горячая вода

Подключение библиотеки phar-формата

Также данную библиотеку можно встретить в формате phar. Подключение её в таком виде производится несколько сложнее. К примеру, использование phar не всегда включено по умолчанию в конфигурационных файлах php.

Рассмотрим, как подключить поддержку файлов phar в php на примере CentOS 6.9. Для этого открываем в текстовом редакторе файл /etc/php.d/phar.ini:

В нём проверяем, что строка extension=phar.so не закомментирована.

Для подключения самой библиотеки в коде модуля PHP прописываем:

В случае если по каким-то причинам подключить библиотеку phar не удалось, можно её распаковать командой:

и воспользоваться инструкцией ниже.

Подключение обычным PHP-файлом

Если библиотека изначально была не в формате phar, то её можно подключить в качестве связки обычных PHP-файлов. Для этого в коде модуля PHP прописываем:

Теперь рассмотрим простейший пример подключения к API микротика.

Пример подключения

В данном разделе будет рассмотрен пример подключения более детально. Весь код примера будет доступен в разделе ниже.

Для рассмотрения примера подключения, создадим файл index.php. В него пропишем следующий код:

В данном случае подключение производится с помощью файла Autoload.php (метод 2), а не phar.

Коннект к API микротика производится в строке: new RouterOSClient(‘192.168.170.198’, ‘admin’, »), где, в качестве параметров, передаются IP адрес микротика, логин и пароль для подключения. Если подключение выполнено успешно, то в браузере увидим надпись «ОК». В противном случае, увидим ошибку.

Теперь, когда подключение к API микротика успешно установлено, выведем какой-нибудь полезный результат.

Получение и парсинг результатов

Работу с API рассмотрим на примере вывода текущего списка IP адресов (вкладка IP->Addresses).

Первое, что делаем – выполняем подключение к API микротика, которое описано в предыдущем пункте.

Далее выполняем запрос на получение списка IP адресов:

$request = new RouterOSRequest(‘/ip/address/print’);

В качестве параметра RouterOSRequest передаём команду, структура которой аналогична команде получения IP адресов в консоли микротика, за исключением одного: вместо пробелов при записи команды в консоли здесь используются «/».

Выполняется запрос командой

Теперь, в переменной $responses хранится массив, содержащий в себе список IP адресов. Осталось распарсить его и привести к читабельному виду.

Запускаем цикл по всему массиву:

Проверяем, чтобы тип ответа был одним из зарезервированных:

И получаем необходимые значения:

Для получения параметра disabled воспользуемся тернарным оператором:

Выведем все переменные в удобочитаемом виде:

После чего закрываем if и цикл foreach.

Исходный код примера

Здесь приведём полный исходный код описанного выше примера:

На этом рассмотрение подключения к API Mikrotik средствами библиотеки PHP завершено.

Остались вопросы?

Я — Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

Оцените статью
Добавить комментарий