Решая задачу, выявил странное поведение L7 в Mikrotik. При явном указании в регулярном выражении регистр символов игнорируется, даже если в регулярном выражении символы заданы в байтах.
Поставим задачу (задача специально придумана для демонстрации ошибки).
Заблокировать следующий 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=12 protocol=tcp src-address=192.168.0.0/24
Теперь необходимо составить верное регулярное выражение (POSIX). Сначала я просто попытался сделать так:
^.*(chelaxe.ru/Summary/).*$
но у меня ничего не получилось, тогда я взял Wireshark и посмотрел на пакеты:
Как видим GET строка в пакете отдельно от Host строки и GET строка идет ранее:
GET /Summary/ HTTP/1.1
Host: chelaxe.ru
Переделываем регулярное выражение:
^.*(/Summary/).*(chelaxe.ru).*$
Проверяем:
Для проверки и создания регулярных выражений пользовался regex101.com спасибо 0dmin за статью Разбор регулярных выражений.
Добавляем все в MikroTik и переходим на http://chelaxe.ru/Summary/
В результате: НЕ РАБОТАЕТ
Исправляем регулярное выражение на:
^.*(/summary/).*(chelaxe.ru).*$
В результате: РАБОТАЕТ, но блокирует как http://chelaxe.ru/Summary/ так и http://chelaxe.ru/summary/ (специально создал две странички которые зависят от регистра буквы S)
Попробовал сделать по другому:
^.*(x2fx53x75x6dx6dx61x72x79x2f).*$
Это строка в байтах соответствует, строки /Summary/
В результате: НЕ РАБОТАЕТ
Меняю байт x53 на x73 (S на s):
^.*(x2fx73x75x6dx6dx61x72x79x2f).*$
В результате: РАБОТАЕТ, но блокирует как http://chelaxe.ru/Summary/ так и http://chelaxe.ru/summary/
Получается пакет уходит от меня в со строкой в верхнем регистре и приходит на сервер в таком же виде (сайт ведь разбирает в верхнем регистре или в нижнем), регулярное выражение верное, но при поиске строки в верхнем регистре ничего не возвращает, а при поиске строки в нижнем регистре возвращает оба варианта (и в верхнем и в нижнем).
Вывод: Использовать L7 в MikroTik`е для определения регистрозависимой информации в пакете невозможно.
Отправил данную информацию в MikroTik, посмотрим на их ответ.
Размышления: Посмотрел как блокируют сайты из реестра провайдеры: при изменении регистра в GET пути страничка все равно заблокирована.
Если сайт у которого заблокирована такая страничка создаст страничку с таким же URL только в верхнем регистре и потребует его разблокировать ввиду того что он не содержит ничего запрещенного, то разблокируется и внесенный в реестр URL.
Автор: chelaxe