[Из песочницы] Управление интернет модулями Laurent из RouterOS MikroTik

Что такое маршрутизаторы Микротик (MikroTik), в наше время известно практически каждому, кто интересуется сетевыми технологиями чуть больше, чем просто пользователь. Благодаря надежной аппаратной части и невысокой стоимости эти роутеры становятся все более популярными не только в профессиональной среде администраторов крупных сетей, но и в офисном и домашнем использовании. Важной составляющей успеха этого оборудования среди профессионалов и любителей является единая для всех устройств Микротик специализированная РоутерОС (RouterOS, ROS) — мощная операционная система, оснащенная удобной графической оболочкой WINBOX, позволяющей гибко и универсально настраивать маршрутизатор. Подчас возможности RouterOS этим не ограничиваются…

В данной статье рассматривается возможность использования функционала ROS MikroTik для подачи команд интернет-модулям Laurent компании KernelChip, воспринимающим прямые http-запросы, через интеграцию этих устройств в сети посредством создания особых микропрограмм — скриптовых функций ROS.


image

Модуль Laurent2


Модуль Laurent2 имеет «на борту» достаточно богатую «оснастку», доступную на колодках клеммных контактов по краям платы. Модуль имеет в своем составе:

  • оптоизолированные дискретные входные линии (6 шт.)
  • мощные выходные дискретные линии (12 шт.)
  • аналого — цифровые преобразователи (для измерения напряжения и подключения различных датчиков) -2
  • счетчики импульсов (4 шт.)
  • высоковольтные электромагнитные реле для коммутации различных нагрузок (4 шт.)
  • ШИМ выход
  • вход для подключения датчик, а температуры KTS-18B20
  • последовательный порт RS — 232


Laurent112


Laurent112 выглядит скромнее, не имея вышеперечисленного разнообразия возможностей Laurent2, но неся на себе «в компенсацию» 12 реле, способных коммутировать стандартную нагрузку бытовых электроприборов.

Для поддержки этих модулей в Микротик РоутерОс мной были написаны следующие скриптовые функции:

FuncLaurent2REL — функция работы с реле модуля Laurent2
FuncLaurent2OUT — функция работы с OUT-линиями модуля
FuncLaurent2PWM — установка мощности ШИМ-сигнала
FuncLaurent2Status — запрос статуса Laurent2
FuncLaurent112REL — функция работы с реле модуля Laurent112
FuncLaurent112Status — запрос статуса Laurent112
FuncPing — служебная функция запроса ответа IP-адреса на «пинг», используется всеми функциями
FuncMail — дополнительная функция отправки произвольного сообщения на почту

Для удобства использования перечисленные функции вместе с некоторыми служебными и скриптами-примерами их вызова объединены в единый файл Laurent.rsc, который может быть импортирован в РоутерОс командой терминала

/import file=Laurent.rsc


(время импорта может занять от 20–30 секунд до 1 минуты в зависимости от производительности Вашей модели роутера Микротик).

Если файл библиотеки скриптов Laurent не поврежден и импорт скриптов в реппозиторий выполнен верно мы увидим в консоли роутера утилиты WINBOX сообщение «Script file loaded and executed successfully»:

image

При этом в реппозитории роутера, кроме уже имеющихся Ваших скриптов, должны появиться следующие:

image

Их легко отличить по метке владельца-создателя (owner), где будет отмечено «Laurent».

Вызывать функции Laurent из любых других скриптов можно следующим образом:
Сначала нужно исполнить скрипты, размещающие необходимые функции в виде глобальных переменных в окружении переменных реппозитория роутера. Для модуля Laurent2 это скрипты Func_Laurent2_library, Func_Ping и Func_Mail (необязательная, но удобная «почтовая» функция). Для Laurent112 это скрипты Func_Laurent112_REL, Func_Laurent112_Status, Func_Ping и Func_Mail.

Запуск этих скриптов можно делать однократно, когда будут нужны эти функции. Если они используются в постоянной работе, удобно реализовать запуск их скриптов сразу при старте роутера из планировщика РоутерОС (/system sсheduler). Либо можно воспользоваться запуском специального скрипта Laurent_START.rsc, который делает все необходимое для установки сразу всех функций обоих модулей. После исполнения этого скрипта из WINBOX или консоли командой

/system script run Laurent_START.rsc

функции библиотеки размещаются в окружении переменных репозитория и звучит часть мелодии Jaga.

В лог роутера выдается сообщение об успешном старте библиотеки:

image

В последствие можно отредактировать установочный файл таким образом, чтобы в окружение ставились только нужные Вам функции (соответственно модели Вашей платы Laurent), либо вызывать их самостоятельно по примеру из текста файла Laurent_START.rsc

Теперь, в окружении переменных, мы можем видеть наши функции, определенные в RouterOS как глобальные переменные (: global), готовые к работе:

image

После определения функции можно вызывать в своих скриптах, планировщике роутера (для исполнения по расписанию) либо каких-либо специальных случаях (DHCP-server Alerts, PPP-profile scripts и др.) объявив их global-имена в вызывающем скрипте.

Следует учитывать, что функции работы с реле обоих модулей, установки выходных линий и мощности ШИМ-сигнала Laurent2 могут работать только в «незащищенном» режиме модулей. При включенном в модулях режиме «protect» эти http-команды не исполняются с выдачей соответствующих сообщений об ошибке (см. далее). Функции запроса статуса модулей работают как в защищенном, так и в не защищенном режимах.

Рассмотрим возможности и работу функций для модуля Laurent2


FuncLaurent2REL — функция включения/выключения/инверсии реле Laurent2

Функция позволяет: включать заданное реле, выключать реле, производить сброс реле на заданное время.

Синтаксис функции следующий:

[$FuncLaurent2REL Ladr="IP-address" Lport="http-port" Rele="nRele" Action="m" Time="time s"]


где:

Ladr — IP адрес модуля Laurent2 в сети в общепринятом формате;

Lport — http-port модуля. В настоящих версиях всех модулей Laurent используется только стандартный http-порт 80, произвольный порт не настраивается. По этому параметр Lport можно не указывать;

Rele — номер реле, к которому обращается функция в диапазоне от 1 до 4;

Action — действие, совершаемое над реле. Может принимать значение (m) равное 1, что эквивалентно включению реле (on) или 0 (off);

Time — время действия над реле в секундах в разрешенном прошивкой модуля диапазоне [1–255]. Если не указано, действие совершается однократно. Если указано значение Time, то выполняется «перезагрузка» реле — смена состояния реле на заданное в Action на Time секунд с возвращением в противоположное состояние.

Результат выполнения функции может быть возвращен в строковую переменную Lanswer (в этом ценность функций в отличии от простых команд).

Чтобы результат был возвращен нужно использовать конструкцию определения (: local или : global) либо присвоения значения (: set) ранее определенной переменной, например:

:local Lanswer [$FuncLaurent2REL Ladr="IP-address" Lport="http-port" Rele="nRele" Action="m" Time="time s"]


При успешном исполнении функции в Lanswer будет возвращено »DONE», либо будет возвращено сообщение об ошибке. При успешном выполнении функции если Action=»1» роутер, оснащенный бипером, издает один короткий звуковой сигнал. При «выключении» реле либо обратной инверсии звучат два последовательных коротких звуковых сигнала.

Функцией могут быть возвращены следующие сообщения об ошибках:

»>ERROR: rele range mismath» — в случае указания недопустимого номера реле в переменной Rele;
»>ERROR: rele regime set mismatch» — в случае не заданного либо неверно заданного Action;
»>ERROR: time mismatch» — в случае ошибочного значения Time (не в диапазоне [1–255]);
»>ERROR: device not responded» — в случае отсутствия ответа Laurent на пинг;
»>ERROR: command ROS » — в случае возникновения ошибки при исполнении URL-команды RouterOs /tool fetch (при неверно заданном, но пингуемом Ladr, неверно заданном Lport недоступности сервиса /tool fetch конкретному user Микротик и т.д…);
»>ERROR: device protect» — в случае если установлен «защищенный режим устройства» и команда не может быть исполнена;
»>ERROR: command syntax» — синтаксическая ошибка в команде (* не все варианты ошибок можно исключить, возможны зависания скрипта при неправильном синтаксисе в функции, например, при неверно заданном или вообще не соответствующим формату Ladr и Lport)

Примеры использования функции FuncLaurent2REL

Включение реле №1 модуля Laurent2 c IP-адресом 192.168.0.101 с возвращением ответа функции в переменную:

:global FuncLaurent2REL;
:local Lanswer [$FuncLaurent2REL Ladr="192.168.0.101" Lport="80" Rele="1" Action="1"];
:if ([:find $Lanswer "DONE"]=0) do={:log warning $Lanswer}


Разумеется, вместо любых прямых значений параметров функции, указываемых в кавычках, можно использовать переменные РоутерОС с произвольными именами:

Инверсия реле №4 на 20 секунд без возвращения ответа функции:

:local LaurentIPadr "192.168.10.5"
:local LaurentRele 4
:local LTime 20
[$FuncLaurent2REL Ladr=$LaurentIPadr Lport="8021" Rele=$LaurentRele Action="1" Time=$Ltime]


К функциям Laurent2 и Laurent112 можно применять любые конструкции, разрешенные языком Lua ROS (циклы, вложенность, ветвления и т.д…).

То, есть, используя цикл, можно, например, включить все реле платы:

:for i from=1 to=4 do={[$FuncLaurent2REL Ladr="192.168.0.101" Lport="80" Rele=$i Action="1"];}


Или аналогичным способом проделывать групповые операции над i/o линиями.

FuncLaurent2OUT — функция установки состояния выходных линий Laurent2

Функция абсолютно аналогична предыдущей. Имеет те же параметры, за исключением замены параметра Rele на параметр Line, который может принимать значения в диапазоне 1–12 (помним, что у Laurent2 12 выходных линий). При указании Action=»1» на линии устанавливается высокий логический уровень, при Action=»0» — низкий. Инверсия линии на заданное время также работает аналогично функции FuncLaurent2REL при задании времени Time.

Пример вызова функции c установкой выходной линии №12 в «High level»:

[$FuncLaurent2OUT Ladr=1"92.168.0.1" Line="12" Action="1"] 


Функция FuncLaurent2OUT присылает ответ «DONE» в случае удачного завершения.

Сообщения об ошибках аналогичны FuncLaurent2REL, но сообщают о выходных линиях:

»>ERROR: line range mismath» — в случае указания недопустимого номера линии в переменной Line;
»>ERROR: line regime set mismatch» — в случае не заданного либо неверно заданного Action;
»>ERROR: time mismatch» — в случае ошибочного значения Time (не в диапазоне [1–255]);
»>ERROR: device not responded» — в случае отсутствия ответа Laurent на пинг;
»>ERROR: command ROS » — в случае возникновения ошибки при исполнении URL-команды RouterOs /tool fetch;
»>ERROR: device protect» — в случае если установлен «защищенный режим устройства» и команда не может быть исполнена;
»>ERROR: command syntax» — синтаксическая ошибка в записи команды.


FuncLaurent2PWM — функция регулировки мощности ШИМ-сигнала

Функция устанавливает мощность сигнала на ШИМ-выходе, что может использоваться в регулировке яркости освещения, например, или скорости работы вентилятора подключенного к этому выходу.

Синтаксис функции следующий:

[$FuncLaurent2PWM Ladr="IP-address" Lport="http-port" PW="n(%)"]


В параметре PW нужно указывать мощность ШИМ-сигнала в процентах (без указания знака %), соответственно в диапазоне 0–100.

При неверном указании параметра PW выдается ошибка »>ERROR: PWM range mismath», остальные сообщения об ошибках аналогичны соответствующим для FuncLaurent2REL и FuncLaurent2OUT.

FuncLaurent2Status — функция запроса статуса модуля Laurent2

Функция может запрашивать полный статус модуля в различных форматах, отдельно каждого из параметров (всех реле, всех входных линий, всех выходных линий, показаний датчика температуры, мощности ШИМ-выхода, счетчиков импульсов и т.д…), а также отдельно одного из элементов мультиэлементных параметров (конкретного реле или дискретной линии). Модули Laurent позволяют запросить статус платы вне зависимости от того, выключен или включен режим «защиты» (protect).

Формат записи функции следующий:

[$FuncLaurent2Status Ladr="IP-address" Lport="http-port" Type="all, xml or name" N="el. number"]


При этом:

Ladr и Lport — IP адрес и http-порт (порт можно не указывать) устройства Laurent2 в сети;

Type — обязательный запрашиваемый параметр, который может принимать значения (systime, rele, in, out, adc1, adc2, count1, count2, count2, count4, temp, pwm) соответственно техническому описанию платы Laurent2. Также можно задать Type=«all» или Type=«xml», не указывать Type совсем — недопустимо;

N — необязательный параметр функции. Используется только для для мультиэлементных Type (rele, in, out) и для них определяет номер запрашиваемого элемента статуса параметра Type (для rele N=[1–4], для out N=[1–12], для in N=[1–6]);

При успешном выполнении (без возникновения ошибок) ответ функции может быть возвращен в переменной Lanswer, либо одноименном одномерном ключевом массиве (если запрашивается весь статус модуля при Type=«аll» (см. далее).

При задании Type=«xml» функция возвращает статус модуля без изменений в формате xml, отдаваемом платой. В Микротик RouterOS такой формат вряд ли удобен, но данная возможность сохранена.

При Type=«all» функция возвращает в одномерном ключевом массиве Lanswer полный статус модуля. Статус отдельных элементов можно извлечь из него по именам-ключам элементов. Ключи элементов имеют названия, соответственно техническому описанию параметров статуса модуля (systime, rele, in, out, adc1, adc2, count1, count2, count2, count4, temp, pwm), где:

systime — текущее системное время модуля в секундах, исчисляемое от момента подачи питания;

rele — cостояние реле модуля в виде сводной строки данных. Первому символу в строке соответствует реле номер 1, второму символу реле номер 2 и т.д. 1 в соответствующей позиции соответствует «реле включено», 0 –выключено;

in — состояния по всем 6 входным дискретным линиям в виде сводной строки данных. Первому символу в строке соответствует линия номер 1, второму символу линия номер 2 и т.д.»0» — на линии установлен низкий логический уровень,»1» — соответственно, высокий логический уровень;

out — аналогично для 12 выходных линий;

adc1 — показания измерений канала АЦП-1 модуля в Вольтах;

adc2 — показания измерений канала АЦП-2 модуля в Вольтах;

temp — показания датчика температуры в градусах Цельсия;

count1 — значение счетчика импульсов №1, целое число в диапазоне 0 –32766;

count2 — аналогично для других трех счетчиков импульсов …;
count3 —
count4 — …

pwm — выходная мощность сигнала на ШИМ выходе. Может принимать значения от 0 до 100,
в процентах

В качестве примера, получим полный статус устройства и выведем в лог роутера только его отдельные параметры — значение температуры термодатчика (temp) и статус всех реле (rele):

Скрипт-пример №1 работы с функцией FuncLaurent2Status
:global FuncLaurent2Status;
;
#Запросить полный статус модуля Lanswer в ключевом массиве;
:local Lanswer [$FuncLaurent2Status Ladr="192.168.0.101" Type="all"];
# Выдать в лог все параметры статуса;
:log info "Полный статус Laurent2 в ключевом массиве с сортировкой по алфавиту имен-ключей:"; :log info $Lanswer;
:log info "";
;
# Выдать в лог только показания термодатчика и статус всех реле из полученного полного статуса:
:local termokey "temp"; :local relekey "rele"; :local Tsend "";
:set Tsend  ($Lanswer->$termokey); :log info ("Показания термодатчика: "."$Tsend"); :log info "";
:set Tsend  ($Lanswer->$relekey); :log info ("Строка-статус всех реле: "."$Tsend"); :log info "";
;
# Выдать в лог статус каждого реле по отдельности:
:log info ("Статус каждого реле:"."\n");
:local rezult; local Saction; :local Reletext;
:for i from=1 to 4 do {:set rezult [:pick $Tsend ($i-1) $i];
:if (rezult="0") do={:set Saction "< ВЫКЛЮЧЕНО >"} else={:set Saction "< ВКЛЮЧЕНО >"}
:log info ("Реле №"."$i"." "."$Saction"); :set Reletext ("$Reletext"."Реле №"."$i"." "."$Saction"."\n")}
:log info "";


Вывод работы вышеприведенного скрипта в лог роутера:

image

* Примечание:

— В RouterOS элементы ключевых массивов располагаются в алфавитном порядке согласно именам ключей. Это никак не влияет на их выборочный вывод, можно запрашивать нужные элементы массива по именам или в произвольном порядке.
 — Температурный датчик в данном случае показывает -273 °С (не подключен).
 — Наглядно видно состояние всех четырех встроенных реле модуля (включено/выключено).

Для мультиэлементных параметров (таких, как rele, in или out), содержащих в своей строке состояние всех соответствующих элементов, соответственно номеру их позиции, можно вывести только определенный элемент (статус конкретного реле, входной линии или линии вывода). Это удобно, когда нужно получить статус отдельных разнородных параметров и элементов или статус группы элементов, чтобы не вызывать функцию запроса статуса конкретного элемента используя параметр N в цикле.

Например, из уже полученного полного статуса модуля выведем состояние только входной линии №6:

# Вывод одного элемента заданного параметра;
:local numelem 6; # порядковый номер интересующего элемента в поле параметра;
:local Par ($Lanswer->"in")
:local elem [:pick $Par ($numelem-1) $numelem]
:log info $elem


Также можно напрямую запросить не полный статус платы, а только состояние нужного параметра, например, всех выходных линий (out):

:local Lanswer [$FuncLaurent2Status Ladr="192.168.0.101" Type="out"];
:set Lanswer ("Статус всех выходных линий: "."$Lanswer");
:log info $Lanswer;


Или только одного элемента мультиэлементного параметра (пусть это будет реле №7):

:local Lanswer [$FuncLaurent2Status Ladr="192.168.0.101" Type="rele" N="7"];
:log info $Lanswer;


Для параметров с одним элементом (таких, как temp, cont2, adc1, systime и др.) N не указывается, а если указано, то игнорируется.

Для Type, для которых N возможно (in, out, rele), но не задано, — возвращается статус всего поля, заданного в Type в виде строки скажем »0100011000» (с учетом количества элементов данного Type), где каждой позиции соответствует значение лог 1 или лог 0.

Если запрашивается мультиэлементный параметр и N задан в функции, причем задан не верно (N<1 или N> возможного для данного Type) — также вовращается весь параметр Type целиком (ошибка неверного диапазона N не выдается).

В случае неудачного входа/исполнения функция может выдать в лог и вернуть в переменной Lanswser следующие сообщения об ошибках:

>ERROR: device not responded — в случае отсутствия ответа модуля Laurent на пинг;
>ERROR: command ROS — в случае возникновения ошибки при исполнении URL-команды RouterOs /tool fetch;
>ERROR: TYPE MISMATCH — в случае неправильно указанного в запросе параметра статуса (rele, out, in, all и т.д…)

Ниже приведен пример кода скрипта, позволяющий целиком, либо избирательно работать со статусом устройства Laurent. Проанализировав логику его работы, надеюсь, Вы сможете писать любые собственные скрипты запроса статуса модуля.

Скрипт-пример №2 работы с функцией FuncLaurent2Status
:global FuncLaurent2Status;
;
:local Ltype "out"; # all – вывод всего статуса или задать какой параметр статуса вывести (rele, out, temp ит.д..);
:local Npar ""; # - задать номер выводимого элемента для параметров с полем больше одного элемента или задать пусто ("");
:local PR "all"; #- задать "all" если нужно вывести все поле многоэлементного параметра или задать любое значение для вывода элемента № Npar; 
;
:local Lanswer [$FuncLaurent2Status Ladr="192.168.0.101" Lport="80" Type=$Ltype];
:if ($Lanswer=">ERROR: device protect") do={:log error "Команда не выполнена. Модуль в защищенном режиме"};
:if ([:find $Lanswer "ERROR"]=1) do={:log error $Lanswer;} else={
:local keytype [:toarray "systime, rele, in, out, adc1, adc2, count1, count2, count3, count4, temp, pwm"];
:local typepar {"systime"="1"; "rele"="4"; "in"="6"; "out"="12"; "adc1"="1"; "adc2"="1"; "count1"="1"; "count2"="1"; "count3"="1"; "count4"="1"; "temp"="1"; "pwm"="1"};
:local T; :local row; :local rezult;
:if ($Ltype="all") do={
:foreach i in=$keytype do={ :set row ($Lanswer->$i); log info ("$i"." = "."$row");}
} else={:set T ($typepar->"$Ltype");
:if ($PR="all") do={:set rezult $Lanswer} else={:set rezult ("уст. лог. ". "$[:pick $Lanswer ($Npar-1) $Npar]")}
:log info ("$Ltype"." всего "."$T"."; "."$Ltype "."$Npar".": "."$rezult");}}; :log info "";


Функции для модуля Laurent112


Модуль Laurent112 предназначен только для подключения нагрузок, но зато количество встроенных реле у него 12. Соответственно для поддержки его функциональности были созданы всего две функции — установки реле FuncLaurent112REL и запроса статуса модуля FuncLaurent112Status.

FuncLaurent112REL — функция работы с реле модуля Laurent112 полностью аналогична таковой для Laurent2, описанной выше. Параметр Rele этой функции может варьировать в диапазоне [1–12].

FuncLaurent112Status — функция запроса статуса Laurent112 ограничена выдачей только двух параметров статуса — системного времени, прошедшего от подачи питания на модуль (systime) в секундах и сатуса реле (rele).

Аналогично функции запроса статуса Laurent2, функция FuncLaurent112Status может выдывать полный статус Laurent112 в формате xml модуля (при задании Type=«xml»), полный статус в виде ключевого массива, помещаемого в Lanswer (при Type=«all») или отдельно для systime и rele. Для Type=«rele» поддерживается задание в запросе параметра N с указанием номера реле, статус которого нужно запросить. Если N не задано, либо задано не в верном диапазоне возможных значений (от 1 до 12) функция возвращает строку, содержащую статус всех реле, где статус реле закодирован нулями (0) или единицами (1) в соответствующей номеру каждого реле позиции реле в строке.

Формат обращения к данным функциям и возвращаемые сообщения об ошибках аналогичны соответствующим функциям Laurent2 (см. выше).

Как на практике использовать реализованную интеграцию роутера Микротик и интернет-модулей Laurent?


Одним из Важных моментов результатов интеграции роутера Микротик и указанных интернет модулей Laurent следует считать автономность — то есть возможность ее существования между двумя сетевыми устройствами, ни один из которых не является ПК и каждый из которых может работать без участия человека (пользователя, администратора). При этом роутер является главным устройством любой локальной сети и, как правило, шлюзом в Интернет. Учитывая возможности РоутерОС и широкий аппаратный спектр RouterBoard все возможные применения данной интеграции даже сложно себе представить, все зависит от технических задач и фантазии аппликатора.

Большую часть автономной работы платы Laurent, после соответствующей настройки, в том числе системы CAT, могут вообще выполнять самостоятельно.

Основными применениями Laurent в интеграции с роутером Микротик представляются следующие:

  1. Защита доступа к какому-либо важному устройству, компоненту локальной сети по питанию.
  2. Включение/выключение отдельных сегментов локальной или удаленной сети (например, гостевая сеть, уличная точка доступа)
  3. Перезагрузка «зависших» устройств в локальной сети с дополнительным контролем и оповещением с Микротик.
  4. «Мониторинг здоровья» самих модулей Laurent, отдельных показателей их входов/выходов, датчика температуры) с оповещением администратора о происходящих событиях.
  5. Включение/выключение бытовых электроприборов (освещение, отопление и т д…), в том числе по расписанию с логированием пользователю на почту, сервисы типа Телеграмм и на мобильный телефон через SMS.


