Как вы уже можете знать, резолвер DNS в Windows 10 отправляет DNS-запросы на все интерфейсы параллельно, что часто бывает либо просто неудобно, когда используется так называемый Split Tunneling и DNS внутри VPN-туннеля отдает внутренние адреса для внутренних ресурсов, а Windows не может понять, что к чему, либо и вовсе создает угрозу безопасности, как в случае утечки DNS через публичный Wi-Fi.

Решить проблему можно разными способами, например, временно добавив правила firewall для блокировки 53 порта на всех интерфейсах, кроме интерфейса VPN, либо установить на всех интерфейсах, кроме VPN, DNS в 127.0.0.1.

Однако, эти способы вносят изменения, выдерживающие перезагрузку, поэтому, если во время работы VPN у вас случайно отключили электричество или VPN-демон просто упал, вы останетесь с неработающим интернетом. Ничего хорошего в этом нет.

Однако есть способ лучше, который вносит только временные изменения и не оставит пользователя без интернета.

Windows Filtering Platform

Начиная с Windows Vista, на замену устаревшим технологиям обработки трафика вроде NDIS, TDI и LSP приходит WFP — современная, легкая и удобная технология, которая работает как в режиме ядра, так и в пользовательском режиме. Современные версии Брандмауэра Windows как раз используют WFP, как и все сторонние файрволлы и антивирусы с возможностью проверки трафика.

Драйвер режима ядра может просматривать, модифицировать и логировать пакеты и просто поток данных, а userspace-фильтры могут пропускать, отбрасывать, задерживать или направлять трафик в ядерный драйвер, основываясь на информации из Ethernet-фрейма или IP-пакета и их заголовков, а также (на уровне ALE) интерфейса источника и назначения, ID процесса, полный путь к exe, и некоторой другой.

WFP-фильтр может добавлять постоянные фильтры, которые выживают после перезагрузки, даже если ПО, установившее их, не было больше запущено, временные фильтры, которые сохраняются после завершения программы, но не после перезагрузки, и сессионные, которые действуют только тогда, когда программа, создавшая их, все еще исполняется.

Фильтра пользовательского режима с сессионными фильтрами вполне достаточно для наших задач, а нам нужно:
  • Запретить все исходящие пакеты от всех интерфейсов на порт 53 по UDP/TCP и IPv4/IPv6
  • Разрешить любой трафик с TAP-интерфейса (-ов) OpenVPN

Все это вылилось в плагин для OpenVPN, однако исходный код может быть собран и как обычный исполняемый файл:
github.com/ValdikSS/openvpn-fix-dns-leak-plugin

Чтобы использовать данный плагин, скачайте .dll-файлы из репозитория, положите их в папку config рядом с конфигурационным файлом, и добавьте в него строку:
plugin fix-dns-leak-32.dll
для 32-битной системы и 32-битной версии OpenVPN, или
plugin fix-dns-leak-64.dll
соответственно для 64-битной системы с 64-битным OpenVPN.

Теперь можно не бояться использовать VPN на Windows 10 через публичный Wi-Fi.

Комментарии (4)


  1. cebka
    05.10.2015 14:58
    +1

    Я в таких случаях применяю комбат-мультиспрей DNSCrypt: dnscrypt.org
    Имеется в наличии: довольно удобный (хотя и ужасный внутри) плагин для win/osx, довольно большое число публичных серверов из коробки, возможность установки своего рекурсора с dnscrypt, возможность работы через tcp/443.


    1. greatvovan
      07.10.2015 22:40

      Так ведь DNSCrypt не спасёт от DNS leak, что является темой данной статьи. Разве нет?


  1. Krey
    06.10.2015 14:20

    А разве нет ключика в реестре, возвращающего старое поведение?


    1. ValdikSS
      06.10.2015 14:36

      К сожалению, он не работает на Windows 10.