Найти в Дзене

🌐 Split Horizon DNS с Pi-Hole и Tailscale: как защитить внутренние сервисы и обеспечить удобство доступа

Представьте ситуацию: вы создали несколько удобных сервисов для себя или своих близких. Это может быть Nextcloud, домашний медиасервер, приватный мессенджер или что-то ещё. Конечно, вам хотелось бы получить доступ к этим сервисам отовсюду — из дома, офиса или в дороге. Но делать их общедоступными через интернет — опасно, а использовать дополнительную аутентификацию не всегда возможно или удобно. Именно такую задачу решил автор оригинальной статьи, объединив два популярных инструмента: Pi-Hole и Tailscale. Прежде чем говорить о технических тонкостях, давайте разберёмся, что такое Split Horizon DNS: Split Horizon DNS позволяет DNS-серверу выдавать разные IP-адреса одного и того же домена в зависимости от того, откуда поступает запрос: Автор столкнулся с проблемой при использовании Nextcloud. Клиенты Nextcloud не поддерживают дополнительную HTTP-аутентификацию на уровне reverse-прокси. Значит, открывать их в интернет напрямую было опасно, а дополнительную защиту поставить нельзя. Решением
Оглавление
Неоновая схема: в центре Pi-hole на Raspberry Pi, от него зелёные стрелки ведут к домашним устройствам, а синие — к защищённым клиентам Tailscale; каждый круг сети получает «свои» IP-ответы, визуализируя Split Horizon DNS.
Неоновая схема: в центре Pi-hole на Raspberry Pi, от него зелёные стрелки ведут к домашним устройствам, а синие — к защищённым клиентам Tailscale; каждый круг сети получает «свои» IP-ответы, визуализируя Split Horizon DNS.

Представьте ситуацию: вы создали несколько удобных сервисов для себя или своих близких. Это может быть Nextcloud, домашний медиасервер, приватный мессенджер или что-то ещё. Конечно, вам хотелось бы получить доступ к этим сервисам отовсюду — из дома, офиса или в дороге. Но делать их общедоступными через интернет — опасно, а использовать дополнительную аутентификацию не всегда возможно или удобно.

Именно такую задачу решил автор оригинальной статьи, объединив два популярных инструмента: Pi-Hole и Tailscale.

🔍 Что такое Split Horizon DNS?

Прежде чем говорить о технических тонкостях, давайте разберёмся, что такое Split Horizon DNS:

Split Horizon DNS позволяет DNS-серверу выдавать разные IP-адреса одного и того же домена в зависимости от того, откуда поступает запрос:

  • 🏠 Из локальной сети (LAN) → выдаётся локальный адрес (например, 192.168.x.x)
  • 🌐 Из внешнего мира (WAN) → выдаётся публичный IP-адрес или адрес, требующий дополнительной аутентификации
  • 🔐 Из защищённой VPN-сети (tailnet) → выдаётся специальный внутренний адрес, доступный только через VPN.

🚀 Зачем это нужно?

Автор столкнулся с проблемой при использовании Nextcloud. Клиенты Nextcloud не поддерживают дополнительную HTTP-аутентификацию на уровне reverse-прокси. Значит, открывать их в интернет напрямую было опасно, а дополнительную защиту поставить нельзя.

Решением стало использование Tailscale, которая создаёт VPN-сеть, защищённую WireGuard:

  • 💡 Преимущество: устройства в tailnet получают прямой и безопасный доступ без лишних авторизаций.
  • 🛡️ Безопасность: публичный доступ с WAN можно закрыть, а значит уменьшить поверхность атак.

🛠️ Как реализовать Split Horizon DNS с помощью Pi-Hole?

Автор использует Pi-Hole, который базируется на dnsmasq (точнее, форке pihole-FTL). Вот основные шаги реализации:

🖥️ 1. Подготовка Pi-Hole:

Необходимо, чтобы Pi-hole мог различать запросы по сетевым интерфейсам:

docker run \
-d \
--network=host \
-e WEB_PORT=8080 \
--name=pihole \
--restart=unless-stopped \
-e ServerIP=0.0.0.0 \
-v $PWD/pihole/conf:/etc/pihole \
-v $PWD/pihole/dnsmasq.d:/etc/dnsmasq.d/ \
pihole/pihole

📝 Важно: Pi-hole должен работать в режиме host, а не в режиме Docker bridge. Это позволит ему видеть интерфейс, с которого приходит DNS-запрос.

📃 2. Настройка записей DNS:

В файле /etc/pihole/custom.list автор прописывает две записи для одного и того же домена, но с разными IP:

192.168.3.33 foo.example.com # Для локальной сети (LAN)
100.100.3.2 foo.example.com # Для сети Tailscale (tailnet)

Благодаря настройке Pi-hole (localise-queries) сервер автоматически возвращает корректный IP-адрес клиенту в зависимости от того, через какой интерфейс пришёл запрос.

⚙️ 3. Настройка Tailscale:

Автор удалил старые маршруты и настроил Split DNS внутри Tailscale:

sudo tailscale down
sudo tailscale set --advertise-routes=
sudo tailscale up --accept-dns

Теперь все клиенты в tailnet получают внутренние адреса и могут безопасно взаимодействовать с сервисами.

📊 Что получилось в результате?

После всех настроек автор получил удобную и безопасную инфраструктуру:

  • 🔓 Локальные клиенты легко подключаются по локальным адресам.
  • 🔒 Tailscale-клиенты получают защищённый доступ, минуя дополнительные проверки, идеально подходя для сервисов, не поддерживающих двойную авторизацию.
  • 🚫 Внешние (WAN) клиенты остаются снаружи, без прямого доступа к сервисам, что существенно повышает безопасность и снижает риски атак.

Дополнительным плюсом стало избавление от географических ограничений, ведь доступ теперь контролируется через VPN, а значит — не зависит от IP-геолокации провайдеров.

🌟 Моё мнение и полезные советы:

На мой взгляд, комбинация Pi-hole и Tailscale — это отличный подход для тех, кто ценит безопасность и удобство. Мне особенно нравится гибкость решения, которая позволяет без ущерба безопасности использовать самые разные сервисы.

Однако есть несколько рекомендаций:

  • ⚠️ Убедитесь, что ваш Pi-hole сервер настроен правильно и действительно видит интерфейсы сети, иначе вы можете столкнуться с неожиданным простоем.
  • 🛑 Помните, что некоторые устройства (например, Chromecast) игнорируют локальные DNS-настройки, поэтому их поведение может отличаться от ожидаемого.

📚 Полезные ссылки и источники: