В современном цифровом мире обеспечение безопасности и удобства доступа к домашним или рабочим сетям становится первоочередной задачей для многих пользователей и системных администраторов. На помощь приходят современные технологии VPN и умное управление DNS, позволяющие не только скрыть реальные IP-адреса устройств, но и гибко распределять доступ к сервисам в зависимости от сети, из которой выполняется запрос. Одной из таких технологий является Split Horizon DNS — метод, позволяющий возвращать разные IP-адреса на один и тот же доменный запрос в зависимости от источника запроса. В сочетании с популярным решением для блокировки рекламы и организации локального DNS-сервера Pi-Hole, а также с VPN-сервисом Tailscale, Split Horizon DNS открывает новые горизонты для удобства и безопасности доступа к домашним и корпоративным ресурсам. Эта статья расскажет о том, как правильно настроить Split Horizon DNS с Pi-Hole и Tailscale, чтобы использовать преимущества обеих технологий и получить максимальный контроль над сетевыми запросами.
Начнём с обзора базовых компонентов, участвующих в этой настройке. Pi-Hole — это широко используемое программное обеспечение, которое функционирует как локальный DNS-сервер и блокировщик рекламы. Его опорой является модифицированная версия демона dnsmasq, которая может быть настроена для создания сложных правил разрешения доменных имён. Tailscale, в свою очередь, представляет собой современный VPN-сервис, основанный на технологии WireGuard, который организует mesh-сеть — то есть сеть с прямыми соединениями между устройствами, минуя центральные серверы. Такое решение обеспечивает высокую скорость работы и традиционную безопасность WireGuard с удобством управления.
Основная идея Split Horizon DNS состоит в том, чтобы устройство, отправляющее запрос, получало IP-адрес, наиболее оптимальный для текущего расположения — например, локальный IP для устройств в одной домашней сети и публичный или VPN-адрес для клиентов, подключающихся из внешней сети. Такая реализация особенно полезна для сервисов, которые требуют безопасного доступа без громоздких процедур повторной аутентификации, а также для обхода различных ограничений и повышения производительности. Принцип работы Split Horizon DNS с Pi-Hole базируется на его внутреннем демоне pihole-FTL, который поддерживает опцию localise-queries. Эта функция отвечает за возврат IP-адреса из файла hosts или аналогичных источников в зависимости от интерфейса, через который пришёл DNS-запрос. Если доменное имя имеет несколько IP-адресов, связанных с разными подсетями, сервер вернёт пользователю тот адрес, который соответствует подсети их сети.
Таким образом, клиент в локальной сети получит локальный IP, а пользователь, подключённый через Tailscale, — VPN IP-адрес. Для успешной реализации данной функциональности необходимо добавить записи в файл /etc/pihole/custom.list, который имеет формат, аналогичный hosts. Например, если сервер с именем foo.example.
com имеет локальный IP 192.168.3.33 и ACL Tailscale IP 100.100.
3.2, данный файл должен содержать обе записи. Запросы от клиентов в локальной сети вернут 192.168.3.
33, а с VPN-клиентов — 100.100.3.2. Однако важным нюансом при использовании Docker-контейнера Pi-Hole становится способ его сетевого взаимодействия.
При использовании стандартного мостового режима контейнер видит только один виртуальный интерфейс, что мешает pihole-FTL определить, с какого физического интерфейса пришёл DNS-запрос. Это нарушает логику localise-queries, которая базируется именно на интерфейсах. Для решения проблемы рекомендуется запускать контейнер с параметром --network=host, позволяющим приложению видеть реальные сетевые интерфейсы хоста и корректно обрабатывать запросы в зависимости от источника. Запуск контейнера Pi-Hole с host-сетевым режимом требует дополнительной настройки, особенно если используются нестандартные порты. Например, Pi-Hole по умолчанию обслуживает веб-интерфейс на порту 80, который может быть занят.
В этом случае можно изменить порт с помощью переменной окружения WEB_PORT, чтобы избежать конфликтов. Также на этапе настройки необходимо убедиться, что в веб-интерфейсе Pi-Hole правильно установлено разрешение для принимаемых интерфейсов — рекомендуется включить параметр разрешения DNS-запросов от всех источников. Следующий шаг — корректная настройка Tailscale. Без этого Split Horizon DNS не даст желаемого эффекта. Сначала важно убрать любые прежние маршруты, которые могли влиять на направление трафика, используя команды оболочки Tailscale для отключения и настройки рекламы маршрутов.
После этого можно добавить на стороне Tailscale функцию Split DNS через веб-интерфейс, указав соответствующий DNS-сервер (адрес Pi-Hole) и домены, для которых нужно применять раздельное разрешение имён. При запуске клиента Tailscale на устройствах настоятельно рекомендуется использовать ключ --accept-dns, чтобы клиент мог автоматически принимать и использовать рекламу DNS из сети. В мобильных приложениях, как правило, существует отдельный переключатель для этой опции. Таким образом, клиенты, подключённые к tailnet, смогут направлять запросы в локальный Pi-Hole и получать IP, соответствующие VPN-сети. Одним из значимых преимуществ такой схемы является возможность значительно снизить нагрузку на WAN и повысить безопасность.
Услуги, к которым ранее потребовалось открывать доступ из Интернета, могут быть ограничены для удаления с помощью геоблокировки или других методов. Пользователи в tailnet смогут полноценно получить доступ к сервисам по IP сети VPN, а локальные пользователи — по своему локальному IP, причём при этом применять общие правила безопасности. Особое внимание стоит уделить сервисам, которые не могут поддерживать дополнительную аутентификацию через обратный прокси. Примером могут служить клиенты Nextcloud, которые реализуют OAuth-токены в заголовках Authorization и не позволяют легко внедрять дополнительный уровень защиты на прокси. Раздельное разрешение DNS для таких клиентов в tailnet позволяет обойти необходимость двойной аутентификации и упростить соединение.
В процессе практической реализации автор заметил влияние мелких, но важных деталей по настройке Docker и Pi-Hole. К примеру, при неправильной сетевой конфигурации контейнер не отвечает на запросы DNS, хотя сервис слушает на порту 53. Логирование и захват трафика (tcpdump) помогает выявить, что запросы доходят, но ответы не отправляются. Часто проблема вызвана неправильным выбором сетевого интерфейса для прослушивания, что легко исправляется изменением параметров Pi-Hole в веб-интерфейсе. Наконец, преимущества использования Tailscale в качестве VPN-решения заключаются в простоте организации mesh-сети.
Нет необходимости отключать VPN на локальной сети для уменьшения задержек, поскольку устройства видят друг друга напрямую. Совместно с Split Horizon DNS это позволяет seamless-переход между разными режимами работы как в локальной сети, так и в удалённой зоне. Таким образом, создание Split Horizon DNS с помощью Pi-Hole и Tailscale — отличный способ повысить безопасность домашней или корпоративной сети и одновременно упростить доступ пользователей к нужным сервисам. Благодаря гибкой настройке DNS-записей в custom.list и правильной конфигурации Docker-контейнера, можно добиться того, что устройства в разных сетях будут получать соответствующие IP-адреса, что важно для безопасности, удобства и оптимизации маршрутизации трафика.
Реализация такой архитектуры позволяет закрыть многие сервисы от прямого доступа из Интернета, использовать geo-блокировки для снижения количества атак, а для удалённых пользователей — обеспечить комфортный и прозрачный доступ через защищённый tailnet. Кроме того, внедрение этих технологий не требует больших финансовых затрат и может быть выполнено в домашних условиях на недорогом оборудовании или в виртуальной среде. В перспективе технологии типа Tailscale всё больше интегрируются с другими сервисами и провайдерами VPN, что открывает дополнительные возможности для пользователей, путешествующих по миру, позволяя им подключаться к домашним сетям без потери скорости и безопасности. Split Horizon DNS становится ещё более актуальным инструментом в таком контексте, помогая разграничить доступ на локальном и удалённом уровнях, не нарушая привычный пользовательский опыт.