Писать скрипты для Mikrotik RouterOS — это просто

  • Tutorial
RouterOS — сетевая операционная система на базе Linux. Данная операционная система предназначена для установки на аппаратные маршрутизаторы Mikrotik RouterBoard. Также данная система может быть установлена на ПК (или виртуальную машину), превращая его в маршрутизатор. Изначально довольно богатая функционалом ОС нет нет да и удивит отсутствием какой-нибудь нужной фишки из коробки. К сожалению, доступ к Linux-окружению очень сильно ограничен, поэтому, «это есть под Linux» абсолютно не равнозначно «это есть в RouterOS». Но не надо отчаиваться! Эта система предоставляет несколько возможностей для расширения своего функционала. Первая — самая простая и нативная — это возможность писать скрипты на встроенном языке.
В данной статье, в качестве примера будет рассмотрен скрипт, преобразующий DNS-имена в списки IP-адресов (address lists).
Зачем он может быть нужен? Многие сайты используют Round Robin DNS для распределения нагрузки (а некоторые и не только для этого). Чтобы управлять доступом к такому сайту (создать правило маршрутизации или фаервола) нам потребуются все IP-адреса, соответствующие этому доменному имени. Более того список IP-адресов по истечении времени жизни данной DNS-записи (в данном случае речь идёт об A-записи) может быть выдан абсолютно новый, поэтому информацию придётся периодически обновлять. К сожалению в RouterOS нельзя создать правило
блокировать все TCP соединения на порт 80 по адресу example.com
на месте example.com должен быть IP-адрес, но как мы уже поняли, example.com соответствует не один, а несколько IP-адресов. Чтобы избавить нас от мучения создания и поддержки кучи однотипных правил, разработчики RouterOS дали возможность создавать правило так:
блокировать все TCP соединения на порт 80 по любому адресу из списка с именем DenyThis
Дело осталось за малым — автоматически формировать этот самый список. Кто ещё не утомился от моей писанины приглашаю под хабракат.

Сразу приведу текст скрипта, далее последует его пошаговый разбор
:local DNSList {"example.com";"non-exist.domain.net";"server.local";"hostname"}
:local ListName "MyList"
:local DNSServers ( [ip dns get dynamic-servers], [ip dns get servers ], 8.8.8.8 )
:foreach addr in $DNSList do={
     :foreach DNSServer in $DNSServers do={
          :do {:resolve server=$DNSServer $addr} on-error={:log debug ("failed to resolve $addr on $DNSServer")}
     }
}
/ip firewall address-list remove [find where list~$ListName]
/ip dns cache all
:foreach i in=[find type="A"] do={
    :local bNew true
    :local cacheName [get $i name]
    :local match false
    :foreach addr in=$DNSList do={
       :if (:typeof [:find $cacheName $addr] >= 0) do={
           :set $match true
       }
    }
    :if ( $match ) do={
        :local tmpAddress [/ip dns cache get $i address]
        :if ( [/ip firewall address-list find ] = "") do={
            :log debug ("added entry: $[/ip dns cache get $i name] IP $tmpAddress")
            /ip firewall address-list add address=$tmpAddress list=$ListName comment=$cacheName
        } else={
            :foreach j in=[/ip firewall address-list find ] do={
                :if ( [/ip firewall address-list get $j address] = $tmpAddress ) do={
                    :set bNew false
                }
            }
            :if ( $bNew ) do={
                :log debug ("added entry: $[/ip dns cache get $i name] IP $tmpAddress")
                /ip firewall address-list add address=$tmpAddress list=$ListName comment=$cacheName
            }
        }
    }
}



Текст скрипта нужно добавить в репозиторий скриптов, находящийся в разделе /system scripts.
Скрипт выполняется построчно. Каждая строка имеет следующий синтаксис:
[prefix] [path] command [uparam] [param=[value]] .. [param=[value]]
[prefix] — ":" — для глобальных комманд, с символа "/" начинается командная строка, которая будет выполняться относительно корня конфигурации, префикс может отсутствовать, тогда командная строка выполняется относительно текущего раздела конфигурации;
[path] — путь до требуемого раздела конфигурации, по которому происходит переход перед выполнением команды;
command — непосредственно действие, выполняемое командной строкой;
[uparam] — безымянный параметр команды;
[param=[value]] — именованные параметры и их значения.

Итак, первым делом, определим параметры работы скрипта в виде переменных. Переменная объявляется командами :local и :global, соответственно получаем локальную переменную, доступную только внутри своей зоны видимости, или глобальную, которая добавляется в список переменных окружения ОС и будет доступна откуда угодно. Локальные переменные живут, пока выполняется их зона видимости, глобальные — пока мы не удалим их.

:local DNSList {"example.com";"non-exist.domain.net";"server.local";"hostname"}
:local ListName "MyList"
:local DNSServers ( [ip dns get dynamic-servers], [ip dns get servers ], 8.8.8.8 )
Переменная DNSList содержит массив доменов, с которым мы хотим работать. Переменная ListName содержит строку, которой будет называться полученный address-list. Переменная DNSServers — содержит массив адресов DNS-серверов, прописанных на роутере или полученных от провайдера при подключении, плюс «восьмёрки» на случай, если на роутере не используется служба DNS, который будет использоваться для получения информации о записях доменов.

:foreach addr in $DNSList do={
     :foreach DNSServer in $DNSServers do={
          :do {:resolve server=$DNSServer $addr} on-error={:log debug ("failed to resolve $addr on $DNSServer")}
     }
}
В цикле «для каждого» обойдём массив доменов и отрезолвим их IP-адреса на каждом DNS-сервере на случай, если разные DNS отдают разные IP. Конструкция
:do {command} on-error={command}
служит для отлова runtime-ошибок. Если не использовать её, то скрипт может прервётся при ошибке резолва несуществующего или ошибочного адреса.

/ip firewall address-list remove [find where list~$ListName]

Перейдём в раздел конфигурации /ip firewall address-list и удалим все записи, в которых название списка содержит значение переменной $ListName. Конструкция из квадратных скобок позволяет в рамках текущей команды выполнить другую, а результат выполнения передать текущей в виде параметра.

/ip dns cache all
:foreach i in=[find type="A"] do={
перейдём в раздел конфигурации /ip dns cahe all. Там содержатся DNS-кэш роутера в виде таблицы Name — Type — Data — TTL. Выполним отбор по типу — нам требуются только A-записи. И результат отбора обойдём в цикле «для каждого». Это и будет главным циклом нашего скрипта.

:local bNew true
:local cacheName [get $i name]
:local match false

Создадим переменные, обновляемые в каждом цикле: два флага — bNew, исключающий дублирования, match, показывающий, входит ли текущая запись кэша в наш список доменов; переменная cacheName содержит поле Name текущей записи кэша, то есть домен.

:foreach addr in=$DNSList do={
  :if (:typeof [:find $cacheName $addr] >= 0) do={
    :set $match true
  }
}

Обойдём список доменов и для каждого проверим, содержится ли в строке cacheName подстрока в виде домена из этого списка.
Почему не использовать сравнение на равенство?
Очень просто — логика скрипта предполагает что под-домены должны обрабатываться так же как домены. Если мы хотим блокировать социалочки, то имеет смысл блокировать не только основной домен, но и, к примеру, сервера отдающие статику, картинки, скрипты, и находящиеся на под-доменах данного сайта. Так же это позволит избежать перечисления отдельно доменов с «www» и без. То что, эти домены не попали в кэш при резолве — не страшно, т.к. они могут попасть туда при резолве браузером пользователя (правда для этого нужно, чтобы DNS-запросы пользователя обрабатывались в RouterOS).
Если содержится, установим значение флага match в true.

:if ( $match ) do={
  :local tmpAddress [/ip dns cache get $i address]
  :if ( [/ip firewall address-list find ] = "") do={
    :log debug ("added entry: $[/ip dns cache get $i name] IP $tmpAddress")
    /ip firewall address-list add address=$tmpAddress list=$ListName comment=$cacheName
  } else={
    :foreach j in=[/ip firewall address-list find ] do={
      :if ( [/ip firewall address-list get $j address] = $tmpAddress ) do={
        :set bNew false
      }
    }
    :if ( $bNew ) do={
      :log debug ("added entry: $[/ip dns cache get $i name] IP $tmpAddress")
      /ip firewall address-list add address=$tmpAddress list=$ListName comment=$cacheName
    }
  }
}

В заключающем этапе если текущий адрес требует добавления (match установлен в true), то мы его добавляем в список адресов. Коментарий к добавляемой записи будет содержать домен, к которому она относится. При этом выполняем несколько проверок. Если address-list пустой, то добавляем сразу, если что-то там есть, проверяем, нет ли там уже записи с таким IP-адресом и если нет — добавляем.

Список адресов нужно периодически обновлять. Для этого в RouterOS есть диспетчер заданий. Задание можно добавить из консоли или из графического интерфейса winbox
/system scheduler
add interval=5m name=MyScript on-event="/system script run MyScript" policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=may/08/2014 \
    start-time=10:10:00


Сценарии работы со списком адресов не ограничиваются созданием правил в фаерволе. Поэтому приведу несколько примеров. Можно выполнять в консоли, можно добавлять мышкой в winbox'е.
Чёрный список:
/ip firewall filter 
add chain=forward protocol=tcp dst-port=80 address-list=DenyThis \
    action=drop

Статический маршрут до данных узлов
/ip firewall mangle
add action=mark-routing chain=prerouting dst-address-list=AntiZapret \
    in-interface=bridge_lan new-routing-mark=RouteMe

/ip route
add distance=1 gateway=172.16.10.2 routing-mark=RouteMe

Сбор информации о клиентах
/ip firewall mangle
add action=add-src-to-address-list address-list=FUPer chain=prerouting \
    dst-address-list=Pron log=yes log-prefix=critical


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

UPD: специально по просьбе turone внёс изменения в скрипт, чтобы адреса DNS-серверов брались из системы.
UPD 24.08.2016: заметил, что в новых версиях RouterOS (начиная с 6.36) появилась возможность указывать в адрес-листах DNS-имена. Так что теперь ценность данного скрипта лишь образовательная.
Поделиться публикацией

Похожие публикации

Комментарии 66

    +2
    К сожалению в RouterOS нельзя создать правило
    блокировать все TCP соединения на порт 80 по адресу example.com

    Да ладно. add action=drop chain=forward content=«Host: habrahabr.ru»
      +1
      На 500 друг за другом идущих таких правилах, я думаю микротик скажет: «фу таким быть» и скорость будет страдать, не? :)
        0
        Подтверждаю. Будет страдать, а если ещё какой-нибудь ipsec параллельно работает — вообще загнуться может. Да и самому в них довольно сложно ориентироваться будет.
          0
          В данном случае немного неправильно применение (неплохого, кстати) инструмента.
          Если вам нужно блокировать 10+ доменных имён — впору задуматься о настройке прозрачного squid.
            0
            Как вы сквидом будете ssl трафик обрабатывать? А если на 443 порту не https? А если на 80 — не http?
              0
              Подразумевается работа http(s) прокси сервера. Работа с https через него ведётся путём запроса метода CONNECT hostname у прокси-сервера. На что сервер отвечает denied.
              Но это в случае если вы обеспечиваете корпоративный выход в инет на предприятии, где запрет социалочек регламентирован. Если же Вы пытаетесь «втихую» блокировать сайты в маленькой конторке, то да, костыли — вариант.
                0
                Подразумевается работа http(s) прокси сервера. Работа с https через него ведётся путём запроса метода CONNECT hostname у прокси-сервера.

                Это же будет работать только если прокси в браузере явно прописать, Вы же сначала прозрачный прокси предлагали.
                Но это в случае если вы обеспечиваете корпоративный выход в инет на предприятии, где запрет социалочек регламентирован. Если же Вы пытаетесь «втихую» блокировать сайты в маленькой конторке, то да, костыли — вариант.

                А как же BYOD? На всех смартфонах-ноутбуках будете настройки бегать прописывать?
                  0
                  А в таком случае это решается корпоративным DNS и запретом соединяться с другими внешними DNS серверами.

                  Вполне годно. Работает.
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                в Mikrotik есть свой web-прокси… https он конечно не может, но в общем весьма пригодный.
          +1
          Точнее:
          /ip firewall filter
          add action=drop chain=forward content=«Host: habrahabr.ru» dst-port=80 protocol=tcp
            0
            Это если у вас http. Этого-то в условии задачи не было сказано :)
              +3
              В условии был 80 порт, это и есть http :)
                +1
                Наверное, я пример не удачный привёл. С https ваше правило не сработает.
                  0
                  Разумеется, это только для http. Этот способ покрывает большинство сайтов и намного проще написания скриптов, только и всего.
                  0
                  Вы зря так, 80 порт — это не только http.

                  Минимум вы путаете уровни модели OSI: посмотрите, на какой уровне появляются в ней «порты» (80/tcp, для точности), а на каком — HTTP как протокол.

                  Во-вторых, заголовок «Host: ...» (такая строчка, конечно, не только в http может пролететь) впервые появился только в HTTP/1.1, так что блочить ваше правило даже из http-серверов будет не все.

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

                  :)
                    0
                    Понятно, что повесить на 80 порт можно что угодно, я говорил о реальном мире, в котором 99% сайтов подойдут под это правило. Для остальных пригодится этот топик.
                      0
                      Так вы условие прочтите: не блочить http-трафик, а трафик на 80/tcp. Скажем, блочить трафик вируса, который на 80 порт некого хоста (по имени) своим протоколом (не http!) гонит украденные у юзера пароли.

                      Ваш вариант хорош как «затычка» на скорую руку, но… знаете, в сети с такими защитами, как предложенное вами правило я бы с удовольствием пользовался инетом, зная, что другие юзеры (не включившие свой мозг) той же сети не имеют доступа к вебу. При этом о моем доступе к вебу админ с вашим подходом был бы не в курсе, и был бы счастлив, что у него «все схвачено» ))

                      Вас плюсуют — так что, полагаю, вы не один такой «внимательный» к условиям задач. Ничего личного, но, как в том анекдоте — «побольше бы таких, как вы, у меня всегда работа будет».
                      0
                      У меня к Вам вопрос про «в-третьих» поделитесь опытом, как вы отловите трафик не http на 80 порту? ;) Очень мне интересно т.к. насущно.
                        0
                        как вариант — L7-фильтры ( goo.gl/ZFAEyy ), но тут опять встаёт два вопроса:
                        — производительность, т.к. анализ принадлежности трафика основан на анализе содержимого пакетов
                        — качество точности определения типа трафика
                          0
                          Большое спасибо за подсказку! не знал. вы пробовали сами реальные возможности?
                            0
                            Нет, не пробовал, т.к. микротик домашний, и у меня нет необходимости в L7-фильтрах.
                              0
                              Было дело. Вот одна, а вот вторая моя статья в которой есть упоминание L7. Ну и крайне годный ресурс.
                            0
                            Как дешевый вариант — заверните трафик 80 порта в прозрачный прокси. Что через него пройдет — то уже http :) Остальное просто не пройдет.

                            Надо однако понимать цель определения http-трафика: вспомните, OpenVPN отлично проходит через прокси-сервера, создавая http-трафик, и заворачивая уже любые данные внутри создаваемого туннеля. Так что (грубо говоря) цель «не дать в офисе никакого трафика кроме http» при помощи прокси/фильтрации по признакам http-трафика не совсем чтобы прокатит, надо отдельно ловить признаки туннелирования внутри http чего-то другого.

                            А если задача — настроить QoS, дав http-трафику определенный приоретет/ширину канала, то какие проблемы, проще метить пакеты, хотя бы более-менее похожие на http. Особенно если сеть — доверенная, и вы не ждете «подлянок» от пользователей, а просто хотите пропустить VoIP вперед http.

                            Ну а если прокси не сильно нравится, и хочется сделать QoS — метьте (mangle) пакеты (а затем — соединения) по формальным признакам (80 порт tcp, те или иные строки в заголовке) — этого хватит.
                              0
                              Цель скорее «не дать в офисе никакого трафика кроме http» и его варианты. Вариантов масса, как пример торрент который свободно пролазит по 80 порту, внешний DNS. ASA оно конечно хорошо, но для фирмы дорого :(

                                0
                                А чем вас ASA, если по-честному, спасет? :) Она, как и много других классификаторов, что-то может, что-то нет.

                                С http вам поможет проки. Только с методом connect разбирайтесь глубже, или вообще его запретите (ой!). Но что бы вы не сделали, https перекрыть нельзя, по нему сейчас полинтернета работает. А разрешите его — любой самый функциональный DPI (не то что решение на Mikrotik) летит в никуда, он просто не будет знать, что внутри.

                                Так что тут остается разбираться в http-трафике, а https пускать только на хосты те, где есть https и нет OpenVPN, например. Или уже переносить борьбу с https на ПК (точнее, в браузеры) юзеров.

                                Я бы начал с DNS. SkyDNS тот же вам в помощь! )
                                  0
                                  Да, вы правы, запретить это конечно не выход совсем :)

                                  Спасет — ну вот инспекцией и спасет, в данном вопросе. Разбирая, как минимум, какой еще трафик кроме необходимого пойдет по порту.

                                  Про http, я понял вас. Спасибо за помощь.
                                    0
                                    > Спасет — ну вот инспекцией и спасет, в данном вопросе. Разбирая, как минимум, какой еще трафик кроме необходимого пойдет по порту.

                                    Вы меньше верьте в чудеса и в идеальной инспекции «из коробки». Я как-то поставил инспекцию ESMTP трафика — а сервер у меня почему-то перестал часть писем получать. Расследование показало, что что-то циске в иных SMTP-диалогах не нравилось…

                                    Повторюсь, http вы и на микротиковском прокси обработаете (IP -> Webproxy), а вот с https будут вопросы, да. Не из-за Микротика, а из-за протокола.
                    0
                    На грани оффтопа, но, думаю, кому-то кроме меня пригодится.
                    Я сделал на микротике в офисе гостевую Wi-Fi сеть для интернета без доступа к локалке. Доступ ограничил так: на бридже в цепочке forward создал правило дропать все, что идёт с wlan2 НЕ на ether1-gateway. Это надёжно с точки зрения безопасности? Вообще, есть какие-нибудь причины так не делать?
                      +1
                      Единственная проблема на первый взгляд, это что не будут работать сайты, которые хостятся у вас в офисе, даже по dns имени, которое смотрит на внешний ип офиса.
                      Что бы это обойти надо прикрутить еще тройку костылей…
                        0
                        можно загнать в address-list (например, local-servers) адреса серверов, на которые нужно попадать с wi-fi и положить правило, пропускающее пакеты с dst-address-list равным local-servers, до правила с DROP'ом
                          0
                          Кстати хороший вариант, мне же в голову пришел более изощренный костыль, это snat'ом подменять адрес из wifi-range на внешний ip офиса при dst адресе веб сервера…
                          0
                          Я просто оставлю это здесь.
                            0
                            Вы в курсе, что тогда сервера будут видеть один и тот же адрес от всех клиентов — адрес шлюза? Думаю, что не нужно объяснять чем это плохо с точки зрения безопасность (выявления вредителя, находящегося в той же подсети).

                            Правильнее всего вынести сервара в dmz-зону (отдельную подсеть), тогда и лишний раз nat'ить не нужно, и фаерволить проще.
                              0
                              Думаю, что «выявления вредителя, находящегося в той же подсети» это не самая правильная формулировка. По сути гостевая wi-fi сеть в офисе, которая будет ходить к серверам по внешнему адресу, ничем не отличается от любого другого публичного wi-fi или провайдера с серыми адресами. Сервис торчит наружу, к нему приходят снаружи…
                              Не совсем понимаю чем это небезопасно?
                                +1
                                ок. Давайте представим себе такую ситуацию…

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

                                По правилам хорошего тона на этом сервере сработает fail2ban, но заблокриует не IP брутфорсера, а IP шлюза… В итоге — все за wifi «отрезаны» от web-ресурса, а важный гость негодует и жалуется Вашему начальнику.

                                Не могу говорить за Вас, но в моём случае могла бы иметь место попоболь…

                                Ну, а если никаких мер не принимать (не бороться с брутфорсером) — кто знает какие методы он пользует?.. Может ведь и проломить «стену»…

                                В общем, я ни кого не заставляю принимать мою точку зрения, но и не мной было придумано понятие DMZ.

                                Как говорится, каждый сам выбирает методы защиты, а потОм — лекарства, для залечивания ран :)
                        0
                        А как планируется быть для случаев когда за одним именем сидит AS(несколько адресов)? Сравните вывод nslookup в Windows и resolve в микротике для того же vk.com
                          0
                          Вы статью то читали? Вывод команды resolve тут вообще не используется.
                            0
                            :foreach addr in $DNSList do={
                            :do {:resolve server=8.8.8.8 $addr} on-error={:log debug («failed to resolve $addr»)}
                            а тут разве не резолв?
                              +1
                              Он нужен, чтобы сделать запрос к днс-серверу. В кэш попадут все записи, относящиеся к этому домену.
                                0
                                В какой момент в ДНС-кеш микротика попадут ВСЕ записи нужного домена?
                                Просто проверил. От пинга на тике и нслукапа на виндовом клиенте в ДНСе микротика записи для всех адресов даного домена не появились.
                                  0
                                  В момент резолва на микротике
                                    0
                                    [admin@MikroTik GW] > /ip dns cache flush  
                                    [admin@MikroTik GW] > /ip dns cache all print 
                                    Flags: S - static, N - negative 
                                     #   NAME            TYPE  DATA                                              TTL         
                                    [admin@MikroTik GW] > :resolve vk.com
                                    [admin@MikroTik GW] > /ip dns cache all print 
                                    Flags: S - static, N - negative 
                                     #   NAME            TYPE  DATA                                              TTL         
                                     0   vk.com          A     87.240.131.99                                     6m50s       
                                     1   vk.com          A     87.240.143.241                                    6m50s       
                                     2   vk.com          A     87.240.131.117                                    6m50s
                                    


                                    C:\Users\Александр>nslookup vk.com 8.8.8.8
                                    ╤хЁтхЁ:  google-public-dns-a.google.com
                                    Address:  8.8.8.8
                                    
                                    Не заслуживающий доверия ответ:
                                    ╚ь :     vk.com
                                    Addresses:  2a00:bdc0:3:103:1:0:403:907
                                              2a00:bdc0:3:103:1:0:403:908
                                              2a00:bdc0:3:103:1:0:403:909
                                              87.240.131.97
                                              87.240.131.99
                                              87.240.143.241
                                    
                            0
                            Коллеги, микротиководы! Можно я, пользуясь случаем, задам пару вопросов:
                            1. Есть ли альтернативы микротику с 10+ Ethernet-портами? OpenWRT в metarouter-e не в счёт, т.к. фича не для продакшена.
                            2. Когда вы делаете (скриптом) автобекапы микротика (а ведь вы их делаете, правда?) — вы проверяете их целостность? Как?
                              0
                              А зачем его автоматически бэкапить? Туда изменения очень редко вносятся. Или вы каждый день сеть переконфигурируете?
                                0
                                А зачем его автоматически бэкапить? Туда изменения очень редко вносятся. Или вы каждый день сеть переконфигурируете?
                                  0
                                  1. Чем вам микротики не угодили? Если от другого вендора, то Cisco, Juniper какие-нибудь.
                                  2. Бэкап микротика — это хорошо. Но у меня редко вносятся изменения в конфигурацию, а все конфигурации достаточно типовые и однообразные. В случае чего дольше будут искать (покупать/заказывать/везти) микротик на замену, чем я его буду настраивать. А там где требуется всегда можно иметь абсолютно идентичный роутер с такой же конфигурацией на замену.
                                    0
                                    NOC отличный проект, который в том числе позволяет автоматически собирать конфиги и следить за их изменениями. Подробнее было в выпуске LinkMeUp #9 и #10.

                                    У себя делаю это по расписанию на scheduler`е и отправляю на ftp сервер. Позже делаю еще один запрос на CGI скрипт, который создает commit в git`е если были сделаны были изменения.
                                    0
                                    свежий mikrotik чего то не ставится на виртуальную машину (vmware work на esxi не пробовал еще.)… а то проверять бекапы и вообще много всего делать можно было.
                                      0
                                      Можно метароутер использовать
                                        0
                                        ставится, ставится )) на том же kvm живет и не переживает

                                        и бекапится отлично образом/снапшотом.
                                        0
                                        :lua — Lua язык в скриптах — это была прекрасная идея версии 4.0 b3, но к сожалению в v4 RC1 удалили поддержку Lua так вот и сидим ждем может появится это счастье…

                                        Вот какой синтаксис был:

                                        [:lua "require 'customprint'\n print('hello from custom print function')"]
                                        
                                          0
                                          Еще не хватает таких примочек как :break и :continue для циклов (я по крайней мере не нашел их поддержки и реализации), ну и ужасного :goto
                                            +1
                                            Отладчика не хватает. :(
                                              0
                                              да тоже… запускайте через консоль скрипт там хоть позиция ошибки указывается…
                                                +1
                                                Так и делаю, но в винбоксе не хватает CTRL+A в окне скрипта, чтобы заменить исправленной версией быстро. А пишу я скрипты в notepad++, у меня есть файлик с синтаксиса подсветкой.
                                                  0
                                                  все тоже самое, но я приучил себя к консоли… по SSH удобнее стало в разы.
                                            0
                                            Хочу поправить: :local DNSServer «8.8.8.8» тут используется сервер google, соответственно ip серверов (:resolve server=$DNSServer $addr) дает для того участка интернет в котором сервер 8.8.8.8 находится. Если на микротике стоит dns сервер(а) провайдера, то часто ip адреса будут отличаться от выданных сервером 8.8.8.8. Поэтому нужно обязательно указать, чтобы в скрипте указывали тот dns который уже настроен в микротике.
                                              0
                                              В данном случае, на микротике DNS провайдера не используются, а используются, как раз восьмёрки.
                                              Если честно, ни разу не сталкивался, чтобы разные DNS отдавали разные A-записи. Только если кэш обновить не успели.
                                                0
                                                бывает. Не так часто, но случается.
                                                  0
                                                  Для простых сайтов ip в основном одинаковые, а для серьезных могут например сеть akamai использовать для надежности и безопасности, в таких случаях ip серверов для разных регионов отличаются. Можете пропинговать www.jw.org.
                                                    0
                                                    Насколько я понял, он разные ip выдаёт каждый раз.
                                                      0
                                                      У меня через dns провайдера ip адрес не меняется, что доказывает: сервер google(8.8.8.8) может (в зависимости от нагрузки или маршрута пакета) выдавать ip серверов разной локализации, что в нашем случае не есть гуд.
                                                        0
                                                        а вы кэш чистили у себя? а ваш провайдер?
                                                          0
                                                          У себя — да. У провайдера нет. Во всяком случае необходимо для скрипта указать, что ip dns сервера должен быть тот, который указан в микротике первым. Я на эту проблему вышел когда попробовал ваш скрипт применить, так вот через 8.8.8.8 все глючило, когда в скрипте прописал dns провайдера(который в микротике прописан первым) проблемы исчезли.
                                                            0
                                                            Добавил изменения в скрипт, надеюсь так Вам больше понравится.

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

                                              Самое читаемое