Приветствую всех ! Эх давно я тут не был ...
Это не готовый, к сожалению, скрипт, а вопрос к знатокам ...
Можно ли (допустим при наступлении какого-то события) скриптом включить правило в /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 мы видим активно правило или неактивно, а как это узнать из скрипта ?
Прошу прощения за длинное объяснение. Может кто может помочь ?
активация/дезактвация правила в файерволле по условию скриптом
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
- podarok66
- Модератор
- Сообщения: 4402
- Зарегистрирован: 11 фев 2012, 18:49
- Откуда: МО
Предположим начало у вас есть:
Давайте попробуем опросить систему и вызнать, сколько правил есть с таким комментом:
Теперь узнаем, сколько из них неактивные:
Ну и дальше, если ($fcount = $o) у вас все правила включены, если ($o = 0) выключены, если ещё какой-то результат, отличный от перечисленных, часть правил включена, а часть отключена. Вот последний вариант намекает как бы, что предыдущая отработка скрипта прервалась, не закончившись.
Кстати, весь ваш foreach у меня заменён на что-то типа
Срабатывает на несколько правил без проблем...
Код: Выделить всё
: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)}};
Кстати, весь ваш foreach у меня заменён на что-то типа
Код: Выделить всё
/ip firewall mangle set [find comment=$pcrule] disable=yes
Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Приветствую нашего дорогого, Podarok66 !
Вот это мне нужно было ! (никак не мог с синтаксисом справиться у GET в этой конструкции, старею, наверное ...
)
Остальное у меня немножко не так просто ... Но главное Вы подсказали, остальное, как говориться, дело техники.
СПАСИБО !
Это, я, разумеется знаю, моя, более тяжелая конструкция, использовалась, просто в эксперименте для ускорения и "надежности" так сказать , но тоже спасибо, за напоминание. Для всех полезно. Ну Вы меня поняли ...
Код: Выделить всё
:if ([/ip firewall mangle get $u disabled] = true) do=

Остальное у меня немножко не так просто ... Но главное Вы подсказали, остальное, как говориться, дело техники.
СПАСИБО !
Код: Выделить всё
Кстати, весь ваш foreach у меня заменён на что-то типа
/ip firewall mangle set [find comment=$pcrule] disable=yes
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
- podarok66
- Модератор
- Сообщения: 4402
- Зарегистрирован: 11 фев 2012, 18:49
- Откуда: МО
Добрейший денёчек, милый наш доктор.
Да, вот так мы и ищем недостающие кусочки, собираем всё в кучу и лепим что-то своё и для себя. Рад что мои скромные потуги иногда нужны людям, к которым я имею тёплые чувства. Становится легко на душе ... С наступающим праздником вас!

Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Еще раз спасибо, Podarok66 !
В результате, то что я хотел работает, благодаря Вашей подсказке.
Итоговый скрипт такой: (производит переключение только когда действительно меняется "окно в Мир", то есть шлюз) и в лог лишнего не сыпет (шлюза тут два, иначе нужно без else - больше "прямых" проверок if do={ ):
Кстати, без :foreach тут видимо не обойтись - если правил с комментарием $pcrule не одно в манглах, то ведь нужно их все "обойти" поскольку нужно не сразу все переключать, а сначала найти и проверить на "активность" ...
В результате, то что я хотел работает, благодаря Вашей подсказке.
Итоговый скрипт такой: (производит переключение только когда действительно меняется "окно в Мир", то есть шлюз) и в лог лишнего не сыпет (шлюза тут два, иначе нужно без 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}}}
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947