Pull to refresh

Блокировка загрузки файлов по расширению. Mikrotik RouterOS

Reading time2 min
Views26K
Привет Хабр! Существует много оборудования и ПО, которое может заниматься фильтрацией трафика. В моем случае это Mikrotik RB3011UiAS-RM. Задача была следующей: запретить загрузку определенных форматов файлов.

Вроде простая задача, и быстрое гугление привело к решению блокировать соединения через Layer7, ибо Web-Proxy работает только с HTTP. И примеры были, но работать так как надо — не работало.
upd: решение работает только если с HTTPS страницы сайта идет запрос файла по HTTP. ( iaon ) ( drsmoll )
По итогу: Пример с mp3-tut.net работает, а с www.nasa.gov/connect/sounds/index.html не работает.

Итак, первая ссылка по Mikrotik Layer7 приводит на Wiki-Mikrotik.

А там мы видим, что для работы Layer7 надо заполнить регулярное выражение, которым будет оперировать роутер. Также есть пометка об использовании POSIX-совместимых regexp.

image

Один из первых вариантов regexp:

^.+(exe|mp3|mpeg).*$

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

Далее было проверено множество сайтов из первых трех страниц выдачи Google. И я пришел к выводу — надо ковырять regexp.

И снова Google и поиск. В итоге набрел на замечательные сайты:

http://web-sniffer.net/
https://regex101.com/

Первый выдает какие запросы уходят на загрузку файла. Второй из этого запроса по регулярному выражению выдает совпадения.

В итоге я пришел к следующему варианту:

GET .*(\.exe|\.bat|\.reg|\.cmd|\.scr|\.vbs|\.vbs|\.ws|\.wsf|\.wsc|\.apk)[^a-zA-Z0-9].*HTTP.*\n

Рассмотрим подробно:

  • GET — начало строки в которой происходит запрос чего-либо на сайте example.com
  • .* — сколько угодно любых символов
  • (\.exe|\.bat|\.reg|\.cmd|\.scr|\.vbs|\.vbs|\.ws|\.wsf|\.wsc|\.apk) — список того что ищем
  • .* — сколько угодно любых символов
  • [^a-zA-Z0-9] — знаки, ^=НЕ входящие в множество a-z, A-Z, 0-9
  • .*HTTP.*\n — HTTP, обрамленное любыми символами ( HTTP.* необязательно), и \n — перевод строки

Предпоследний пункт, с [^a-zA-Z0-9] используется, чтобы позволить неуправляющие символы, например: php.net/manual/ru/function.exec.php

  1. Connect to 72.52.91.14 on port 80 ... ok
    GET /manual/ru/function.exec.php HTTP/1.1
    Host: php.net
  2. Connect to 72.52.91.14 on port 80 ... ok
    GET /manual/ru/function.exe.php HTTP/1.1
    Host: php.net

Правило применится только лишь во втором случае.

Да, строка GET где будет .расширение. будет дропаться. Но в моем случае этого достаточно. Пользователи не жаловались. А вы сможете дополнить как угодно эти правила.

Далее, чтобы все работало как надо создаем правила для Firewall:
upd: — вместо DROP указывайте REJECT-TCP RESET. В этом случае браузеру приходит ответ «Соединение сброшено». Позволяет сразу отказываться от загрузки страницы или фрейма, на которые сработало правило, что в свою очередь ускорит загрузку. (Спасибо за подсказку AcidVenom)

image

В списке AllowAll находятся IP адреса, к которым правило не применяется.

Проверяем набор регулярных выражений Layer7:

image

Вот и все!
Tags:
Hubs:
+13
Comments28

Articles