Медведь-талисман NordBastion стоит в тёмном северном каменном зале рядом со стойкой серверов, подняв одну лапу к парящему циановому голографическому рунному камню со списком доменных имён; четыре луча запросов расходятся веером через рунную арку к трём далёким серверным монолитам, а пятый луч останавливает янтарный щит с перечёркнутым кругом, за окном позади видно северное сияние
Руководство · Сеть·15 мин. чтения · 40 мин. практики

Ваш собственный DNS-резолвер.
Единственный журнал, о переносе которого никто не думает.

Каждый домен, который запрашивают ваши устройства, — это строка с меткой времени в чужом файле: вашего провайдера или бесплатного публичного резолвера. Шесть шагов, чтобы перенести этот файл на машину, которая принадлежит вам: Unbound резолвит от корня, AdGuard Home фильтрует перед ним, шифрованный DNS работает на настоящем сертификате, а порт 53 никогда не смотрит в интернет. Машина стоит $3.90 в месяц. Протестировано на Debian 12.

Шесть шагов
  1. 01

    Форма

    Рекурсивный, а не пересылающий

  2. 02

    Закрыть

    Порт 53 — до того, как он откроется

  3. 03

    Резолвинг

    Unbound, с валидацией

  4. 04

    Фильтрация

    AdGuard Home, DoH, DoT

  5. 05

    Доступ

    Сначала туннель, затем клиенты

  6. 06

    Проверить

    Утечки, DNSSEC, аптайм

Прежде чем начать · Что на самом деле утекает

DNS — это индекс вашей жизни. По умолчанию он принадлежит не вам.

Зашифруйте диск, заверните трафик в туннель, платите в Monero, регистрируйтесь без почты — а затем позвольте ноутбуку весь день спрашивать резолвер, о котором вы никогда не задумывались, переводя каждое имя хоста, к которому он обращается, по одному запросу за раз, в открытом виде. Разрешение имён — та часть стека, которую защищают в последнюю очередь, и именно она оставляет самую чистую запись того, чем человек занимается на самом деле.

Стоит точно определить, что именно содержит эта запись, потому что фраза «DNS выдаёт ваш браузинг» одновременно верна и поверхностна. Журнал запросов — это список доменных имён с метками времени, привязанный к IP-адресу, который их запросил. Это не страницы, которые вы читали, и обычно не точный URL. Это нечто более тихое и, для профилирования, более ценное: форма жизни. Банк. Работодатель. Приложение для знакомств, проверяющееся каждые четыре минуты. Медицинский сайт, посещённый один раз в 02:00. Три домена, которые появляются вместе только потому, что принадлежат одному и тому же мессенджеру. Никому не нужно содержимое, когда индекс настолько хорош.

Этот индекс могут держать четыре стороны, и самостоятельный хостинг переносит его от первых двух к четвёртой:

Настройка Кто видит каждый ваш запрос Видно в трафике Множество анонимности
Резолвер провайдера, открытым текстом (по умолчанию)Ваш провайдер — по имени и аккаунтуВсё, любому на маршрутеЕго абоненты
Публичный резолвер, шифрованно (DoH/DoT)Эта одна компания — привязана к вашему IPНичего, кроме адреса назначенияМиллионы
Ваш собственный резолвер, пересылающий вышестоящему серверуВышестоящий сервер, который вы выбрали, — без измененийНичего, кроме адреса назначенияОдин
Ваш собственный резолвер, рекурсия от корняНикто — каждая зона видит только свои собственные именаНичего, кроме адреса назначенияОдин — на IP, который не указывает на вас

Третья строка — та, на которой люди попадаются. Установить резолвер на собственном сервере, а затем настроить пересылку всего на 1.1.1.1, меняет ровно одну вещь: теперь ваши запросы приходят в Cloudflare с другого IP-адреса. Журнал всё так же существует, всё так же принадлежит кому-то другому, а вы добавили себе машину на обслуживание взамен ни на что.

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

Шаг 01 · Форма

Рекурсия — или просто ретрансляция? Только один из двух вариантов стоит того, чтобы заводить сервер.

За фразой «мой собственный DNS-сервер» скрываются две совершенно разные машины, и почти каждый туториал строит не ту. Определитесь с этим прежде, чем что-либо устанавливать, потому что это разница между инструментом приватности и прокси для чужой политики конфиденциальности.

Форвардер принимает ваш запрос и передаёт его другому резолверу — обычно Cloudflare, Google, Quad9 или вашему провайдеру — а затем кэширует то, что приходит в ответ. Это просто, это быстро, и это отдаёт весь поток ваших запросов одной-единственной третьей стороне. Каждое руководство, заканчивающееся словами «теперь укажите в качестве вышестоящего сервера 1.1.1.1», построило именно такую систему.

Рекурсивный резолвер делает всю работу сам. Чтобы найти mail.example.com, он спрашивает у корневого сервера, кто обслуживает .com, спрашивает у серверов .com, кто обслуживает example.com, а затем спрашивает саму запись у собственных серверов имён example.com. Три-четыре коротких обмена с тремя-четырьмя разными операторами, ни одному из которых не сообщается ничего об остальных. При включённой QNAME-минимизации всё идёт ещё дальше: у корня спрашивают только про .com, а у серверов .com — только про example.com. Полное имя раскрывается ровно одной стороне — той, что обслуживает это имя и которая в любом случае получила бы ваше соединение тридцатью миллисекундами позже.

Свойство Unbound, рекурсивный Любой форвардер AdGuard Home в одиночку
Каждый запрос видит одна сторонаНетДаДа — его вышестоящий сервер
DNSSEC проверяется локальноДаДоверие — от вышестоящего сервераДоверие — от вышестоящего сервера
Списки блокировки и правила для отдельных устройствТолько через локальные зоныЗависит от демонаДа, с веб-интерфейсом
Слушатели DoH / DoT для клиентовDoT нативно, DoH через проксиЗависит от демонаОба, встроенные
Задержка холодного старта3–4 раунд-трипа1 раунд-трип1 раунд-трип
Правильный ответПоловина стека, отвечающая за приватностьТолько как осознанный резервный вариантПоловина, отвечающая за фильтрацию, — перед ним

Два правых столбца — не конкуренты, это две половины одной и той же сборки. AdGuard Home владеет портом 53, применяет списки блокировки и терминирует шифрованные транспорты; Unbound находится позади него, на loopback, и занимается резолвингом. Ни одна из половин не справляется хорошо с работой другой, а вся цепочка в сумме занимает около сотни мегабайт RAM.

Если вы вынесете с этой страницы только одну мысль, пусть будет эта: резолвер, пересылающий запросы публичному провайдеру DNS, не сделал ваш DNS приватным. Он лишь перенёс журнал на один хоп дальше и добавил сервер в список того, что вам нужно обслуживать. Вся суть — именно в рекурсии.

Шаг 02 · Закрытие

Закройте порт 53 прежде, чем что-либо его откроет. Это не шаг предосторожности. Это необходимый шаг.

Сначала закажите машину. В панели: Заказ → VPS → Sentinel, образ Debian 12, в том бастионе, который ближе всего к устройствам, которые будут им пользоваться, — Helsinki, Stockholm, Oslo или Reykjavík. Для открытия аккаунта не нужен адрес электронной почты, а счёт оплачивается в Monero, Bitcoin, Lightning или любом другом поддерживаемом активе, и здесь это важнее, чем обычно: вся ценность личного резолвера держится на том, что IP-адрес, от имени которого идут запросы, невозможно проследить до имени.

Затем пройдите по чек-листу защиты первого часа — только SSH-ключи, никакого входа по паролю, автоматические обновления — потому что всё, что дальше, предполагает машину, которая ещё не скомпрометирована.

Прочтите это, прежде чем запускать демон

Рекурсивный резолвер, отвечающий всему интернету, называется открытым резолвером, и сканеры, обходящие весь интернет, найдут его в течение часов после открытия порта. DNS работает поверх UDP, адреса источника в UDP тривиально подделываются, а 60-байтовый запрос может породить ответ, который в десятки раз больше, — поэтому открытый резолвер является бесплатным усилителем для атаки типа «отказ в обслуживании» против третьей стороны. Дальнейшая последовательность всегда одна и та же: начинается трафик, приходят жалобы на злоупотребление, и IP отправляется в null-route. Это самый распространённый способ, которым заканчивает свои дни первый DNS-сервер. Два правила полностью это предотвращают: отказывать по умолчанию в конфигурации резолвера и никогда не разрешать 53/udp с 0.0.0.0/0 в файрволе.

Поэтому файрвол настраивается первым, пока ничего ещё не слушает. Правила ниже предполагают туннель WireGuard на 10.8.0.0/24 — если вы его ещё не построили, руководство по WireGuard, на которое есть ссылка внизу этой страницы, — это пятнадцатиминутное отступление, и это тот транспорт, на котором вся эта конструкция чувствует себя лучше всего.

ufw default deny incoming
ufw allow 22/tcp                      # or your moved SSH port
ufw allow 51820/udp                   # WireGuard
ufw allow in on wg0 to any port 53 proto udp
ufw allow in on wg0 to any port 53 proto tcp
ufw enable

# DNS is NOT opened to the world. Confirm it:
ufw status numbered | grep 53

Обратите внимание на то, что намеренно отсутствует: нет правила, открывающего 53 на публичном интерфейсе. Порт 53 существует только на wg0 и на loopback. Если позже вы добавите DNS-over-TLS или DNS-over-HTTPS, это будут TCP 853 и TCP 443, они аутентифицируются сертификатом и получат собственные правила в шаге 05 — а обычный нешифрованный UDP-порт в любом случае останется закрытым.

Теперь освободите порт. В Ubuntu — и в любом Debian, где его кто-то включил, — systemd-resolved уже слушает на 127.0.0.53:53, и Unbound откажется запускаться с ошибкой привязки, которую люди по двадцать минут неправильно трактуют. Сначала проверьте, затем отключите только stub-слушатель, оставив systemd-resolved в роли локального клиентского интерфейса:

ss -lunp 'sport = :53'                # who owns UDP/53 right now?

mkdir -p /etc/systemd/resolved.conf.d
cat > /etc/systemd/resolved.conf.d/no-stub.conf <<'EOF'
[Resolve]
DNSStubListener=no
EOF
systemctl restart systemd-resolved
ss -lunp 'sport = :53'                # should now be empty

На чистом Debian 12 первая команда ничего не выведет, и делать будет нечего. Всё равно выполните её — это займёт секунду, а альтернатива — диагностировать «address already in use» против сервиса, о существовании которого вы даже не знали.

Шаг 03 · Резолвинг

Unbound, от корня. Один пакет, один конфигурационный файл, никакого вышестоящего сервера.

Unbound — это валидирующий, рекурсивный, кэширующий резолвер от NLnet Labs. Он упакован повсюду, это то, что уже работает на значительной части интернета, и из коробки он именно резолвит рекурсивно — чтобы превратить его в форвардер, придётся специально постараться. Установите его вместе с пакетом корневых подсказок, чтобы он знал, где находятся корневые серверы, не загружая список ниоткуда:

apt update && apt install -y unbound dns-root-data
unbound -V | head -2

Пакет dns-root-data устанавливает корневые подсказки в /usr/share/dns/root.hints и корневой якорь доверия DNSSEC в /usr/share/dns/root.key, а также поддерживает оба файла в актуальном состоянии через обычный канал обновления пакетов. Это скучный, но правильный способ их получить; скачивание root.hints по URL в cron-задаче — способ, который рано или поздно молча откажет.

/etc/unbound/unbound.conf.d/nb-resolver.conf

server:
    # ---- Who may ask. Deny first, allow narrowly.
    interface: 127.0.0.1@5335
    interface: 10.8.0.1
    access-control: 0.0.0.0/0 refuse
    access-control: ::0/0 refuse
    access-control: 127.0.0.0/8 allow
    access-control: 10.8.0.0/24 allow

    # ---- Privacy of the recursion itself.
    qname-minimisation: yes
    qname-minimisation-strict: no
    hide-identity: yes
    hide-version: yes
    rrset-roundrobin: yes

    # ---- DNSSEC. The anchor is maintained by the dns-root-data package.
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
    root-hints: "/usr/share/dns/root.hints"
    harden-dnssec-stripped: yes
    harden-glue: yes
    harden-below-nxdomain: yes
    harden-large-queries: yes
    harden-short-bufsize: yes
    aggressive-nsec: yes
    val-clean-additional: yes

    # ---- Do not be a reflector, even by accident.
    refuse-any: yes
    ratelimit: 1000
    ip-ratelimit: 200
    edns-buffer-size: 1232

    # ---- Cache. This is where the 4 GB actually earns its keep.
    msg-cache-size: 128m
    rrset-cache-size: 256m
    cache-min-ttl: 60
    cache-max-ttl: 86400
    prefetch: yes
    prefetch-key: yes
    serve-expired: yes
    serve-expired-ttl: 3600

    # ---- Never chase a name that has no business being on the internet.
    private-address: 10.0.0.0/8
    private-address: 172.16.0.0/12
    private-address: 192.168.0.0/16
    private-address: 169.254.0.0/16
    private-address: fd00::/8
    private-address: fe80::/10

    num-threads: 2
    so-reuseport: yes
    verbosity: 0
    logfile: ""

remote-control:
    control-enable: yes
    control-interface: /run/unbound.ctl

Четыре из этих строк делают настоящую работу и заслуживают по отдельному предложению каждая.

  • 01access-control: 0.0.0.0/0 refuse — ответ по умолчанию всему интернету — «нет». Всё, что после неё, — исключения, которые вы написали намеренно. Именно эта единственная строка останавливает сценарий с усилением из шага 02 ещё до того, как за дело возьмётся файрвол.
  • 02qname-minimisation: yes — у корневых серверов спрашивают про .com, а не про полное имя хоста. RFC 9156, включённый по умолчанию в текущем Unbound, — причина, по которой рекурсивный резолвер утекает меньше, чем можно подумать, глядя на диаграмму. Строгий режим оставьте выключенным: небольшое число неправильно настроенных зон всё ещё ломается под ним.
  • 03refuse-any: yes — запросы ANY возвращают максимально большой ответ на минимально возможный вопрос, а это именно то, что нужно атаке с усилением. Ничему легитимному они не нужны.
  • 04serve-expired: yes — когда авторитативный сервер недоступен, отдавать устаревший ответ и обновлять его в фоне вместо того, чтобы просто отказывать. Именно эта настройка не даёт далёкому сбою выглядеть для всех в доме так, будто пропал интернет.

Обратите внимание на два слушателя. Loopback на порту 5335 — это то, что AdGuard Home будет использовать на следующем шаге; 10.8.0.1 — это адрес туннеля, чтобы клиенты в VPN могли обращаться к Unbound напрямую, если вы решите пропустить слой фильтрации. Если вы ещё не запустили WireGuard, пока уберите эту вторую строку интерфейса — Unbound не запустится с адресом, которого нет на машине.

Запустите его и убедитесь, что он работает:

unbound-checkconf
systemctl restart unbound && systemctl enable unbound

apt install -y dnsutils
dig @127.0.0.1 -p 5335 nordbastion.com +short

# DNSSEC: the first must come back with the "ad" flag set,
# the second must FAIL — its signatures are deliberately broken.
dig @127.0.0.1 -p 5335 dnssec-tools.org +dnssec | grep -E 'flags:|status:'
dig @127.0.0.1 -p 5335 dnssec-failed.org  | grep 'status:'

Флаг ad в первом ответе означает, что Unbound проверил цепочку подписей от корня до самой записи и она выдержала проверку. SERVFAIL во втором означает, что валидация отклонила подделанный ответ вместо того, чтобы передать его вам. Если вместо этого второй запрос вернёт адрес, значит, валидация не включена, и первое, на что стоит посмотреть, — это якорь доверия.

Шаг 04 · Фильтрация

AdGuard Home перед ним. Списки блокировки, правила для отдельных устройств и шифрованные слушатели.

Строго говоря, этот шаг необязателен — один Unbound уже является приватным резолвером, — и всё же почти всем он нужен. AdGuard Home даёт вам списки блокировки, политики для отдельных клиентов, читаемый журнал запросов на время отладки и, что полезнее всего, встроенные слушатели DNS-over-TLS и DNS-over-HTTPS, чтобы телефоны и браузеры могли обращаться к вашему резолверу из сетей, где VPN непрактичен.

Устройство — это цепочка, и весь фокус в том, чтобы правильно расставить порты: AdGuard Home владеет 53 и обращён к клиентам, Unbound сидит на 127.0.0.1:5335 и обращён к интернету. Больше ничего на машине не слушает 53.

curl -fsSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
# Web interface: http://<vps>:3000 — reach it over the SSH tunnel below,
# never by opening 3000 to the internet.
ssh -N -L 3000:127.0.0.1:3000 root@<vps>

Пройдите мастер первого запуска через этот туннель. Установите слушатель админки на 127.0.0.1 или на адрес туннеля, никогда на 0.0.0.0, и задайте длинный пароль — этот интерфейс может переписать каждое имя, которое резолвит ваша сеть, а значит, он так же чувствителен, как и сам резолвер.

Затем укажите ровно один вышестоящий сервер: в разделе Настройки → Настройки DNS очистите список по умолчанию и укажите свой экземпляр Unbound. Одна строка, ничего больше. Если в этом поле останется публичный резолвер, всё, что было сделано в шаге 01, окажется отменено.

127.0.0.1:5335

Оставьте «Parallel requests» выключенным — с единственным вышестоящим сервером это лишь дублирует трафик, — и выключите «Use private reverse DNS resolvers», если только вы на самом деле не держите внутреннюю зону. Укажите в качестве bootstrap-серверов то, чему вы доверяете; они используются только для разрешения имён хостов вышестоящих серверов, а при вышестоящем сервере в виде обычного IP к ним вообще ни разу не обратятся.

Списки блокировки: начните узко. Инстинкт подсказывает включить всё на странице списков и наслаждаться счётчиком. Сопротивляйтесь ему. Каждый список — это набор субъективных решений, принятых кем-то другим о том, куда вашим устройствам разрешено обращаться, а сбои от него тихие и сбивающие с толку: страница загрузилась наполовину, кнопка ничего не делает, банковское приложение отказывается открываться. Начните со стандартного фильтра AdGuard DNS filter или с одного хорошо поддерживаемого агрегата вроде OISD, поживите с ним пару недель и только потом добавляйте ещё. Ведите allow-список и пользуйтесь им без чувства вины.

Журнал запросов — неловкая часть

Вы только что построили машину, назначение которой — не дать кому-то ещё вести список всех имён, которые резолвят ваши устройства, — а первое, что делает AdGuard Home, это ведёт ровно такой список, по умолчанию включённый, на девяносто дней. Это по-настоящему полезно, пока вы настраиваете списки блокировки, и это самый чувствительный файл на сервере. Решите осознанно: 24 часов достаточно, чтобы ответить на вопрос «что это устройство только что запросило?», ноль — честная настройка после того, как настройка завершена, а девяносто дней — это решение, которое никто не должен принимать, просто оставив настройку по умолчанию. Настройки → Общие настройки → Журнал запросов, и заодно настройте там же срок хранения статистики.

Направьте файрвол на новую расстановку — теперь AdGuard Home владеет портом 53 на интерфейсе туннеля, а Unbound доступен только через loopback. На публичном интерфейсе ничего не меняется: на нём по-прежнему нет вообще никакого DNS.

Шаг 05 · Доступ

Два способа получить доступ. Туннель — это хороший вариант; шифрованный DNS — портативный.

Резолвер, до которого никто не может достучаться, бесполезен, а резолвер, до которого может достучаться кто угодно, — это тот самый сбой из шага 02. Есть ровно два хороших ответа, и большинство в итоге использует оба — туннель дома и на ноутбуке, шифрованный DNS на телефоне и в сетях, где UDP фильтруется.

Вариант A — через WireGuard. Лучший из двух вариантов, и причина, по которой это руководство продолжает указывать на руководство по WireGuard. Порт 53 остаётся невидимым для интернета, сам запрос никогда ни в каком виде не пересекает недоверенную сеть, и нет сертификата, который нужно продлевать. Если VPS уже является точкой выхода вашего VPN, это одна строка в конфигурации каждого пира:

# On the client, in the [Interface] section of the peer config:
DNS = 10.8.0.1

Одна тонкость, которая многих подводит: в Linux wg-quick устанавливает этот адрес через resolvconf или systemd-resolved, и если ни один из них не установлен, он молча ничего не делает, пока туннель тем временем поднимается идеально. Проверьте это командой resolvectl status или прочитав /etc/resolv.conf после того, как туннель поднялся, — работающий туннель с всё ещё настроенным старым резолвером — это ровно та утечка, ради которой затевалось всё это упражнение.

Вариант B — DNS-over-TLS и DNS-over-HTTPS. Нужен, когда устройство не может постоянно находиться в туннеле. Оба аутентифицируются сертификатом, а значит, требуют имени хоста: направьте A-запись на VPS, затем либо позвольте AdGuard Home держать сертификат напрямую, либо поместите его за обратным прокси, который уже терминирует TLS за вас. Слушатели — это 853/tcp для DoT и 443/tcp для DoH.

ufw allow 853/tcp                     # DNS-over-TLS
ufw allow 443/tcp                     # DNS-over-HTTPS
# 53/udp is still NOT open on the public interface. It never will be.
ufw status

Дайте конечной точке DoH путь, который невозможно угадать — AdGuard Home позволяет отдавать её по адресу /dns-query/<random>, а отдельный путь для каждого человека означает, что доступ можно отозвать у одного человека за раз, ничего не меняя для всех остальных. Это не аутентификация в строгом смысле, но она не даёт публичному слушателю превратиться в открытый резолвер с лишними шагами.

Клиент Где живёт настройка Какой транспорт использует
Android 9 и новееНастройки → Сеть и интернет → Частный DNS → имя хостаТолько DNS-over-TLS
iOS и macOSПодписанный DNS-профиль .mobileconfigDoH или DoT, на уровне всей системы
Windows 11Параметры → Сеть и Интернет → Назначение DNS-сервераDoH, для каждого адаптера
FirefoxНастройки → Приватность и защита → DNS через HTTPS → ДругойDoH, только в браузере
Роутер (вся сеть)WAN DNS, либо DHCP option 6Обычный DNS — так что заверните его в туннель

Строка про роутер — та, над которой стоит подумать. Раздача вашего резолвера через DHCP разом покрывает все устройства в доме, включая те, у которых вообще нет экрана настроек, — но тогда переход от роутера к VPS оказывается обычным DNS через открытый интернет, а именно это вы и собирались остановить. Либо запустите туннель на самом роутере, либо смиритесь с тем, что последняя миля не шифрована, и пусть вашей победой останется хотя бы рекурсия.

Ещё одна настройка, о которой стоит знать: браузер с включённым DNS-over-HTTPS будет использовать собственный резолвер и молча игнорировать системную настройку, независимо от туннеля. И Firefox, и Chrome в некоторых регионах поставляются с этим включённым по умолчанию. Либо направьте браузер тоже на свою конечную точку, либо выключите в нём DoH, чтобы он следовал настройкам операционной системы.

Шаг 06 · Проверка

Четыре проверки. На трёх из них спотыкается почти каждая первая сборка.

1. Открыт ли он в интернет? Выполните это с машины, которая не в туннеле, — телефон на мобильном интернете, другой VPS, что угодно. Таймаут — правильный и желательный ответ. Реальный ответ означает, что его найдёт и любой сканер в интернете, и вам следует немедленно вернуться к шагу 02.

dig @<public-ip-of-vps> +timeout=3 example.com
# Expected: ";; connection timed out; no servers could be reached"

2. Действительно ли устройство им пользуется? Это проверка, которая проваливается чаще всего, и сбой невидим: туннель поднят, настройка выглядит правильной, а операционная система всё ещё спрашивает резолвер, который выдало по DHCP кафе. Спросите у самого резолвера, кем он вас считает, а затем подтвердите это с другой стороны.

# On the client — which resolver is the system actually using?
resolvectl status | grep -A2 'Current DNS'        # Linux
scutil --dns | grep nameserver                    # macOS

# On the server — does the query actually arrive?
tail -f /var/log/syslog | grep -i unbound &
unbound-control stats_noreset | grep total.num.queries

Затем откройте с устройства одну из публичных страниц для проверки утечки DNS и прочитайте результат. Если она называет вашего провайдера VPS, путь верный. Если она называет вашего интернет-провайдера или крупный публичный резолвер, значит, что-то до туннеля всё ещё отвечает.

3. Действительно ли включена валидация? Повторите те же две команды dig из шага 03, но на этот раз через всю цепочку — клиент, AdGuard Home, Unbound, — а не напрямую к Unbound. Имя с испорченной подписью должно отказать и здесь. Если у AdGuard Home где-то в настройках остался второй вышестоящий сервер, именно здесь это проявится.

4. Справляется ли кэш со своей работой? После суток обычного использования коэффициент попаданий должен быть где-то между семьюдесятью и девяноста процентами. Значительно ниже обычно означает, что кэш слишком мал или что cache-min-ttl игнорируется, потому что у всего вышестоящего очень короткий TTL; значительно выше в загруженной сети — хороший знак того, что работает prefetch.

unbound-control stats_noreset | grep -E 'total.num.(queries|cachehits)'
# hit rate = cachehits / queries

А затем два эксплуатационных решения. Первое: что происходит, когда эта машина перезагружается. Каждое устройство, направленное на неё, теряет разрешение имён, а все в доме назовут это «интернет сломался». Настройте сервис на перезапуск при сбое и на запуск при загрузке, затем один раз намеренно перезагрузите VPS и посмотрите, как он возвращается. Второе: резервный вариант. Либо укажите публичный резолвер как вторичный на своих клиентах и смиритесь с тем, что во время сбоя эти запросы покидают вашу зону контроля, либо запустите второй экземпляр на втором VPS в другом бастионе. Оба варианта защитимы. А вот обнаружить этот вопрос в 23:00 в воскресенье — нет.

systemctl enable unbound AdGuardHome
systemctl show unbound -p Restart -p RestartUSec
reboot        # then, from a client: dig nordbastion.com +short
Честная часть · Чего это не делает

Это закрывает один канал. Четыре других остаются открытыми.

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

Соединение всё равно происходит. Через миллисекунду после запроса ваше устройство открывает TCP-соединение с адресом, который только что узнало. Любой, кто наблюдает за вашей линией, видит этот адрес. Для сайта на собственном IP адрес и есть сайт. Шифрованный DNS убирает вопрос — но не убирает ответ.

TLS-рукопожатие обычно называет сайт. Server Name Indication передаётся в открытом виде в начале почти каждого HTTPS-соединения, так что пассивный наблюдатель всё равно читает имя хоста. Encrypted Client Hello это исправляет, но развёрнут неравномерно — там, где и браузер, и сайт его поддерживают, имя скрыто, а там, где нет, — не скрыто. Не считайте само собой разумеющимся, что он включён.

Теперь оператор резолвера — вы, и вы один. Каждый авторитативный сервер, с которым говорит ваш резолвер, видит один-единственный IP-адрес, спрашивающий про их зону. На множестве зон у этого IP есть характерный узор, и этот узор — домохозяйство. Это та самая плата за множество анонимности, о которой шла речь в первой главе, и единственное, что её смягчает, — это то, что IP невозможно проследить до имени (VPS без KYC, оплаченный криптовалютой), а в идеале — что это тот же IP, из которого уже выходит ваш трафик.

Провайдер видит пакеты, как и всегда. VPS работает на чужом железе в чужом дата-центре. NordBastion не инспектирует трафик клиентов, а отчёт о прозрачности и warrant canary описывают, что произошло бы в случае запроса, — но честное архитектурное утверждение состоит в том, что арендуемая вами машина физически достижима кем-то ещё. Что меняет самостоятельный хостинг — так это то, что не остаётся журнала запросов на уровне продукта, аналитического конвейера и политики конфиденциальности, которую можно изменить; остаётся только процесс, держащий кэш в RAM, настроенный вами, в юрисдикции, которую вы выбрали намеренно.

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

Подбор конфигурации · Что заказать

DNS — это немного. Заказывайте под то, что ещё живёт на машине.

Тариф Ежемесячно Ресурсы Что на нём комфортно работает
Sentinel$3.902 vCPU · 4 GB · 120 GBРезолвер + WireGuard для домохозяйства. Правильный ответ.
Garrison$7.904 vCPU · 8 GB · 240 GBТо же самое, плюс Vaultwarden, SearXNG и цель для резервного копирования
Ravelin$16.908 vCPU · 16 GB · 480 GBНебольшая команда, двадцать пять пиров туннеля, плюс другие сервисы
Второй Sentinel$3.90В другом бастионеРезервный резолвер — чтобы сбой не превращался в пропажу интернета

Ничего в этой таблице не выбрано ради DNS. Резолвер для тридцати устройств использует несколько сотен мегабайт под кэш и долю одного ядра, а трафика гоняет несколько сотен мегабайт в месяц. Выбирайте тариф под пиры WireGuard, другие сервисы и диск — а резолвер пусть едет бесплатным пассажиром.

Заметки с практики · Шесть ловушек

Шесть способов, которыми это может пойти не так. Пять из них — беззвучные.

Ловушка 01 · Громкая

Открытый резолвер и null route неделей позже

Одно лишнее правило файрвола или строка access-control, оставленная на allow. Сканеры находят порт за часы, начинается трафик усиления, приходит жалоба на злоупотребление, IP гаснет. Отказывайте по умолчанию, разрешайте только туннель и проверяйте снаружи сети.

Ловушка 02 · Бессмысленная

Приватный резолвер, пересылающий запросы публичному

AdGuard Home установлен, вышестоящий сервер оставлен из списка по умолчанию, всё прекрасно работает — а журнал запросов всё так же накапливается в компании, чьё имя стоит в поле настроек. Укажите один вышестоящий сервер, и пусть им будет ваш Unbound.

Ловушка 03 · Невидимая

Туннель поднят, а устройство вас так и не спросило

wg-quick не смог протолкнуть настройку DNS, потому что не установлен resolvconf, либо браузер выполняет собственный DNS-over-HTTPS. Всё выглядит правильно, а каждый запрос всё равно уходит в сеть, в которой вы сидите. Проверяйте со стороны резолвера, а не по экрану настроек клиента.

Ловушка 04 · Сбивающая с толку

Список блокировки сломал банковское приложение — три недели спустя

Ничто не заявляет о себе как о сбое DNS — страница загружается наполовину, кнопка ничего не делает. Шесть агрессивных списков, включённых в первый же день, делают это невозможным отследить. Начните с одного, добавляйте медленно, ведите allow-список и храните журнал запросов достаточно долго, чтобы ответить на вопрос.

Ловушка 05 · Ироничная

Девяносто дней журнала запросов, включённых по умолчанию

Вся эта сборка существует, чтобы никто не вёл этот список, а слой фильтрации ведёт его прямо из коробки, на диске, три месяца. Устанавливайте срок хранения осознанно — 24 часа во время настройки, ноль после неё — и помните, что это касается всех в сети, а не только вас.

Ловушка 06 · Внезапная

Одна перезагрузка — и в доме нет интернета

Резолвер становится инфраструктурой в тот момент, когда на него начинают полагаться другие люди. Включите оба сервиса при загрузке, задайте Restart=on-failure, один раз намеренно перезагрузите машину, чтобы это доказать, и решите вопрос резервного варианта заранее, а не в момент, когда он понадобится.

FAQ · Приватный DNS

Вопросы, и ответы на них.

Одиннадцать вопросов, возникающих в процессе постройки, — включая два, от которых зависит, стоит ли вообще всё это строить.

Действительно ли собственный резолвер приватнее, чем Quad9 или Cloudflare?

Это другое, и это лучше в том смысле, который важнее всего, — но честный ответ состоит из двух половин. Что вы получаете: при рекурсивном резолвере ни одна сторона не видит весь поток ваших запросов целиком. Корневые серверы узнают, что кто-то спросил про .com, серверы .com узнают, что кто-то спросил про example.com, а полное имя узнаёт только оператор example.com — и никто из них не видит следующую тысячу имён, которые вы запросите. Публичный резолвер, напротив, видит их все, по порядку, с метками времени, навсегда, и единственное, что стоит между этим списком и кем-то ещё, — его политика конфиденциальности. Что вы теряете: у личного резолвера множество анонимности равно единице. Запросы, покидающие крупный публичный резолвер, смешиваются с запросами миллионов других людей; запросы, покидающие ваш, — однозначно ваши. Этот компромисс стоит того, когда IP резолвера не привязан к вашей личности — а именно это даёт VPS без KYC, оплаченный криптовалютой, и именно этого не даёт гиперскейлер с привязанной картой. Поместите резолвер за тем же VPS, из которого уже выходит ваш VPN, и множество анонимности не сократится вовсе, потому что этот IP и так уже обслуживал весь ваш трафик.

Ускорит ли самостоятельный хостинг DNS мой браузинг?

Немного медленнее при первом обращении к имени, заметно быстрее при каждом повторе, а в целом — примерно то на то и выходит. Рекурсивный резолвер при холодном старте вынужден пройти всю цепочку делегирования — корень, TLD, авторитативный сервер, — а это три-четыре раунд-трипа вместо одного раунд-трипа до публичного резолвера, у которого ответ уже закэширован чьим-то чужим запросом. Как только кэш прогрелся — а для домохозяйства это занимает около суток, — популярные имена отдаются из RAM заметно быстрее миллисекунды, и вы уже в выигрыше. Включите prefetch, чтобы популярные записи обновлялись до истечения срока действия, и случай холодного старта почти исчезает. Единственное место, где можно реально потерять в производительности, — геолокация CDN: крупные публичные резолверы передают авторитативному серверу усечённую версию вашего сетевого местоположения (EDNS Client Subnet), чтобы CDN мог выбрать ближайший edge-узел. Unbound принципиально этого не делает. Если ваш резолвер находится в том же регионе, что и вы, это ничего измеримо не меняет. Если резолвер в Reykjavík, а вы в Сингапуре, некоторые CDN выдадут вам европейский edge-узел, и вы это почувствуете.

Нужен ли мне для этого домен?

Только для шифрованного транспорта. Обычному DNS поверх туннеля WireGuard не нужен ни домен, ни сертификат, ни какая-либо публичная доступность вообще — резолвер слушает на приватном адресе вроде 10.8.0.1 и отвечает только пирам туннеля. Это и самая простая, и самая приватная конфигурация из всех в этом руководстве. Домен понадобится, как только вы захотите DNS-over-TLS или DNS-over-HTTPS, потому что оба аутентифицируются сертификатом, а сертификат выдаётся на имя. Это та конфигурация, которую стоит выбрать, если устройства не могут постоянно находиться в VPN, — рабочий ноутбук, телефон в сети, блокирующей UDP, член семьи, который не станет поддерживать туннель. Если вы всё же регистрируете домен, регистрируйте его там, где не требуют ту же личность, о которой вы заботились везде остальные, и держите включённой приватность WHOIS.

Unbound или AdGuard Home — нужны ли оба?

Они решают разные задачи, и это сочетание не избыточно. Unbound — это резолвер: он проходит DNS от корня, проверяет подписи DNSSEC и кэширует результаты. AdGuard Home — это вообще не резолвер: это фильтрующая обвязка с веб-интерфейсом и шифрованными слушателями, которая пересылает всё, что не блокирует, вышестоящему серверу. Запустите AdGuard Home один, и его вышестоящим сервером окажется публичный резолвер, а значит, весь поток ваших запросов снова окажется в чужом журнале. Запустите Unbound один, и вы получите по-настоящему приватный резолвер без списков блокировки, без правил для отдельных устройств и без интерфейса. В связке — AdGuard на 53, Unbound на 127.0.0.1:5335 как его единственный вышестоящий сервер — вы получаете фильтрацию и шифрованный транспорт перед резолвером, который отвечает от корня. Если вам нужна минимально возможная поверхность атаки и не важна блокировка рекламы, один Unbound — вполне достойный ответ, и именно эта половина стека на самом деле обеспечивает приватность.

Что такое открытый резолвер и почему это так важно?

Открытый резолвер — это рекурсивный резолвер, отвечающий на запросы с любого адреса источника в интернете. Это важно, потому что DNS работает поверх UDP, адреса источника в UDP тривиально подделываются, а маленький запрос может породить большой ответ. Атакующий отправляет вашему серверу 60-байтовый запрос с адресом жертвы, подделанным в качестве источника; ваш сервер послушно отправляет жертве ответ, который в десятки раз больше. Умножьте на тысячи открытых резолверов — и вот вам DDoS-атака с отражением и усилением, а ваш сервер — одно из орудий. На практике последовательность быстрая и предсказуемая: сканеры, обходящие весь интернет, находят только что открывшийся порт 53 в течение часов, начинается трафик, приходят жалобы на злоупотребление, и провайдер отправляет IP в null-route, чтобы защитить свою сеть. Это не гипотеза и не редкость — это самый распространённый способ, которым плохо заканчивается судьба первого DNS-сервера. Исправление стоит одного правила файрвола и одной строки конфигурации: отказывать по умолчанию, разрешать только свой туннель.

Скрывает ли шифрованный DNS от моего провайдера, какие сайты я посещаю?

Это скрывает запрос, а не сам визит. DNS-over-TLS и DNS-over-HTTPS означают, что ваш провайдер больше не видит нешифрованный вопрос вида example.com. Что он всё ещё видит — это соединение, которое вы устанавливаете миллисекундой позже: IP-адрес назначения и — если обе стороны не поддерживают Encrypted Client Hello — имя сервера в TLS-рукопожатии, в открытом виде. Для сайта на выделенном IP один только адрес его идентифицирует; для сайта за крупным CDN адрес общий, и выдаёт всё SNI. Так что шифрованный DNS повышает стоимость пассивного логирования и убирает самую простую и дешёвую поверхность наблюдения — но не делает ваш браузинг невидимым. Если модель угроз — это ваш провайдер или враждебная сеть, видящая всё, инструмент для этого — туннель: шифрованный DNS закрывает ту утечку, которая всё ещё может остаться у одного лишь VPN, когда операционная система продолжает использовать резолвер провайдера вне туннеля.

Насколько большим должен быть VPS?

Гораздо меньшим, чем принято думать. Ответы DNS занимают сотни байт, а работа на один запрос — это поиск по хэшу, поэтому резолвер для домохозяйства или небольшой команды простаивает почти всё время. Sentinel — 2 vCPU, 4 ГБ, $3.90 в месяц — обслужит десятки устройств, даже не сдвинув среднюю нагрузку с нуля, и большая часть этих 4 ГБ доступна под кэш, а это единственный ресурс, реально улучшающий впечатление от работы. Выделите Unbound несколько сотен мегабайт под кэш сообщений и RRset — и коэффициент попаданий будет держаться в диапазоне восьмидесяти-девяноста процентов. Причина увеличивать конфигурацию никогда не в DNS: она в том, что та же машина ещё и терминирует ваш туннель WireGuard, или запускает Vaultwarden, или хранит репозиторий резервных копий. Пропускная способность вообще не проблема — загруженный домашний резолвер гоняет несколько сотен мегабайт в месяц.

Что произойдёт, если VPS перезагрузится или резолвер упадёт?

Каждое устройство, настроенное на его использование, перестаёт разрешать имена, а те, кто им пользуется, назовут это «интернет пропал». Это реальная эксплуатационная цена самостоятельного хостинга DNS, и она заслуживает осознанного решения, а не случайного открытия. Три защиты, в порядке нарастания усилий. Настройте вторичный резолвер на клиентах — публичный, такой как Quad9 или dns0.eu, — и смиритесь с тем, что во время сбоя эти запросы покидают вашу зону контроля; это то, что стоит сделать большинству. Либо запустите второй экземпляр на втором VPS в другом бастионе и укажите оба, что оставляет всё «в семье» ценой второй машины за $3.90. Либо, на туннеле, запустите крошечный локальный кэш на каждом клиенте, чтобы короткий сбой был незаметен. Что бы вы ни выбрали, задайте Restart=on-failure для юнита, включите запуск при загрузке и один раз намеренно проверьте перезагрузку — резолвер, который не восстанавливается сам, всегда выберет для этого худший момент.

Сломают ли списки блокировки что-нибудь?

Да, изредка, и то, как вы с этим справляетесь, — это разница между конфигурацией, которая живёт долго, и той, которую выдирают через две недели. Списки блокировки поддерживают люди, принимающие субъективные решения, и время от времени такое решение задевает что-то нужное вам: эндпоинт банка для обнаружения мошенничества, виджет отслеживания доставки, процесс входа, перенаправляющий через аналитический домен. Сбой сбивает с толку, потому что не похож на проблему DNS, — страница загружается наполовину, или кнопка ничего не делает. Три привычки решают это. Начните с одного консервативного списка, а не с шести агрессивных. Ведите allow-список и пополняйте его без чувства вины. И держите журнал запросов включённым достаточно долго, чтобы ответить на вопрос «что это устройство только что запросило и что мы отказали?» — именно в этот момент вы обнаруживаете, что фильтрующий резолвер сам по себе устройство, которое логирует всё, а настройка срока хранения — это решение о приватности, которое вы принимаете за всех в сети.

Можно ли поделиться резолвером с семьёй или друзьями?

Да, и это одна из лучших причин его строить — одна машина за $3.90 способна привести в порядок DNS для целого домохозяйства или горстки друзей. Безопасным это делают два правила. Во-первых, делитесь им через туннель или через аутентифицированную шифрованную конечную точку, никогда не открывая порт 53 всему миру; с DNS-over-HTTPS можно дать каждому человеку свой отдельный путь, чтобы доступ можно было отозвать индивидуально, а AdGuard Home сможет применять для каждого клиента свою фильтрацию. Во-вторых, чётко осознайте, что вы на себя берёте: теперь вы держите журнал запросов всех, кто им пользуется. Установите хранение в ноль или в сутки, скажите им, какая стоит настройка, и помните: если однажды вы будете защищать уже собственную приватность, резолвер, которым пользуются пятеро, — это ещё и резолвер, где любой отдельный запрос труднее приписать кому-то одному из них.

Возражает ли NordBastion, если я запущу DNS-резолвер на VPS?

Ничуть — приватный, контролируемый по доступу резолвер является нормальной нагрузкой, и политике допустимого использования тут нечего сказать. А вот что действительно волнует эту политику, как и любую серьёзную сеть, — это открытый резолвер, используемый как отражатель усиления против третьей стороны, потому что атакующий трафик покидает нашу сеть и обрушивается на чужую. Следуйте шагу 02, и этого никогда не произойдёт: отказывать по умолчанию, разрешать туннель, ограничивать по частоте всё остальное. Если вы хотите намеренно запустить публичный резолвер как сервис для других, об этом стоит поговорить заранее, а не после первой жалобы на злоупотребление, — технические требования (ограничение частоты ответов, запрет ANY, мониторинг) хорошо понятны, и проблема не в том, чтобы держать такой резолвер сознательно, а в том, чтобы держать его случайно.

Получите машину

Собственный резолвер на IP, который не носит вашего имени. Без KYC, оплата криптовалютой.

Sentinel — 2 vCPU и 4 ГБ за $3.90 в месяц, в Helsinki, Stockholm, Oslo или Reykjavík. Достаточно для резолвера, туннеля WireGuard, за которым он должен жить, и всего остального, что вы решите перестать арендовать у других. Никакой почты при регистрации, никакого документа, удостоверяющего личность, и никакого журнала на уровне продукта обо всём, что вы ищете.

Последняя проверка · 2026-10-12 · Источники · Документация Unbound и AdGuard Home, RFC 9156 (QNAME-минимизация), RFC 7858 (DNS-over-TLS), RFC 8484 (DNS-over-HTTPS), systemd-resolved(8) · Периодичность · ежегодно

Приватный хостинг, построенный на Севере.