Mikrotik: небольшие полезности. Часть 2

    Это очередная порция небольших возможности/реализации в RouterOS.

    Изображение для привлечения внимания

    Сегодня я расскажу о том:
    1) Как закрыть все сайты кроме одного/нескольких
    2) Как получать «человеческие» уведомления о VPN-подключениях
    3) Важное нововведение в v6.36, после которого можно забыть про L7

    Интересно? Тогда прошу под кат.



    Как закрыть все сайты кроме одного/нескольких


    Сразу скажу, что использовать нужно L7 Protocol. Казалось бы, чего сложного: просто применить правило «все кроме».

    Но нет, это не работает. Если хотите, проверьте сами. Что делать? Одним фильтром разрешить нужные ресурсы и вторым запретить все остальные.
    Разрешающий L7 имеет вид ^.+(какой-то_сайт|еще какой-то_сайт).*$.
    С запрещающими сложнее. Можно зафильтровать вообще все через ^.+$. Но я бы посоветовал фильтровать протокол HTTP по URI, то есть так — ^.+(HTTP\/[0-2]).+$.
    К сожалению, через терминал необходимые L7-фильтры добавляются с пустым полем regexp. Используйте вместо этого Winbox.
    /ip firewall layer7-protocol add name=Allow regexp="^.+(какой-то_сайт|еще_какой-то_сайт).*$" 
    /ip firewall layer7-protocol add name=Deny regexp="^.+(HTTP\/[0-2]).+$" 
    

    Добавление самих фильтры, по 2 на 'разрешить' и 'запретить' согласно вики Микротик
    /ip firewall filter add chain=forward protocol=tcp out-interface=ваш_интерфейс layer7-protocol=Allow action=accept
    /ip firewall filter add chain=forward protocol=tcp in-interface=ваш_интерфейс layer7-protocol=Allow action=accept
    /ip firewall filter add chain=forward protocol=tcp out-interface=ваш_интерфейс layer7-protocol=Deny action=reject reject-with=tcp-reset
    /ip firewall filter add chain=forward protocol=tcp in-interface=ваш_интерфейс layer7-protocol=Deny action=reject reject-with=tcp-reset
    

    Небольшое уточнение для тех, кому все-таки требуется разрешить строго определенные сайты: проверяйте, какие еще ресурсы задействованы на сайте. К примеру, это могут быть подгружаемые карты. Я использую Opera для серфинга в сети, а так же входящий в нее DevTools, вкладка «Console» для определения ошибок.

    Важное уточнение: в версии 6.36 и новее это можно реализовать использую 3 пункт статьи.


    Как получать «человеческие» уведомления о VPN-подключениях


    Кто сталкивался с уведомлениями Микротика в секции Logging, тот знает, что уведомления убогие и подходят только для совсем простых случаев. Мне же хотелось, чтобы уведомления несли в себе как можно больше полезной информации. Оказалось, это реализовать достаточно просто: необходимы скрипты на подключение/отключение для профиля PPP. Ниже я приведу скрипты на On Up и On Down, но сначала немного подводных камней:
    1) Для обоих скриптов есть предопределенные переменные — подробнее о них.
    2) Переменные с дефисом необходимо указывать в кавычках. К примеру, $«caller-id». Иначе не работает!
    3) Микротик отсылает сообщения по электронной почте в тексте, поэтому никаких тэгов, гиперссылку вставлять только в явном виде.
    4) В теле сообщения для переноса каретки в начало новой строки используется \r\n.
    5) На данном этапа (версия 6.33.2) есть проблемы с кодировкой сообщений в некоторых почтовых клиентах и web-интерфейсах.

    Код скриптов максимально упрощен. У вас должна быть настроена ветка Tools -> Email для использования «из коробки».
    Скрипт On Up
    :local email "ваш_адрес_почты"
    ##### Тело скрипта
    /tool e-mail send to=$email subject="Пользователь $user подключился к VPN"  body="Пользователь $user подключился по $[/ppp active get [/ppp active find where name=$user caller-id=$"caller-id" address=$"remote-address"] service] в $[/system clock get time].\r\nIP-адрес клиента - $"caller-id".\r\nИнфо об IP клиента - http://apps.db.ripe.net/search/query.html?searchtext=$"caller-id""
    

    Вид уведомления



    Скрипт On Down
    :local email "ваш_адрес_почты"
    ##### Тело скрипта
    /tool e-mail send to=$email subject="Пользователь $user отключился от VPN"  body="Пользователь $user отключился в $[/system clock get time]."
    

    Вид уведомления



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


    Доменные имена в адресных листах


    И на сладкое: начиная с версии v6.36, в адресные листы можно добавлять доменные имена!
    *) firewall — allow to add domain name to address-lists (dynamic entries for resolved addresses will be added to specified list);

    Если вы еще не прыгаете от радости как я, то самое время начать. Эта фича позволяет практически полностью уйти от использования затратного L7 с его ограничениями.
    В качестве примера приведу маршрутизацию разных сайтов в разные шлюзы. Это актуально в связи с действительностью в нашей стране. Заворачивать будем web-интерфейсы почтовых серверов mail.google.com и e.mail.ru. В почту Google будем ходить по OVPN, а в Mail — по L2TP.
    /ip firewall address-list add list=ovpn address=mail.google.com
    /ip firewall address-list add list=l2tp address=e.mail.ru
    /ip firewall mangle add chain=prerouting protocol=tcp src-address=192.168.1.0/24 dst-address-list=ovpn action=mark-routing new-routing-mark=ovpn-route
    /ip firewall mangle add chain=prerouting protocol=tcp src-address=192.168.1.0/24 dst-address-list=l2tp action=mark-routing new-routing-mark=l2tp-route
    /ip route add dst-address=0.0.0.0/0 gateway=ovpn-out1 distance=1 routing-mark=ovpn-route
    /ip route add dst-address=0.0.0.0/0 gateway=l2tp-out1 distance=1 routing-mark=l2tp-route
    

    Таким образом, при добавлении нужного имени в определенный лист, мы фактически определяем по какому каналу будет установлена связь.
    Еще один пример, который многим пригодится: перенаправлять все TCP-соединения в шлюз OVPN, а rkn.gov.ru — в шлюз по умолчанию.
    /ip firewall address-list add list=RKN address=rkn.gov.ru
    /ip firewall mangle add chain=prerouting protocol=tcp src-address=192.168.1.0/24 dst-address-list=RKN action=accept
    /ip firewall mangle add chain=prerouting protocol=tcp src-address=192.168.1.0/24 dst-address=!192.168.0.0/16 action=mark-routing new-routing-mark=ovpn-route
    /ip route add dst-address=0.0.0.0/0 gateway=ovpn-out1 distance=1 routing-mark=ovpn-route
    

    Важное замечание: если вы используете Fasttrack, то обязательно смотрите его описание. А именно:
    Fasttracked packets bypass firewall, connection tracking, simple queues, queue tree with parent=global, ip traffic-flow(restriction removed in 6.33), ip accounting, ipsec, hotspot universal client, vrf assignment, so it is up to administrator to make sure fasttrack does not interfere with other configuration;

    Что значит, что соединения такого типа не попадают в файервол, обработку пакетов, очереди и т.д.


    Другие части

    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 25

      0
      Использование доменных имен в Address List это очень хорошо. Но вот вопрос: каким образом разрешается это имя в IP?
      Допустим, я хочу иметь список удаленных узлов, которым будет разрешен доступ к некоторому сервису во внутренней сети (dst-nat проброс). Причем эти удаленные узлы имеют постоянные DDNS-имена, но меняющиеся динамические IP-адреса. Раньше по некоторой схеме через одно место получал удовлетворительный актуальный список IP-адресов этих узлов. Теперь пытаюсь понять, может ли новая фича заменить прежнюю схему с динамическим списком DDNS узлов.
      Вопрос, собственно, в том, как часто делается DNS Resolve по доменным именам в Address List?
        +1
        Once a domain is added to an address-list it is resolved by routeros and the resolved IP(s) is added to the same address-list as a dynamic entry with timeout value the TTL returned by the DNS protocol.
        When the timeout (TTL) expires, routeros will re-resolve the domains again and if the IP is changed it will replace it in the address-list.
        The firewall rules that use those address-lists only take into account the entries with IP addresses. Not the ones with domains.

        Ссылка
          0
          Хм. Как я понимаю, в случае roun-robin DNS эта фича у Микротика будет работать костыльно…
          Лучше, получается, ею не пользоваться?
          Кстати, iptables в Линукс, по-моему, тоже умеет DNS пользоваться… но там есть нюансы.
            0
            iptables резолвит доменное имя только на этапе добавления правила, и добавляет по одному правилу для каждого полученного ip-адреса. Сами по себе эти правила потом никак не обновляются. Наименее костыльный вариант решения подобной задачи — ipset + самописный скрипт обновления записей в сете.
          0
          И вкратце:
          ...the address is resolved at boot and when DNS TTL reaches 0 and is renew in cache.

          Перезагрузка, TTL = 0, обновление кэша DNS.
          +1
          человеческие уведомления… нет они имеют право на жизнь, но только не по вопросу подключения-отключения интерфейсов в т.ч. vpn, для большинства случаев все таки будет лучше систему мониторинга, которая понимает состояния и не шлет письма каждые 20 секунд например
            0
            Если вы видели стандартные уведомления в Logging, то вы понимаете почему нужны человеческие.
            Реализация не претендует на корпоративный сегмент среднего-крупного масштаба. Для малого бизнеса она вполне пригодна.
            Но, конечно, можно собирать vpn-подключения по SNMP системой мониторинга.
            0
            Хм, а есть в контексте создания правила по блокировке Windows Update хотя бы в рабочее время?
            (в офисе канал 2МБит на всех, пара машин с 10-й просто «кладёт» интернет)
            В ветке форума Микротика нагуглил список URL относящихся к Windows Update:
            http://windowsupdate.microsoft.com
            http://*.windowsupdate.microsoft.com
            https://*.windowsupdate.microsoft.com
            http://*.update.microsoft.com
            https://*.update.microsoft.com
            http://*.windowsupdate.com
            http://download.windowsupdate.com
            http://download.microsoft.com
            http://*.download.windowsupdate.com
            http://wustat.windows.com
            http://ntservicepack.microsoft.com
            http://stats.microsoft.com
            https://stats.microsoft.com

            Но тут маски! Микротик, как я понимаю такого (ещё) не умеет…
            Можно было бы настроить систему на использование прокси, указав невалидный адрес, но боюсь хитрый windowsupdate будет лезть напрямую…
            Получается без разворачивания SQUID с правилами блокировки не обойтись?

              0
              Mikrotik: небольшие полезности. Часть 1
              Пункт 3, через L7. Через адресные листы скорее всего нет.
                0
                Настроил через L7.
                А много ль тот L7 забирает мощности процессора, чай каждый TCP пакет надо через regexp прогонять…
                Или там умнее алгоритм, первые 2-3 исходящих пакета смотрит?
                  0
                  L7 matcher collects the first 10 packets of a connection or the first 2KB of a connection and searches for the pattern in the collected data.

                  Ссылка.
                  Не заметите нагрузки.
                    0
                    А у меня L7 не работает при включенном FastTrack-е.
                      0
                      Да и сейчас всё больше https — так что L7 не очень помогает…
                        0
                        Если вы имеете ввиду инспекцию по адресу, то все прекрасно работает. Не выставляйте dst.port, и все будет хорошо.
                          0
                          Эмм, простите, а как он без MITM узнаёт — на какой домен делаю обращение?
                            0
                            Так по HTTPS передается имя домена в открытом виде. Вот его и анализирует L7.
                            Все, что внутри, микротик не видит.
                        0
                        И не должен:
                        Fasttracked packets bypass firewall, connection tracking, simple queues, queue tree with parent=global, ip traffic-flow(restriction removed in 6.33), ip accounting, ipsec, hotspot universal client, vrf assignment, so it is up to administrator to make sure fasttrack does not interfere with other configuration;
                    0
                    Static DNS завернуть на 127.0.0.1 и клиентам Микротик как DNS сервер отдавать. ;)
                      0
                      Увы, ни микротик, ни файл hosts не допускают wildcards…
                        +2
                        Да ладно. * не ставьте, а начните с "." и будет вам счастье.
                        Пример: .microsoft.com
                          0
                          Спасибо, сделал:
                          ip dns static print
                          Flags: D — dynamic, X — disabled, R — regexp
                          # NAME ADDRESS TTL
                          0 R .microsoft.com 127.0.0.1 1d
                          1 microsoft.com 127.0.0.1 1d
                          2 R .windowsupdate.com 127.0.0.1 1d
                          3 windowsupdate.com 127.0.0.1 1d
                          4 windows.com 127.0.0.1 1d
                          5 R .windows.com 127.0.0.1 1d
                    0
                    Попробовал настроить PBR по описанию из третьего пункта, и полчаса не мог разобраться почему же это не работает. Только после того как попробовал закепчерить трафик и все неожиданно заработало нашел в чем дело — mangle правила не применяются к fasttrack трафику. Для исправления этой проблемы в дефолтное правило fasttrack можно добавить указание на исходящий интерфейс, и тогда все работает.
                    Мне кажется имеет смысл добавить это уточнение в вашу статью.
                      0
                      Сделаю уточнение, но на этот вопрос я уже отвечал выше.
                      +1
                      Кстати, обнаружил в 6.36 еще парочку мажорных улучшений:
                      *) firewall — added "/interface list" menu which allows to create list of interfaces which can be used as in/out-interface-list matcher in firewall and use as a filter in traffic-flow;
                      *) firewall — added pre-connection tracking filter — «raw» table, that allow to protect connection-tracking from unnecessary traffic;
                      По второму ничего не могу сказать, что-то на тему защиты от DDOS. А вот первое: наконец появилась возможность создавать списки интерфейсов, для указания их в правилах и цепочках firewall-а, т.е. можно не плодить однотипные правила и цепочки. Вопрос только в производительности, наверное.
                        0
                        Полностью согласен. Второе скорее выглядит как управляемый/настраиваемый Fasttrack.

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