четверг, 31 декабря 2015 г.

It's Christmas Time Mikrotik.

Друзья, поздравляю Вас с наступающим Новым Годом!




Новогодняя песенка для моделей у которых есть beeper:

среда, 30 декабря 2015 г.

RouterBOOT - загрузчик RouterOS.

  RouterBOOT отвечает за запуск RouterOS в устройствах RouterBOARD. В RouterBOARD кроме основного загрузчика есть резервный, он используется в тех случаях, когда основной загрузчик не работает. Включить резервный загрузчик можно в меню:
system routerboard settings set force-backup-booter=yes
  С обновлением RouterOS периодически прилетают обновления загрузчика на разные модели маршрутизаторов. При чем по-умолчанию они не устанавливаются, обновлять нужно вручную через меню, нажав "Upgrade".



  После обновления, что бы использовать уже новый загрузчик, нужно перезагрузить устройство.

понедельник, 28 декабря 2015 г.

Serial-порт Mikrotik (Console, Special Login).

  В некоторых роутерах Mikrotik встроен консоль-порт для управления устройством. В этот порт устройства отдают информацию при загрузке, так же через него можно войти в RouterBOOT-меню для устранения неполадок загрузки и тонкой настройки загрузчика. Порт может иметь вид COM-COM или RJ45-COM в зависимости от устройства. Распиновку можно посмотреть в WIKI.

COM-порт CCR1009-8G-1S-1S+PC.

RJ45 type serial port RB2011UAS-2HnD
  Подключатся мы будем через кабель RJ45-COM к устройству RB2011UAS-2HnD.

воскресенье, 27 декабря 2015 г.

Остановить выполнение скрипта.

  Прервать скрипт:
/system script job remove [find script=script25]
  Более правильный вариант, с обработчиком ошибок:

:do {/system script job remove [find script=script25]} on-error={}
log info 33
   Хотя первый скрипт срабатываем отлично, и не валится в ошибку если в "system script job" script25 нет,  я бы рекомендовал использовать второй вариант, особенно, если данная часть кода входит в длинный скрипт. В этом случае, работает или нет в данный момент скрипт с именем "script25", выполнения кода продолжится, и в лог напишет "33".

понедельник, 21 декабря 2015 г.

Подсветка синтаксиса скриптов RouterOS в сторонних редакторах.

  Когда приходится писать объемные скрипты в стандартном редакторе MikroTik встроенном в RouterOS это делать очень неудобно. Уследить за синтаксисом без "подсветки" нереально. Для примера приведу два скрина одного и того же скрипта в стандартном редакторе и в стороннем редакторе с подсветкой синтаксиса RouterOS:


Стандартный редактор скриптов RouterOS.
Редактор Sublime Text + Package Mikrotik​Script.

четверг, 17 декабря 2015 г.

Tik App - android клиент RouterOS. Alpha-версия.

  Наконец-то MikroTik созрел до официального клиента для смартфонов. Официальный клиент пока разрабатывается только для  Android, так как по мнению компании MikroTik это самая распространенная ОС для смартфонов. Хотя, в будущем, они не исключают появления версии для iOS. Для остальных операционных систем очень маловероятно. Даже в офф. теме приводили статистику:
Android 76.60%
iOS 19.70%
Windows phone 2.80%
Blackberry 0.40%
Symbian 0.00%
Ubuntu 0.00%
Others 0.50%
global market share in percent, IDC, 2014 Q4
  Итак, для того, что-бы скачать и установить Tik App нужно подать заявку на тестирование.  Это можно сделать по ссылке:

вторник, 15 декабря 2015 г.

Коммутация портов в RouterOS: отличие Bridge от Switch (Master Port).

  В RouterOS есть два способа коммутации портов. Первый - коммутация через Switch (Master Port):
Коммутация через Master Port.
  В этом случае коммутация производится через чип свитча, в обход центрального процессора маршрутизатора. Обычно в SOHO маршрутизаторах Mikrotik используется одна свитч-группа на 5 портов, если портов больше - две свитч-группы. В устройствах Cloud Router Switch чипы коммутации на больше портов и имеют больше возможностей, подробней на них мы останавливаться в этой статье не будем.

пятница, 11 декабря 2015 г.

Packet Flow Diagram RouterOS v6.

  Добавляю, как шпаргалку, диаграммы движения пакетов в RouterOS v6, очень помогает при настройке правил и маршрутизации. Мне лично они очень помогли разобраться с функцией
FastPath и отследить прохождения пакета по короткому пути.
Общая диаграмма

четверг, 10 декабря 2015 г.

Mikrotik: Флаги интерфейсов и маршрутов.

  Речь пойдет об обозначениях в окне Interface List и Route List которые отображаются в самой первой колонке.
  Итак, в Interface List статусы выглядят так:

воскресенье, 6 декабря 2015 г.

Способы сброса Mikrotik к настройкам по-умолчанию.


Cтандартное имя пользователя admin, без пароля.
Стандартный IP: 192.168.88.1/24.
Роутер всегда можно найти через Neighbors.
Стандартный пин-код на сенсорном экране: 1234.

Сброс можно осуществить несколькими способами:

1) Через кнопку RESET.
  1. Отключите питание роутера;
  2. Нажмите и держите кнопку Reset;
  3. Включите питание роутера;
  4. Дождитесь, пока замигает индикатор ACT, и отпустите кнопку Reset.
Примечание: Если вы не отпустите кнопку Reset и дождетесь, когда индикатор ACT перестанет мигать, то устройство перейдет в режим Netinstall для переустановки операционной системы RouterOS.

Шпаргалка по консоли RouterOS.


                                                                                                                                                                       vk.com/mikrotik_ru

Реализация стандарта WPS (Wi-Fi Protected Setup) в MikroTik.

  Wi-Fi Protected Setup (WPS) — стандарт (и одноимённый протокол) полуавтоматического создания беспроводной сети Wi-Fi. Целью протокола WPS является упрощение процесса настройки беспроводной сети, поэтому изначально он назывался Wi-Fi Simple Config. Протокол призван оказать помощь пользователям, которые не обладают широкими знаниями о безопасности в беспроводных сетях, и как следствие, имеют сложности при осуществлении настроек. WPS автоматически обозначает имя сети и задает шифрование для защиты беспроводной Wi-Fi сети от несанкционированного доступа в сеть, при этом нет необходимости вручную задавать все параметры.

пятница, 20 ноября 2015 г.

Mikrotik: RoMON.

  RoMON (Router Management Overlay Network) - сеть для управления маршрутизаторами Mikrotik, собственный протокол Mikrotik. Работает по принципу пересылки MAC и обнаружения соседних устройств. Каждому маршрутизатору должен быть присвоен RoMON ID, по которому устройство можно найти. RoMON-протокол не шифрованный. Говоря простыми словами RoMON берет на себя функцию туннелирования для управления сетью RouterOS, тем самым, все устройства в сети связываются в виртуальную сеть Layer2, и войдя на одно устройство из-вне, вы можете получить доступ ко всем другим RoMON-маршрутизаторам.
  Для того, что бы роутер отображался в сети RoMON, эту функцию нужно включить. Когда  RoMON включен ID назначается автоматически (по умолчанию MAC-адрес этого маршрутизатора), но его возможно изменить.

/tool romon

вторник, 17 ноября 2015 г.

Резервное питание Mikrotik.

  В News November 2015 (Issue #68) был анонсирован новый роутер CCR1072-1G-8S+. Среди всего прочего, у него встроенные 2 модульные блоки питания с возможность резервирования и горячей замены.
  Однако, большинство новых моделей RouterBOARD

понедельник, 16 ноября 2015 г.

Bypass Port Mikrotik.

 Bypass-ethernet предназначен для соединения двух портов (1 уровень OSI), если питание маршрутизатора пропадет, линк между этими портами останется. Это реализовывается аппаратно - релюшками, которые видны возле соответствующих портов ether11 и ether12.

воскресенье, 15 ноября 2015 г.

Один внешний IP и несколько WEB-серверов внутри сети.

                     Это работает только для HTTP-соединений но не работает для HTTPS соединений, так как web-proxy такие соединения не поддерживает

  У нас есть один внешний IP, за которым мы хотим поместить несколько WEB-серверов(в данном случае 3, с 3 разными доменами на них):
123.com@192.168.0.2
 abc.com@192.168.0.3
 456.com@192.168.0.4
   Настраиваем наш прокси-сервер:
/ip web-proxy
set enabled=yes src-address=0.0.0.0 port=8080 hostname="your.proxy" \
transparent-proxy=yes parent-proxy=0.0.0.0:0 \
cache-administrator="webmaster" max-object-size=4096KiB cache-drive=system \
max-cache-size=unlimited max-ram-cache-size=unlimited
/ip web-proxy access
add dst-port=23-25 action=deny comment="block telnet & spam e-mail relaying" \
disabled=no
add dst-port=80 action=allow comment="Enable Http Connection" disabled=no

суббота, 14 ноября 2015 г.

Default Forward: Пример уязвимости авторизации HOTSPOT.

  Для начала можно посмотреть видео, как легко обходится авторизация по HOTSPOT в Mikrotik (Networks - How to bypass Mikrotik Hotspot Login Page).

пятница, 13 ноября 2015 г.

Определяем роутеры в сети.

  Зная, что каждый маршрутизатор, при маршрутизации должен уменьшать значение TTL на единицу, и значение TTL которое отдает ОС можно выследить наличие роутеров в сети.  

  Вот распространенные значения:
TTL Операционная система
54 FreeBSD / BSD
64 Linux
128 Windows
255 Cisco / Solaris

Маскируем наш роутер в сети провайдера от TTL-фильтра.

   Теория:
  В IPv4 TTL представляет собой восьмиразрядное поле IP-заголовка.
 Определяет максимальное количество хопов (hop, то есть прыжок, участок между маршрутизаторами), которые пакет может пройти. Наличие этого параметра не позволяет пакету бесконечно ходить по сети. Каждый маршрутизатор, при маршрутизации должен уменьшать значение TTL на единицу, но некоторые шлюзы можно настроить, чтобы игнорировать это. Пакеты, не достигшие адресата, но время жизни которых стало равно нулю, уничтожаются, а отправителю посылается сообщение ICMP Time Exceeded. Если требуется, чтобы пакет не был маршрутизирован (то есть принят только в своём сегменте), то выставляется TTL=1. На отправке пакетов с разным временем жизни основана трассировка их пути прохождения (traceroute). Максимальное значение TTL=255. Обычное начальное значение TTL=64 (зависит от ОС).

   Добавим правило в Mikrotik,  что бы с имитировать конечное устройство:
/ip firewall mangle add action=change-ttl chain=prerouting new-ttl=increment:1 passthrough=yes

Настройка WEP-шифрования.

  Оборудование Mikrotik поддерживает пару видов WEP-шифрования: 40bit-wep и 104bit-wep. Ключ нужно вводить в шестнадцатеричном формате, в первом случае длина 10 символов, во втором - 26.
  Для начала в Security Profile на вкладке General выбираем static-keys-required - использовать WEP, не принимать и не отправлять незашифрованные данные.

воскресенье, 8 ноября 2015 г.

Загрузчик WinBox v3.0.

  С выходом новой версии RouterOS v6.33 наконец-то выпустили обновленный WinBox и встроили ее в систему вместо v2 9.27.
  Долго шли к этому и наконец пришли. Итак, рассмотрим новый функционал загрузчика:

Загрузчик WinBox.
  В главном меню два пункта: File и Tools.

суббота, 7 ноября 2015 г.

Дополнительная идентификация с помощью ClientID (DHCP option 61).

  Опция ClientID для протокола  DHCP служит для идентификации компьютера-клиента. По умолчанию в DHCP это реализуется  через MAC-адреса клиента, но протокол DHCP позволяет другие варианты. В некоторых устройствах и ОС можно задать эту опцию идентификатора клиента произвольно. По-умолчанию такая строка имеет вид 1:a4:db:30:1c:97:b6, где a4:db:30:1c:97:b6 - MAC-адрес клиента. В устройствах Mikrotik реализованная идентификация по этой опции.
  В любом случае, для того, чтобы DHCP-авторизация по 61 опции работала, вы должны быть уверены, что ни один другой клиент не использует ваш уникальный идентификатор клиента, и DHCP-сервер будет его принимать.
  Реализовать идентификацию DHCP в RouterOS можно:
   1) только по MAC-адресу;
   2) только по ClientID;
   3) и по MAC-адресу и по ClientID.
  Последний вариант с большей степенью вероятности гарантирует что ваш ip не получит другое устройство при подделке MAC.
  В UBUNTU идентификатор задается в файле конфигурации dhcpd.conf:
option dhcp-client-identifier 43:4c:49:45:54:2d:46:4f:4f;
  Параметр является строкой NVT ASCII, заключенной в двойные кавычки(option dhcp-client-identifier "CLIET-FOO"), или последовательность октетов в шестнадцатеричном формате, разделенных двоеточиями. Нам подходит второй вариант. В любом HEX-переводчике переводим нужный нам идентификатор, например CLIET-FOO - 43 4c 49 45 54 2d 46 4f 4f, и записывает значение через двоеточие.
  В Микротике это будет выглядеть так:


  При переводе назад получаем наш идентификатор в понятном виде: CLIET-FOO. Таким образом даже если MAC-адрес скопируют, этот IP устройство не получит, так как не пройдет идентификацию по ClientID.

суббота, 31 октября 2015 г.

Горячие клавиши WinBox.

  В линейке WinBox v.2.x горячие клавиши состояли из одной буквы. Например, при нажатии на  клавишу R происходило удаление записи,  при нажатии на клавишу C - открывалось окно для внесения комментарий в правило, включить правило - E, выключить - D. Это было не безопасно, так как случайно нажав клавишу можно удалить нужны данные. С выпуском  WinBox v.3.x(пока еще релиз кандидат) эту оплошность пофиксили.
  По состоянию на WinBox v.3.0rc17 работают такие горячие клавиши:
Ctrl+Tab - переключение между вкладками в окне, между окнами которые не имеют вкладок;
Ctrl+F6 - переключение между вкладками вперед;
Ctrl+Shift+F6 переключение между вкладками назад;
SHIFT+INSERTCtrl+V - вставить (в полях ввода текста);
CTRL+INSERTCtrl+C - копировать (в полях ввода текста);
SHIFT+DELETECtrl + X - вырезать (в полях ввода текста);
Ctrl+M - добавить комментарий;
Ins - создать;
Del - удалить;
Ctrl+F - поиск(сочетание работает с любого места экрана, ставит курсор в поле поиска активной вкладки);
Ctrl+G - поиск далее;
Tab, стрелка вверх, стрелка вправо, стрелка влево, стрелка вниз - перемещение между элементами в окне;
Ctrl+A - выбрать все;
Ctrl+E - включить;
Ctrl+D - выключить.


  Горячие клавиши всегда можно посмотреть в контекстном меню:

Контекстное меню WinBox
  Знаете еще горячие клавиши, которые работают в WinBox, добавляйте в комментариях.

пятница, 30 октября 2015 г.

Пускаем компьютер из LAN-сети в Интернет через другого провайдера без прероутинга.

  У нас есть роутер к которому подключено два провайдера, нужно один компьютер из нашей внутренней сети пустить через другого провайдера в Интернет, обычно это делается прероутингом в Mangle:
add action=mark-routing chain=prerouting comment="9 na wan2" disabled=yes \
    new-routing-mark=markName src-address=192.168.0.12
  С перенаправлением в указанный маршрут
/ip route
add comment=wan2_mark distance=1 gateway=1.1.1.1 routing-mark=markName

  Но можно поступить проще, имеем маршрут:

/ip route add gateway=1.1.1.1 routing-mark=markName 
воспользуемся route rule:
/ip route rule add src-address=192.168.0.12 action=lookup-only-in-table table=markNmae

Доступ в Mikrotik по двум и более WAN одновременно.

