Привет Хабр! Существует много оборудования и ПО, которое может заниматься фильтрацией трафика. В моем случае это 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

Вот и все!
Поделиться с друзьями
-->

Комментарии (28)


  1. ifaustrue
    08.02.2017 12:50

    Какая нагрузка на память\CPU на вашем железе оказывают такие правила и на какой нагрузке на канал?


    1. xapoh11
      08.02.2017 13:35

      +1-2% нагрузки на процессор. Память не ест.
      Канал 25 мбит\с. До 100 пользователей, из них 15 в списке исключений.
      image


  1. AcidVenom
    08.02.2017 13:05

    Вместо дропа делайте tcp reset.


    1. xapoh11
      08.02.2017 13:36

      Объясните разницу с точки зрения пользователя? И в том и другом случае страница ожидает загрузки и вываливает ошибку через 20-30 секунд.


      1. xapoh11
        08.02.2017 13:53

        Нашел разницу, спасибо за подсказку. И я был неточен, TCP reset — вываливает ошибку в браузере сразу.
        DROP — пакеты уходят в «черную дыру», TCP Reset — ответ соединение сброшено.
        Так как правило работает на входящие из локалки, то прятаться роутеру не от кого.


  1. drsmoll
    08.02.2017 13:15

    как дела с https?


    1. xapoh11
      08.02.2017 13:38
      -1

      https обрабатывает. Заголовок с GET не шифруется.
      проверял на: https://mp3-tut.net/


      1. iaon
        08.02.2017 16:13

        Вот спецслужбы то обрадуются вашему открытию. Все шифруется на самом деле.
        Этот кривой mp3-tut.net просто делает редирект на http.


        1. xapoh11
          08.02.2017 16:13

          Есть варианты, где https не «кривой»? Прошу указать


          1. drsmoll
            08.02.2017 16:47

            Попробуйте с этой страницы: www.nasa.gov


          1. iaon
            08.02.2017 16:59
            +1

            А смысл? Не взлетит.
            Все мы чего-то не знаем, но вы пишете про L7 фильтрацию, но не знаете базовых вещей про https…

            Тут только установка своего сертификата на клиенты и прокся-перекодировщик вам помогут, типа казахский вариант.


            1. drsmoll
              08.02.2017 17:28

              абсолютно верно, этого я и спрашивал у автора ;-)


              1. xapoh11
                08.02.2017 17:35

                Не доглядел. Буду смотреть дальше.
                И судя по всему решения 100% только два: подмена сертификата HTTPS, на что сразу среагируют браузеры, или инвертировать список правил с список запретить, остальное разрешить на список разрешить, остальное запретить


                1. drsmoll
                  08.02.2017 18:12

                  при наличии MS-AD раздача сертификата не составит труда.


  1. phnx
    08.02.2017 14:01

    Кстати только таким способом полностью выпиливается торрент трафик, особенно DHT.

    Примерный код
    В Сети много вариантов, возможно есть намного свежее.
    /ip firewall filter
    add action=drop chain=forward comment="TORRENT No 1: Classic non security torrent" disabled=no p2p=all-p2p
    add action=drop chain=forward comment="TORRENT No 2: block outgoing DHT" content=d1:ad2:id20: disabled=no dst-port=1025-65535 packet-size=95-190 protocol=udp
    add action=drop chain=forward comment="TORRENT No 3: block outgoing TCP announce" content="info_hash=" disabled=no dst-port=2710,80 protocol=tcp
    add action=drop chain=forward comment="TORRENT No 4: prohibits download .torrent files. " content="\r\nContent-Type: application/x-bittorrent" disabled=no protocol=tcp src-port=80
    add action=drop chain=forward comment="TORRENT No 5: 6771 block Local Broadcast" content="\r\nInfohash:" disabled=no dst-port=6771 protocol=udp


    1. xapoh11
      08.02.2017 14:02

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


      1. phnx
        08.02.2017 14:24

        Политика ИБ компании диктует условия.

        Пример — производственные предприятия. Там сам факт торрент-трафика из цехов уже должен насторожить сотрудника ИБ. Хотя обычно рубят вообще любой внесетевой трафик.


    1. AcidVenom
      08.02.2017 14:05

      С https-анаунсерами работает?


      1. phnx
        08.02.2017 14:18

        Могу ошибаться, но вроде заголовки не шифруются. По опыту, таким способом настраивал на предприятии блокировку (500+ пользователей) и за все время работы (около года) такой конфигурации торрент трафик «не протекал» ни разу.

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


      1. alexkuzko
        09.02.2017 13:56

        Судя по коду, нет. Там вообще 443-й порт не проверяется. Да и как? Тут надо делать аналог ssl bumping (SSL-Bump) как в сквиде, чтобы как клиент подключиться, и увидеть куда запрос направлен (но не его содержание..).

        Блокировки не одобряю, но сейчас приходится думать как на работе это реализовать. В первую очередь от забывчивых пользователей, которые не выключают торрент-клиенты…


  1. garadash
    09.02.2017 10:10
    -1

    Зачем с такими игрушками как Микротик возиться и время терять, где вы со своим RB3011UiAS забавляетесь? За 200 $ сейчас даже 38-я серия ISR покупается в хорошем состоянии, а уже не говорю про 28-ю, ставьте и кайфуйте.


    1. xapoh11
      09.02.2017 10:16

      У всех свои игрушки. А для Cisco порог вхождения выше. Да и цена вхождения.
      А Вы сможете за ~2600р. найти оборудование, который даст потрогать ВСЕ функции, которые раскроются на железе за ~20 000 р?

      Я не спорю Cisco — вещь. Но специалисты Cisco ценятся именно потому что они редки, а значит что-то ограничивает их «размножение».


      1. garadash
        09.02.2017 11:33

        Конечно, полно древнючих за копейки под лабы, из 26-й серии. Трогайте на здоровье любые функции IOS. Ну, и виртуальные конструкторы типа Cisco packet tracer, gns3 и т.п. никто не отменял, не совсем то, что работать с оборудованием, но все же, какой никакой практикум.


        1. MeGaPk
          09.02.2017 12:38
          +1

          лучше взять микротик, чем циско за 200$. В моей практике, микротик показал себя как «Просто работает без рестартов». Циско — всех офисом хотели сжечь.


    1. phnx
      09.02.2017 12:31
      +1

      У Микротика одно главное преимущество в своем сегменте — функционал. Нет аналогов за те деньги, за которые вы получаете абсолютно все необходимое из коробки для low\mid-range нагрузок.

      Это я к тому, что сравнивать Циски, Джуниперы, Мотороллы с Микротиком неверно априори. Эти железки разного уровня и для разных потребителей.


  1. xapoh11
    09.02.2017 10:16

    DEL


  1. rgoldshteyn
    10.02.2017 17:10

    А функционал L7 у микротика с какиой версии По начинается?


    1. AcidVenom
      11.02.2017 15:06

      Вроде бы начиная с 4 ветки.