Чтобы обнаружить использование прокси, Cloudflare проверяет, какую реализацию DNS использует браузер. В версии 28.6.0 мы добавили возможность использовать пользовательскую реализацию DNS в Chrome, которая является вариантом по умолчанию. Вот некоторые пояснения, как это работает, и примеры настройки:
В Chrome реализован пользовательский DNS-резолвер. Он не опирается на функции winapi вроде getaddrinfo или DnsQueryEx. Он реализован поверх низкоуровневых api — например, функций, использующих tcp или udp. Это позволяет выполнять продвинутые DNS-запросы, которые могут быть недоступны через windows api.
Прокси будет выполнять только запросы A и AAAA, чтобы получить IP сервера. Настоящий браузер выполнит другие запросы и получит данные. Недостающие данные могут быть обнаружены сервером. Различий может быть больше, поэтому предпочтительно использовать пользовательский DNS-резолвер Chrome.
Этот патч позволяет включать или отключать пользовательский DNS. Он также позволяет направлять DNS UDP-трафик через прокси, если прокси поддерживает UDP. Альтернативный вариант — направлять весь трафик напрямую без использования прокси.
Вот конфигурация патча:
Параметр DNSSorting.
Если в хост-системе есть ipv6, а прокси не поддерживает ipv6, и у домена есть запись AAAA, то Chromium может попытаться подключиться через ipv6, что будет заблокировано. Задав этот параметр, можно фильтровать ip по типу из результата DNS-запроса.
Использование:
_settings("Fingerprints.DNSSorting": "Native")!
Возможные значения: Native (по умолчанию) — использовать нативную фильтрацию через методы WinAPI. Может работать неверно, если поддержка IPv6 у ПК и прокси не совпадает. OnlyIPv4 — оставить только поддержку IPv4, отфильтровать весь IPv6. Используется, когда прокси не поддерживают IPv6. Copy — оставить и IPv4, и IPv6. Используется, когда прокси поддерживают IPv6.
Параметр DNSIP.
Использование пользовательской реализации Chrome требует задать ip DNS. В отличие от метода по умолчанию, где имя хоста отправляется прокси и DNS-запрос выполняется там, нам нужно разрешать ip локально и поэтому требуется ip DNS.
Использование:
_settings("Fingerprints.DNSIP": "1.1.1.1")!
Параметр DNSMode.
Этот переключатель позволяет задать метод разрешения домена.
Использование:
_settings("Fingerprints.DNSMode": "SendDomainThroughProxy")!
Возможные значения: SendDomainThroughProxy (по умолчанию) — передавать домен через прокси, разрешать домен на стороне прокси. RouteThroughProxy — разрешать домен локально, но отправлять весь DNS UDP-трафик на указанный прокси. RouteWithoutProxy — разрешать домен локально, выполнять DNS-запросы напрямую.
Параметр DNSCache.
Позволяет включить или отключить кэш DNS.
Использование:
_settings("Fingerprints.DNSCache": "Disable")!
Возможные значения: Disable (по умолчанию) — отключить кэш DNS. Enable — разрешить кэш DNS
Параметр DNSCache.
При задании пользовательского DNS-сервера Chrome может автоматически найти DoH-сервер, привязанный к указанному DNS-серверу. Стандартного механизма поиска DoH-сервера нет, поэтому браузер жёстко прописывает известные DoH-серверы в файле net/dns/public/doh_provider_entry.cc. По умолчанию при использовании DNS-сервера локального провайдера DoH не используется, поэтому может быть полезно его отключить.
Использование:
_settings("Fingerprints.DNSOverHTTPS": "Disable")!
Возможные значения: Disable (по умолчанию) — отключить DoH. Enable — разрешить DoH
Вот надёжная конфигурация для поддержки пользовательского DNS. Она будет разрешать все DNS-запросы локально: _settings( "Fingerprints.DNSSorting": "OnlyIPv4", "Fingerprints.DNSIP": "1.1.1.1", "Fingerprints.DNSMode": "RouteWithoutProxy", "Fingerprints.DNSCache": "Disable", "Fingerprints.DNSOverHTTPS": "Disable", )!