На нашем устройстве два или более провайдера интернет(WAN). Нам нужно что-бы наше устройство было доступно и с одного и с другого внешнего IP провайдеров одновременно.
[admin@mikrotik] /ip firewall mangle> print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=input action=mark-connection new-connection-mark=ISP 1 -> Input passthrough=no dst-address=172.25.25.247 in-interface=ether1
1 chain=output action=mark-routing new-routing-mark=ISP 1 passthrough=no connection-mark=ISP 1 -> Input
2 chain=input action=mark-connection new-connection-mark=ISP 2 -> Input passthrough=no dst-address=192.168.99.2 in-interface=ether2
3 chain=output action=mark-routing new-routing-mark=ISP 2 passthrough=no connection-mark=ISP 2 -> Input
4 chain=input action=mark-connection new-connection-mark=ISP 3 -> Input passthrough=no dst-address=192.168.100.2 in-interface=ether3
5 chain=output action=mark-routing new-routing-mark=ISP 3 passthrough=no connection-mark=ISP 3 -> Input
  Правило 0
  Если в пакете пришедшем на первый интерфейс (ISP 1) в адресе назначения указан IP адрес 172.25.25.247(ISP 1, ip от провайдера), то маркируем соединение именем (ISP 1 -> Input)
  Правило 1
  Если исходящий пакет принадлежит соединению с маркировкой (ISP 1 -> Input), то для него используем маршрут ISP 1
  Тем самым маршрутизатор знает, что если его (пингуют или любой входящий трафик) с провайдера ISP 1, то ответ вернёт он через провайдера ISP 1

  Соответственно нужно создать нужные нам маршруты:
add comment=ISP1_mark distance=1 gateway=192.168.111.1 routing-mark=ISP 1
add comment=ISP2_mark distance=1 gateway=82.117.240.1 routing-mark=ISP 2
где  gateway - шлюз по-умолчанию вашего провайдера.

Доступ из одной подсети в другую есть, наоборот нет.

  Вот такая задача:
Есть микротик, в нем 2 бриджа и один ван:
1 бридж: 2 и 3 порт (192.168.25.0/24)
2 бридж: 4 и 5 порт (192.168.36.0/24)
ван 1 порт.
У одной сети и у второй есть инет через ван. Нужно сделать что б доступ с 192.168.25.0/24 на 192.168.36.0/24 был, а наоборот не был. Типа так, как будто к микротику во второй бридж подключил роутер и на нем за натом спрятал подсеть.
  Это нужно для того, что бы разделить общественную(192.168.36.0/24) и домашнюю сеть(192.168.25.0/24) в небольшой локальной домовой сети.  Но так как администратор сети сидит в 192.168.25.0/24 он должен иметь возможность подключатся к общественной сети, в то же время люди с общественной сети не должны получать доступ к домашним устройствам администратора.

  Для начала нужно занатить две подсети:
/ip firewall nat
add action=masquerade chain=srcnat out-interface=ether1 src-address=192.168.36.0/24
add action=masquerade chain=srcnat src-address=192.168.25.0/24
  Для общественной сети натятся пакеты только на ван интерфейс. Для локальной - на все интерфейсы.
  Есть два варианта решения проблемы:
/ip firewall mangle
chain=prerouting action=mark-connection new-connection-mark=36
      passthrough=yes dst-address=192.168.25.0/24 in-interface=bridge2 log=no
      log-prefix=""
помечаем пакеты с общественной подсети

/ip firewall filter
chain=forward action=drop connection-mark=36 log=no log-prefix=""
и баним их. И второй вариант проще:
/ip firewall filter
add action=drop chain=forward connection-state=new dst-address=192.168.25.0/24 src-address=192.168.36.0/24 
  Просто баним все новые пакеты, которые идут с общественной подсети, пакеты установившиеся пропускаем, а все пакеты с домашней подсети считаются установившимися так как прошли через правило ната.
  Подробнее:
  Каждое из сетевых соединений Mikrotik относит к одному из 4 состояний:
New – Новое соединение. Пакет, открывающий новое соединение, никак не связанное с уже имеющимися сетевыми соединениями, обрабатываемыми в данный момент маршрутизатором.
Established – Существующее соединение. Пакет относится у уже установленному соединению, обрабатываемому в данный момент маршрутизатором.
Related – Связанное соединение. Пакет, который связан с существующим соединением, но не является его частью. Например, пакет, который начинает соединение передачи данных в FTP-сессии (он будет связан с управляющим соединением FTP), или пакет ICMP, содержащий ошибку, отправляемый в ответ на другое соединение.
Invalid – Маршрутизатор не может соотнести пакет ни с одним из вышеперечисленных состояний соединения.
спасибо форуму

суббота, 10 октября 2015 г.

Поиск нужного address-list.

Скрипт найдет нужный адрес-лист и выведет его название:
:put [/ip firewall address-list get value-name=list [find address=192.168.x.x]] 

пятница, 9 октября 2015 г.

Таймер в скрипте.

   Таймера  в Микротике пока не придумали, можно воспользоваться шедуллером, и запускать скрипт с интервалом, но иногда нужно что-бы таймер обрабатывался в скрипте. Например, мне нужно было, что бы в скрипте на определенном моменте засекалось 60 минут, и в течении этого времени происходила пинг-проверка работоспособности сети wifi, когда это время истекало, скрипт должен был принудительно подключать роутер к другой wifi сети.
В итоге вышло такое:
:global nameADR23;
:global perviy23;
:do {:global nameADR23 [/ip firewall address-list get value-name=list [find address=12.12.12.12]]} on-error={:if ($perviy23=true) do={set $perviy23 ""; set $nameADR23 ""; log info 146} else={:set nameADR23 ""; /ip firewall address-list add dynamic=yes address=12.12.12.12 list=timer23 timeout=0:01:00; set $perviy23 true}};
Создаются две глобальные переменные. Потом проверяется наличие некого списка адресов в  address-list, если его нет, он создается с нужным вам таймаутом(в примере 1 минута). При следующем запуске скрипта, он проверит наличие этого адрес-листа, если он еще есть(время не прошло), просто запишет в переменную nameADR23 имя адрес-листа(timer23), но если время истечет, адрес-лист удалится, извлечь имя его мы не сможем, и если это будет не первый запуск(который непосредственно создает адрес лист) то мы считаем что 1 минута прошла, и выполняем действие log info 146, и очищаем наши переменные(set $perviy23 ""; set $nameADR23 ""). Вот такой работоспособный скрипт (версия 6.18).

Отладка скриптов.

  Как таковой отладки в RouterOS нет. Но можно воспользоваться командой
/system script> print from=<your script name>
которая подсветит ваши ошибки скрипта в терминале.
  Так-же вы можете поместить скрипт в { } и скопировать его в терминал. Если этого не сделать, то на локлаьные переменные будет ругаться. Ну и это можно обойти, сделал все локальные переменные - глобальными.

вторник, 29 сентября 2015 г.

DNS-имя в mail-сервере (v6.33rc16).

v6.33rc16


*) winbox - allow to specify dns name in all the tunnels;
*) winbox - allow to enter dns name in email server;
*) email - allow server to be specified as fqdn which is resolved on each send;
*) ppp - added on-up & on-down scripts to ppp profile
Можно указывать днс-имя mail-сервера. Долой резольв в скриптах!


суббота, 19 сентября 2015 г.

Глобальные переменные и перезагрузка.

В связи с введение нового функционала - "функций" стоит сказать, что глобальные переменные очищаются при перезагрузке роутера. Это нужно учитывать при написании скриптов!

Безопасная удаленная работа на устройстве Mikrotik.

Что надо сделать при удалённой работе с Mikrotik. Аналог Reload.

Баловаться с FireWall на удаленном компе или роутере - к дальней дороге

Вводная: При удалённом программировании вполне можно ошибиться и вбить что-нибудь, что ограничит собственный доступ. В cisco есть хорошая команда reload in, но к сожалению в mikrotik её нет. Но её заменяет целых две возможности

Установка своего скрипта по-умолчанию в устройства Mikrotik.

Бывает передаешь на офисы несколько однотипных устройств Mikrotik. Если в процессе настройки возникли ошибки, или устройство перестало отвечать, можно попросить персонал сбросить роутер по умолчанию. После сброса можно что б применял ваш скрипт с базовыми настройками. Этот скрипт можно поставить в программе Netinstall.
Дополнительно можно почитать тут:
http://forum.mikrotik.com/viewtopic.php?f=9&t=28169

Скрипт делающий функцию(в виде глобальной переменной) из скрипта.

В версии 6.2 ввели использование функций. Для того, что-бы  из скрипта сделать функцию используем код:
:local fnArray;
:foreach f in=[/system script find where name~"^Function.*"] do={:set fnArray ($fnArray.",".[/system script get $f name])};
:set fnArray [:toarray $fnArray];
:foreach f in=$fnArray do={:exec script=":global \"$f\" [:parse [/system script get $f source]]"; /log info ("Defined function ".$f);};
Все скрипты которые у вас есть и начинаются с "Function." появятся в виде глобальный переменных с тем же названием. Дальше их можно использовать как функции.
  Например, есть скрипт Function.1 с телом log info 1. После использования вышеуказанного кода:
:put $Function.1
Output:
log info 1

Спасибо dissident76 с офф. форума.

пятница, 18 сентября 2015 г.

Arxont: Вывод только нужного значения в консоли Mikrotik (...

Arxont: Вывод только нужного значения в консоли Mikrotik Вводная: Необходимо вывести только одно единственное значение в консоль.

Arxont: Кастомизация стартового приглашения консоли Mikrot...

Arxont: Кастомизация стартового приглашения консоли Mikrot...: Вводная: Необходимо при логине к роутеру Mikrotik вывести в консоль некоторую информацию. 

Функции.

Если в скрипте нужно использовать повторяющийся кусок кода можно использовать функцию:
#define function and run it
:global myFunc do={:put "hello from function"}
$myFunc
output:
hello from function
Таким образом можно сократить количество строк в коде. Например функцию можно использовать в таком куске кода:
:if ($lenPass = 8) do={:log warning "WiFi password s random.org: $newPassword"; $myFunc} 
Он выполнит запись в лог, а потом все команды которые записаны в функции $myFunc.

Еще пример с вики:
:global myFunc do={ :return ($a + $b)}
:put [$myFunc a=6 b=2]
output:
8
Так же можно передать существующий скрипт в функцию:

#add script
 /system script add name=myScript source=":put \"Hello $myVar !\"" 

:global myFunc [:parse [/system script get myScript source]]
$myFunc myVar=world
output:
Hello world !

Обработчик ошибок.

Есть такой скрипт:
/tool fetch url="https://www.random.org/passwords/\?num=1&len=8&format=plain&rnd=new" keep-result=yes dst-path="pass.txt";
log info 1;
Если по какой-то причине  www.random.org будет недоступен, то скрипт не продолжит работу, а завершится с ошибкой. Что-бы он продолжил работу нужно добавить обработчик:
:do {/tool fetch url="https://www.random.org/passwords/\?num=1&len=8&format=plain&rnd=new" keep-result=yes dst-path="pass.txt"} on-error={:log warning "random.org not generator"};
log info 1;
В таком случае скрипт продолжит работу.
Еще пример с вики:
:do {
      :put [:resolve www.example.com];
} on-error={ :put "resolver failed"};
:put "lala"
output:
resolver failed
lala 
http://wiki.mikrotik.com/wiki/Manual:Scripting 

вторник, 15 сентября 2015 г.

Удаляем с DHCP-сервера клиентов у которых поле host-name пустое.

foreach i in=[/ip dhcp-server lease find] do={
   :if ([:len [/ip dhcp-server lease get $i host-name]] = 0) do={
      /ip dhcp-server lease remove $i;
   }
}

Генерируем пароли через сервис random.org.

Предыдущий генератор не совершенен. А генерации случайных чисел в Mikrotik пока нет, но можно использовать сторонний сервис: random.org.
:global RandomOrg "";
/tool fetch url="https://www.random.org/passwords/\?num=1&len=8&format=plain&rnd=new" keep-result=yes dst-path="pass.txt";
delay 3;
:global RandomOrg [/file get pass.txt contents];
/file remove pass.txt;
Данный скрипт записывает сгенерированный пароль и 8 символов в переменную, если сервис не доступен - переменная будет пустая. 

воскресенье, 13 сентября 2015 г.

Отправка сведений об устройстве на почту.

  Скрипт отправляет информацию об устройстве на почту:
:local firmware [ /system routerboard get current-firmware ];
:local routeros [ /system resource get version ];
:local routername [ /system identity get name ];
:local licenselevel [ /system license get nlevel ];
:local architecture [ /system resource get architecture-name ];
:local boardname [ /system resource get board-name ];
/tool e-mail send to=email@here subject="Current RouterOs" body=("Router name: $routername\nFirmware: $firmware\nRouterOS: $routeros\nLicence level: $licenselevel\nBoard name: $boardname\nArchitecture: $architecture\n\n " );

Передаем динамический IP резервного интернета с одного Mikrotik на другой.

   Есть два офиса. На втором офисе 2 интернета, основной и резервный. Основной с реальным IP, резервный с динамическим (usb-модем). При переключении на резервный канал на втором офисе, на главном офисе должны знать какой IP сейчас на втором офисе. Для этого на второстепенном офисе каждые 10 минут отрабатывает скрипт, который извлекает внешний IP с PPP-интерфейса и передает на основной офис, в глобальную переменную Mikrotik.
:global inter;
/interface ppp-client monitor ppp-intertelekom once do={:set inter $"local-address"};
/file remove [find name=inter.txt];
delay 2;
/file print file=inter.txt;
delay 2;
/file set inter.txt contents=":global interNaVYB $inter";
delay 1;
/tool fetch mode=ftp upload=yes address=1.1.1.1 port=30 user=admin password=admin ascii=no src-path=inter.txt dst-path=inter.auto.rsc

Создание папки.

Напрямую папку создать нельзя. Делаем небольшую уловку:
/tool fetch address=127.0.0.1 src-path=someDummyFile user=admin password=admin mode=ftp dst-path=newDir/newFileName;
Для того что-бы это работало нужно что б сервис ftp работал, если в скрипте не указывать порт, то он должен быть стандартным. Пользователь должен иметь доступ к ftp. newDir - название новой пустой диретории.

Отрезать маску IP-адреса.

:local $ip "1.1.1.1/32"
 :for i from=([:len $ip] - 1) to=0 do={
     :if ([:pick $ip $i] = "/" ) do={
         :set ip [:pick $ip 0 $i]
         }
     }
и покороче
:local s "1.1.1.1/24";
:put [:pick $s 0 [:find $s "/"]] 

вторник, 8 сентября 2015 г.

Проверить выполняется ли скрипт в данный момент или нет.

:if ([:len [system script job find script ="script23"]] > 1) do={} else={log info svoboden}
Этот скрипт называется  "script23". При запуске он проверяет выполняется ли он в данный момент(проверяет по своему имени). Если выполняется-то он ничего не делает и завершается, если не выполняется, то выполняет действие "log info svoboden". Этот оборот используется например в данном скрипте.  Для чего это нужно. Например скрипт может входить в бесконечный цикл(например пока не подключится к нужной сети wifi), но запускается он по шедуллеру, что б не было дубликатов нужна такая проверка. В таком случае ставим время повторения в шедуллере 1 минута, и пока не завершится скрипт, он заново не стартанет.

Автоматическое подключение одной из двух доступных WIFI-сетей.

Есть две wifi сети. Одна открытая ssid 52, другая запаролена ssid 3G. Изначально наш роутер подключен к открытой сети. Эта сеть всегда онлайн, но бывают перебои - или ее нет, или на ней нет интернета. Есть вторая сеть - 3G, она включается с мобильного телефона. Задача, при пропадании первой сети, и появлении второй(включили на телефоне функцию "точка доступа") подключатся к сети 3G. После этого раз в час пробовать подключатся к сети 52, если она активна переходить на нее. В случае если нет ни одной сети периодически пытаться подключится в любой из этих двух бесконечно долго. Скрипт адаптирован к двум зашифрованным сетям. Скрипт выполняется только тогда, когда он закончил свою работу. Скрипт предусматривает что вы получаете адрес по dhcp и в одной и во второй сети. При проверке главного интерфейса роутер отключается от рабочего резервного, т.к. в микротике один радиомодуль. Ну и непонятно по какой причине микротик до сих пор не умеет выводит значения поиска беспроводных сетей в переменные.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#   23q RouterOS v.6.18-6.28
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 0) kidaem v sheduller na 1 minutu
# 1) proverit' nazvanie scripta "wifi_connect"
# 2) proverit' vremja dozvona na glavnuy tochku "TimeProverkaGlav" 3600
# 3) proverit' nazvanie wlan interfeisa - "wlan1"
# 4) proverit' nastroiki wlan i schifrovaniya
# 5) proverit' nastroiki dhcp-client na wlan
:if ([:len [system script job find script ="wifi_connect"]] > 1) do={} else={
# SSID glavnogo ineta
:local SSIDglav 52;
# Pass glavnogo ineta
#:local SSIDglavpass 2323wifi;
# SSID rezervnogo ineta
:local SSIDrezerv 3G;
# Pass rezervnogo ineta
:local SSIDrezervpass 12345678;
# Zaderchka mechdu popitkami pereklucheniya na glavniy inet
:local TimeProverkaGlav 3600;
:local SSID [/interface wireless get value-name=ssid number=0];
:local PingCount 3;
# YandexDNS
:local PingTarget1 77.88.8.8;
# OpenDNS
:local PingTarget2 208.67.222.222;
# GoogleDNS
:local PingTarget3 8.8.8.8;
:if ($SSID=$SSIDglav) do={
:local PingResult1 [/ping $PingTarget1 count=$PingCount];
:local PingResult2 [/ping $PingTarget2 count=$PingCount];
:local PingResult3 [/ping $PingTarget3 count=$PingCount];
:if (($PingResult1 + $PingResult2 + $PingResult3) >= (2 * $PingCount)) do={} else={
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors l2mtu=2290 ssid=$SSIDrezerv wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] authentication-types=wpa2-psk eap-methods="" mode=dynamic-keys supplicant-identity=MikroTik wpa-pre-shared-key=$SSIDrezervpass wpa2-pre-shared-key=$SSIDrezervpass; :delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1];
:delay 10;
:local PingResult11 [/ping $PingTarget1 count=$PingCount];
:local PingResult21 [/ping $PingTarget2 count=$PingCount];
:local PingResult31 [/ping $PingTarget3 count=$PingCount];
:if (($PingResult11 + $PingResult21 + $PingResult31) >= (2 * $PingCount)) do={:log info "WiFi $SSIDrezerv active"} else={
:local GLAVworking false;
:local REZERVworking false;
:while ($GLAVworking!=true and $REZERVworking!=true) do={
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors frequency=2462 l2mtu=2290 ssid=$SSIDglav wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] mode=none;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1];
:delay 10;
:local PingResultzikl1 [/ping $PingTarget1 count=$PingCount];
:local PingResultzikl2 [/ping $PingTarget2 count=$PingCount];
:local PingResultzikl3 [/ping $PingTarget3 count=$PingCount];
:if (($PingResultzikl1 + $PingResultzikl2 + $PingResultzikl3) >= 6) do={:set GLAVworking true};
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors l2mtu=2290 ssid=$SSIDrezerv wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] authentication-types=wpa2-psk eap-methods="" mode=dynamic-keys supplicant-identity=MikroTik wpa-pre-shared-key=$SSIDrezervpass wpa2-pre-shared-key=$SSIDrezervpass;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1];
:delay 10;
:local PingResultzikl11 [/ping $PingTarget1 count=$PingCount];
:local PingResultzikl22 [/ping $PingTarget2 count=$PingCount];
:local PingResultzikl33 [/ping $PingTarget3 count=$PingCount];
:if (($PingResultzikl11 + $PingResultzikl22 + $PingResultzikl33) >= 6) do={:set REZERVworking true}};
if ($GLAVworking=true) do={
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors frequency=2462 l2mtu=2290 ssid=$SSIDglav wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] mode=none;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1]} else={:log info "WiFi $SSIDrezerv active"}}}} else={:delay $TimeProverkaGlav;
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors frequency=2462 l2mtu=2290 ssid=$SSIDglav wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] mode=none;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1];
:delay 10;
:local PingResultzikl21 [/ping $PingTarget1 count=$PingCount];
:local PingResultzikl22 [/ping $PingTarget2 count=$PingCount];
:local PingResultzikl23 [/ping $PingTarget3 count=$PingCount];
:if (($PingResultzikl21 + $PingResultzikl22 + $PingResultzikl23) >= 6) do={:log info "WiFi $SSIDglav active"} else={ /interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors l2mtu=2290 ssid=$SSIDrezerv wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] authentication-types=wpa2-psk eap-methods="" mode=dynamic-keys supplicant-identity=MikroTik wpa-pre-shared-key=$SSIDrezervpass wpa2-pre-shared-key=$SSIDrezervpass;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1]}}}

Определяем последний день текущего месяца.

  Иногда, например для отчетов с Mikrotik, нужно знать последний день текущего месяца -30, 31 или 28, 29( в феврале). Для этого нам поможет скрипт:
:global date
:global day
:global month
:global year
:global yeardiv
:global yearmult
:global leapyear
:global lastday
:global found
 
 :set date [system clock get date]
 :set month [:pick $date 0 3]
 :set day [:pick $date 4 6]
 :set year [:pick $date 7 11]

 :set yeardiv ($year / 4)
 :set yearmult ($yeardiv * 4)

 :if ([$yearmult] = $year) do={ :set leapyear true } else={ :set leapyear false }
 :if ([$month] = "jan") do={ :set lastday 31 }
 :if ([$month] = "feb") do={
        :if ($leapyear = true) do={ :set lastday 29 }
        :if ($leapyear = false) do={ :set lastday 28 } }
 :if ([$month] = "mar") do={ :set lastday 31 }
 :if ([$month] = "apr") do={ :set lastday 30 }
 :if ([$month] = "may") do={ :set lastday 31 }
 :if ([$month] = "jun") do={ :set lastday 30 }
 :if ([$month] = "jul") do={ :set lastday 31 }
 :if ([$month] = "aug") do={ :set lastday 31 }
 :if ([$month] = "sep") do={ :set lastday 30 }
 :if ([$month] = "oct") do={ :set lastday 31 }
 :if ([$month] = "nov") do={ :set lastday 30 }
 :if ([$month] = "dec") do={ :set lastday 31 }
 :if ([$lastday] = $day) do={log info 1} else={log info 2}
Скрипт выполняется каждый день. Если сегодня последний день месяца пишем в лог "1", если нет - пишем в лог "2". Естественно тут можно выполнять нужные именно вам команды. Так же глобальные переменные в начале можно заменить на локальные.

пятница, 14 августа 2015 г.

По-поводу import в Mikrotik.

Команда импорта:
import file=[filename]
import [filename]

Можно импортировать настройки автоматически, если файл импорта представить в таком виде:
anything.auto.rsc
и передать по фтп (такой метод работает только при передаче по фтп). После импорта будет создан файл anything.auto.log. Значит импорт произошел успешно.

  Полный импорт нужно делать только тогда, когда маршрутизатор полностью сброшен по дефолту, а начальная конфигурация не применена! 
When you first time run import it applied part of the config and then failed. Next time when you are trying to run it starts from the beginning, trying to add what already was added.
To make it work you have to reset configuration to defaults, do not apply default config and then import.
  Так же при импорте через Winbox вы должны использовать MAC-Winbox соединение. Так как при полном импорте подменяются настройки интерфейсов. Ошибки при полном импорте могут быть из-за конфликтов MAC-адресов разных устройств(при импорте с другого устройства). Ошибки могут быть из за пункта в импорт файле /user group. Из-за того, что эти настройки при импорте подменяются, рвется Winbox-соединение и импорт не успевает загрузится полностью. Эту проблему решает файл типа anything.auto.rsc, в таком случае импорт запускается от "суперпользователя". Вообще импорт файл лучше открыть и частями кидать прямо в терминал, тогда видны ошибки. Ну или править(менять маки, удалять импорт настроек пользователей).

  При загрузке файла сделанного методом export file=address нужно удалять все строки с настройкой роутера по умолчанию, а при загрузке файла созданного методом export compact эти линии не создаются, что упрощает импорт.
  Так же стоит сказать что импортировать настройки из одного роутера в другой нужно на одинаковой версии RouterOS, иначе при импорте можем получить ошибку кода (из-за различий в синтаксисе в разных версиях).
  При импортировании настроек через терминал нужно помнить, что скрипт импорта прервется в момент назначения MAC-адреса интерфейсу с которого вы сидите. Для продолжения выполнения скрипт нужно начать его выполнять уже после этого момента.

  Не забывайте: пользователи и пароли не импортируются стандартным импортом. После того как залили настройки не поленитесь проверить именно меню пользователи и их пароли!!!

Понижаем версию прошивки MikroTik.

  Сначала скачиваем пакет обновления. Находим ссылку под свое устройство на официальном сайте:
http://download2.mikrotik.com/routeros/6.30.2/routeros-mipsbe-6.30.2.npk

  Заменяем на нужную версию, например:
http://download2.mikrotik.com/routeros/6.19/routeros-mipsbe-6.19.npk

  Вкидываем на роутер, выполняем команду:
system package downgrade

Arxont: Полная очистка логов Mikrotik RouterOS

Arxont: Полная очистка логов Mikrotik RouterOS

Вводная: Нужно было почистить следы выполнения некоторых команд на роутерах Mikrotik, так чтобы не было видно, что кто-то что-то делал.

Решение: Решение описано много где в интернетах и сводится к двум вещам - очистке логов и очистке истории введённых команд консоли (к примеруhttps://aacable.wordpress.com/2013/12/19/howto-clear-mikrotik-loghistory/).
Однако есть команда /system history print которая выводит список изменений конфигурации и который стандартными средствами не удаляется!

Для полного удаления следов пребывания можно использовать метод создания и последующего восстановления резервной копии, который выполняется за 2 команды
system backup save name=test 
system backup load name=test

Плюсы данного решения в том, что чистится всё - и логи, и история консоли, и system history.

Минус на мой взгляд один - будет выполнена перезагрузка устройства, что иногда нежелательно.

Примечание - Также будет оставлен файл бэкапа (для маскировки можно назвать файл auto-before-reset.backup и поставить ему время Jan/01/1970 00:05:51 - параметры автоматически создаваемого файла при сбросе конфигурации system reset-configuration)

среда, 29 июля 2015 г.

Настройка SNMP в Mikrotik.

Настройка Mikrotik
Через Winbox переходим "IP"-"SNMP"
Здесь устанавливаем флаг "Enabled", тем самым включая SNMP на маршрутизаторе. Далее нажимаем кнопку "Сommunities" и выбираем уже созданный по умолчанию community "public", и исправляем его на свой. Так же для безопасности можно указать IP адреса с которых можно подключаться по SNMP.

Нажимаем "ОК" на всех вкладках. На этом настройка маршрутизатора закончена. 
 ВАЖНО:
Отключить или удалить профиль "public" нельзя. Даже если в SNMP в поле "Сommunities" вы поставить свой профиль с ограничения по IP, профиль "public" все-равно будет действовать и отдавать данные на все интерфейсы и адреса(0.0.0.0/0). Обязательно правьте этот профиль и ставьте свои подсети и адреса в целях безопасности!

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

The DUDE и нестандартный порт WinBox.

   В чудесном продукте от Mikrotik есть один небольшой и непофиксиный баг, а именно, при добавления на карту устройства на ОС RouterOS с нестандартным портом WinBox (не 8291) программа не может подключиться и в разделе функций мониторинга по протоколу  RouterOS пусто. В  Mikrotik  знают об этой проблеме, но почему-то ее не фиксят. Для того, что б не менять порт на стандартный используем проброс:

перенаправляем на основном шлюзе на другое устройство:
add action=dst-nat chain=dstnat comment="dude port 8291 switch" \
    dst-address=10.2.0.6 dst-port=8291 protocol=tcp src-address=10.2.10.5 \
    to-ports=2453
перенаправляем на основном шлюзе на сам основной шлюз:
add action=dst-nat chain=dstnat comment="dude port 8291" dst-address=\
    10.2.10.1 dst-port=8291 protocol=tcp src-address=10.2.10.5 to-ports=2323

схема такая:
chain=dst-nat, src-address=<dude-server>, dst-address=<ip-configured-in-the-dude>, Proto=tcp, dst-port=8291 -> action=dst-nat, to-ports=<your-webmin-port>

Избыточная доступность хоста для подключении VPN.

Есть главный узел, к нему подключаются клиенты VPN. У главного узла есть два WAN с реальными IP. Когда один  WAN работает и является основным шлюзом все коннекты к нему, когда падает к резервному. Проверка осуществляется по пингу. В данном скрипте важно что бы резервный  WAN не был доступен для VPN соединения, когда рабочий основной WAN. Данный скрипт выполняется на офисе-клиенте каждые 1,5 минуты.
:local status [interface l2tp-client get l2tp-office2 running]
:local PingCount 3
:local PingTarget 8.8.8.8
:local PingResult1 [/ping $PingTarget count=$PingCount]
:delay 30;
:local PingResult2 [/ping $PingTarget count=$PingCount]
:if (($PingResult1 + $PingResult2) >=3) do={ if ($status=true) do={} else={/interface l2tp-client set [find name=l2tp-office2] connect-to=8.8.8.8}}  else={ if ($status=true) do={} else={/interface l2tp-client set [find name=l2tp-office2] connect-to=4.4.4.4}}
Где  8.8.8.8 - основной, 4.4.4.4 - резервный.

Данный скрипт потерял актуальность когда Mikrotik ввел подключение по VPN по доменному имени, раньше было только по IP. Также после введения сервиса от Mikrotik для динамического ДНС в свои роутеры все еще больше упростилось. 

вторник, 28 июля 2015 г.

Архив версий RouterOS

Сайт предоставляет ссылки на разные версии ОС, так же на дополнительные пакеты.

http://mirror.mikrotik-bg.net/?dir=/

понедельник, 27 июля 2015 г.

Выгрузка export и backup на e-mail каждые 14 дней.

Иногда выгрузки только backup не хватает, если заливать его на другое устройство, то некоторые настройки могут не восстановится: настройки беспроводной сети, некоторых интерфейсов из-за несоответствия MAC-адресов.  Да и для анализа настроек нужно использовать export. Так как Mikrotik в версии 6.30 еще не научился отправлять в одном письме несколько вложений (хотя я на офф. форуме оставлял просьбу) будем отправлять два письма. Обязательно добавим задержку между оправками, так как почтовые сервера могут обозлиться.  Письмо отправляем на 2 адресата, скрипт добавляем в шедуллер на 14 дней:

:local backupfile ("nazvanie_backup-" . [:pick [/system clock get date] 7 11] ."-" . [:pick [/system clock get date] 0 3] ."-" . [:pick [/system clock get date] 4 6] . ".backup");
:local exportfile ("nazvanie_export-" . [:pick [/system clock get date] 7 11] ."-" . [:pick [/system clock get date] 0 3] ."-" . [:pick [/system clock get date] 4 6]);
/system backup save dont-encrypt=yes name=$backupfile;
:delay 5;
/export file=$exportfile;
:delay 3;
:local date [/system clock get date];
:local body1 "$date Mikrotik backup";
:local body2 "$date Mikrotik export";
:local smtpserv [:resolve "smtp.yandex.ru"];
:local email "test@yandex.ru";
:local pass test;
/tool e-mail send server=$smtpserv port=587 user=$email password=$pass start-tls=yes to="admin@ya.ru" cc="admin@gmail.com"  from=$email subject="$body1" body="$body1" file=$backupfile;
:delay 120;
/tool e-mail send server=$smtpserv port=587 user=$email password=$pass start-tls=yes to="admin@ya.ru" cc="admin@gmail.com"  from=$email subject="$body2" body="$body2" file=$exportfile;
:delay 5;
/file remove $backupfile;
/file remove $exportfile;
:log warning "backup, export e-mail finished";

Установка TFTP и PoniX на маршрутизатор MikroTik.

воскресенье, 26 июля 2015 г.

Очистить журнал консольных команд.

Начиная с версии RouterOS 6.x , вы можете очистить журнал консольных команд с помощью команды:
console clear-history

пятница, 24 июля 2015 г.

Блокировка тех, кто ввёл IP вручную...

http://forummikrotik.ru/viewtopic.php?f=13&t=5180&p=32599#p32599

Главные тезы:
Давным давно была тема, как можно заблокировать тех, кто ввёл IP вручную, а не получил его по DHCP, были примеры со громоздкими скриптами, но я для себя нашёл более рациональное решение.
Данное решение помимо того что блокирует всех кто ввёл IP руками, так ещё и даёт контроль доступа в интернет.

Итак, создаёт 2 правила в фаерволе:

/ip firewall filter
add action=drop chain=forward comment="Drop !DHCP-Lease" in-interface=LAN-BRIDGE src-address-list=!DHCP-Lease
add action=drop chain=forward comment="Drop !DHCP-Lease" dst-address-list=!DHCP-Lease in-interface=WAN-PPPoE
Думаю комментировать смысла нету, но если вдруг.... Эти правила дропают все пакеты, если адрес отправителя\получателя не находиться в адрес-листе DHCP-Lease.
Дальше достаточно зайди в DHCP-Server, сделать запись статичной (статичный IP) и дописать Address List: DHCP-Lease.
После этого данное устройство будет свободно ходить в интернет.

Реализация не идеальная, но в 95% случаев со своей задачей справляется. 


и

Так ведь для этого существует режим ARP Reply-Only с добавлением DHCP-лизов в ARP-таблицу. По-моему, так проще и логичнее.



четверг, 23 июля 2015 г.

Настройка фильтрации трафика на Mikrotik.

Подменяем реальный ай-пи в тесте speedtest.net.

Иногда нужно так, что бы клиенту вашей сети в тесте speedtest.net показался другой внешний ай-пи, а сам тест показал реальную скорость подключения. Это нужно для того, например, что бы замаскировать реального поставщика услугу интернет клиенту.
Используем протокол прикладного уровня что б пометить нужные нам пакеты.
/ip firewall layer7-protocol
add comment="" name=speedtest-url regexp=\
"^.*(get|GET).+/(speed|bandwidth).*test.*\$"
Все айпи с помеченными пакетами складываем в адрес-лист speedtest-al.
/ip firewall mangle add action=add-dst-to-address-list address-list=speedtest-al chain=prerouting
comment="speedtest mark connection" dst-port=80 layer7-protocol=\
speedtest-url protocol=tcp
Адрес-лист направляем по нужному маршруту для айпи 10.2.10.23 .
/ip firewall mangle
add action=mark-routing chain=prerouting comment=speedtest_test \
dst-address-list=speedtest-al new-routing-mark=velton src-address=\
10.2.10.23
Собственно сам маршрут.
/ip route
add distance=1 gateway=pppoe-velton routing-mark=velton
 Теперь клиенты буду видеть один айпи, а тест будет идти через другого провайдера.

Так же для тема сокрытия вашей реальной сети подробно рассказана в этом видео:

Ссылка на TikTube

среда, 22 июля 2015 г.

Записки сисадмина: mikrotik ssh authentication. authorized_keys

Записки сисадмина: mikrotik ssh authentication. authorized_keys: 1) # ssh-keygen -t dsa на рабочей машине создаем dsa ключики 2) # ftp 192.168.31.1     # ftp

вторник, 21 июля 2015 г.

Запись на диск в системе RouterOS.

 RouterOS пишет на диск минимум 1.5 секунды, поэтому перед следующей командой нужно добавлять задержку. Чем больше инфы записывается в файл, тем больше задержка.
/tool fetch url="http://xx.xx.xx.xx/1.txt" mode=http ;
:delay 2s ;

Автоизменение пароля юзера в Mikrotik.

Если в парке ваших устройств много роутеров Mikrotik можно настроить автоизменение пароля администратора раз в какой-то период. Для этого можно использовать скрипт, который будет забирать с вашего сервера, где сгенерирован пароль и менять его на устройстве.
/tool fetch url="http://xx.xx.xx.xx/pass54321.txt" mode=http ;
:delay 2s ;
:global password [/file get pass54321.txt contents] ;
/user set manager password=$password ;
Подробнее 

среда, 15 июля 2015 г.

Блокируем порты спамеров

Блокируем порты в фильтрах
ip firewall filter add chain=forward port=t dst-port=25 src-address-list=spamm action=drop
Добавляем в адрес лист спамеров на 30 дней
ip firewall filter add chain=forward protocol=tcp dst-port=25 connection-limit=30,32 limit=50,5 src-address-list=!spamm action=add-src-to-address-list address-list-timeout=30d 
http://ingrid.net.ru/blog/76 

Спрятать сеть от фильтров TTL провайдера

Правило вверх
ip firewall mangle add action=change-ttl chain=prerouting new-ttl=increment:1 passthrough=yes
http://ingrid.net.ru/blog/76

Определяем в сети роутеры

Все IP адреса, которые сидят за роутерами автоматом попадут в адрес лист routers, что делать дальше - на Ваше усмотрение.
ip firewall mangle add action=add-src-to-address-list chain=prerouting in-interface=ether01 ttl=equal:63 address-list=routers
ip firewall mangle add action=add-src-to-address-list chain=prerouting in-interface=ether01 ttl=equal:127 address-list=routers

http://ingrid.net.ru/blog/76

Изменения в названиях релизов RouterOS.

С версии 6.31 можно выбирать какой релиз устанавливать:
 auto upgrade - added ability to select which versions to select when upgrading;
 Маски релизов выглядят так:
Bugfix only = 6.30.1 - только исправления, фиксы.
Current = 6.31 - релиз
Release candidate = 6.32rc1 - релиз кандидат
Development = 7beta1 - версия разработки.

суббота, 30 мая 2015 г.

Список изменений.

Описание текущих изменений в новых версиях RouterOS(+rc)

RouterBOOT changelog (изменения в boot-версиях загрузчика RouterOS)

RouterOS ChangeLog

What’s new in 6.28 (2015-Apr-15 15:18):

*) email – increase server greeting timeout to 60s;
 *) lte – ZTE MF823 may loose configuration;
 *) userman – update paypal root certificate;
 *) timezone – updated timezone information to 2015b release;
 *) cm2 – fixed capsman v2 100% CPU and other stability improvements;
 *) route – using ldp could cause connected routes with
 invalid interface nexthop;
 *) added support for SiS 190/191 PCI Ethernet adapter;
 *) made metarouter work on boards with 802.11ac support or usb LTE;
 *) sstp server – allow ADH only when no certificate set;
 *) make fat32 disk formatting support disks bigger than 134GiB;
 *) fixed tunnels – could crash when clamp-tcp-mss was enabled;
 *) added basic counters for ipv4/bridge fast path, also show status wether fast
 path is active at all;
 *) trafflow: – fixed crash on disable;
 *) pppoe over eoip – fixed crash with large packets;
 *) tilegx – fixed memory leak when queue settings are changed;
 *) ar9888 – fixed crash when hw reports invalid rate;
 *) console – fixed “in” operator in console;
 *) console – make “/system package update print” work again.
 *) tile – rare situation when CCR devices failed to auto-negotiate ethernet link (introduced in v6.25);
 *) dhcpv4 client – it is now possible to unset default clientid and hostname options
 *) initial RoMon (Router Management Overlay Network) support added.

четверг, 21 мая 2015 г.

IT Config: Защита от DoS атак на роутерах Mikrotik и Router ...

IT Config: Защита от DoS атак на роутерах Mikrotik и Router ...: DoS (отказ в обслуживании) атаки могут привести к перегрузке маршрутизатора. Это означает, что загрузка процессора возрастает до 100%, а м...

четверг, 14 мая 2015 г.

Время на роутере после перезагрузки, без использования NTP.

Так как в роутерах Mikrotik по неизвестной причине не используются внутренние батарейки для поддержания часов, после выключения время сбрасывается на 1970 год. Если есть интернет и настроен NTP или Cloud то в течении 3 секунд после загрузки время синхронизируется и время восстанавливается. Но бывает что в этот момент интернет не доступен, тогда время показывается неправильно. Лично у меня не сработал скрипт, который настроен на срабатывания каждые 40 секунд, но после перезагрузки сбилось время и по неизвестной причине время следующего срабатывания установилось аж через несколько часов. Что бы этого избежать и последствия хоть как-то минимизировать можно использовать скрипты:
fixclock
/system clock set date=[/user get date comment]
/system clock set time=[/user get time comment]

