Введение
Split DNS (Разделенный DNS) - это конфигурация, которая использует различные наборы DNS-серверов для разрешения доменных имен в зависимости от местоположения запрашивающего. Используя Разделенный DNS, можно отправлять разные DNS-ответы для одного и того же доменного имени в зависимости от того, исходит ли запрос из внутренней сети или из публичного интернета.
Этот подход предлагает несколько преимуществ:
- Улучшенную производительность сети. Внутренние пользователи направляются к ресурсам внутри локальной сети без ненужного трафика через внешние сети а следствии этого снижается задержка и улучшается общая производительность внутренних сервисов. В то время как внешние пользователи направляются к общедоступным ресурсам.
- Повышенную безопасность. Разделенный DNS помогает улучшить безопасность сети, снижая поверхность атаки, подвергающуюся публичному интернету. Предоставляя разные DNS-ответы для внутренних и внешних пользователей, можно эффективно изолировать свою внутреннюю сеть от потенциальных угроз, исходящих из интернета. Этот подход также ограничивает доступ к внутренним ресурсам, которые могут быть уязвимы к внешним атакам.
- Оптимизированная доступность ресурсов. Разделенный DNS обеспечивает доступ внутренних пользователей к внутренним ресурсам, даже если они недоступны из публичного интернета. Это позволяет размещать частные ресурсы, такие как внутренние веб-сайты или файловые серверы, предназначенные только для внутреннего использования.
Применение в домашних условиях
Если вы публикуете свои локальные приложения и сервисы в интернет с помощью Traefik. то при обращении к ним по доменному имени, ваш запрос поступает на DNS сервер который в свою очередь разрешает его в ваш внешний IP адрес. Например у вас есть сервис с локальным IP 192.168.78.99 и он проксируется через Traefik который работает по адресу 192.168.78.110. У вашего регистратора доменного имени в DNS зоне domain.ru
имеется A-записью - 104.21.75.252 с FQDN именем app.domain.ru
. При обращении по этому доменному имени в локальной сети, DNS отвечает нам, что он доступен по адресу 104.21.75.252 - это наш внешний IP адрес, соответственно чтобы попасть на него нам нужно выйти за пределы нашей локальной сети и потом вернуться обратно.
Если мы сделаем трассировку до него, то увидим весь маршрут, он будет выглядеть примерно так:
$ traceroute app.domain.ru
traceroute to app.domain.ru (104.21.75.252), 30 hops max, 60 byte packets
1 _gateway (192.168.78.254) 0.261 ms 0.258 ms 0.209 ms
2 15.19.0.106 (15.19.0.106) 9.347 ms 15.19.0.110 (15.19.0.110) 9.454 ms 9.264 ms
3 15.19.0.242 (15.19.0.242) 1.578 ms 1.965 ms 1.925 ms
4 87.245.255.180 12.696 ms 12.328 ms 12.288 ms
5 139.45.224.56 (139.45.224.66) 10.166 ms 10.125 ms 10.138 ms
6 ae15-8.rt.lim.waw.pl.retn.net (87.245.232.177) 25.161 ms 24.841 ms 27.909 ms
7 * * 162.158.100.252 (162.158.100.252) 31.950 ms
8 162.158.100.23 (162.158.100.23) 33.691 ms 162.158.100.27 (162.158.100.27) 27.062 ms 28.482 ms
9 104.21.75.252 (104.21.75.252) 26.238 ms 26.410 ms 26.583 ms
Т.е. чтоб попасть в наше локальное приложение мы проходим через множество шагов. И итоговое время прохождения составляет больше 26 мс.
С помощью Adguard Home мы можем настроить перезапись запросов и организовать своего рода Split DNS. Для этого переходим в Фильтры -> Перезапись DNS-запросов и добавляем новое правило перезаписи. Указываем FQDN имя и локальный адрес на котором работает Traefik.
После этого очищаем DNS-кэш и повторяем трассировку:
$ traceroute app.domain.ru
traceroute to app.domain.ru (192.168.78.110), 30 hops max, 60 byte packets
1 192.168.78.110 (192.168.78.110) 0.256 ms 0.262 ms 0.247 ms
Теперь мы сразу попадаем в наш сервис по его локальному адресу всего за четверть миллисекунды.
Также вы можете ограничить доступ к внешним ресурсам. Например если вы используете Traefik и Cloudflare, можно создать А-запись которая будет указывать на локальный IP-адрес сервиса и ограничить доступ к нему указав список разрешенных IP адресов или подсетей внутри локальной сети.