Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Проверка и отключение шлюзов

    Проверка и отключение шлюзов

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Проверка и отключение шлюзов, RouterOS
     
    infidel
    Guest
    #1
    0
    18.02.2010 19:03:00
    Я наконец-то создал скрипт для проверки и отключения шлюзов. Он работает нормально, но я хочу немного его оптимизировать. Вот сам скрипт.

    #set variables  
    :local pingcount 3  
    :local pingip [:resolve "google.com"]
    :local GatewayA 192.168.1.1  
    :local GatewayB 192.168.2.254  
    :local GatewayC 192.168.3.254  

    :if ([/ip route print count-only where dst-address="$pingip/32"]=0) do={
     /ip route add dst-address=($pingip) gateway=($GatewayA) comment="Gateway $GatewayA Check"  
    }  
    /ip route set [find dst-address="$pingip/32"] disabled=no gateway=$GatewayA comment="Gateway $GatewayA Check"

    Тестирую GatewayA:  
    :local pingresultA [/ping $pingip count=$pingcount]
    GatewayA включение/отключение:  
    :if ($pingresultA=0) do={  
     :foreach i in=[/ip route find gateway=$GatewayA] do={
       /ip route set $i disabled=yes  
     }  
    }  
    :if ($pingresultA!=0) do={  
     :foreach i in=[/ip route find gateway=$GatewayA] do={
       :if ([/ip route get $i disabled]) do={
         /ip route set $i disabled=no  
       }  
     }  
    }  
    :log info ("tested Gateway $GatewayA")  
    :delay 5000ms

    Тестирую GatewayB:  
    /ip route set [find dst-address="$pingip/32"] disabled=no gateway=$GatewayB comment="Gateway $GatewayB Check"
    :local pingresultB [/ping $pingip count=$pingcount]
    GatewayB включение/отключение:  
    :if ($pingresultB=0) do={  
     :foreach i in=[/ip route find gateway=$GatewayB] do={
       /ip route set $i disabled=yes  
     }  
    }  
    :if ($pingresultB!=0) do={  
     :foreach i in=[/ip route find gateway=$GatewayB] do={
       :if ([/ip route get $i disabled]) do={
         /ip route set $i disabled=no  
       }  
     }  
    }  
    :log info ("tested Gateway $GatewayB")

    Могу ли я создать переменную со всеми шлюзами внутри и использовать :foreach?  
    Сейчас, если я добавляю ещё один шлюз (GatewayC), приходится копировать часть скрипта в конце и переименовывать переменные.  

    Я хочу что-то вроде этого:

    #set variables  
    :local pingcount 3  
    :local pingip 69.16.137.252  
    :local Gateway [192.168.1.1;192.168.2.254]

    :foreach i in=($Gateway) do={  
     :if ([/ip route print count-only where dst-address="$pingip/32"]=0) do={
       /ip route add dst-address=($pingip) gateway=($Gateway) comment="Gateway $Gateway Check"  
     }  
     /ip route set [find dst-address="$pingip/32"] disabled=no gateway=$GatewayA comment="Gateway $Gateway Check"

     Тестируем Gateway:  
     :local pingresult [/ping $pingip count=$pingcount]
     Включение/отключение Gateway:  
     :if ($pingresult=0) do={  
       :foreach i in=[/ip route find gateway=$Gateway] do={
         /ip route set $i disabled=yes  
       }  
     }  
     :if ($pingresult!=0) do={  
       :foreach i in=[/ip route find gateway=$Gateway] do={
         :if ([/ip route get $i disabled]) do={
           /ip route set $i disabled=no  
         }  
       }  
     }  
     :log info ("tested Gateway $Gateway")  
     :delay 5000ms  
    }
     
     
     
    jamiewatson69
    Guest
    #2
    0
    23.09.2010 09:53:00
    Привет, я пытаюсь сделать нечто очень похожее! У нас в маршруте по умолчанию три шлюза, и я хочу включать или отключать их в зависимости от того, что этот скрипт определит о состоянии линии. Думаю, проблема в том, что нельзя просто отключить или включить сам шлюз, с ним надо либо добавлять маршрут, либо удалять! Мне удалось запустить этот скрипт на отдельных маршрутах, но он, похоже, просто игнорирует маршрут с несколькими шлюзами! Я тоже пытался использовать это решение, но безуспешно: http://wiki.mikrotik.com/wiki/Advanced_…_Scripting http://wiki.mikrotik.com/wiki/Two_gateways_failover Есть идеи? Спасибо, Джейми http://www.fusionmanageit.co.uk
     
     
     
    infidel
    Guest
    #3
    0
    23.09.2010 14:33:00
    Нет, этот скрипт не добавляет и не удаляет шлюзы, он только отключает и включает их. Но чтобы проверить каждый шлюз, мне пришлось создать статический маршрут, который принудительно направляет пинг через конкретный шлюз. То есть я создаю статический маршрут, с его помощью пингуя сайт, а потом удаляю маршрут. Затем создаю другой статический маршрут, пингуя тот же сайт, и опять удаляю маршрут. Если результат пинга равен нулю, я ОТКЛЮЧАЮ все маршруты, которые используют этот шлюз. Если при следующем пинге результат больше нуля, то я снова ВКЛЮЧАЮ все маршруты с этим шлюзом.
     
     
     
    infidel
    Guest
    #4
    0
    23.09.2010 14:37:00
    Понимаю твою проблему. К сожалению, скрипт не рассчитан на такой сценарий, хотя я сам использую несколько шлюзов для одного маршрута. Я подумаю над этим и отвечу тут. Я тоже начинал с вики, но либо у меня не получалось заставить это работать, либо это не подходило под мои задачи. Поэтому я и создал этот скрипт.
     
     
     
    jamiewatson69
    Guest
    #5
    0
    23.09.2010 14:39:00
    Привет! Да, всё абсолютно понятно, придётся возвращаться к чертежной доске, потому что мне надо, чтобы происходила маршрутизация пакетов по трём адресам роутеров и одновременно отключался (удалялся или добавлялся) именно тот шлюз (они у меня ADSL-модемы), в рамках одного правила по умолчанию, если через него больше нельзя выйти в интернет! Я думал, что установка трёх маршрутов с одинаковым приоритетом тоже может сработать, но оказывается, активен всегда только один маршрут! Готов заплатить тому, кто сможет это сделать! С уважением, Джейми
     
     
     
    infidel
    Guest
    #6
    0
    23.09.2010 14:48:00
    Если собираетесь создавать правило mangle, которое отмечает пакеты, отправляемые на хост, который вы пингодуете, помните: для каждого шлюза, который хотите проверить, нужно использовать отдельный хост. И когда этот шлюз падает, никто не сможет получить доступ к этому хосту. Поэтому не используйте Google или что-то популярное. Затем вам нужно НЕ отключать маршруты с маркировкой маршрутизации, которую вы используете для тестирования, вместе с маршрутами по умолчанию.
     
     
     
    infidel
    Guest
    #7
    0
    23.09.2010 14:54:00
    Единственное решение, которое я могу предложить для вашей проблемы — создать маршруты по умолчанию со всеми возможными комбинациями. Например, если у вас 3 модема, создайте маршрут #1 (1-2-3), маршрут #2 (1-2), маршрут #3 (1-3), маршрут #4 (2-3), маршрут #5 (1), маршрут #6 (2), маршрут #7 (3). Маршрут #1 будет иметь метрику 1, маршруты #2, #3, #4 — метрику 2, маршруты #5, #6, #7 — метрику 3. Теперь нужно будет изменить мой скрипт так, чтобы он отключал любой маршрут, который ВКЛЮЧАЕТ неработающий шлюз. Учтите, что это был мой первый скрипт, и мои знания очень ограничены, так что, возможно, есть более простой способ.
     
     
     
    WirelessRudy
    Guest
    #8
    0
    18.10.2010 20:04:00
    infidel; Мне нравится твой скрипт, хотя я не до конца понимаю, что именно происходит на разных этапах его выполнения. Мои знания в скриптах слабые, и я иногда просто пишу простенькие скрипты для простых действий. У меня один маршрутизатор с двумя подключёнными ADSL-лирями, но я уже заказал третий.

    Вопросы:

    Твой скрипт теперь работает с тремя линиями? Ты начал тему со скриптом для трёх линий, но в “финальном” варианте проверяешь только две.

    В ROS v4.10 при задании переменных получаю следующее:

    [adminrudy@RB600 ADSL VODAFONE] > #set variables
    [adminrudy@RB600 ADSL VODAFONE] > :local pingcount 3
    [adminrudy@RB600 ADSL VODAFONE] > :local pingip [:resolve “sex.com”]
    [adminrudy@RB600 ADSL VODAFONE] > :local Gateways “10.10.21.1,10.10.22.1”
    [adminrudy@RB600 ADSL VODAFONE] > :local Gateway [:toarray $G ateways]
    syntax error (line 1 column 27)  
    При вставке этой части в терминал красным выделяет букву “G” в “$G ateways”. То есть эта последняя команда не выполняется.

    Что вообще делает эта последняя команда? И как, если нужно, исправить синтаксис?

    В следующем разделе скрипта “Setup Log File” снова получаю ошибку синтаксиса на такой строке:  
    ` :if ([/ip route print count-only where dst-address=“$ p ingip/32”]=0) do={/ip route add dst-address=($pingip) gateway=(10.10.22.1) comment=“Gateway Check”};`
    Сейчас выделена буква p, из-за которой возникает ошибка.

    В разделе “Test Gateway” тоже ошибки синтаксиса похожего рода:

    [adminrudy@RB600 ADSL VODAFONE] > /ip route set [find dst-address=“$ p ingip/32”] disabled=no gateway=$k comment=“Checking Gateway $k …”;
    syntax error (line 1 column 35)  
    [adminrudy@RB600 ADSL VODAFONE] > :delay 1000ms;
    [adminrudy@RB600 ADSL VODAFONE] > :if ([/ip route get [find dst-address=“$ p ingip /32”] gateway-status] = “$k unreachable”) do={:log info (“Router $k not present or unconfigured”)} else={
    syntax error (line 1 column 41)  
    [adminrudy@RB600 ADSL VODAFONE] > :local pingresult [/ping $ p ingip count=$pingco unt];
    syntax error (line 1 column 27)  
    [adminrudy@RB600 ADSL VODAFONE] > # Gateway enable/disable:
    [adminrudy@RB600 ADSL VODAFONE] > :if ($ p ingresult=0) do={:foreach i in=[/ip rou te find gateway=$k] do={/ip route set $i disabled=yes}};
    syntax error (line 1 column 7)  
    [adminrudy@RB600 ADSL VODAFONE] > :if ($ p ingresult>0) do={:foreach i in=[/ip rou te find gateway=$k] do={:if ([/ip route get $i disabled]) do={/ip route set $i d isabled=no}}};
    syntax error (line 1 column 7)  
    [adminrudy@RB600 ADSL VODAFONE] > :if ($ p ingresult=0) do={:log info (“Gateway $k Down! $pingresult / $pingcount”)} else={:log info (“Gateway $k Up $pingresult / $pingcount”)};
    syntax error (line 1 column 7)  
    [adminrudy@RB600 ADSL VODAFONE] > :delay 3000ms;
    [adminrudy@RB600 ADSL VODAFONE] > }
    [adminrudy@RB600 ADSL VODAFONE] > }
    [adminrudy@RB600 ADSL VODAFONE] > /ip route remove [find dst-address=“$ p ingip/32”]
    syntax error (line 1 column 38)

    Можешь помочь с этим? Значит ли это, что скрипт работает не так, как должен? Я могу проверить только с одной неисправной ADSL-линией. Она мёртвая — никакого IP-трафика при подключённом модеме, хотя сигнал ADSL есть. Техников уже вызвал, но это может занять какое-то время здесь, в Испании.

    Я включил все маршруты к обоим модемам, чтобы протестировать твой скрипт, он аккуратно отключает маршруты через шлюз, который не работает из-за отключённой линии. Значит, в общем, он работает. Но ошибки синтаксиса явно говорят о том, что что-то не до конца правильно...

    Как ты запускаешь скрипт? Через планировщик? И как часто — каждые 5 минут или каждую минуту?

    Кроме того, мне нужно сделать скрипт для обновления очередей (queue tree). Ограничения скорости разделены по интерфейсам, но мой скачивание (если оно идёт через LAN-интерфейс) использует общую скорость двух линий. Очевидно, это теперь надо менять под одну линию. А когда появится третья линия — будет ещё сложнее. Нужно работать с тремя наборами очередей на скачивание.

    Ещё надо написать скрипт, который будет отправлять созданный файл “Gateways Check.0.txt” на мой e-mail. Но мне нужно только уведомление, если что-то реально изменилось. Не хочу получать письмо каждый раз, когда планировщик запускает скрипт.

    Можешь помочь с этим?
     
     
     
    WirelessRudy
    Guest
    #9
    0
    18.10.2010 22:03:00
    Я заметил одну проблему в этой схеме: что будет, если тестовый сервер (www.sex.com) будет недоступен? Или просто временно не отвечает на пинг? Чтобы не отключать шлюз из-за того, что сервер на пару минут упал, скрипт нужно запускать очень часто. Но тогда в логах будет куча записей, да и маршрутизатор будет постоянно занят такими проверками. Кроме того, на опыте работы с выделенными WAN балансировщиками нагрузки я видел, что иногда некоторые сайты просто недоступны для пинга, в то время как остальной интернет работает нормально. Даже Google порой становится недоступен. Поэтому, возможно, стоит расширить скрипт так, чтобы при первой неудачной проверке на определённом сервере через первый шлюз, тест переходил ко второму серверу (а для большей надёжности — и к третьему). Три обычных сервера одновременно недоступны — значит, скорее всего, интернет-соединение действительно плохое или прервано и можно считать его «выпавшим». Кроме того, для разрешения имени веб-сервера для пинг-теста нужен DNS-сервер с правильными данными. Если DNS-сервер не работает или в кэше неверная информация, скрипт посчитает, что сервер недоступен, и сочтёт, что шлюз не работает. Как же справиться с такой ситуацией? Может, стоит добавить в скрипт сначала проверку DNS-сервера?
     
     
     
    infidel
    Guest
    #10
    0
    19.10.2010 08:42:00
    Используйте финальный скрипт и добавляйте столько шлюзов, сколько хотите, разделяя их запятыми (,). Если sex.com (или любой другой сайт, который вы используете) не работает, то соответствующие шлюзы будут отключены. Можно использовать любой сайт, но помните, что этот сайт будет постоянно менять шлюзы, поэтому не стоит брать, например, facebook.com — возникнут проблемы с подключением. Просто добавьте этот скрипт в планировщик и запускайте каждые 2-3 минуты. Если хотите, можно отключить отчёты в логах. Я использую это с самого начала и не сталкивался с проблемами по использованию процессора.
     
     
     
    infidel
    Guest
    #11
    0
    19.10.2010 08:47:00
    Вы можете заменить [:resolve “ sex.com ”] на IP-адрес предпочитаемого тестового сервера. Если вы используете одного провайдера, скорее всего, сможете узнать один из его IP-адресов (например, почтового сервера), который всегда будет доступен. Это поможет избежать любых проблем с DNS. Я просто взял [:resolve “ xxx.com ”], потому что так было проще менять для тестирования.
     
     
     
    infidel
    Guest
    #12
    0
    19.10.2010 08:55:00
    Нельзя запускать скрипт построчно в терминале. Нужно создать скрипт (с правами на запись) и запускать его через планировщик или вручную. К сожалению, это сильно усложняет отладку, потому что нельзя видеть, что происходит. Замена  
    if ($pingresult=0) do={:log info (“Gateway $k Down! $pingresult / $pingcount”)} else={:log info (“Gateway $k Up $pingresult / $pingcount”)};  
    на  
    if ($pingresult=0) do={:log info (“Gateway $k Down! $pingresult / $pingcount”)};  
    будет логировать только упавшие шлюзы. Тогда нужно будет найти скрипт, который отправит файл вам по почте. Кажется, я где-то на форуме видел что-то подобное.
     
     
     
    WirelessRudy
    Guest
    #13
    0
    21.10.2010 23:48:00
    Хорошо, похоже, скрипт работает нормально. Я наконец-то восстановил свою вторую линию, и скрипт проверил её как активную, также включил все маршруты, снова указывающие на эту вторую линию. Всё отлично работает. Я сделал простой скрипт, который включает/отключает два других скрипта, которые я написал для включения/отключения набора Queue trees (я просто включаю/отключаю родительское правило, дочернее автоматически становится неактивным или активным в зависимости от состояния родителя). Но как встроить в твой скрипт логику: если один шлюз недоступен, выполняется скрипт “QTree_one_adsl”, а если оба шлюза снова активны — выполняется скрипт “QTree_two_adsl”? Пожалуйста, помоги с этим, я совсем не понимаю, как это сделать на скриптовом языке.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры