Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • 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
    Добавить неудачное согласование IPSec phase1 в AddrList

    Добавить неудачное согласование IPSec phase1 в AddrList

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Добавить неудачное согласование IPSec phase1 в AddrList, RouterOS
     
    accarda
    Guest
    #1
    0
    22.03.2021 17:39:00
    Всем привет! Я делал скрипт, который смотрит в системный лог и если находит “ipsec,error” о неудачных переговорах phase1, добавляет адрес в черный список. Если кому-то интересно, вот скрипт, который сейчас у меня работает на паре роутеров. Скрипт состоит из функции для поиска дублирующихся адресов в списке адресов и самого основного скрипта. Функция загружается как глобальная переменная и её нужно перезагружать после каждого рестарта роутера.

    # Функция для поиска дублирующихся IP в address-list
    :global searchIPList do={
    :local listName $1
    :local ipAddr $2

    :if ([:len [/ip firewall address-list find list=$listName]] > 0) do={
    :foreach foundIP in=[/ip firewall address-list find list=$listName] do={
    :if ($ipAddr = ([:pick [/ip firewall address-list print as-value where .id=$foundIP] 0]->"address")) do={
    :return "duplicated"
    }
    }
    }
    }

    Это основной скрипт, который можно добавить на роутер, как любой другой.

    # Основной скрипт добавляет в черный список адреса, у которых не прошел IPSec phase1
    :global searchIPList
    :global myBlackListName "intruseBL"

    :foreach i in=[/log find where (topics=ipsec,error && message~"phase1 negotiation failed")] do={
    :local iplength [:find [/log get value-name=message number=$i] " "]
    :if ([:typeof $iplength] = "num") do={
    :if ([:toip [:pick [/log get value-name=message number=$i] 0 $iplength]]~"^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}") do={
    :local intruseIP [:pick [/log get value-name=message number=$i] 0 $iplength]
    :if ([:len [/ip firewall address-list find list=$myBlackListName]] > 0) do={
    :if ([$searchIPList $myBlackListName $intruseIP] != "duplicated") do={
    /ip firewall address-list add list=$myBlackListName address=$intruseIP
    }
    } else={
    /ip firewall address-list add list=$myBlackListName address=$intruseIP
    }
    }
    }
    }

    Армандо
     
     
     
    accarda
    Guest
    #2
    0
    03.01.2022 06:09:00
    Я проверил функцию searchIPList с списком адресов, и она действительно находит только дубликаты. Учтите, что функция работает только с IP-адресами без обозначения CIDR. Так что если в списке был адрес с CIDR, функция не покажет флаг дубликата при выходе. Я пробовал на пустом списке — функция могла добавлять новые адреса или пропускать их, если они были дубликатами. Чтобы избежать произвольного ответа на валидный адрес, я добавлял значение вывода "OK", иначе функция возвращала бы ;;;. Но это не должно мешать основному скрипту, так как он ищет текст "duplicated". В моей системе я обновил глобальную функцию searchIPList с этим дополнительным выводом, хотя это и не критично.

    ПРАВКА: не используйте это изменение кода, так как оно останавливает выполнение функции для всего списка адресов, если совпадений не найдено. Лучше оставаться с оригинальным кодом.

    :global searchIPList do={
    :local listName $1
    :local ipAddr $2

    :if ([:len [/ip firewall address-list find list=$listName]] > 0) do={
    :foreach foundIP in=[/ip firewall address-list find list=$listName] do={
    :if ($ipAddr = ([:pick [/ip firewall address-list print as-value where .id=$foundIP] 0]->"address")) do={
    return "duplicated"
    } else={
    return "OK"
    }
    }
    }
    }
     
     
     
    Manth15
    Guest
    #3
    0
    03.01.2022 14:31:00
    Спасибо, accarda. Значит, мне нужно объединить этот скрипт с оригинальным мастер-скриптом или создать отдельный?
     
     
     
    accarda
    Guest
    #4
    0
    03.01.2022 14:38:00
    На самом деле вы можете удалить глобальную функцию searchIPList из вашего скрипта → меню Environment в Winbox и загрузить вместо неё эту новую версию. Но, как я уже сказал, ничего особо не изменилось, кроме того, что теперь устанавливается выходное значение, если в списке нет совпадений с адресом. Всё остальное осталось без изменений.
     
     
     
    Manth15
    Guest
    #5
    0
    03.01.2022 16:12:00
    Очень странно, что он до сих пор не добавляет новый IP из моих логов. Это из-за того, что у меня версия 7.1.1?
     
     
     
    accarda
    Guest
    #6
    0
    03.01.2022 17:53:00
    Не совсем уверен, так как у меня это стоит на роутере с версией v6.x. Однако, если что-то и не полностью совместимо с v7, то это будет касаться основного скрипта (а не функции для поиска дублирующихся IP). Я проверял searchIPList на ROS v7.1.1, и он отлично находил дублирующийся IP; но на том роутере у меня не было полного скрипта для поиска по логу и добавления этих неудачных попыток в адресный список. Точно не знаю, изменился ли в ROS v7.1.1 какой-то код для получения IP из лога, но я бы на это не рассчитывал.
     
     
     
    Manth15
    Guest
    #7
    0
    03.01.2022 19:27:00
    Ниже нет никакого результата от командной строки. Я удалил все IP из списка доступа в фаерволе, снова запустил основной скрипт — и он нормально добавил IP. Что-то странное, вроде как searchIPList не ищет по списку доступа intruseBL или что-то в этом роде. У тебя вывод есть, когда запускаешь searchIPList через команду? @MikroTik ] > /system script run searchIPList @MikroTik ] >
     
     
     
    Manth15
    Guest
    #8
    0
    03.01.2022 21:36:00
    Итак, я искал в интернете и нашёл, что некоторые пользователи успешно добавляли в свои скрипты эту строку: on-error={}. Однако, каждый раз, когда я добавляю её в основной скрипт, появляется ошибка строки. Если мы сможем интегрировать on-error={} в основной скрипт, думаю, всё заработает. Ниже пример из другого скрипта:

    :foreach i in=[/ip firewall address-list find] do={
     :if ([/ip firewall address-list get $i comment] = "IPblacklist1") do={
       :do { /ip firewall address-list remove $i } on-error={}  
     }  
    }

    Спасибо, Taylor
     
     
     
    accarda
    Guest
    #9
    0
    03.01.2022 21:43:00
    На самом деле searchIPList — это функция (внутри глобальной переменной), поэтому вызвать её напрямую так нельзя. В терминале её можно вызвать так: :put [$searchIPList list IP], где list — имя вашего списка адресов, а IP — адрес, который хотите проверить. То есть её запускают, подавая два необходимых параметра. Основной скрипт, где эта функция загружена, можно выполнить из терминала примерно так же, как вы указали для searchIPList, но не саму функцию отдельно.
     
     
     
    Manth15
    Guest
    #10
    0
    03.01.2022 21:58:00
    Хорошо, я добавил свой список, имя отображается, возвращается OK как для дубликата, так и для нового IP-адреса. Имя моего списка в файрволе совпадает с вашим intruseBL.
     
     
     
    Manth15
    Guest
    #11
    0
    03.01.2022 22:55:00
    Вот мой вывод, реально странно — должно показываться как дубликат, а не просто «ок».  
    [taylor@MikroTik] > /ip firewall address-list print
    Столбцы: LIST, ADDRESS, CREATION-TIME  
    LIST       ADDRESS          CREATION-TIME  
    0 intruseBL  74.82.47.21      jan/03/2022 10:13:03  
    1 intruseBL  65.49.20.106     jan/03/2022 10:13:03  
    2 intruseBL  64.62.197.78     jan/03/2022 10:13:03  
    3 intruseBL  74.82.47.27      jan/03/2022 10:13:03  
    4 intruseBL  184.105.247.195  jan/03/2022 10:13:03  
    5 intruseBL  184.105.247.227  jan/03/2022 10:13:03  
    6 intruseBL  184.105.247.219  jan/03/2022 10:13:03  
    7 intruseBL  184.105.139.68   jan/03/2022 10:13:03  
    8 intruseBL  216.218.206.85   jan/03/2022 10:13:03  
    9 intruseBL  64.62.197.146    jan/03/2022 10:13:03  
    [taylor@MikroTik] > :put [$searchIPList intruseBL 64.62.197.146] OK
     
     
     
    accarda
    Guest
    #12
    0
    04.01.2022 06:39:00
    Привет, Taylor, проигнорируй, пожалуйста, предложенное изменение в функции searchIPList и используй оригинальный код (я приведу его снова, чтобы не было путаницы):

    :global searchIPList do={
    :local listName $1
    :local ipAddr $2

    :if ([:len [/ip firewall address-list find list=$listName]] > 0) do={
    :foreach foundIP in=[/ip firewall address-list find list=$listName] do={
    :if ($ipAddr = ([:pick [/ip firewall address-list print as-value where .id=$foundIP] 0]->"address")) do={
    :return "duplicated"
    }
    }
    }
    }

    Как видишь, я снова убрал сообщение OK, которое выводилось, когда IP не находился. Это была моя ошибка, потому что если возвращать это значение, функция заканчивает работу и прекращает проверку остальных элементов. Такой подход работал бы с адресным списком из одного элемента, чего в нашем случае не было. Так что возвращаемся к исходной функции, которая возвращает "duplicated" только при обнаружении дублирующей записи (это была изначальная задумка).

    Если протестируешь функцию ещё раз, увидишь, что она поймает дубликат; вернёт ;;;, когда совпадений нет и адреса в списке нет.

    Почему изначально возникла проблема — это нужно выяснять, но так мы исправляем недавнюю ошибку.

    Armando
     
     
     
    Manth15
    Guest
    #13
    0
    04.01.2022 14:34:00
    Привет, accarda! Большое спасибо тебе, и я действительно верю, что теперь всё работает. Возможно, главный скрипт изначально неправильно создавал скрипт в окружении. Может, нам стоит добавить мастер-скрипт, чтобы в будущем все могли им пользоваться. Я пересмотрел кучу информации в интернете, и, кажется, это первое решение, которое действительно помогает. Я буду наблюдать и дам тебе знать завтра, автоматически ли всё добавляется, но по моим тестам немного раньше — всё работает отлично. Похоже, наши совместные усилия наконец-то решили эту давнюю проблему =)…
     
     
     
    accarda
    Guest
    #14
    0
    04.01.2022 15:51:00
    Спасибо, что подтвердили, что у вас тоже всё сработало. Скорее всего, при первой попытке что-то не синхронизировалось как надо. Тем не менее, в начале этой темы есть и основной скрипт, и функция — они работают вместе, и код с тех пор не менялся. Скрипт должен регулярно загружаться и запускаться через планировщик, а функция должна быть загружена как глобальная переменная в системе. Когда скрипт запускается, создаётся дополнительная глобальная переменная (lastTime), которая хранит время последнего добавления какого-то IP. Это делается, чтобы не добавлять одно и то же снова и снова из одной и той же части лога, учитывая, что при получении таких строк лога из памяти, самая старая информация автоматически удаляется через какое-то время. Армандо
     
     
     
    Manth15
    Guest
    #15
    0
    04.01.2022 16:51:00
    Да, это была моя ошибка, я не понимал, что нужно запускать два разных скрипта. Я добавил его в список скриптов, затем запустил оба — и всё сработало отлично. Подтверждаю, что проблема была из-за того, что скрипт searchiplist не запускался, потому что там не было значений в окружениях. Спасибо за вашу усердную работу и помощь с решением этой проблемы.
     
     
     
    Manth15
    Guest
    #16
    0
    02.01.2022 16:18:00
    По какой-то причине этот скрипт отлично работает только при первом запуске. Я обнаружил новый IP, который пытался подключиться к IPsec VPN (ошибка), но он не добавился в список в файерволе. После небольшого расследования я удалил все IP из списка доступа файервола и запустил скрипт снова. И почему-то на этот раз всё сработало нормально. Не уверен, работает ли твой скрипт по выявлению дубликатов адресов. Дай знать, я новичок в Mikrotik и очень хочу, чтобы это заработало. Заранее спасибо. @MikroTik ] > /system script run intruseBL ошибка: запись с таким значением уже есть
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры