Блокування завантаження файлів по розширенню. Mikrotik RouterOS

Привіт Хабр! Існує багато обладнання і ПЗ, яке може займатися фільтрацією трафіку. У моєму випадку це Mikrotik RB3011UiAS-RM. Задача була наступною: заборонити завантаження певних форматів файлів.

Начебто просте завдання, і швидке гугление призвело до рішення блокувати з'єднання через Layer7, бо Web-Proxy працює тільки з HTTP. І приклади були, але працювати так як треба — не працювало.

Отже, перша посилання по 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, обрамлене будь-якими символами (необов'язково), і \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:

image
У списку AllowAll знаходяться IP адреси, до яких зазвичай не застосовується.

Перевіряємо набір регулярних виразів Layer7:

image
От і все!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.