Далее рассмотрим примеры реализации некоторых из них.

1. «Физическая защита» доступа к важному сетевому ресурсу.

Предположим, в Вашей локальной сети есть важное устройство, которое Вы хотели бы дополнительно защитить от доступа из вне. Сетевых защит существует, как известно, великое множество, например метод port knoking, организация различных VPN-тоннелей и т.д…
Все они неплохи, но практически все давно вскрыты. Разумеется, если Вы не банкир, то профессионалы не будут заниматься взломом Вашей сети, а рядовым пользователям взлом даже легких защит, как правило, не под силу.

Тем не менее существует не мало фактов взлома удаленных рабочих столов, файловых серверов и т.д…, что весьма не приятно. Что же может предложить в этом смысле наша интеграция?
Главным образом — физические ограничение доступа к ресурсу во времени, а это один из важнейших факторов, влияющих на возможность взлома сети из вне.

Итак, помним, что все программные методы сетевой защиты (например, NAT и FIREWALL самого роутера) защищают доступ к какому либо сетевому ресурсу, постоянно работающему в сети.
С помощью интеграции Микротик-сетевое реле (в данном случае модуль Laurent) можно, просто и удобно, дополнительно к этим методам защиты, сделать «физический блок» доступа к нужному нам устройству в сети. Как это реализовать?

Электропитание нашего защищаемого устройства (например, секретный файловый сервер с Вашим личным архивом данных о Вашей фирме) подключим к одному из реле модуля Laurent, например к реле 1. В роутерОс Микротика настроим любой VPN-сервер, например один из самых популярных — pptp-сервер. РоутерOc позволяет гибко настраивать отдельные PPP-профили для пользователей-клиентов сервера (PPP-profile), индивидуально под каждого VPN-клиента или группу клиентов. Для примера, у нас есть настроенный PPP-profile для VPN-клиента с именем D_Ivanov. Кроме задания логина и пароля для входа клиента и массы других возможных сетевых настроек для каждого PPP-profile РоутерОС позволяет задавать опции PPP-scripts «on Up» и «on Down», в которые можно поместить непосредственно исполняемый код скриптов.

Поместим в эти поля следующий код:

image

Тогда, при подключении к роутеру VPN-клиента D_Ivanov со своим логином и паролем (первая ступень защиты) через 5 секунд будет выполнен скрипт, размещенный в «on Up», который с помощью функции FuncLaurent2REL включит реле №1 (помним, что к реле №1 подключено питание нашего «секретного» файлового сервера, наша вторая ступень «физической защиты»). Питание сервера будет включено, он загрузится и клиент получит к нему доступ «снаружи» по VPN. Как только VPN-клиент разорвет тоннель (завершит сеанс или сеанс будет разорван из-за нарушений интернет-трафика) второй скрипт, размещенный в поле «on Down», отключит питание нашего файлового сервера и сервер станет физически не доступен. Это позволяет серверу (или какому-либо иному устройству, какому Вам хочется) не постоянно находится в рабочем состоянии (и быть потенциально уязвимой мишенью для «подбирателей» паролей все 24 часа в сутки), а включаться физически только на время доступа VPN-клиента.

