Избавляемся от DNS Leak в Windows 10 — свой userspace WFP-фильтр в виде OpenVPN-плагина

    Как вы уже можете знать, резолвер 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.

    UPD: В OpenVPN 2.3.9 появилась опция для блокирования сторонних DNS: block-outside-dns. Используйте ее, а не плагин.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 4

      +1
      Я в таких случаях применяю комбат-мультиспрей DNSCrypt: dnscrypt.org
      Имеется в наличии: довольно удобный (хотя и ужасный внутри) плагин для win/osx, довольно большое число публичных серверов из коробки, возможность установки своего рекурсора с dnscrypt, возможность работы через tcp/443.
        0
        Так ведь DNSCrypt не спасёт от DNS leak, что является темой данной статьи. Разве нет?
        0
        А разве нет ключика в реестре, возвращающего старое поведение?
          0
          К сожалению, он не работает на Windows 10.

        Only users with full accounts can post comments. Log in, please.