Поисковые конструкции в Mikrotik

Написал admin . Опубликовано в Mikrotik просмотров 7 868

Так себеПойдетХорошоПонравилосьОтличный пост (3 votes, average: 5,00 out of 5)
Загрузка...

Mikrotik — замечательная роутер ОС. Богатые возможности и стабильность работы подкупают, заставляя задуматься, на сколько выгоднее работать с ней, а не допустим с Cisco. Так как частенько приходится сталкиваться с некоторыми задачами на Mikrotik, буду публиковать интересные приемы.

В данном посте мы рассмотрим разные методы поиска строк в списках Mikrotik, ну и что-нибудь сделаем с ними.

Для чего нам может понадобиться поиск в списках?
Все просто — списки, это гибкий инструмент по фильтрации доступа к сервисам и на основе них делают разграничение доступа по IP.


Допустим у нас есть лист под именем access-inet. Давайте посмотрим:

> ip firewall address-list print where list=access-inet
Flags: X - disabled, D - dynamic
# LIST ADDRESS
228 ;;; cid=3931;rule_id=18;
access-inet 10.60.10.229
230 ;;; cid=2796;rule_id=7;
access-inet 10.60.2.201
232 ;;; cid=1825;rule_id=18;
access-inet 10.60.8.202

Замечательно. Что с ним можно сделать.

1. Удалить все элементы списка, если есть точное название листа:

> :foreach i in [/ip firewall address-list find where list=access-inet] do={/ip firewall address-list remove $i};

2. Так же можно удалить элементы в группе листов по частичному вхождению имени листа (по маске):

> :foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i list] "access-"]=0) do={/ip firewall address-list remove $i}};

Удалятся элементы во всех листах, в имени которого есть access-

3. Удалять можно не только по имени листа, но и по любому аттрибуту. К примеру комментарию, так как очень часто в него заносят расширенные данные, которые как раз и могут пригодится для поиска таких адресов в списках. К примеру найдем в листах access-inet все элементы с комментарием cid=100; и удалим их:

> :foreach i in [/ip firewall address-list find where list=access-inet] do={:if ([:find [/ip firewall address-list get $i comment] "cid=100;"]=0) do={/ip firewall address-list remove $i}};

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

Для отладки можно воспользоваться директивой :put в контрольных точках. К примеру не удалять, а просто вывести на экран объекты, чтобы проверить запрос. Так же не забывайте, когда используете переменные, что у них есть область видимости.

> :foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i list] "access-"]=0) do={:put $i}};

Раз уж мы затронули списки, то в следующий раз расскажу как эти списки можно держать в одинаковом состоянии на двух разных девайсах (к примеру для организации резервного шлюза в интернет).

Похожие статьи:

Метки: , , , , ,

Trackback from your site.

Comments (4)

  • Greek

    |

    Вместо
    :foreach i in [/ip firewall address-list find where list=access-inet] do={/ip firewall address-list remove $i};

    удобнее сразу:
    /ip firewall address-list remove [find where list=access-inet]

    Reply

    • admin

      |

      Да, спасибо — так действительно веселее выглядит.

      Reply

  • eugene

    |

    спасибо интересная статья, но эта конструкция ищет не вхождение строки с любого символа, а вхождение именно с начала, например:
    при поиска строки abc в строке f.abc поиск ничего не находит.

    Reply

    • admin

      |

      Спасибо за отзыв 🙂
      Для поиска вхождения подстроки, попробуйте воспользоваться оператором «~» вместо «=». В значении сравнения можно указывать POSIX регулярные выражения.

      /ip route print where gateway~»^[0-9 \\.]*202″

      Reply

Leave a comment


Warning: Unknown: open(/var/lib/php/session/sess_154cor7e0p4qhck20v81fspv92, O_RDWR) failed: Permission denied (13) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0