Универсальный домашний DNS

Универсальный домашний DNS

У меня дома много сетевых устройств, и я хотел бы, чтобы они были доступны в сети удобным для человека способом. Я не хочу, чтобы устройства были доступны напрямую из Интернета.

Мои потребности:

  1. Устройство может иметь несколько «псевдонимов»- например, он должен быть доступен под именем backup, dockerилиnas
    • Потому что я запускаю несколько служб на одном устройстве и хочу различать их, имея возможность переносить их на другое устройство.
  2. Устройство должно быть доступно удаленно с использованием домашнего VPN-подключения.
    • Потому что я хотел бы получить доступ к своему NAS и иметь возможность запускать резервное копирование из удаленного местоположения.
  3. Устройство должно быть доступно с домашней рабочей станции, подключенной к рабочей VPN.
    • Потому что я иногда работаю из дома и все равно хочу иметь доступ к своей локальной сети

За эти годы я перепробовал следующие решения. Однако ни одно из них не удовлетворяет всем моим потребностям без компромиссов.

С использованиемmDNS

Это была моя первоначальная настройка, устройства доступны вhostname.local

❓ Устройство может иметь несколько «псевдонимов»

Возможно иметь несколько имен mDNS на одном устройстве, однако я никогда не исследовал этот вопрос более подробно из-за следующей проблемы

❌ Устройство должно быть доступно удаленно с использованием домашнего VPN

mDNSИспользуется протокол , broadcastкоторый не пересылается через VPN-соединение. mDNSОтветы от устройств не могут достичь VPN-клиента.

✅ Устройство должно быть доступно с домашней рабочей станции, подключенной к рабочему VPN

Это работает нормально, поскольку mDNS«обходит» VPN и получает доступ к локальной сети.

Использование mDNSчерез домашний DNSсервер

Я размещаю свой собственный DNSсервер дома. Идея в том, что это должно решить мои первые две потребности. Однако наличие *.localзаписей на DNSсервере не рекомендуется. Например, digвыводит предупреждение

$ dig docker.local
...
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
...
✅ Устройство может иметь несколько «псевдонимов»

Хотя это и не рекомендуется, имена разрешаются правильно.

✅ Устройство должно быть доступно удаленно с использованием домашнего VPN

Доступ к серверу DNSосуществляется простым способом «запрос-ответ», поэтому он полностью совместим с VPN.

❌ Устройство должно быть доступно с домашней рабочей станции, подключенной к рабочему VPN

Это не работает, поскольку рабочая станция использует рабочий DNS внутри VPN, который (очевидно) не имеет записей для моего docker.local.

Использование домашнего DNSсервера с пользовательским домашним доменом

Это должно быть "правильным путем". Я создал свой домашний домен, например. myplace(чтобы избежать теневых *.home) и позволил DHCP-серверу установить этот домен для всех устройств. Идея заключалась в том, чтобы DNSправильно использовать сервер.

✅ Устройство может иметь несколько «псевдонимов»

Спасибо DNSсерверу.

✅ Устройство должно быть доступно удаленно с использованием домашнего VPN

Доступ к серверу DNSосуществляется простым способом «запрос-ответ», поэтому он полностью совместим с VPN.

❌ Устройство должно быть доступно с домашней рабочей станции, подключенной к рабочему VPN

Это не работает, поскольку рабочая станция использует рабочий DNS внутри VPN, который (очевидно) не имеет записей для моего docker.myplace.

Использование публичного DNSсервера с публичным доменом (пока только теоретически)

Я также плачу за общественное достояние, пусть оно будет example.com. Идея состоит в том, чтобы исправить третью потребность из предыдущего решения, имея, например, docker.example.com = 192.168.0.17запись в общественном DNS.

✅ Устройство может иметь несколько «псевдонимов»

Спасибо DNSсерверу.

✅ Устройство должно быть доступно удаленно с использованием домашнего VPN

Доступ к серверу DNSосуществляется простым способом «запрос-ответ», поэтому он полностью совместим с VPN.

✅ Устройство должно быть доступно с домашней рабочей станции, подключенной к рабочему VPN

Поскольку публичный домен размещен на публичном DNSсервере, он docker.example.comдолжен быть доступен из любой точки мира (как и superuser.comдомен).

⚠️ Однако. Это небезопасно:

  1. Я бы выложил в Интернет все имена своих устройств и их (домашние) IP-адреса
  2. При доступе docker.example.comиз-за пределов домашней сети (на работе, в кафе и т. д.) я бы подключался 192.168.0.17кихлокальная сеть. Это может закончиться по-разному
    • адрес не существует - соединение просто не устанавливается
    • адрес существует - я бы подключился к чьему-то устройству, что может быть очень опасно (например, для незащищенных соединений)

Есть ли у кого-нибудь идеи получше, как это сделать?

решение1

Это не работает, поскольку рабочая станция использует рабочий DNS внутри VPN, который (очевидно) не имеет записей для моего docker.myplace.

Внутренний домашний DNS будет работать, если ваша ОС поддерживает раздельный DNS. Например, с systemd-resolved в Linux есть несколько наборов <доменов, DNS-серверов> (по одному на сетевой интерфейс), так что вы можете иметь VPN DNS-серверы для рабочих доменов, но домашний DNS для всего остального – или наоборот, домашний DNS для ".home.arpa", но VPN DNS для всего остального. До systemd также можно было настроить dnsmasq или Unbound, чтобы добиться того же.

(Не путать с DNS с «разделением мозга» или «разделением представления», которые выполняются на стороне сервера.)

Windows, по-видимому, называет это «условной переадресацией» в программном обеспечении DNS-сервера, имощьподдерживают его для встроенного VPN-клиента (IKEv2), хотя корпоративные VPN вряд ли позволят это сделать.

Я бы выложил в Интернет все имена своих устройств и их (домашние) IP-адреса

В том, чтона самом делеНо в чем проблема? Имена устройств — это, ну, имена — они не кажутся мне чем-то изначально личным (хотя, возможно, у меня несколько старомодный взгляд на это, с тех пор, как это было довольно распространено в домашних сетях); и IP-адреса в любом случае не имеют никакого значения за пределами вашей домашней локальной сети.

Однако вы всегда можете иметь смесь того и другого: иметь публичные имена DNS (возможно, общие имена, такие как docker) для нескольких избранных устройств, к которым вам нужно получить доступ с рабочей станции, но использовать внутренний DNS для всего остального. На большинстве ПК можно настроить более одного суффикса домена (и даже развернуть список через DHCP).

При доступе к docker.example.com из-за пределов домашней сети (на работе, в кафе и т. д.) я бы подключался к 192.168.0.17 в их локальной сети. Это может закончиться по-разному

IPv6 был бы обычным «решением» для этой проблемы: случайно сгенерированный частный префикс IPv6 имел бы ~56 уникальных бит, чего обычно более чем достаточно, чтобы избежать коллизий.

Связанный контент