Показаны сообщения с ярлыком Готовые скрипты. Показать все сообщения
Показаны сообщения с ярлыком Готовые скрипты. Показать все сообщения

четверг, 22 декабря 2016 г.

Проверка статуса выгрузки на FTP в Mikrotik.

  Очень часто мы пользуемся выгрузкой на FTP-сервера через скрипты в Mikrotik. Удобно загружать бекапы или экспортные файлы на сервер, передавать файлы типа anything.auto.rsc на другие Микротики для автовыполнения. Иногда передача по фтп завешается неудачей, наша цель - отследить статус отправки. Типового механизма отслеживания корректно ли произошла отправка по фтп в RouterOS нет, но есть небольшая уловка, которой мы можем воспользоваться.
  С помощью оператора :execute мы сможем выполнить скрипт и результат обработки записать в файл, проанализировав который можно сказать удачно ли произошла отправка или нет.
  Сам скрипт:
:local logftp "ftp.log"
:local cmd "/tool fetch mode=ftp upload=yes user=\"admin\" password=\"admin\" src-path=\"11.txt\" address=\"192.168.88.254\" dst-path=\"99.txt\""
:execute file=$logftp script=$cmd
# ждем 30 секунд. Это время можно изменить проанализировав время выгрузки вашего файла
:delay 30s
:local logres [/file get [find name="$logftp.txt"] contents]
:if ($logres~"finished") do={
 :global ftpSTS "done"
/log warning "ftp upload success"
} else={:global ftpSTS "error"; /log error "ftp upload NOT success"}
  192.168.88.254 - IP нашего сервера FTP,
  admin, admin - логин и пароль.
  Проанализировав вывод оператора и найдя в нем строчку "finished" - мы считаем что файл успешно передался.

стандартный вывод успешного завершения передачи по ftp.
  Это мы и записываем в переменную ftpSTS (done) и пишем в лог. Дальше используем эту переменную по вашему усмотрению.


Используемый материал:

четверг, 8 декабря 2016 г.

Переносим динамический адрес-лист на другой Mikrotik.

  Обратился человек по имени Serg и попросил помочь с написанием скрипта. Суть скрипта такова, есть некий динамически список (dynamic address list) в Mikrotik - его нужно сохранить. А после перезагрузки маршрутизатора - восстановить с тем же таймаутом (address-list timeout). Проблема эта возникла из-за того, что после перезагрузки маршрутизатора динамические адрес-листы очищаются. Попутно было бы не плохо переносить эти адрес-листы на другие Микротики.
  Начнем с того, что командой экспорта динамические листы экспортировать не получиться, она сохраняет только статические листы:



  Поэтому для экспорта динамического листа можно использовать команду print. Для адрес-листа 3333 команда будет такая:

воскресенье, 9 октября 2016 г.

Добавляем IP в статический лист через правила в Firewall.

  Возьмем классическое правило добавления IP в address-list в Firewall Mikrotik:
/ip firewall filter
add action=add-dst-to-address-list address-list=1 address-list-timeout=0s chain=forward
  Обратимся к Wiki:
address-list-timeout (time; Default: 00:00:00) - указываем временной интервал, на который мы добавляем IP в адрес-лист. Значение 00:00:00 оставит адрес в списке навсегда.

   Но если взглянуть на скриншот, можно увидеть, несмотря на интервал 00:00:00, правила создаются динамические. А это значит, что после перезагрузки эти листы удалятся. Очень странное поведение RouterOS, но имеем то, что имеем!
  Иногда нам нужно правилом забанить вредоносные IP. Например те, которые подключаются с WAN-интерфейса, и мы определяем их подключения - как небезопасные. При-чем хочется забанить их навсегда - но получается только до перезагрузки. Для этого нам нужно преобразовать динамические записи -  в статические. В этом случае можно использовать скрипт. Скрипт, преобразовывающий динамические записи в адрес-листе в статические я описывал ранее, сейчас я приведу его другую вариацию:
:foreach i in=[/ip firewall address-list find list=1] do={
    :local ipaddress [/ip firewall address-list get $i address]
    :local dynamic [/ip firewall address-list get $i dynamic]
    if ($dynamic = true) do={
        /ip firewall address-list remove $i
        /ip firewall address-list add list=12 address=$ipaddress
    }
}
  Где "1" - имя динамического адрес-листа, а "12" - имя преобразованного статического. Скрипт можно кинуть в планировщик на выполнение раз в минуту. Таким образом ни один IP не пропадает после перезагрузки. Теперь можно создавать правило для дропа статического адрес-листа.


суббота, 24 сентября 2016 г.

Автоматическое ограничение скорости DHCP-клиентам.

  Есть сеть, в сети адреса раздаются по DHCP. Нужно, что-бы при подключении клиентов каждому автоматически ограничивалась скорость в 10 мегабит. Для этого мы будем использовать функционал в DHCP-сервер Mikrotik под название "lease-script". Для этого зайдем в IP > DHCP Server в свойства нашего сервера.

суббота, 10 сентября 2016 г.

Скрипт для обновления IP в Cloud Dynamic DNS за NAT.

  При использования сервиса динамического днс Cloud в устройствах Mikrotik, если устройство находится за NAT,  появляются проблемы при обновлении внешнего IP.


   Для того, что бы корректно происходило обновление можно использовать скрипт. Его можно поместить в шедулер на выполнение каждые 2 минуты.
#some Variables
:local hostname [/ip cloud get dns-name]
#resolve current dns-address
:local resolvedIP [:resolve "$hostname"]
#get current external IP
:local currentIP [:resolve myip.opendns.com server=208.67.222.222];
# Determine if DNS update is needed
:if ($currentIP != $resolvedIP) do={
   :log info ("Mynetname update needed: Current-IP: $currentIP Resolved-IP: $resolvedIP")
   /ip cloud force-update
} else={
   :log info ("Mynetname: No update needed ($currentIP=$resolvedIP)")
}
  При использовании  Cloud за NAT нужно помнить: для того, что-бы подключится к вашему маршрутизатору вам нужно пробросить порт, или порты, на ваше конечное устройство. Иначе подключится из-вне по DNS имени у вас не получится.

За основу взят материал

вторник, 6 сентября 2016 г.

Как оградить MikroTik от хакеров и спамеров.

  Думая о том, как защитить маршрутизатор от внешних вторжений пришла в голову мысль о том, что не только один я сталкиваюсь с этой проблемой. Поэтому я начал искать в интернете сервисы, которые помогают компаниям с выявлением угроз. В интернете есть ряд сайтов, которые отслеживают злоумышленников, спамеров, брутфорсеров и заносят их IP в некие "черные" списки. Происходит это автоматически, и частота обновления этих списков довольно частая (часы, сутки). Почему бы не воспользоваться этими списками для составления адрес-листов в RouterOS.
  Фактически реализовать это не сложно. Списки в основном представлены в виде txt файлов, автоматически загрузив которые, через "/tool fetch", можно с ними оперировать. Для начала извлечь IP в address-list немного поработав над обработкой структуры файла (а она для каждого сервиса разная). Этим я решил и заняться, вопрос решаем... Но, чисто случайно, наткнулся на сайт joshaven.com, где Joshaven Potter уже это все реализовал, и любезно поделился со всеми. Мало того, даже создал собственную платформу для преобразования IP-листов, и дал доступ к этим спискам. За что ему огромное человеческое спасибо!

  Итак, разберем что-же нам предлагают. Предлагается вариант с добавлением "черных IP" с сервисов:

  • OpenBL - сервис, ранее известен как SSH blacklist, выявляет различные виды угроз в Интернет. Сервис содержит ряд хостов, в которых мониторятся разные порты: 21 (FTP), 22 (SSH), 23 (TELNET), 25 (SMTP), 110 (POP3), 143 (IMAP), 587 (Submission), 993 (IMAPS) и 995 (POP3S) на наличие брутфорс атак, а также анализирует запросы на порты 80 (HTTP) и 443 (HTTPS) для "левых", явно представляющих угрозу, подключений (атака на PHPMyAdmin и другие веб-сервисы).
  • Spamhaus - сервис предоставляющий списки адресов, которые используются известными спамерами и хакер-группировками. Так же сюда попадают списки адресов и автономных систем которых "хакнули" и с помощью их распространяют вредоносное ПО или производят атаки.
  • dshield.org - сервис предоставляет топ 20 IP класса C (/24) подсетей, с которых были атаки, за последние 3-е суток.
  • malc0de.com - блэклист обновляется ежедневно. Туда заносятся опасные IP, с которых были документированные атаки (или распространение вредоносного ПО) за последние 30 дней.

Узнаем MAC по указанному IP в ARP.

  Скрипт, который анализирует записи ARP-таблицы в Mikrotik и выводит в переменную значение  MAC-адреса нужного нам IP.
## Script v2 for Dynamic/Static arp ##
## Testet with RouterOS v6.37rc27 ##
## from BrasDeutscher,Para,Brazil ##
{
## Установите в переменную state "yes" для поиска по динамическим записям ARP-таблицы или "no" для поиска по статическим. В переменную ip укажите IP, для которого требуется извлечь MAC-адрес ##
:global state yes
:global ip 10.0.0.2
## !!-- Do not change any below, this can breake the Script --!! ##
:global mac
:foreach a in=[/ip arp find where address=$ip dynamic=$state ] do={
:set mac [/ip arp get $a mac-address ];
:log warning ("IP - $ip to Mac - $mac");}}
   MAC-адрес будет извлечен в глобальную переменную mac.

вторник, 23 августа 2016 г.

Умный скриптовый аналог Netwatch Mikrotik.

  Есть небольшая "домашняя" сеть, в ней несколько клиентов подключено по WiFi методом точка-точка. Расстояния каждого линка небольшие (до 1 км.), эти линки нужно мониторить. Следить мы будет за ответными точками 4 клиентов, если точка отпала - оповещать в чат Telegram операторов. Родной Netwatch нам не подходит, так как не учитывает кратковременные пропадания, которые допустимы (например точку перегрузили). А значит будет куча ложных срабатываний. При написании скрипта нужно учитывать, что он выполняется по регламенту, а значит при пропадании одной из точек сообщения будут отправляться каждый раз при выполнении скрипта (через промежуток времени, который задан в шедуллере). Что-бы этого измежать нам нужно вводить глобальную переменную статуса точек. Однако, глобальные переменные при перезагрузке пропадают, но это тоже учтено в скрипте.

воскресенье, 14 августа 2016 г.

Скрипт меняющий регистр слов в RouterOS.

  Скрипт позволяющий заменить заглавные буквы в строчные и наоборот. Автор предлагает выполнять скрипт при загрузке роутера, и использовать переменные "$toupper" и "$tolower" для преобразования в верхний и нижный регистр соответственно.
  Скрипт для копирования в терминал (добавляется в автозагрузку роутера при старте):
{
/system scheduler add name=goonet.strcase on-event="{\r\
\n:global strcase do={\r\
\n\t:local toreplaceL {\"A\"=\"a\";\"B\"=\"b\";\"C\"=\"c\";\"D\"=\"d\";\"E\"=\"e\";\"F\"=\"f\";\"G\"=\"g\";\"H\"=\"h\";\"I\"=\"i\";\"J\"=\"j\";\"K\"=\"k\";\"L\"=\"l\";\
\"M\"=\"m\";\"N\"=\"n\";\"O\"=\"o\";\"P\"=\"p\";\"Q\"=\"q\";\"R\"=\"r\";\"S\"=\"s\";\"T\"=\"t\";\"U\"=\"u\";\"V\"=\"v\";\"X\"=\"x\";\"Z\"=\"z\";\"Y\"=\"y\";\"W\"=\"w\"\
};\r\
\n\t:local toreplaceU {\"a\"=\"A\";\"b\"=\"B\";\"c\"=\"C\";\"d\"=\"D\";\"e\"=\"E\";\"f\"=\"F\";\"g\"=\"G\";\"h\"=\"H\";\"i\"=\"I\";\"j\"=\"J\";\"k\"=\"K\";\"l\"=\"L\";\
\"m\"=\"M\";\"n\"=\"N\";\"o\"=\"O\";\"p\"=\"P\";\"q\"=\"Q\";\"r\"=\"R\";\"s\"=\"S\";\"t\"=\"T\";\"u\"=\"U\";\"v\"=\"V\";\"x\"=\"X\";\"z\"=\"Z\";\"y\"=\"Y\";\"w\"=\"W\"\
};\r\
\n\t:local toreplace \$toreplaceL;\r\
\n\t:local str \$1;\r\
\n\t:local newStr;\r\
\n\t:local newChar;\r\
\n\r\
\n\t:if (\$2 = \"-u\") do={\r\
\n\t\t:set toreplace \$toreplaceU;\r\
\n\t}\r\
\n\r\
\n\t:for i from=0 to=([:len \$str] - 1) do={\r\
\n\t :local char [:pick \$str \$i];\r\
\n\t :set newChar (\$toreplace->\$char);\r\
\n\t \r\
\n\t :if ([:typeof \$newChar] = \"str\") do={\r\
\n\t\t:set char \$newChar;\r\
\n\t }\r\
\n\t :set newStr (\$newStr . \$char);\r\
\n\t}\r\
\n\t:return \$newStr;\r\
\n}\r\
\n\r\
\n:global tolower do={ :global strcase; return [\$strcase \$1]};\r\
\n:global toupper do={ :global strcase; return [\$strcase \$1 -u]}\r\
\n}" policy=read,write,policy,test start-time=startup
}
 

среда, 10 августа 2016 г.

Скрипт преобразовывающий динамические записи в адрес-листе в статические.

  Введите название в переменную "dyn" динамической записи, которые нужно преобразовать в статические. Вместо NewList введите название нового статического адрес-листа.
:local dyn DynList;
:foreach i in=[/ip firewall address-list find (dynamic=yes)&&(list=$dyn)] do={
:local a [/ip firewall address-list get value-name=address $i]                  
/ip firewall address-list remove $i
/ip firewall address-list add address=$a list=NewList}

воскресенье, 7 августа 2016 г.

Пару полезностей: получаем публичный IP в переменную, подсказка диапазона подсети.

  Иногда требуется получить публичный IP в переменную Mikrotik. Если роутер за натом, то на его интерфейсе внутренний IP. Для получения внешнего можно воспользоваться методом, о котором я писал ранее. Сервис opendns позволяет запросом получить свой внешний IP. Если сделать запрос на сервер 208.67.222.222 домена myip.opendns.com, сервер возвратит ваш IP, с которого сделан запрос. Таким образом скрипт возвратит реальный публичный IP, даже если вы за NAT-ом.
:global currentIP [:resolve myip.opendns.com server=208.67.222.222];
  Так же, если в окне IP/Address List навести на адрес, то Микротик выдаст подсказку, с дапазоном IP, которые входят в текущую маску. Пока такая фича пока доступна только в этом окне.

воскресенье, 24 июля 2016 г.

Оповещение администратора о входе в Mikrotik.

  Скрипт, который создан для обеспечения безопасности вашего устройства. Он анализирует логи Mikrotik, при наличии НОВЫХ записей входа (удачного или неудачного) на устройство - отсылает e-mail администратору. Сам скрипт можно настроить таким образом, что-бы он исключал "легитимные" входы с наших IP, а отсылал сообщения только тогда, когда входы совершаются с чужих адресов. Скрипт проверят наличие всех записей с последнего старта, и потом все найденые совпадения шлет на е-мейл. Проверен на 6.37rc5.