Такой метод двойной защиты является очень эффективным, т.к. «подобраться» к неработающему устройству, стоящим и так «за» защищенным роутером, узнать его модель, пропинговать порты, просто не возможно, а сделать это в короткое время его работы — очень сложно (ведь взломщик не знает, когда Вы надумаете подключиться через VPN к своему роутеру). Разумеется в те же поля PPP profile scripts можно добавить код, посылающий сообщения на почту или мобильный телефон о входе VPN-клиента (что дополнительно проинформирует, в частности администратора о взломе VPN-сервера роутера, но еще не Вашего секретного файлового сервера !, который можно будет быстро защитить).

2. Включение/выключение отдельных сегментов сети.

Оперируя функциями работы с реле или выходными линиями (не стоит забывать, что к ним также можно подключить реле или блоки реле) можно, например, физически включать/выключать дочерние сети и подсети, стоящие «за роутером». Модуль Laurent2 имеет 4 встроенных реле и 12 выходных линий, если задействовать их все (к выходным линиям тоже подключить реле или блоки реле), то получается 16 выходов электропитания. Laurent112 несет 12 готовых встроенных реле. То есть имея один из указанных модулей Laurent можно организовать раздельное включение 16-ти или 12-ти соответственно wifi-точек доступа, свичей или тому подобных сетевых устройств.
Таким образом, можно регулировать работу сети целого большого офиса или предприятия, включая/выключая, перезагружая физически «гостевые» сети, «уличные» точки доступа, точки-сетевые мосты и прочее. И это может делать не оператор/администратор сети, а роутер Микротик в автоматическом режиме, в том числе по расписанию или по каким-либо условиям.

Например, включаем через нашу функцию wifi-точку-доступа. Если она не включается, то есть не отвечает на пинг, не подключает клиентов (это тоже проверяет наш скрипт) — выключаем ее питание и включаем другую, резервную точку и т.д… Это также ограничит расходование трафика и дополнительно обеспечит безопасность определенных сегментов сети (например, уличных).

3. Мониторинг модулей Laurent и работа интеграции с Микротик по расписанию

Поскольку модули Laurent сами «не умеют» считывать время с серверов точного времени, то работа по расписанию в них весьма ограничена. Модули могут опираться только на свое собственное системное время, которое начинает отсчет от подачи питания на саму плату.
Роутер Микротик оперирует «настоящим» суточным временем датой и может выполнять любые действия в RouterOS по точному расписанию через отслеживание этого времени скриптом либо в собственном «планировщике» (в WINBOX доступен во вкладке /system scheduler). Туда мы может поместить скрипты, использующие наши функции поддержки модулей Laurent, настроив для них логику работы (можно «срабатывать» при старте роутера, при старте с нужной задержкой, в определенное время суток однократно либо с регулярным повторением).

Используя данные возможности, можно в дополнение к системе CAT модулей Laurent не только управлять какими-либо нагрузками и линиями, а и считывать статус модуля или отдельные его элементы в RouterOS Микротика. Далее можно принимать какие-либо решения подобно условиям системы CAT, а также информировать о произошедших событиях администратора и пользователей роутера на их почтовые адреса и/или мобильные номера через SMS. При этом можно использовать бесплатные возможности пересылки сообщения с почтового адреса на мобильный номер например ресурса sms.ru или подобных. Также можно отправлять данные с Микротика в боты Телеграмм. О том, как это настроить, в Интернет есть специальные инструкции.

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

Скрипт запроса статуса Laurent2 с отчетом на почту
# 
# Запрос статуса Laurent2 c отправкой на E-mail пользователя
#
;
# определяем переменные и функции
;
:global FuncMail; # - определение функции отправки почты;
:local Smail "user@mail.ru"; # - адрес почты для уведомления о выполненном запросе;
;
:global FuncLaurent2Status; # - определение функции запроса статуса Laurent2;
:local Sadr "192.168.1.101"; # - IP-адрес устройства;
:local Sport "80"; # - http-порт, если не стандартный
:local Stype "all"; # - запрашиваем полный статус
:local keytype [:toarray "systime, rele, in, out, adc1, adc2, count1, count2, count3, count4, temp, pwm"];
:local Tsend "";
;
# запросить полный статус Laurent;
;
:local Lanswer [$FuncLaurent2Status Ladr="192.168.0.101" Lport=$Sport Type=$Stype];
;
# сформировать полный отчет в переменной Mtext
;
:local Mtext; :local Stext; :local row;
:foreach i in=$keytype do={ :set row ($Lanswer->$i); :set Stext ("$i"." = "."$row"."\n"); :set Mtext ("$Mtext"."$Stext")}
;
# сформировать отдельный отчет-статус всех реле в переменной Reletext
;
:set Tsend  ($Lanswer->"rele"); :local rezult; local Saction; :local Reletext;
:for i from=1 to 4 do {:set rezult [:pick $Tsend ($i-1) $i];
:if (rezult="0") do={:set Saction "< ВЫКЛЮЧЕНО >"} else={:set Saction "< ВКЛЮЧЕНО >"}
:set Reletext ("$Reletext"."Реле №"."$i"." "."$Saction"."\n")}
;
# Выдать весь отчет в лог и отправить его по почте
;
:log info ("STATUS Laurent2 module IP "."$Sadr"."\n");
:log info $Mtext; :log info "";
:log info $Reletext;
:set Mtext ("Router "."$[/system identity get name]"." about STATUS Laurent2 module IP "."$Sadr"."\n"."\n"."$Mtext"."\n"."$Reletext");
[$FuncMail Email=$Smail Mailtext=$Mtext]


При исполнении кода скрипта вышеприведенного примера на почтовый сервер mail.ru приходит письмо следующего вида и содержания:

image

Вы можете улучшить и расширить приведенный пример кода скрипта по своему усмотрению.

Возможности реализации ингерации Микротик и Laurent не ограничены вышеописанными примерами. Вполне реально создание практически любых решений, в зависимости от конкретных задач пользователя.

Заключение


Возможно, в процессе эксплуатации первой версии библиотеки скриптов поддержки модулей Laurent2 и Laurent112 будут выявлены какие-либо ошибки, либо у пользователей возникнут замечания или предложения. Автор будет рад, если Вы сообщите ему об этом, для совершенствования скриптов библиотеки. Также принципиально возможно создание поддержки других модулей компании KernelChip, имеющих сетевой RJ45 интерфейс, например интернет-модуля JEROME.


01.02.2018 г. Серков Сергей Владимирович
serkov1375@mail.ru

© Habrahabr.ru