Ошибка в работе L7 в Mikrotik

    Решая задачу, выявил странное поведение L7 в Mikrotik. При явном указании в регулярном выражении регистр символов игнорируется, даже если в регулярном выражении символы заданы в байтах.

    image



    Поставим задачу (задача специально придумана для демонстрации ошибки).
    Заблокировать следующий URL: http://chelaxe.ru/Summary/
    Как видно в URL есть буква в верхнем регистре: S.

    Для этого воспользуемся Layer7 в MikroTik`е, который умеет потрошить пакеты. Он собирает первые 10 пакетов или 2кб из соединения и ищет в них необходимые данные по регулярному выражению.

    Настраивается все так:
    /ip firewall layer7-protocol add name=lock regexp=^.*(\/Summary\/).*(chelaxe\.ru).*$
    /ip firewall filter add action=drop chain=forward disabled=no dst-port=80 layer7-protocol=lock protocol=tcp src-address=192.168.0.0/24

    Через WinBox
    image


    Теперь необходимо составить верное регулярное выражение (POSIX). Сначала я просто попытался сделать так:

    ^.*(chelaxe\.ru\/Summary\/).*$

    но у меня ничего не получилось, тогда я взял Wireshark и посмотрел на пакеты:
    image
    Как видим GET строка в пакете отдельно от Host строки и GET строка идет ранее:

    GET /Summary/ HTTP/1.1
    Host: chelaxe.ru

    Переделываем регулярное выражение:

    ^.*(\/Summary\/).*(chelaxe\.ru).*$

    Проверяем:

    image

    Для проверки и создания регулярных выражений пользовался regex101.com спасибо 0dmin за статью Разбор регулярных выражений.

    Добавляем все в MikroTik и переходим на http://chelaxe.ru/Summary/
    В результате: НЕ РАБОТАЕТ

    Исправляем регулярное выражение на:
    ^.*(\/summary\/).*(chelaxe\.ru).*$
    В результате: РАБОТАЕТ, но блокирует как http://chelaxe.ru/Summary/ так и http://chelaxe.ru/summary/ (специально создал две странички которые зависят от регистра буквы S)

    Попробовал сделать по другому:

    ^.*(\x2f\x53\x75\x6d\x6d\x61\x72\x79\x2f).*$

    Это строка в байтах соответствует, строки /Summary/
    В результате: НЕ РАБОТАЕТ

    Меняю байт \x53 на \x73 (S на s):

    ^.*(\x2f\x73\x75\x6d\x6d\x61\x72\x79\x2f).*$
    В результате: РАБОТАЕТ, но блокирует как http://chelaxe.ru/Summary/ так и http://chelaxe.ru/summary/

    Получается пакет уходит от меня в со строкой в верхнем регистре и приходит на сервер в таком же виде (сайт ведь разбирает в верхнем регистре или в нижнем), регулярное выражение верное, но при поиске строки в верхнем регистре ничего не возвращает, а при поиске строки в нижнем регистре возвращает оба варианта (и в верхнем и в нижнем).

    Вывод: Использовать L7 в MikroTik`е для определения регистрозависимой информации в пакете невозможно.

    UPD: Пользовался версией v5.26 (последняя в 5 ветке), а в ветке 6 данный баг был пофиксен:
    What's new in 6.0rc12 (2013-Mar-26 17:18):
    *) fixed layer7 matcher — it is case insensitive now;

    Проверил в версии v6.3 все работает как надо. Так что данная особенность имеет место быть, только в 5 ветке RouterOS

    Размышления: Посмотрел как блокируют сайты из реестра провайдеры: при изменении регистра в GET пути страничка все равно заблокирована.

    у ТТК:
    image
    image


    Если сайт у которого заблокирована такая страничка создаст страничку с таким же URL только в верхнем регистре и потребует его разблокировать ввиду того что он не содержит ничего запрещенного, то разблокируется и внесенный в реестр URL.
    • +1
    • 28.2k
    • 2
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 2

      0
      Видимо этот самый L7 в Mikrotik с дуру всю строку в нижний регистр преобразует.
        +2
        Спасибо за статью, Александр Федорович. =)
        Да и ваша страничка получила немерянно PR и ТИЦ.

        Only users with full accounts can post comments. Log in, please.