понедельник, 13 июня 2016 г.

Перезагрузка роутера когда нет подключенных клиентов по WiFi.

  Есть роутер Mikrotik, к нему подключено несколько клиентских точек по Wi-Fi. Периодически, по непонятным причинам, клиенты отваливаются от роутера. Задача, когда это произошло, перезагрузить роутер:
:local clientes [/interface wireless registration-table print count-only];
:local WarnAt 0
#:log info ($clientes);
:if ($clientes <= $WarnAt) do={
#:log info ($clientes);
/system reboot
}
  Стоит учитывать, что интервал между выполнением скриптом должен быть достаточен для того, что-бы клиенты, после перезагрузки, смогли подключиться к роутеру. В противном случае будет цикличная перезагрузка. 

воскресенье, 12 июня 2016 г.

Автоматический бекап и экспорт настроек Микротик на FTP.

  Скрипт для выгрузки бекапа и экспорта Mikrotik на ФТП ресурс (проверен на 6.35.2):

# automated backup export ftp
# ftp configuration
:local ftphost "host"
:local ftpuser "user"
:local ftppassword "pass"
:local ftppath "folder_ftp"
# months array
:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
# get time
:local ts [/system clock get time]
:set ts ([:pick $ts 0 2].[:pick $ts 3 5].[:pick $ts 6 8])
# get Date
:local ds [/system clock get date]
# convert name of month to number
:local month [ :pick $ds 0 3 ];
:local mm ([ :find $months $month -1 ] + 1);
:if ($mm < 10) do={ :set mm ("0" . $mm); }
# set $ds to format YYYY-MM-DD
:set ds ([:pick $ds 7 11] . $mm . [:pick $ds 4 6])
# file name for system backup - file name will be Mikrotik-servername-date-time.backup
:local fname1 ("/Mikrotik-".[/system identity get name]."-".$ds."-".$ts.".backup")
# file name for config export - file name will be Mikrotik-servername-date-time.rsc
:local fname2 ("/Mikrotik-".[/system identity get name]."-".$ds."-".$ts.".rsc")
# backup the data
/system backup save name=$fname1
:log info message="System backup finished (1/2).";
/export compact file=$fname2
:log info message="Config export finished (2/2)."
# upload the user manager backup
:log info message="Uploading system backup (1/2)."
/tool fetch address="$ftphost" src-path=$fname1 user="$ftpuser" mode=ftp password="$ftppassword" dst-path="$ftppath/$fname1" upload=yes
# upload the config export
:log info message="Uploading config export (2/2)."
/tool fetch address="$ftphost" src-path=$fname2 user="$ftpuser" mode=ftp password="$ftppassword" dst-path="$ftppath/$fname2" upload=yes
# delay time to finish the upload - increase it if your backup file is big
:delay 30s;
# find file name start with Mikrotik- then remove
:foreach i in=[/file find] do={ :if ([:typeof [:find [/file get $i name] "Mikrotik-"]]!="nil") do={/file remove $i}; }
:log info message="Configuration backup finished.";

  Файлы имеют такой вид:

Мониторим питание 220В с оповещением по e-mail или SMS в Mikrotik без дорогостоящего APC SMART-UPS

  Согласно разделу WiKi Manual:System/UPS Mikrotik официально поддерживает UPS фирмы APC, и то только серии SmartUPS, хотя я лично подключал и Back-UPS. Роутер получает информацию с Back-UPS, но периодически отваливается подключение (подключение было по USB к роутеру RB951G ИБП Back-UPS 1100VA). SmartUPS такой проблемы не имеет, но и цена от 400$ не радует. Подключать можно как по USB так и через COM. В Mikrotik ИБП выдает довольно обширную информацию.

  Если в важных узлах покупка такого ИБП имеет смысл, то в удаленных офисах смысл покупки такого дорогого ИБП теряется, логичнее было использовать что-то попроще. Есть небольшое решение, которое не требует больших вложений, но позволяет следить за наличием напряжения сети 220 с устройства Mikrotik. 

четверг, 21 апреля 2016 г.

Мониторим сайт с помощью оборудования Mikrotik.

  Задача: есть сайт, который находится на собственном WEB-сервере за NAT. Работоспособность его нужно мониторить. Пинг для определения работоспособности "сайта" я не использовал. Сервер за NAT-ом, поэтому пинговать внешний интерфейс бессмысленно (он может быть рабочий, а сам WEB-сервер упал). Для проверки был выбран метод скачивания специально подготовленной страницы html с сайта на Микротик через функцию /tool fetch используя метод http. Если страница скачалась через http, мы считаем что сайт в рабочем режиме, если нет, отправляем человеку, который следит за сайтом смс (через сторонний сервис).

пятница, 29 января 2016 г.

Находим чужие DHCP-серверы в сети.

  Маршрутизаторы Mikrotik позволяют вычислить чужой, "левый", сторонний DHCP-сервер который находится в вашей сети и тем самым мешает вашим устройствам получать правильные IP-адреса. Такая ситуация может возникнуть, когда клиент, например, подсоединил свой домашний роутер не через WAN порт, а через LAN-порты, а ваша сеть не ориентированна на изоляцию клиента (VLANs, EoIP/VPLS Tunnels, Horizon Bridging/Private VLAN Edge(PVE)). Для этого в RouterOS существует настройка /ip dhcp-server alert:

воскресенье, 24 января 2016 г.

Удаление всех записей в Firewall-Connections.

  При переключении канала интернета с главного на резервный полезно сбрасывать сессии, что-бы не было зависших соединений. Можно это сделать простым выключением и включением Firewall-Connections:
/ip firewall connection tracking set enabled=no
:delay 5s
/ip firewall connection tracking set enabled=auto

вторник, 19 января 2016 г.

Следим за начальством: оповещение при регистрации в сети.

  Обычный офис, есть штат сисадминов, есть начальство, которое ходит на работу, как мы все знаем, не по графику. Было бы довольно неплохо сисадмину знать, когда начальство в офисе, а когда нет. 
  Задача стояла следующая: когда начальник приходит в офис - оповещать сисадмина об этом знаменательном событии =). Так как сейчас все повсеместно пользуются смарфонами, то при появлении на работе начальника - его смартфон автоматически регистрируется в Wi-Fi сети предприятия (конечно, если у него он всегда включен). Это был как раз наш случай. Значит по этому событию мы можем сделать оповещение!
  Для этого создаем скрипт:
# вводим локальную переменную с MAC-адресом смартфона начальника
:local MAC CC:CC:CC:CC:CC:CC;
# вычисляем время, и отбираем значение "час"
:local time [/system clock get time];
:local hour [: pick [/system clock get time] 0 2];
# если время с 9 до 18 (время работы админов), ищем в регистрационном листе Wi-Fi наш MAC.
:if ($hour >= 9 and $hour <= 18)  do={:local MACdetect [interface wireless registration-table find mac-address=$MAC];

вторник, 5 января 2016 г.

Failover маркированных клиентов.

  Имеем роутер Mikrotik, к нему приходят два ISP и две группы пользователей - "важные" и "не очень важные" клиенты. Они разделены в разные подсети.

  • wan2 - основный канал интернета, он же является каналом по дефолту для нашего роутера. через него ходит в интернет группа пользователей "важные".
  • wan1 - резервный канал интернета, он является резервным для микротика, через него ходит в интернет группа пользователей "не очень важные".

  Задача.

  • организовать доступ к микротику одновременно и с wan2 и с wan1 из-вне;
  • организовать переключение при падении основного канала на резервный и переключение назад при восстановлении;
  • организовать переключение маркированных клиентов при падении их интернета с wan1 на wan2, при возобновлении - переключение назад.