setclockfix
:if ([:pick [/system clock get date] 7 30]>=[:pick [/user get date comment] 7 30]) do={
/user set date comment=[/system clock get date]
/user set time comment=[/system clock get time]}
/system scheduler
add comment="" disabled=no interval=0s name=fixclock on-event=fixclock policy=write,test start-time=startup
add comment="" disabled=no interval=10s name=setclockfix on-event=setclockfix policy=write,test start-date=jan/01/1970 start-time=00:00:00 
/user
add address=1.1.1.1/32 disabled=yes group=read name=date
add address=1.1.1.1/32 disabled=yes group=read name=time 
Изначально в комменты юзерам нужно поставить дату и время, что б скрипт сравнения сработал. Используем поле комментарий юзера из-за того, что глобальные переменные при перезагрузке тоже очищаются.

Офф. форум по этому вопросу.

Failover Mikrotik.

  Мой вариант Failover на Mikrotik проверенный временем. Для двух каналов интернет. IP от провайдеров получаем по DHCP. Канал velton считаем главный, dsl второстепенный. Маршруты (основной шлюз) прописываем ручками.
  Для начала на каждый канал нужно создать по два маршрута:
/ip route
add comment=Ukrtel_mark distance=1 gateway=X.X.X.X routing-mark=dsl
add comment=Velton_mark distance=1 gateway=Y.Y.Y.Y routing-mark=velton
add comment=Velton distance=1 gateway=Y.Y.Y.Y
add comment=Ukrtel distance=2 gateway=X.X.X.X
  Это нужно что б при отвале главного маршрута мы могли проверять доступность интернета на интерфейсе через промаркированный маршрут. Обращаем внимание на метрику!!! Этим определяется какой маршрут приоритетный. Теория такова, мы всегда проверяем только главный канал, если он не активный, то переключаем всех на резервный. Резервный на работоспособность не проверяем, т.к. если не работает не тот не тот, то смысла переключать нет. Пингуем 3 попытками 3 хоста: ya.ru, www.ua, 8.8.8.8, если два первых невозможно отрезольвить то подставляем другие айпи:  77.88.8.8, 208.67.222.222.
interface=ether1-velton можно не указывать, например тогда, когда у нас isp провайдер дает инет по pppoe и при отвале этого интерфейса микротик не может пингануть и скрипт вываливается в ошибку. В таком случаем используем строчку для пинга без указания интерфейса (interface=ether1-velton убрать с скрипта во всех повторениях). Так же в начале мы проверяем статус главного маршрута, это нужно для того, что б после того как инет на главном isp пропал скрипт, который первый раз уже переключил микротик на резервный канал не пытался сделать это заново и не засорял лог.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#   23q
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:local status [ip route get value-name=active [find comment=Velton]];
:local PingCount 3;
:local PingResult1;
:local PingResult2;
:local PingResult3;
# yandex dns
:local PingTarget1reserv 77.88.8.8;
:local PingTarget1serv false;
:local PingTarget1;
:set $PingTarget1 [:pick [:do {:resolve ya.ru} on-error={:set PingTarget1serv true}] 1];
# OpenDNS
:local PingTarget2reserv 208.67.222.222;
:local PingTarget2serv false;
:local PingTarget2;
:set $PingTarget2 [:pick [:do {:resolve www.ua} on-error={:set PingTarget2serv true}] 1];
# Google Public DNS
:local PingTarget3 8.8.8.8;
if ($PingTarget1serv =  true) do={:set PingResult1 [/ping $PingTarget1reserv count=$PingCount interface=ether1-velton routing-table=velton]} else={:set PingResult1 [/ping $PingTarget1 count=$PingCount interface=ether1-velton routing-table=velton]};
if ($PingTarget2serv =  true) do={:set PingResult2 [/ping $PingTarget2reserv count=$PingCount interface=ether1-velton routing-table=velton]} else={:set PingResult2 [/ping $PingTarget2 count=$PingCount interface=ether1-velton routing-table=velton]};
:set $PingResult3 [/ping $PingTarget3 count=$PingCount interface=ether1-velton routing-table=velton];
:if (($PingResult1 + $PingResult2 + $PingResult3) >= (2 * $PingCount)) do={ if ($status=true) do={} else={/ip route enable [find comment=Velton]}}  else={ if ($status=true) do={/ip route disable [find comment=Velton]} else={}}
   В скрипт между попытками можно добавить задержки. Так же при переключении можно сбрасывать коннекшены, как это сделать читайте тут. Ну и этот скрипт у меня отрабатываем каждый 40 секунд. Если добавляем задержки между попытками то корректируем время в Scheduler.

Очистить лог-журнал.

Иногда нужно очистить лог  Mikrotik. Напрямую это сделать нельзя, но можно выполнить команду очистки:
/system logging action set memory memory-lines=1;
/system logging action set memory memory-lines=1000;
Данные в скрипте подправить в зависимости куда пишется журнал (в оперативку или на диск), и какое количество строк в журнале. 

пятница, 8 мая 2015 г.

:len считаем количество символов.

:put [:len "length=8"];
 :if ($lenPass = 8) do={}

четверг, 7 мая 2015 г.

Вычисляем размер файла, если превышает 3000 байт выполняем действие.

:global size;
:set $size [/file get value-name=size [find name=hotusers.txt]];
if ($size > 3000) do={log info 1} 

If если.

:if ($"current-vpn-ip" != $"new-vpn-ip") do={ /interface l2tp-client set [find name=$"vpn-interface-name"] connect-to=$"new-vpn-ip"}

Find поиск.

/ip f a remove [find comment=ntp];

Edit редактирование.

из терминала:
/system script edit awesome_script source

из скрипта:
/system script set awesome_script source="#### Blah\rblah blah"

Export, import всех параметров.

export compact
export compact file=1
Команда  export compact с 6 ветки ОС соответствует команде export. Что-бы сделать полный экспорт всех настроек (и дефолтных) можно воспользоваться командой export verbose.

Print выводит значения (в терминал или в файл).

in et  print

Set присваивает значение.

/system ntp client set primary-ntp=[:resolve "0.ua.pool.ntp.org"]; 

Enable, disable включение, отключение.

in et en ether5 

Remove удаление.

/ip f a remove [find comment=ntp];

Вывести значение параметра в переменную.

Выводим размер файла
:global 23 [/file get value-name=size [find name=hotusers.txt]];

Выводим все команды в переменную 23 применимые для данного файла:
:global 23 [/file get [find name=hotusers.txt]];
Еще примеры:
:global dnsDyndns [/ip dns static get value-name=address [find name=checkip.dyndns.org]];
:local status [ip route get value-name=active [find comment=Optinet]] 

Записываем в переменную текст с кавычками.

Должно получится:
 > put $1
WshShell.SendKeys "{ENTER}"
WScript.Sleep 500
WshShell.SendKeys "reboot"
WshShell.SendKeys "{ENTER}"
WScript.Sleep 2000
WshShell.SendKeys "exit"
Если выполнить
global 1 WshShell.SendKeys "{ENTER}" WScript.Sleep 500 WshShell.SendKeys "reboot" WshShell.SendKeys "{ENTER}" WScript.Sleep 2000 WshShell.SendKeys "exit"
Кавычки будут мешать записать переменную, нужно писать так:
:global 1 "WshShell.SendKeys \"{ENTER}\" \r\nWScript.Sleep 500 \r\nWshShell.SendKeys \"reboot\" \r\nWshShell.SendKeys \"{ENTER}\" \r\nWScript.Sleep 2000 \r\nWshShell.SendKeys \"exit\""
Вот некоторые примеры:
 \" Insert double quote
\\ Insert backslash
\n Insert newline
\r Insert carriage return
\t Insert horizontal tab
\$ Output $ character. Otherwise $ is used to link variable.
\? Output ? character. Otherwise ? is used to print "help" in console.
\_  - space
\a  - BEL (0x07)
\b  - backspace (0x08)
\f  - form feed (0xFF)
\v Insert vertical tab
\xx Print character from hex value. Hex number should use capital letters.
Источник: http://wiki.mikrotik.com/wiki/Manual:Scripting