НейроАгент

Настройка split DNS для Tailscale subnet router

Полное руководство по настройке split DNS для subnet router в Tailscale. Узнайте, как настроить локальный DNS-сервер для доступа к IoT-камерам через постоянные имена.

Вопрос

Как настроить split DNS для subnet router в Tailscale?

Ситуация:
В домашней сети есть основной роутер с IP-адресом 10.10.10.1
За ним расположена подсеть 20.20.20.0/24, где находятся различные IoT-устройства, включая камеры YI.
После настройки subnet router в подсети все устройства стали доступны извне, и система работает корректно.
Однако камеры YI не поддерживают резервирование DHCP-адресов и привязку IP к MAC-адресам. Установка статического IP-адреса непосредственно на самих устройствах невозможна. В результате после истечения срока аренды IP-адреса устройства получают случайные IP-адреса, что требует ручного поиска и подключения.

Вопрос:
Как запустить локальный DNS-сервер? Что и где нужно настроить, чтобы обращение к камерам осуществлялось через локальные имена, например: rtsp://camer001.local/channel1? Также необходимо обеспечить возможность определения текущего IP-адреса устройства по его локальному имени.

НейроАгент

Настроить split DNS для subnet router в Tailscale можно через раздел DNS административной консоли, добавив локальный DNS-сервер для разрешения внутренних имен устройств. Для YI-камер, которые не поддерживают резервирование DHCP, локальный DNS позволит обращаться к устройствам по постоянным именам, таким как camer001.local, независимо от их текущего IP-адреса.

Содержание

Что такое split DNS и почему он нужен

Split DNS (раздельный DNS) — это конфигурация, при которой DNS-запросы направляются на разные серверы в зависимости от домена. В контексте Tailscale это позволяет:

  • Использовать внутренний DNS-сервер для локальных доменов (например, .local)
  • Продолжать использовать публичные DNS-серверы для интернет-доменов
  • Обеспечить постоянное разрешение имен IoT-устройств, независимо от их IP-адресов

Важно: Как отмечено в документации Tailscale, split DNS создает DNS-сервер, который отвечает на записи, не используемые в публичном интернете.

Настройка локального DNS-сервера

Для решения проблемы с YI-камерами необходим локальный DNS-сервер в вашей сети. Вот несколько вариантов:

Вариант 1: Использование роутера

Если ваш основной роутер (10.10.10.1) поддерживает функцию локального DNS:

  1. Зайдите в веб-интерфейс роутера
  2. Найдите раздел DHCP/DNS
  3. Включите опцию локального DNS
  4. Добавьте записи для ваших устройств

Вариант 2: Установка отдельного DNS-сервера

Для более надежной настройки можно установить отдельный DNS-сервер на устройстве в подсети 20.20.20.0/24:

bash
# Пример установки dnsmasq на Linux
sudo apt update
sudo apt install dnsmasq

Вариант 3: Использование Docker

bash
docker run -d --name=local-dns \
  -p 53:53/udp \
  -e "DOMAINS=local" \
  -e "DNSMASQ_HOSTS=camer001.local=20.20.20.10, camer002.local=20.20.20.11" \
  --restart=always \
  andyshinn/dnsmasq:latest

Примечание: Как объясняется в статье о subnet router, для использования внутреннего DNS-сервера необходимо настроить split DNS в разделе DNS административной консоли.

Конфигурация split DNS в Tailscale

Для настройки split DNS выполните следующие шаги:

  1. Зайдите в административную консоль Tailscale
  2. Нажмите “Add nameserver”
  3. Укажите параметры:
    • DNS-сервер: IP-адрес вашего локального DNS (например, 10.10.10.1 или адрес сервера в подсети)
    • Домены: local или конкретные домены ваших устройств
Пример конфигурации:
Имя сервера: Local DNS Server
IP-адрес: 10.10.10.1
Домены: local, .local

Совет: Как упоминается в обсуждении на Reddit, для корректной работы нужно, чтобы nas.local указывал на ваш DNS-сервер.

Настройка subnet router для доступа к DNS

Поскольку ваш локальный DNS-сервер находится в подсети 20.20.20.0/24, необходимо убедиться, что subnet router правильно настроен для маршрутизации DNS-запросов:

  1. Проверьте настройки subnet router:
bash
tailscale status
  1. Убедитесь, что маршруты корректно анонсированы:
bash
tailscale set --advertise-routes=20.20.20.0/24
  1. Проверьте доступность DNS-сервера:
bash
# С устройства в Tailscale
nslookup camer001.local 10.10.10.1

Важно: Как указано в документации Tailscale, если ваши DNS-серверы не являются публичными или не используют IP-адреса Tailscale, вам, вероятно, потребуется настроить маршрутизацию подсетей для доступа к частным DNS-серверам.

Практическая реализация для YI-камер

Для YI-камер, которые не поддерживают резервирование DHCP, реализация будет выглядеть следующим образом:

Настройка на локальном DNS-сервере

Добавьте постоянные записи для ваших камер:

Для dnsmasq:

address=/camer001.local/20.20.20.10
address=/camer002.local/20.20.20.11
address=/camer003.local/20.20.20.12

Для роутера с DD-WRT:

  • Зайдите в Services → DNSMasq
  • Добавьте:
address=/camer001.local/20.20.20.10
address=/camer002.local/20.20.20.11

Конфигурация доступа к камерам

Теперь вы можете обращаться к камерам через имена:

bash
# Примеры доступа к камерам
rtsp://camer001.local:554/channel
rtsp://camer002.local:554/channel1
rtsp://camer003.local:554/stream

Совет: Как видно из примера на GitHub, для локальных имен можно использовать поддомены, такие как local.zila.dev, что позволяет использовать единые сертификаты TLS.

Решение проблем с доступом

Проблема 1: DNS-запросы не доходят до локального сервера

Решение:

  1. Проверьте, что subnet router правильно маршрутизирует трафик в подсеть
  2. Убедитесь, что брандмауэр не блокирует UDP-порты 53
  3. Проверьте конфигурацию split DNS в консоли Tailscale

Проблема 2: Камеры не доступны по именам

Решение:

bash
# Проверьте разрешение имен
nslookup camer001.local 10.10.10.1

# Проверьте доступность
ping camer001.local

# Проверьте доступ к RTSP-потоку
ffprobe -i rtsp://camer001.local:554/channel

Проблема 3: Конфликт DNS-серверов

Решение: Как упоминается в настройках клиента, если вы хотите использовать только локальный DNS, в меню устройства снимите галочку “Use Tailscale DNS settings”.

Альтернативные подходы

1. Использование MagicDNS для Tailscale

Если устройства имеют IP-адреса в подсети 20.20.20.0/24, вы можете использовать MagicDNS:

bash
# Настройка MagicDNS для имен в подсети
tailscale set --magicdns=enabled
tailscale set --advertise-routes=20.20.20.0/24

2. Использование /32 маршрутов

Как упоминается в обсуждении, можно использовать /32 адреса в CIDR-нотации для subnet router:

bash
tailscale set --advertise-routes=20.20.20.10/32,20.20.20.11/32,20.20.20.12/32

3. Обратный прокси

Для веб-интерфейсов камер можно настроить обратный прокси на subnet router:

nginx
# Пример конфигурации Nginx
server {
    listen 80;
    server_name camer001.local;
    
    location / {
        proxy_pass http://20.20.20.10;
        proxy_set_header Host $host;
    }
}

Важно: Как отмечено в статье о DNS rebinding, для проблемных DNS-серверов может потребоваться настроить исключение для определенных доменных имен.

Источники

  1. Configure Split DNS with Tailscale and Local DNS
  2. DNS in Tailscale - Official Documentation
  3. SplitDNS magic with Tailscale
  4. Subnet routers - Tailscale Docs
  5. What is Split DNS & Why Should You Use It?
  6. Custom DNS for machines - GitHub Issue
  7. Manage client preferences - Tailscale Docs
  8. DNS problems with internal services - Tailscale Docs

Заключение

Настройка split DNS для subnet router в Tailscale позволяет решить проблему с динамическими IP-адресами IoT-устройств, таких как YI-камеры. Ключевые моменты:

  1. Настройте локальный DNS-сервер в вашей сети для разрешения внутренних имен
  2. Сконфигурируйте split DNS в административной консоли Tailscale, добавив ваш DNS-сервер для домена .local
  3. Убедитесь в правильности маршрутизации между подсетями для доступа к DNS-серверу
  4. Добавьте постоянные DNS-записи для ваших камер, чтобы они разрешались в фиксированные IP-адреса
  5. Тестируйте доступ через RTSP-потоки с использованием локальных имен

После настройки вы сможете обращаться к камерам через постоянные имена типа rtsp://camer001.local/channel, что значительно упростит управление устройствами и избавит от необходимости ручного поиска IP-адресов.