активация/дезактвация правила в файерволле по условию скриптом

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

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

Можно ли (допустим при наступлении какого-то события) скриптом включить правило в /ip firewall mangle если оно выключено и выключить если оно включено, но с предварительной проверкой на "активность" этого правила ?

Поясню зачем и как это нужно ...
Допустим есть кусочек скрипта:

:local pcrule "redirection PC to ether1"
:if ([ping 8.8.8.8 interface=ether1 routing-table="ether1" count=3]>2) do={
:foreach i in=[/ip firewall mangle find comment=$pcrule] do={/ip firewall mangle enable numbers=$i}} else={:foreach i in=[/ip firewall mangle find comment=$pcrule] do= {/ip firewall mangle disable numbers=$i}}


Что он делает очевидно: если есть пинг до Мира то ищем в манглах все правила с комментарием "redirection PC to ether1" и включаем их (делаем их активными). Если же пинга в Мир нет - выключаем эти правила. Я это использую для того, чтобы управлять правилами меняющими трафик разных клиентов по разным маршрутам ... (но сейчас это не важно, это пример).

Важно другое: всё бы хорошо, но скрипт следит из Планировщика за всем этим хозяйством и исполняется скажем раз в 30 секунд. Тогда в лог постоянно идут сообщения типа mangle set pc rule (ну или что то в этом роде ...) и сильно при таком количестве засоряют лог. Логирование для мангл отключать не хочется (это кривое решение)..., а хочется сделать красиво. Решение мне видится следующее - перед действием по включению/отключению правила в мангле в вышеприведенном скрипте надо как-то добавить проверку типа "ЕСЛИ НАМ СЕЙЧАС НУЖНО ОТКЛЮЧАТЬ НО ПРАВИЛО УЖЕ НЕ АКТИВНО (ВЫКЛЮЧЕНО) ТО НЕ БУДЕМ НИЧЕГО ДЕЛАТЬ, А ЕСЛИ ПРАВИЛО АКТИВНО ТО ВЫКЛЮЧИМ ЕГО" и наоборот. Тогда в лог сообщения о действии над /ip firewall mangle выдалось бы только когда пинг через меченный маршрут действительно восстановится или пропадет, а не при каждом срабатывании скрипта в Планировщике.

Проблема в том, что я не знаю как скриптом получить статус правила в мангле - то есть как узнать активно оно в данный момент или задизейблено ... Ясно, что в WINBOX мы видим активно правило или неактивно, а как это узнать из скрипта ?

Прошу прощения за длинное объяснение. Может кто может помочь ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
podarok66
Модератор
Сообщения: 4360
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Предположим начало у вас есть:

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

:local pcrule "redirection PC to ether1";
Давайте попробуем опросить систему и вызнать, сколько правил есть с таким комментом:

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

:local fcount [/ip firewall mangle print count-only where comment=$pcrule];
Теперь узнаем, сколько из них неактивные:

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

:local o 0; 
:foreach u in=[/ip firewall mangle find comment=$pcrule] do={:if ([/ip firewall mangle get $u disabled] = true) do={set o ($o + 1)}}; 
Ну и дальше, если ($fcount = $o) у вас все правила включены, если ($o = 0) выключены, если ещё какой-то результат, отличный от перечисленных, часть правил включена, а часть отключена. Вот последний вариант намекает как бы, что предыдущая отработка скрипта прервалась, не закончившись.
Кстати, весь ваш foreach у меня заменён на что-то типа

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

/ip firewall mangle set [find comment=$pcrule] disable=yes
Срабатывает на несколько правил без проблем...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Приветствую нашего дорогого, Podarok66 !

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

:if ([/ip firewall mangle get $u disabled] = true) do=
Вот это мне нужно было ! (никак не мог с синтаксисом справиться у GET в этой конструкции, старею, наверное ... :-) )
Остальное у меня немножко не так просто ... Но главное Вы подсказали, остальное, как говориться, дело техники.

СПАСИБО !

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

Кстати, весь ваш foreach у меня заменён на что-то типа

/ip firewall mangle set [find comment=$pcrule] disable=yes
Это, я, разумеется знаю, моя, более тяжелая конструкция, использовалась, просто в эксперименте для ускорения и "надежности" так сказать , но тоже спасибо, за напоминание. Для всех полезно. Ну Вы меня поняли ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
podarok66
Модератор
Сообщения: 4360
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Добрейший денёчек, милый наш доктор. :-) Да, вот так мы и ищем недостающие кусочки, собираем всё в кучу и лепим что-то своё и для себя. Рад что мои скромные потуги иногда нужны людям, к которым я имею тёплые чувства. Становится легко на душе ... С наступающим праздником вас!


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Еще раз спасибо, Podarok66 !

В результате, то что я хотел работает, благодаря Вашей подсказке.

Итоговый скрипт такой: (производит переключение только когда действительно меняется "окно в Мир", то есть шлюз) и в лог лишнего не сыпет (шлюза тут два, иначе нужно без else - больше "прямых" проверок if do={ ):

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

:local pcrule "redirection PC to ether1"
:if ([ping 8.8.8.8 interface=ether1 routing-table="ether1" count=3]>2) do={
:foreach i in=[/ip firewall mangle find comment=$pcrule] do={:if ([/ip firewall mangle get $i disabled] = true) do={/ip firewall mangle enable numbers=$i}}} else={:foreach i in=[/ip firewall mangle find comment=$pcrule] do= {:if ([/ip firewall mangle get $i disabled] = false) do={/ip firewall mangle disable numbers=$i}}}
Кстати, без :foreach тут видимо не обойтись - если правил с комментарием $pcrule не одно в манглах, то ведь нужно их все "обойти" поскольку нужно не сразу все переключать, а сначала найти и проверить на "активность" ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить