Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • 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
    Удалить все подключения в Firewall-Connections

    Удалить все подключения в Firewall-Connections

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Удалить все подключения в Firewall-Connections, RouterOS
     
    parscon
    Guest
    #1
    0
    13.01.2016 09:11:00
    Всем привет! Мне нужен скрипт, который сможет удалить все соединения в IP—>Firewall—>Connections. Я использую этот скрипт:  
    /ip firewall connection {:foreach r in=[find] do={remove $r}}
    Но он удаляет не все. Пожалуйста, помогите.  
    С наилучшими пожеланиями.
     
     
     
    tullaman
    Guest
    #2
    0
    05.02.2018 11:18:00
    Всем привет, ответ boen_robot работает у меня. Идея с включением и отключением conn-tracking на пару секунд с последующим включением не сработала — я пробовал время до минуты. Может быть, стоит уменьшить стандартное время ожидания соединения до значения меньше того периода, на который отключают conn-track? Но, как я уже сказал, ответ boen_robot решает проблему. /Tullaman.
     
     
     
    pothi
    Guest
    #3
    0
    02.02.2019 03:29:00
    Спасибо, @boen_robot. Твой код/ответ всё ещё работает. У меня была маленькая, но раздражающая проблема при переключении — существующие соединения не переходили на нового провайдера. Очистка существующих соединений с помощью твоего кода решила эту проблему.
     
     
     
    yreks
    Guest
    #4
    0
    02.02.2019 05:56:00
    Если соединений много — около 5600, то мне пришлось пять раз запускать команду clean / ip firewall connection remove [find]. Сначала в терминале я получил ответ «нет такого элемента (4)».
     
     
     
    igoldstein
    Guest
    #5
    0
    24.01.2024 00:50:00
    Что значит «no such item (4)»? И как мне понять, сколько раз нужно добавить команду «/ip firewall connection remove [find]» в мой скрипт?

    Это мой скрипт DOWN, который netwatch запускает при обнаружении, что основной интернет упал:  
    log warning "PRIMARY link seems to be DOWN - Running Down script"  

    /ip route set [find comment="Default Route"] distance=15

    /ip firewall connection {:foreach i in [find protocol="tcp"] do={remove $i}}
    /ip firewall connection {:foreach i in [find protocol="udp"] do={remove $i}}

    /ip firewall filter set [find comment="tcp reset"] disabled=no

    delay delay-time=10  

    /ip firewall filter set [find comment="tcp reset"] disabled=yes

    /system script run DynDnsF  

    /tool e-mail send to=myemailaddress@noemail.com subject="$[/system identity get name] network change" body="Primary connection failed and successfully connected to secondary"
     
     
     
    rextended
    Guest
    #6
    0
    24.01.2024 08:41:00
    Я уже отвечал год назад… Нужно добавить «where timeout>60», как в моём примере, потому что закрытые соединения во время выполнения скрипта всё ломают.
     
     
     
    elico
    Guest
    #7
    0
    03.03.2024 10:31:00
    Следующий скрипт отлично работает на RouterOS V7.x, но мне бы хотелось, чтобы он был на foreach, если это возможно. Проблема в том, что у меня устройство с более чем 60 тысячами отслеживаемых соединений, и когда я пытаюсь использовать скрипт с foreach из тех, что выше, он делает «find» для каждого соединения, и это занимает вечность, чтобы очистить соединения.  
    {  
    do {  
    :local e 1;  
    :while ($e=1) do {  
     :set e 0;  
     :do {  
    /ip/firewall/connection/remove [find];
    } on-error={  
    :set e 1;  
    :log info "error 1 removing FW connection";  
    }  
    }  
    :log info "SUCCESS removing FW connection";  
    } on-error={  
    :log info "error 2 removing FW connection";  
    }  
    }
     
     
     
    rextended
    Guest
    #8
    0
    04.03.2024 10:52:00
    Игнорируя неправильный способ программирования с бесполезным do={...} и прочими вещами... всё ещё отсутствует "where timeout>60", что делает on-error совершенно бесполезным... /ip firewall connection print where (timeout>60) [remove $".id"] Если устройство достаточно быстрое, таймаут можно уменьшить с 60 до минимум 10 секунд.
     
     
     
    elico
    Guest
    #9
    0
    15.03.2024 20:46:00
    В общем, если вы хотите сбросить все правила отслеживания соединений FW, то сделать это нажатием кнопки в winbox нельзя, но можно через /ip/firewall/connection/print где (timeout>15) [remove $".id"]. Я могу это проверить, но мой скрипт работает нормально, может быть, этот конкретный однострочник лучше или быстрее в каком-то смысле. Но обработка ошибок — это нормальная практика в программировании, так что я не понимаю, почему я должен предпочесть однострочник? Что в нём лучше? Единственное отличие — это наличие цикла, но технически в чём реальная разница между использованием однострочника внутри цикла for или while и конструкцией с on-error?

    Я могу запустить цикл for для каждого отдельного элемента (30-40 тысяч) и использовать do { } on-error {} для одной операции удаления.

    {
       :log info "Начинаю очистку отслеживания соединений FW";
       :do {
           :foreach entry in=[/ip/firewall/connection/find] do={
               /ip/firewall/connection/remove $entry;
           }
       } on-error={
           :log info "ошибка 1 при удалении соединения FW";
       }
       :log info "Закончил очистку отслеживания соединений FW";
    }

    Этот код сработает даже без проверки, есть ли 10, 15, 30 или 60…
     
     
     
    Amm0
    Guest
    #10
    0
    15.03.2024 21:33:00
    Боже… Это похоже на сравнение функционального и процедурного программирования. Но если голосовать, то однозначный победитель — @rextended. Версия @elico приемлема, если ему такой стиль нравится. Но она просто неэффективна и неаккуратна, если выбирать по качеству.

    Несколько замечаний:  
    1. Использование on-error= для защиты [remove] вполне разумно — например, файл может закрыться между find и remove из-за плохого тайминга.
    2. Перевод строки — это вполне валидный разделитель команд. Точки с запятой не нужны, так что их можно считать лишними символами для обработки, особенно если стремишься к максимальной эффективности (ведь тогда получается два разделителя: ; и \n).

    Особенность подхода @rextended с использованием «конвейера вывода» (моё название, у некоторых скриптов нет конкретных терминов) — здесь больше функционального программирования — выделяется особенно ярко. Обратите внимание, что сама команда print вызывает cmd во время итерации, и при этом «цикл» явно не нужен. Можно добавить «as-value», чтобы привести вывод в необходимый вид.

    Не знаю, но, думаю, remove всё равно может не сработать, так что можно добавить опцию «:retry» (которая будет пытаться выполнить заново при ошибке). Например, в сравнении с :while циклом, который теоретически может работать бесконечно при постоянных ошибках, хоть это и маловероятно.
     
     
     
    Amm0
    Guest
    #11
    0
    15.03.2024 21:47:00
    Если убрать условие (timeout>60) в версии @rextended, всё равно должно работать со всеми записями. В операторе "where" всё равно что-то происходит, например [:remove $“.id”], даже без условий для сопоставления.
     
     
     
    igoldstein
    Guest
    #12
    0
    13.01.2023 15:58:00
    Ты уже понял, как очистить соединения и не получить эту ошибку?
     
     
     
    rextended
    Guest
    #13
    0
    13.01.2023 17:40:00
    /ip fire conn  
    :foreach idc in=[find where timeout>60] do={
    remove [find where .id=$idc]
    }
     
     
     
    benlg
    Guest
    #14
    0
    31.01.2022 13:21:00
    Это работает безупречно, независимо от количества соединений, которые нужно очистить:

    :local e 1  
    :while ($e) do={  
     :set e 0  
     :do {/ip firewall connection remove [find]} on-error={:set e 1}
    }
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры