Щоб виявити використання проксі, 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", )!