Mikrotik split-dns: они это сделали +17



Не прошло и 10 лет, как разработчики RoS (в stable 6.47) добавили функционал, который позволяет перенаправить DNS запросы в соответствии со специальными правилами. Если раньше надо было изворачиваться с Layer-7 правилами в firewall, то теперь это делается просто и изящно:

/ip dns static
add forward-to=192.168.88.3 regexp=".*\\.test1\\.localdomain" type=FWD
add forward-to=192.168.88.56 regexp=".*\\.test2\\.localdomain" type=FWD

Моему счастью нет предела!

Чем это нам грозит?


Как минимум, мы избавляемся от странных конструкций с NAT наподобие этой:

/ip firewall layer7-protocol
add comment="DNS Nat contoso.com" name=contoso.com regexp="\\x07contoso\\x03com"
/ip firewall mangle
add action=mark-packet chain=prerouting comment="mark dns contoso.com" dst-address-type=local dst-port=53 in-interface-list=DNSMASQ layer7-protocol=contoso.com new-packet-mark=dns-contoso.com passthrough=yes protocol=udp
add action=mark-packet chain=prerouting comment="mark dns contoso.com" dst-address-type=local dst-port=53 in-interface-list=DNSMASQ layer7-protocol=contoso.com new-packet-mark=dns-contoso.com passthrough=yes protocol=tcp
/ip firewall nat
add action=dst-nat chain=dstnat comment="DST-NAT dns contoso.com" dst-port=53 in-interface-list=DNSMASQ packet-mark=dns-contoso.com protocol=udp to-addresses=192.0.2.15
add action=dst-nat chain=dstnat comment="DST-NAT dns contoso.com" dst-port=53 in-interface-list=DNSMASQ packet-mark=dns-contoso.com protocol=tcp to-addresses=192.0.2.15
add action=masquerade chain=srcnat comment="mask dns contoso.com" dst-port=53 packet-mark=dns-contoso.com protocol=udp
add action=masquerade chain=srcnat comment="mask dns contoso.com" dst-port=53 packet-mark=dns-contoso.com protocol=tcp


И это не все, теперь можно прописать несколько серверов пересылки, что поможет сделать dns failover.
Интелектуальная обработка DNS даст возможность начать внедрение ipv6 в сеть компании. До этого я этого не делал, причина в том, что мне нужно было разрешать ряд dns имен в локальные адреса, а в ipv6 это было не сделать без довольно больших костылей.

Теги:




Комментарии (53):

  1. Alkop
    /#21691424

    А расскажите подробней — для чего это надо?

    • MagicGTS
      /#21691432

      Да все просто.
      Допустим, у вас есть домен, причем он имеет глобальное имя, к примеру в зоне .ru
      И вот вам нужно, что-бы некоторые ресурсы были доступны как из интернета так и во внутренней сети за NAT. Реализуется это тем, что-бы внутри NAT отвечать на DNS запрос IP адресом из серой сети, а не публичны. Или надо выносить все подобные сервера в DMZ.

      • rstepanov
        /#21691608

        Это зонами делается в BIND

        • MagicGTS
          /#21691622

          Это совсем грустный вариант для нано филиальчиков. Куда водружать BIND, если в филиале кроме двух ПК и mikrotik ничего нет?
          Заруливать DNS в туннель до головного офиса — совсем не лучшая затея.

          • rstepanov
            /#21691632

            Это был грустный вариант раньше, а теперь ставишь малину и на нее — все, что душе угодно: прокси, тор, днс, впн-сервер, веб-сервер, баннерорезку и т.п.

            • MagicGTS
              /#21691640 / +2

              Зачем тогда Mikrotik? Это создает дополнительные точки отказа и усложняет поддержку.

              • rstepanov
                /#21691650

                Я в целом положительно отношусь к микротикам, просто хотел отметить, что это не единственное решение описанной проблемы, можно было и раньше, и при сравнимом бюджете. И вообще хорошо, когда вариантов больше одного.

                А вообще, когда у вас есть внутренние ресурсы в филиале, но нет ни одного сервера — тут что-то не сходится, вспоминаю про трусы и крестик. Разве что камера какая-нибудь или принтер, но это на большинстве роутеров прикручивается через LAN DNS функцию, даже с динамическим внутренним IP.

                • MagicGTS
                  /#21692502

                  У меня в практике вполне типичная ситуация: точка продаж.
                  На точке есть пара ПК и принтер, иногда камера. Mikrotik обеспечивает туннель до общей сети. И тут как раз split dns мне сильно помогает, если падает туннель, то пропадают внутренние ресурсы, но остаётся интернет. И если туда приезжает менеджер с ноутом, то ему не надо ничего специально настраивать, все работает как из головного офиса или дома.

            • AxisPod
              /#21692484

              Прокси, впн? И получаешь скорость в пол байта в секунду?

              • rstepanov
                /#21692530

                А вам сколько надо? Если гигабит/с — то узнайте сначала сколько такой канал стоит для юрлиц.

                • Am0ralist
                  /#21692618

                  10-100 мбит/с в регионах могут быть не так уж и дороги.
                  На прошлой работе вообще, насколько помню, услугу создания сети между точками продаж и головной фирмой провайдер предлагал на неплохих скоростях.

                  • rstepanov
                    /#21692640

                    Pine A64 (Cortex-A53) легко справляется с 300 мбит каналом как некэширующий прокси-сервер, RPi4(Cortex-A72) еще быстрее. Для каналов быстрее 500 мбит/с я бы уже задумался о чем-нибудь более серьезном, но это не точка продаж ни разу, там такие скорости не нужны.

          • net_racoon
            /#21706638

            Заруливать DNS в туннель до головного офиса — совсем не лучшая затея.


            А вы считаете, что нагружать софтроутер разборами ДНС запросов затея получше? Кроме того, если у меня 500 таких филиалов, то каждый филиал- это отдельная точка для настройки?

            • MagicGTS
              /#21706652

              А как вы настраиваете такие филиалы? Прямо из коробки в бой?

              • net_racoon
                /#21707782

                Я про эксплуатацию. Вот поступила вам команда зарезать хабр на все 500 филиалов. Вы предлагаете зайти на каждый и править фильтр вместо централизованного управления?

                • MagicGTS
                  /#21707886

                  Тут уже можно делать по разному, но я в компании смог объяснить, что технические запреты ресурсов (типа сайтов), ничего не решат, поэтому такой команды мне не дадут.
                  Если надо массового настроить 500 роутеров, то тут прямая дорога к изучению ros api, что поможет делать не только это.

      • Alkop
        /#21691610

        ааа… я это делал путём дополнительного правила в NAT

        • MagicGTS
          /#21691628

          Ага, Layer-7, mangle, NAT. И скажи нет dns failover для таких доменов, проблема с большими пакетами и т.п.

          • Alkop
            /#21692948

            Да у меня там один сайтик был :) Так что не сильно парился.

      • jocelot
        /#21691750

        Если я не ошибаюсь, то ситуация с сервером за NAT'ом и пробросом портов решается NAT-loopbak правилом без всяких layer 7 и DNS вообще. Например, для внктренней сети 192.168.0.0/24 вот так:
        chain=srcnat action=masquerade protocol=tcp src-address=192.168.0.0/24 dst-address=192.168.0.0/24 out-interface=<Your_LAN_bridge> dst-port=0-65535

        • MagicGTS
          /#21691752

          Это близкий случай, но не тот.

          • jocelot
            /#21691766

            Странно. У меня вроде работает. Расскажите, пожалуйста, когда это не работает для сервера за NAT'ом. Я бы тоже у себя пофиксил.

            • MagicGTS
              /#21691792 / +1

              Первое, чем мне не нравится hairpin nat это то, что мы нагружаем роутер лишним трафиком.
              Плюсы split-dns в том, что можно держать в глобальной доступности всего пару сервисов, а остальные в привате. И тут для пользователя самое удобное, он не встречает никаких различий между подключением к сервисам внутренним и внешним, для него это выглядит прозрачно и в голове он держит только один домен. В случае без split dns, очень часто имеется ситуация с существованием как глобального домена так и локального.

    • maxzhurkin
      /#21691474

      Например, можно сделать так, чтобы запросы на внутренние ресурсы локальной сети/интранет сети не уходили в «дикий интернет».
      У некоторых провайдеров довольно паршиво настроенные сервера DNS, можно отправить все запросы на широко известные публичные сервера, а запросы на ресурсы провайдера — на его сервер/сервера.
      Некоторые носят компактные модели MikroTik с собой и подключают в разных местах (заранее известных) можно учесть специфику сразу всех этих сетей, до этого в особо специфичных случаях приходилось что-нибудь перенастраивать

    • usego
      /#21691486

      Например есть у вас в облаке домен ourcloud.internal и VPN туда из офиса, и надо что бы из офиса резолвились server1.ourcloud.internal, redis23.ourcloud.internal и т.п. Направляете запросы *.ourcloud.internal на облачный ресолвер, а остальные как обычно.

    • KonstantineZ
      /#21695108

      А расскажите подробней — для чего это надо?

      Вот мой случай: два провайдера, у каждого есть внутренние сервисы (сайт, личный кабинет), не доступные из интернета. Один из провайдеров часто меняет IP этих сервисов. Таким образом, мне необходимы ДНС обоих провайдеров, причем имена сайтов должны резолвиться именно своим ДНС-сервером. Я вот до этой статьи и не обратил внимания на изменения, в основном потому что на long term сидел. Перешел на stable.

  2. maxzhurkin
    /#21691442

    С какой версии RouterOS?

    • MagicGTS
      /#21691452

      С текущей стабильной, хотя эту функцию можно было попробовать и в testing.

      • maxzhurkin
        /#21691490

        С текущей стабильной, хотя эту функцию можно было попробовать и в testing.
        Вы сознательно заставляете того, кто наткнётся на эту статью (а это именно статья, а не заметка в блоге, хотя и выглядит так) через какое-то время, выяснять, а какая же версия RouterOS была текущей стабильной в июне 2020-го?

        • MagicGTS
          /#21691508

          Нет, просто вы не прочитали эту информацию в заметке.

  3. MaxKozlov
    /#21691478

    Если б у них ещё regexp отрабатывался после обычной статики, а не до, было б совсем хорошо

  4. paxlo
    /#21691506

    А с настроенным DoH работает?

    • MagicGTS
      /#21691514

      Сам не использовал, ответить не могу.

    • AcidVenom
      /#21691916

      Да

      !) dns — added client side support for DNS over HTTPS (DoH) (RFC8484);

      • onegreyonewhite
        /#21692264

        Что-то у меня с настроенным DoH пересылка запросов не пошла. А то что вы привели в качестве пруфа, говорит о том, что DoH в принципе теперь поддерживается.

        • dareksi
          /#21699540

          в документации указано:
          Currently DoH is not compatible with FWD type static entries, in order to utilize FWD entries, DoH must not be configured.

  5. cjmaxik
    /#21691518

    Извините, но Twitter в соседней вкладке.
    Могли бы и поподробнее расписать: суть изменения, примеры использования, сравнение с предыдущими версиями и т.д.

    • maxzhurkin
      /#21691532 / +2

      Это тот самый случай, когда имеет смысл читать комментарии :)

      • MagicGTS
        /#21691550

        Этот тот случай, когда большая и подробная статья лежит и тухнет, а невнятный хайп — нет.
        Я сам не люблю такие статьи, однако и сам создал такую. Зато я сразу вижу интерес сообщества, за что спасибо. Торжественно обещаю, мельчить больше не буду.

  6. AcidVenom
    /#21691914

    Кроме того, приехал Split DNS для IPsec

    *) ike2 — added support for RFC8598;

  7. VVakko
    /#21693554

    Маленький вопрос по переопределению определённых имён в рамках перенаправляемых доменов.
    Допустим, у нас есть домен "*.test1.localdomain", который мы перенаправляем на forward-to=192.168.88.3. Но есть одно имя из этого домена exception.test1.localdomain, IP-адрес которого необходимо переопределить на 127.0.0.1, к примеру, используя static dns на MikroTik'е.


    Вопрос 1. Какая очерёдность резолвинга? Перебьёт ли static этот forward-to? В случае с layer7 не перебивало, т.к. запрос на 53-й порт (подходящий под условия) форвардился на другой DNS и до DNS-сервера MikroTik'а запрос не долетал.
    Вопрос 2. Кто хорошо умеет в регекспы, подскажите, как можно добавить исключение в regexp=".*\.test1\.localdomain", чтобы под этот regexp попадал весь домен включая поддомены, за исключением имени exception.test1.localdomain?

    • Xobotun
      /#21694366

      Попытался поэкспериментировать, но у меня не вышло сделать подобное, увы.

      1. По моим ощущениям, сначала разрешаются правила с регулярками, а затем – чисто статические. Документация, кстати, говорит, что это так:

      The server is capable of resolving DNS requests based on POSIX basic regular expressions so that multiple requests can be matched with the same entry. In case an entry does not conform with DNS naming standards, it is considered a regular expression and marked with an ‘R’ flag. The list is ordered and is checked from top to bottom. Regular expressions are checked first, then the plain records.

      2. Я попытался вывести из-под правила домен test.example.com. В цитате выше упомянуто, что используются POSIX basic regular expressions, то есть никаких negative lookahead не получится, (?!test).*\.example.com не сработал. Попытался запустить ([^t]+|t[^e]+|te[^s]+|tes[^t]+)\.example.com по образу и подобию этого ответа со stackoverflow, но результат оказался прямо противоположный: только test.example.com стал попадать под правило. Хотя на сайтах типа regexr.com поведение совпадает с ожидаемым мной. :/

      • VVakko
        /#21694466

        Как оказалось, ещё вчера 6.47 вышла в stable, поэтому я обновил один из домашних роутеров и проверил.
        Опытным путём выяснилось, что статичная запись типа A имеет приоритет над записью типа FWD. При чём даже не влияет где эта запись находится выше FWD, или ниже.
        Так что вопрос с исключающимися регулярками с повестки снят. Если нужно исключить какие-то хосты из форвардинга – добавляем их статиком и всё нормально работает.

        • Xobotun
          /#21694594

          А, понятно. У меня просто надо всем, кроме одного домена, назначить A-запись. Наверное, я использую не тот инструмент, но он работает. :)

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

          • MaxKozlov
            /#21695298

            мне кажется проще всего в две записи:


            ^exception\.test1\.localdomain$ - Type A (не перенаправлять)
            .*\.test1\.localdomain$ - Type FWD (перенаправлять)

            первая отработает — вторая уже не будет.
            под первую не попадёт — отфорвардит

      • Xobotun
        /#21694554

        Не уложился в 30-минутный лимит редактирования коммента. :/

        UPD: Документация немного устарела, похоже. По крайней мере, работают не только POSIX BRE, но и ERE. Хотя я сначала так и думал. :D

        И проблема с регекспами решилась достаточно просто: надо было добавить ^ в начало. Почему-то регулярка срабатывает, даже если часть домена попадает под неё. Мне сложно придумать подобную ситуацию без натягивания совы, но лучше иметь гибкость, чем не иметь её, когда она нужна.

        В абстрактном случае работает ^([^t]+|t[^e]+|te[^s]+|tes[^t]+|test.+)\.example\.com$,
        а в вашем – что-то вроде ^([^e]+|e[^x]+|ex[^c]+|exc[^e]+|exce[^p]+|excep[^t]+|except[^i]+|excepti[^o]+|exceptio[^n]+|exception.+)\.test1\.localdomain$, хотя это и нечитаемо.

  8. lengvo1111
    /#21706628

    Подскажите пожалуйста, я ранее пользовался связкой Layer7+mangle(mark connections)+NAT
    У меня все работало (условная пересылка DNS запросов).
    Попробовал реализовать через DNS static — не получается

    Домен: home.local
    Прописываю следующее
    /ip dns static
    add forward-to=192.168.2.2 regexp=".*\\.home\\.local" type=FWD

    но DNS сервер микротика не разрешает данный префикс FQDN серверов
    Что я делаю не так, подскажите пожалуйста.

    • MagicGTS
      /#21706648

      А ваши клиенты точно спрашивают dns у роутера? Есть вероятность работы кэша на клиентах, какой dns суффикс вы отдали\установили у клиента?

    • lengvo1111
      /#21707058

      решил таким образом, как был реализован regexp в layer7

      /ip dns static
      add forward-to=192.168.2.2 regexp="(home.local)" type=FWD

  9. krotish
    /#21708506

    в контексте split-dns у меня родился юзкейс — организовать прозрачный доступ из локальной сети к .onion. Tor ноду держим на raspberry pi к примеру рядом в локальной сети.

    но возникает вопрос реализации, web-proxy в данном случае все равно нужен на микроте?
    я пробовал реализовать по сценарию web-proxy (Mikrotik) — 3proxy (raspberry pi) — tor-socks5 (raspberry pi) — но выглядит это как большой костыль.
    наводку брал тут

    возможно можно как-то проще?