Введите ваш email — мы отправим ссылку для сброса в гарнизон.
Вспомнили?
Второй фактор
Введите ваш код.
Откройте приложение-аутентификатор и введите текущий 6-значный код.
Руководство · Сеть·15 мин. чтения · 40 мин. практики
Ваш собственный DNS-резолвер. Единственный журнал, о переносе которого никто не думает.
Каждый домен, который запрашивают ваши устройства, — это строка с меткой времени в чужом файле: вашего провайдера или бесплатного публичного резолвера. Шесть шагов, чтобы перенести этот файл на машину, которая принадлежит вам: Unbound резолвит от корня, AdGuard Home фильтрует перед ним, шифрованный DNS работает на настоящем сертификате, а порт 53 никогда не смотрит в интернет. Машина стоит $3.90 в месяц. Протестировано на Debian 12.
Шесть шагов
01
Форма
Рекурсивный, а не пересылающий
02
Закрыть
Порт 53 — до того, как он откроется
03
Резолвинг
Unbound, с валидацией
04
Фильтрация
AdGuard Home, DoH, DoT
05
Доступ
Сначала туннель, затем клиенты
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. Он упакован повсюду, это то, что уже работает на значительной части интернета, и из коробки он именно резолвит рекурсивно — чтобы превратить его в форвардер, придётся специально постараться. Установите его вместе с пакетом корневых подсказок, чтобы он знал, где находятся корневые серверы, не загружая список ниоткуда:
Пакет 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-профиль .mobileconfig
DoH или 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.
А затем два эксплуатационных решения. Первое: что происходит, когда эта машина перезагружается. Каждое устройство, направленное на неё, теряет разрешение имён, а все в доме назовут это «интернет сломался». Настройте сервис на перезапуск при сбое и на запуск при загрузке, затем один раз намеренно перезагрузите 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.90
2 vCPU · 4 GB · 120 GB
Резолвер + WireGuard для домохозяйства. Правильный ответ.
Garrison
$7.90
4 vCPU · 8 GB · 240 GB
То же самое, плюс Vaultwarden, SearXNG и цель для резервного копирования
Ravelin
$16.90
8 vCPU · 16 GB · 480 GB
Небольшая команда, двадцать пять пиров туннеля, плюс другие сервисы
Второй Sentinel
$3.90
В другом бастионе
Резервный резолвер — чтобы сбой не превращался в пропажу интернета
Ничего в этой таблице не выбрано ради DNS. Резолвер для тридцати устройств использует несколько сотен мегабайт под кэш и долю одного ядра, а трафика гоняет несколько сотен мегабайт в месяц. Выбирайте тариф под пиры WireGuard, другие сервисы и диск — а резолвер пусть едет бесплатным пассажиром.
Заметки с практики · Шесть ловушек
Шесть способов, которыми это может пойти не так. Пять из них — беззвучные.
Ловушка 01 · Громкая
Открытый резолвер и null route неделей позже
Одно лишнее правило файрвола или строка access-control, оставленная на allow. Сканеры находят порт за часы, начинается трафик усиления, приходит жалоба на злоупотребление, IP гаснет. Отказывайте по умолчанию, разрешайте только туннель и проверяйте снаружи сети.
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, за которым он должен жить, и всего остального, что вы решите перестать арендовать у других. Никакой почты при регистрации, никакого документа, удостоверяющего личность, и никакого журнала на уровне продукта обо всём, что вы ищете.