Полезные скрипты для MikroTik RouterOS
Перезагрузка роутера, при зигрузке CPU
Копирование и применение последней актуальной понфигурации
То есть забираем по FTP lastconfig.backup и восстанавливаемся с него. FTP пользователь должен быть настроен, желательно с ограничением доступа по IP. Обратите внимание, что к FTP подключаемся по IP-адресу локального физического интерфейса, который доступен только между роутерами.
Этот скрипт ставим в планировщик на несколько минут позже выполнения скрипта резервного копирования.
И последний скрипт — применение настроек на резервном сервере. В нем также используется МАС для идентификации роутера.
Здесь меняем имя роутера, ip-адрес LAN-интерфейса и приоритет VRRP на меньший, чтобы роутер сделать слейвом. Запуск этого скрипта нужно поставить в автозагрузку. Изменения будут происходить на резервном сервере после копирования и применения последней актуальной конфигурации.
Резервное копирование
Проверка статуса роутера и выключение интерфейса
Подключение к динамическим серверам или сервисам, на примере pptp-соединения
Проверка синтаксиса скрипта
Настройка на 2 провайдера:
Блокировка трафика по времени:
Если нужно запретить трафик по времени ночью, скажем с 22:00 до 10:00 утра:
0) Стандартный способ – использовать два правила с временными промежутками 22:00:00-23:59:59 и 00:00:00-10:00:00
1) Использовать через запрет – Где-то в конце есть правило, которое запрещает, а конкретным правилом разрешать.
2) Использовать шедулер –
также создаём правило в файрволе, но не указываем конкретное время –
Пишем скрипт для MikroTik об успешном входе на устройстводля.
Статья будет больше интересна специалистам использующим небольшой парк устройств (не использующим отдельный сервер, для системы мониторинга или логирования), домашним пользователям, тем кто в первый раз подступается к написанию скриптов устройства и тем у кого нет времени/желания разбираться.

Написать свой скрипт меня сподвигло желание упростить монструозные скрипты, которые можно найти по этому запросу в интернете, выполняющие это несложное действие (пример скрипта с Wiki MikroTik), а так же показать почему инженеры MikroTik сделали невозможным простой способ парсинга, если вы не житель Лондона.
Статья разбирает пример уведомления о входе и выходе пользователя с устройства MikroTik, но так же покажет примеры:
Предыстория. Почему скрипты парсинга логов MikroTik «монструозны»?
Под монструозностью будем понимать большой объем логики скрипта и конструкции вида:
Они показывают умение администратора «оптимизировать» код, но здорово усложняют возможности понимания скриптов другими пользователями.
Но самую огромную роль в усложнение логики этого скрипта внесла сама компания MIkroTik, с интересной логикой журнала на устройстве. 🙂
Что может быть проще конструкции: «найди все события по времени старше последнего запуска с темой «account», запущенной простым казахстанцем (UTC+06)?
Это даже будет работать, ровно до 23:59:59 текущего дня. А после 12 ночи, скрипт превратится в тыкву А вот после 00:00:00 система начнет вываливать все события предыдущего дня. Почему?
Инженеры MikroTik большие оригиналы решившие сделать хранение записей журнала следующим образом: система хранит в журнале события сегодняшнего дня только с параметром времени, а чтобы не путаться, когда сменяется день, перезаписывает время событий добавляя дату, во все события «вчерашнего» дня. Для пользователя, в журнале событий все события отображаются дата/время, но сама система, событиям текущего дня присваивает только время.
Ну и где здесь оригинальность? А оригинальность в том, что MikroTik считает началом нового дня время 00:00:00 по UTC±0:00. Игнорируя часовой пояс самого устройства, т.е. у меня (UTC+06), до 6 утра, выдавались все уведомления за предыдущий день. В 06:00:00 Микротик перезаписывал всем событиям дату и скрипт снова начинал корректно работать.
Так что если вы не житель Лондона (UTC±0:00), для парсинга журнала устройства по времени вам приходилось использовать костыли, решая логикой скрипта проблему организации времени на устройстве.
Костыли делать мне не хотелось (в частности однажды это могут исправить), поэтому подумалось над вариантом который был бы проще в работе и проще в понимании другими пользователями.
Логика скрипта
Помимо параметров время события, текст события, MikroTik использует уникальный параметр id события, который мы будем использовать (.id уникален до перезапуска устройства, потом отчет начинается заново, с 0).
Создать скрипт
Для запуска скрипта необходимы разрешения: read, write, test, policy.
Код скрипта
Добавление скрипта в Планировщик
Для запуска скрипта необходимы разрешения: read, write, test, policy.
Или выполните в терминале:
Заключение
Надеюсь пишем скрипт для MikroTik будет вам полезен, вы поймете как легко и просто парсить журнал устройства MikroTik выставляя триггеры по теме сообщения, или тексту сообщения.
Возможные темы сообщений в журнале устройства, можно увидеть попытавшись создать правило Logging:
Для парсинга текста сообщений используйте регулярные выражения и команду вида:
[/log find where message
Установив более частое время проверки скрипта, вы можете выполнить дополнительные действия при входе/выходе пользователя, например автоматическое создание резервной копии (для тех кто любит править Firewall в пятницу вечером, забывая устанавливать MikroTik Safe Mode) или что еще подскажет воображение.
Мой скрипт выглядит проще, чем что я находил в интернете и доступен к оптимизации, если вы любите оптимизировать код в минимальное количество строк.
Работа скрипта проверена на: hAP ac lite, RouterOS 6.47.8 (stable).
iОнлайн
Как запустить скрипт на Microtik (Router OS)
Недавно я написал статью “Правила брэндмауэра для обеспечения внешней безопасности сети с помощью маршрутизатора Mikrotik (Router OS)“, но совсем забыл о том, что далеко не все начинающие администраторы знают как можно запустить на микротике готовый скрипт и что для этого нужно. В итоге написанная статья может пойти прахом, т.к. из-за недостатка информации о запуске скрипта, администратор не сможет им воспользоваться. Таким образом, чтобы не рассусоливать, я быстренько расскажу как можно запускать скрипты. Тут есть несколько вариантов. Так что кому интересно, добро пожаловать под кат.
И так. все варианты я буду рассматривать в двух типах. Как известно, маршрутизатор Mikrotik под управлением RouterOS можно администрировать тремя инструментами:
В данной статье я не буду останавливаться на том, как подключиться к маршрутизатору ибо, если вы ее начали читать, то ответ на этот вопрос вы знаете. На варианте настройки с помощью SSH и Telnet я тоже останавливаться не буду. будем рассматривать только простые пользовательские варианты. И так, приступим.
Вариант 1.1 Для самых терпеливых (WinBox)
Запускаем WinBox и подключаемся к маршрутизатору
Нажимаем кнопку NEW TERMINAL. В результате у нас открывается окно терминала для ввода команд:
Теперь открываем файл со скриптом и построчно вводим все команды которые там написаны. Да это долго, да это неэффективно, но имеет право на жизнь.
Вариант 1.2 Для самых терпеливых (Веб-Интерфейс)
Заходим на веб интерфейс вашего маршрутизатора
Введите логин и пароль для входа на маршрутизатор. В итоге мы попадаем на стартовую страницу WebFig маршрутизатора:
Теперь сверху выбираем пункт TERMINAL
В результате у нас открывается окно терминала для ввода команд:
К сожалению, данный вариант точно так же неэффективен. Но имеет место быть.
Правда он отвечает на вопрос “Как открыть терминал в веб-интерфейсе Mikrotik”. Так что работа была проделана не зря.
Поэтому переходим ко второму варианту и правильному запуску готовых скриптов на Mikrotik.
Вариант 2. Запуск скриптов через редактор скриптов (WinBox).
Запускаем WinBox и подключаемся к маршрутизатору
В меню с левой стороны выбираем пункт SYSTEM и в выпавшем меню выбираем пункт SCRIPT
В итоге у нас открывается окно редактора скриптов.
Ну а теперь дело техники. Нажимаем на знак ” + ” и открывается окно добавления нового скрипта:
Теперь в поле NAME пишем имя вашего скрипта. Пишите какое нравится.
В поле POLICY можно выставить область действия скрипта. Если не знаете что это такое, то проверьте чтобы стояли все галки и не заморачивайтесь.
В поле SOURCE нужно вставить текст Вашего скрипта. Все просто копируем текст скрипта из источника, вставляем в это поле.
После того как назвали скрипт, выставили политики и вставили текст скрипта, жмем кнопку APPLY. Теперь у вас появляется выбор. Вы можете нажать кнопку RUN SCRIPT и ваш скрипт выполнится. Либо OK и окно со скриптом закроется и скрипт сохранится в памяти маршрутизатора. Либо нажать кнопку REMOVE и все ваши старания удалятся.
Лично я применяю следующий сценарий:
Заполняю указанные поля, потом жму APPLY, потом запускаю скрипт, а потом все удаляю. Удобно.
Если вам скрипт нужно запускать регулярно, то его можно сохранить, а потом запускать прямо из списка. Выглядит это так:
Теперь рассмотрим, как то же самое можно сделать через WEB-Интерфейс.
Вариант 3. Запуск через редактор скриптов в WEB-интерфейсе
Заходим на веб интерфейс вашего маршрутизатора
Введите логин и пароль для входа на маршрутизатор.
В меню с левой стороны выбираем пункт SYSTEM и в выпавшем меню выбираем пункт SCRIPT
Ну а теперь дело техники. Нажимаем на кнопку ADD NEW и открывается окно добавления нового скрипта:
Далее можно действовать точно так же, как было описано в варианте 2.
Вот как-то так. Надеюсь, что информация оказалась для Вас полезной. Спасибо что посетили мой сайт.
Писать скрипты для Mikrotik RouterOS — это просто
блокировать все TCP соединения на порт 80 по адресу example.com
блокировать все TCP соединения на порт 80 по любому адресу из списка с именем DenyThis
Текст скрипта нужно добавить в репозиторий скриптов, находящийся в разделе /system scripts.
Скрипт выполняется построчно. Каждая строка имеет следующий синтаксис:
[prefix] — «:» — для глобальных комманд, с символа «/» начинается командная строка, которая будет выполняться относительно корня конфигурации, префикс может отсутствовать, тогда командная строка выполняется относительно текущего раздела конфигурации;
[path] — путь до требуемого раздела конфигурации, по которому происходит переход перед выполнением команды;
command — непосредственно действие, выполняемое командной строкой;
[uparam] — безымянный параметр команды;
[param=[value]] — именованные параметры и их значения.
Итак, первым делом, определим параметры работы скрипта в виде переменных. Переменная объявляется командами :local и :global, соответственно получаем локальную переменную, доступную только внутри своей зоны видимости, или глобальную, которая добавляется в список переменных окружения ОС и будет доступна откуда угодно. Локальные переменные живут, пока выполняется их зона видимости, глобальные — пока мы не удалим их.
Переменная DNSList содержит массив доменов, с которым мы хотим работать. Переменная ListName содержит строку, которой будет называться полученный address-list. Переменная DNSServers — содержит массив адресов DNS-серверов, прописанных на роутере или полученных от провайдера при подключении, плюс «восьмёрки» на случай, если на роутере не используется служба DNS, который будет использоваться для получения информации о записях доменов.
В цикле «для каждого» обойдём массив доменов и отрезолвим их IP-адреса на каждом DNS-сервере на случай, если разные DNS отдают разные IP. Конструкцияслужит для отлова runtime-ошибок. Если не использовать её, то скрипт может прервётся при ошибке резолва несуществующего или ошибочного адреса.
перейдём в раздел конфигурации /ip dns cahe all. Там содержатся DNS-кэш роутера в виде таблицы Name — Type — Data — TTL. Выполним отбор по типу — нам требуются только A-записи. И результат отбора обойдём в цикле «для каждого». Это и будет главным циклом нашего скрипта.
Создадим переменные, обновляемые в каждом цикле: два флага — bNew, исключающий дублирования, match, показывающий, входит ли текущая запись кэша в наш список доменов; переменная cacheName содержит поле Name текущей записи кэша, то есть домен.
Обойдём список доменов и для каждого проверим, содержится ли в строке cacheName подстрока в виде домена из этого списка.
Если содержится, установим значение флага match в true.
В заключающем этапе если текущий адрес требует добавления (match установлен в true), то мы его добавляем в список адресов. Коментарий к добавляемой записи будет содержать домен, к которому она относится. При этом выполняем несколько проверок. Если address-list пустой, то добавляем сразу, если что-то там есть, проверяем, нет ли там уже записи с таким IP-адресом и если нет — добавляем.
Список адресов нужно периодически обновлять. Для этого в RouterOS есть диспетчер заданий. Задание можно добавить из консоли или из графического интерфейса winbox
Сценарии работы со списком адресов не ограничиваются созданием правил в фаерволе. Поэтому приведу несколько примеров. Можно выполнять в консоли, можно добавлять мышкой в winbox’е.
Чёрный список:
Статический маршрут до данных узлов
Сбор информации о клиентах
UPD: специально по просьбе turone внёс изменения в скрипт, чтобы адреса DNS-серверов брались из системы.
UPD 24.08.2016: заметил, что в новых версиях RouterOS (начиная с 6.36) появилась возможность указывать в адрес-листах DNS-имена. Так что теперь ценность данного скрипта лишь образовательная.
Удалённое включение скриптов Mikrotik из Telegram
И комментарий в одной из групп ВК Кирилла Казакова:
Да уж, совсем не секьюрно. Я бы лучше написал телеграм бота, который принимает только с моего аккаунта команды на включение.
Я решил написать такого бота.
Итак, первое, что нужно сделать – это создать бота в telegram.
Use this token to access the HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Затем, нужно найти нашего бота в поиске по имени @MikrotikROuter_bot и нажать на кнопку Start.
После этого нужно открыть браузер и ввести следующую строку:
Где XXXXXXXXXXXXXXXXXX – токен вашего бота.
Откроется страница примерно следующего вида:
Находим на ней следующий текст:
Итак, у нас есть вся необходимая информация для написания скриптов для Mikrotik’а, а именно:
Токен бота: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
ID чата, куда он должен писать: 631290
Для проверки можем зайти через браузер:
Должны получить результат:
Для нашего удобства, сразу добавим команды для бота:
Находим аккаунт с именем @botfather
После чего пишем ему команду /setcommands
Сейчас немного поясню что они делаю:
Создаем задание:
непонятно почему но из рабочего скрипта не оглашает глобальные данные, добавил скрипт при загрузке системы.
Telegram-startup
Как это работает
Все проверено на Mikrotik rb915 RouterOS 6.37.1
Если отправить сразу много команд, они все по очереди будут выполняться с интервалом 30 сек.
P.S. Огромное спасибо Кириллу Казакову за идею и моему другу Александру за помощь со скриптами.
Ссылки
Добавил проверку на chat_id
Проверка на дурака, если кто то напишет нашему боту, он ответит ему: » I can’t talk with you. «, аналогично ответит нам, если не распознает команду.
По выполнению команды, бот отписывается в чат (см. Скрипт wolmypc)
Нашли с 7Stuntman7 что файл с выше
14 сообщений, перестает обрабатываться командой find (ограничения Mikrotik). По этому в будущем скрипт переделаю на lua cпасибо 7Stuntman7 за это, про lua не знал.
в Telegram видимо немного изменили «выхлоп» getUpdate. теперь в основном скрипте нужно поправить смещение сообщения с 2 на 1













