Поясните строки в скрипте "удаление соединений"

Автоматизация при помощи встроенного скриптового языка и RouterOS API
Аватара пользователя
sasha300
Сообщения: 107
Зарегистрирован: 03 мар 2016, 16:00
Откуда: Санкт-Петербург

Поясните строки в скрипте "удаление соединений"

Сообщение sasha300 »

Приветствую!
Появилась необходимость подчищать маршруты после переключения каналов. Знакомый скинул скрипт, позволяющий делать это, вот код (атс висит на 192.168.0.15):

Код: Выделить всё

/ip firewall connection remove [find where src-address~"192.168.0.15"]

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

:foreach i in=[/ip firewall connection find dst-address~":5060" protocol~"udp"] do={ /ip firewall connection remove $i } 
:foreach i in=[/ip firewall connection find dst-address~":5068" protocol~"udp"] do={ /ip firewall connection remove $i } 

/ip firewall connection remove [find where src-address~"192.168.0.15"]
Все работает, но нифига не понял с переменной "i", в общем по порядку:

Код: Выделить всё

/ip firewall connection remove [find where src-address~"192.168.0.15"]
удаляет все соединения, где в Src. Address значится 192.168.0.15
Если так, то почему там стоит тильда "~", а не знак равно?

Код: Выделить всё

:foreach i in=[/ip firewall connection find protocol~"udp"] do={ /ip firewall connection remove $i }
ну тут, как я понял, надо грохнуть все соединения, имеющие протокол udp

Код: Выделить всё

:foreach i in=[/ip firewall connection find dst-address~":5060" protocol~"udp"] do={ /ip firewall connection remove $i } 
:foreach i in=[/ip firewall connection find dst-address~":5068" protocol~"udp"] do={ /ip firewall connection remove $i } 
если в предыдущем правиле мы грохнули все соединения с UDP протоколом, то зачем эти 2 правила? Да, я вижу что адрес назначения идет на 5060 и 5068 порты, но там же протокол UDP, а предыдущее правило уже удалило эти соединения. Тогда зачем они нужны?
Ну и напоследок:

Код: Выделить всё

/ip firewall connection remove [find where src-address~"192.168.0.15"]
Зачем дублировать правило, которое было в начале?
Заранее спасибо за ответ!
p.s.: на Микротике 2 канала: основной и резервный. Когда тик переключается на резервный, а потом возвращается на основной, то внешний номер отваливался от АТС (пакеты к серверу Телфин не шли), причем маршруты до и после переключения на основной канал не менялись. Трабл оказался в соединениях, из-за которых пакеты не шли до сервера Телфина. Но АТС регается по 5060 порту UDP протокола, может проще грохать только эти соединения?
Аватара пользователя
Chupaka
Сообщения: 4095
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Поясните строки в скрипте "удаление соединений"

Сообщение Chupaka »

судя по разнообразию подходов, код собирался с миру по нитке (этим же можно объяснить дублирование правил), поскольку

Код: Выделить всё

/blablabla remove [find where blablabla]
и

Код: Выделить всё

:foreach i in=[/blablabla find blablabla] do={ /blablabla remove $i }
это реализация одного и того же удаления разными способами, причём первый предпочтительнее, насколько понимаю (как минимум он проще), хотя косяк у обоих может быть один и тот же: на большом объёме удаляемых данных может возникнуть ситуация, когда посреди процесса удаления очередное соединение досрочно вываливается из трекинга, например, по таймауту, и попытка удаления этой записи вызовет ошибку, останавливая остаток процесса

касательно тильды: к сожалению, src/dst-address в connections хранит не просто адрес, но и порт, при его наличии. поэтому строку "192.168.0.15:5060" условие src-address="192.168.0.15" не найдёт. приходится использовать не проверку на равенство ("="), а сравнение с регулярным выражением ("~"). как следствие - лучше использовать что-то вроде ~"^192.168.0.15:", это, по идее, менее затратно с точки зрения процессора (надо искать совпадение с начала строки, а не по всей строке; здесь могу ошибаться, регулярные выражения - жутко оптимизированная весчЪ), и не будет лишних совпадений (например, ~"10.10.10.10" словит как указанный адрес, так и адреса вроде 110.10.10.10, 10.10.10.102, etc)

естественно, к udp регулярные выражения применять - расточительство, обычного сравнения хватит с лихвой
Аватара пользователя
sasha300
Сообщения: 107
Зарегистрирован: 03 мар 2016, 16:00
Откуда: Санкт-Петербург

Re: Поясните строки в скрипте "удаление соединений"

Сообщение sasha300 »

Оки, спасибо за разьяснения, скоро приступаю к DDNS. ;)
Аватара пользователя
sasha300
Сообщения: 107
Зарегистрирован: 03 мар 2016, 16:00
Откуда: Санкт-Петербург

Re: Поясните строки в скрипте "удаление соединений"

Сообщение sasha300 »

Так может грохать вообще все соединения? А то при переключении на резервный канал начинаю пинговать какой-нибудь ресурс, а он не пингуется. А почему? Потому, что предыдущие соединения висят и не дают пропинговку. Хотя тоже странно, маршрут же меняется, почему старые соединения не удаляются автоматически?
Аватара пользователя
Chupaka
Сообщения: 4095
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Поясните строки в скрипте "удаление соединений"

Сообщение Chupaka »

потому что кто сказал, что соединения должны устаревать, если меняется маршрут? :) всякое бывает, конечно, но тем не менее далеко не всегда такое поведение полезно

чтобы грохать все соединения, можно вообще проверить действенность выключения/включения Connection Tracking - по идее, оно должно всё начинать заново, без утомительной процедуры удаления всех соединений по одному
Аватара пользователя
sasha300
Сообщения: 107
Зарегистрирован: 03 мар 2016, 16:00
Откуда: Санкт-Петербург

Re: Поясните строки в скрипте "удаление соединений"

Сообщение sasha300 »

я сегодня прилепил скрипт к шедуллеру и ничего не получилось :(
Отдельно скрипт отрабатывается, в шедуллере нет. Сегодня вечером опять буду эксперементировать, если не получиться, то размещу код тут. А то буксанул на этих соединениях, пора к DDNS переходить.. ;)
Аватара пользователя
Chupaka
Сообщения: 4095
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Поясните строки в скрипте "удаление соединений"

Сообщение Chupaka »

почитал удалённое сообщение, рад, что разбор полётов прошёл успешно :)

сторонним посетителям: если вы что-то пишете в терминале и оно не выдаёт ошибку синтаксиса - это не значит, что есть такая команда; вполне возможно что команда вида /razdel podrazdel set email name=preved выполняет команду set name=preved (т.е. просто меняет имя) для объекта с текущим именем email, а не запускает команду email с параметром name=preved :)
Spine
Сообщения: 3
Зарегистрирован: 07 май 2021, 15:46

Re: Поясните строки в скрипте "удаление соединений"

Сообщение Spine »

Спрошу здесь ибо по теме:
команда

Код: Выделить всё

 /ip firewall connection>
 :put [find where dst-address~"^10\\."]
Отлично находит адеса начинающиеся на 10.
А как найти не начинающиеся? что-то вроде " !~" по аналоги с "!="
Задача: доработать команду

Код: Выделить всё

/ip firewall connection remove [find where protocol~"tcp"]
так, что-бы она рвала все соединения кроме локальных 10.0.0.0/8
Аватара пользователя
Chupaka
Сообщения: 4095
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Поясните строки в скрипте "удаление соединений"

Сообщение Chupaka »

Как говорится, добро пожаловать в мир регулярных выражений :)

Вам нужно что-то вроде

Код: Выделить всё

dst-address~"^([^1]|1[^0]|10[^.])"
Т.е. ловим всё, что начинается не с единицы, либо если с единицы - то следом не ноль, либо если с 10 - то дальше не точка :)