Короткий ответ

Не верьте «VPN подключён» и сайту leak-test вслепую. Смотрите пакеты: с какого NIC уходит UDP/TCP 53 и куда (бытовой резолвер vs 10.0.10.10). На Windows 11 добавьте NRPT и отключите DoH в браузере политикой, если внутренние зоны не должны утекать. На Linux — resolvectl query + tcpdump. Утечка ≠ «DNS сломан»: часто split намеренно шлёт интернет-DNS на ISP, а утечка — это внутренние имена contoso.example на публичный резолвер.

Снимите параллельно dump на wg0 и на Wi-Fi в момент Resolve-DnsName fileserver.contoso.example.

Симптомы и как отличить

  • В логах публичного DNS появляются dc01.contoso.example.
  • nslookup показывает Server 8.8.8.8 при живом VPN.
  • Браузер резолвит иначе, чем PowerShell (DoH).

Починка резолвера, когда имена не резолвятся — DNS через VPN. Здесь — куда ушёл успешный или неуспешный запрос.

Возможные причины

  1. Нет NRPT, split tunnel, системный DNS = роутер 192.168.1.1.
  2. Chrome/Edge Secure DNS / DoH на 1.1.1.1.
  3. systemd-resolved без ~contoso.example на wg0.
  4. IPv6 DNS на бытовом NIC при IPv4 split.
  5. smart multi-homed Windows (DNS на всех интерфейсах параллельно).
  6. OpenVPN не применил dhcp-option DNS.
  7. «Leak test» путают с ожидаемым split (интернет-имена на ISP — норма).

Диагностика

1. Кто сервер с точки зрения ОС

Get-DnsClientServerAddress -AddressFamily IPv4,IPv6
Get-DnsClientNrptPolicy
Get-VpnConnection | Format-List Name, ConnectionStatus, SplitTunneling
Resolve-DnsName fileserver.contoso.example | Format-List
resolvectl status
resolvectl query fileserver.contoso.example

2. Куда ушёл пакет

Linux:

tcpdump -n -i wg0 port 53 or port 853
tcpdump -n -i wlan0 port 53 or port 853

Запрос contoso.example на wlan0 → leak. На wg0 к 10.0.10.10 → ок для внутренней зоны.

Windows (pktmon / внешний захват): смотрите Interface Index из Get-NetIPInterface. Не отключайте firewall ради захвата: pktmon умеет фильтр порта 53.

Get-NetIPInterface -AddressFamily IPv4 | Format-Table ifIndex, InterfaceAlias, ConnectionState

3. DoH

Если на 53 тишина, а имя резолвится — TCP 443 к резолверу DoH. Политика браузера, Get-Process. Корпоративный Edge: «DNS поверх HTTPS» = off или на внутренний DoH.

4. IPv6

tcpdump -n -i wlan0 ip6 and port 53

AAAA-путь часто забывают в split.

Решение

Сценарий A. Ожидаемый split + внутренние зоны

NRPT .contoso.example10.0.10.10. Linux: resolvectl domain wg0 ~contoso.example и DNS на интерфейсе туннеля. Маршрут до 10.0.10.10 должен существовать (маршруты).

Сценарий B. Политика «весь DNS через офис»

Full DNS: единственный резолвер 10.0.10.10, рекурсия наружу на DC/resolver. Тогда leak-тест должен показать офисный IP. Цена — нагрузка и зависимость от VPN для любого сайта. См. full tunnel/DNS статьи.

Сценарий C. DoH

GPO/Intune: отключить недоверенный DoH на рабочих браузерах. Либо корпоративный DoH, куда уходят и внутренние зоны.

Сценарий D. OpenVPN 2.6

Проверьте, что push DNS применяется (resolv-conf hook). Иначе ovpn «подключён», DNS как до VPN.

Сценарий E. Windows multi-homed

Повысьте метрику VPN DNS / NRPT. Иногда помогает Disable-NetAdapterBinding на IPv6 бытового NIC только если это согласовано — не как вечный костыль без IPv6-плана.

Стенд: три резолвера в один момент

Откройте fileserver.contoso.example и example.com при живом split. Параллельно:

tcpdump -n -c 30 -i any 'port 53 or port 853'

Внутреннее имя к 10.0.10.10 на wg0. Внешнее — к ISP на wlan0 если так задумано. Если внутреннее на 8.8.8.8 — leak. Если внешнее на 10.0.10.10 — full DNS, не leak; тогда DC должен рекурсировать.

Windows:

Get-DnsClientNrptPolicy
Resolve-DnsName fileserver.contoso.example
# DevTools браузера: Secure DNS

DoH: тишина на 53 при успешном имени. Политика Edge/Chrome. Не лечите leak сайтом «dnsleaktest» как единственным критерием AD-зоны.

IPv6 RA на домашнем роутере раздаёт DNS2001: уходит мимо NRPT IPv4. Снимите Get-DnsClientServerAddress -AddressFamily IPv6.

Корпоративный Android/iOS часто игнорирует NRPT Windows-статей. На мобильном смотрите split DNS вендора WG/OpenVPN и захват с точки доступа (отдельный VLAN стенда). DoH в приложении почты — ещё один обход. Политика MDM «запретить частный DNS» там, где это поддерживается. Не обещайте «leak закрыт», проверив только один ПК админа.

Get-DnsClientServerAddress
Resolve-DnsName dc01.contoso.example

Если dc01 ушёл на 8.8.8.8 и пришёл NXDOMAIN — это и leak, и поломка входа в домен. Тогда сначала NRPT, потом спор про split.

Повторите проверку после сна ноутбука и после смены Wi-Fi: NRPT иногда жив, а маршрут к 10.0.10.10 уже нет, и запросы таймаутятся, клиент уходит на второй DNS Nic — выглядит как leak. Это ступень маршрута, не «браузер злой». Снимите ip route get 10.0.10.10 в тот же момент, что tcpdump :53.

Как проверить, что проблема устранена

Повтор tcpdump: запрос fileserver.contoso.example только к 10.0.10.10 на туннельном NIC. Публичное имя example.com — по политике (ISP или офис). Браузер и Resolve-DnsName совпадают. IPv6 не обходит.

Resolve-DnsName fileserver.contoso.example
Get-DnsClientNrptPolicy
tcpdump -n -c 20 -i any port 53

Если не помогло

  • Только одно приложение утекает — вшитый DNS (некоторые мессенджеры).
  • Корпоративный MDM не доехал до ПК.
  • Резолвер 10.0.10.10 сам форвардит внутреннюю зону наружу — это утечка сервера, не клиента; чините DNS AD, не VPN.

Профилактика

  • NRPT в золотом образе.
  • Запрет DoH на managed Chrome.
  • Периодический tcpdump канарейки.
  • Не учить пользователей «проверьте leak на сайте» как единственный метод.

FAQ

Split без NRPT всегда leak?

Для внутренних имён — да, они уйдут на ISP и станут NXDOMAIN плюс утечка факта имени. Для google.com — это не leak, а split.

Помогает ли full tunnel против DoH?

Не всегда: DoH на 443 может идти уже через туннель на 1.1.1.1, минуя корпоративный DNS. Нужна политика браузера или firewall к публичным DoH.

port 853

DNS over TLS. Смотрите его так же, как 53.

Можно ли hosts-файлом закрыть leak?

Точечно, не масштабируется, маскирует проблему резолвера.

Get-VpnConnection не меняет DNS

RAS может не выставлять DNS. NRPT/GPO надёжнее, чем надежда на VPN NIC.