Меню
RU

Мы исправили проблему со скоростью доменов Google в AdGuard DNS

В последние полторы-две недели мы начали получать большое количество жалоб на скорость работы AdGuard DNS. Долгое время мы не могли понять в чем дело — скорость мы замеряем в большом количестве точек по всему миру, и согласно нашим наблюдениям везде она была в порядке.

Но совсем недавно источник проблемы, наконец, был найден. Как оказалось, проблема была не в самом AdGuard DNS. Он всё это время отвечал быстро и вообще работал без нареканий. Загвоздка крылась в тех IP-адресах, которые он возвращал. Для некоторых доменов (в основном, принадлежащих Google) возвращались IP-адреса, принадлежащие Google China. Ожидаемо, эти адреса работали очень медленно для большинства пользователей.

Что же случилось? Давайте разбираться. Но перед этим мы приносим наши извинения за то, что решение этой проблемы заняло у нас гораздо больше времени, чем хотелось бы.

Как работает DNS?

Итак, в первую очередь, давайте мы расскажем, как работает DNS в целом. Дело в том, что DNS — децентрализованная система. За каждый домен отвечает отдельный DNS-сервер, так называемый авторитативный сервер имён (authoritative nameserver). Рекурсивные DNS-резолверы (такие как AdGuard DNS) на самом деле получают ответы у таких авторитативных серверов имён.

Что же происходит, когда AdGuard DNS получает ваш DNS-запрос?

Этап №1: Проверка кэша. Во-первых, мы можем уже знать, какой IP-адрес соответствует вашему запросу, если этот адрес сохранён во внутреннем кэше. Это происходит в подавляющем большинстве случаев, и тогда AdGuard DNS просто сразу отправляет ответ.

Этап №2: разрешение DNS. Но если в кэше ответ не найден, нам необходимо получить ответ от авторитативного сервера. Давайте предположим, что вы спросили у нас "какой IP-адрес у домена example.org?"

Первым делом мы должны узнать, какой сервер имён отвечает за доменную зону org. Для этого мы обращаемся к так называемым "корневым DNS-серверам" (root DNS servers). Всего таких серверов во всём мире 14, и вы можете ознакомиться с их списком вот тут. Их единственная задача — знать какой сервер имён ответственнен за ту или иную доменную зону первого уровня (такие как com, org и т.д.).

У одного из таких корневых серверов мы узнаём ответ: за доменную зону org отвечают 6 серверов имён — так называемых "TLD nameserver", которые отвечают за всю зону org. TLD-сервера знают, какие авторитативные сервера имён отвечают за каждый из доменов в их зоне.

Наконец, у одного из этих серверов нам надо узнать, а кто же отвечает за example.org? Мы получаем в ответ ещё 2 сервера и наконец узнаём, кто же нам ответит на изначальный вопрос — какой IP-адрес у example.org?

Источник: Cloudflare

Наглядно посмотреть на то, как эта система работает, вы можете, например, на этом сайте.

Так в чём же проблема?

За все домены Google отвечают 4 авторитативных сервера имён. Они настроены таким образом, чтобы клиенту возвращался IP-адрес ближайшего сервера Google. У AdGuard DNS почти полсотни серверов по всему миру (а скоро будет ещё больше), так почему некоторым из них Google возвращал адреса, находящиеся в Китае?

Дело в том, что у серверов AdGuard DNS есть несколько IP-адресов — как IPv4-адреса, так и IPv6-адреса. Похоже, что Google не справлялся с определением локации при использовании IPv6 и выдавал записи для Китая, а не для реальных локаций серверов AdGuard DNS.

Вот такая простая разгадка. Так что будьте осторожны, если используете свой собственный рекурсивный DNS-сервер — от IPv6 можно ожидать чего угодно.

Чтобы избежать такого поведения в будущем, мы переконфигурировали наши серверы так, что они теперь предпочитают IPv4, так что больше вы не столкнётесь с медленной скоростью подключения при переходе на домены Google.

Можно ли решить эту проблему другим способом?

Да, можно. Давно уже существует технология EDNS Client Subnet, которая позволяет оповещать авторитативные сервера имён о том, для какого клиента вы совершаете запрос. Для этого вам нужно передать в запросе еще и "подсеть" клиента. К сожалению, просто передача таких данных авторитативным серверам имён нас не устраивает, это идёт вразрез с нашей политкой конфиденциальности, ведь мы не передаём никому ваш реальный адрес.

Можно ли использовать EDNS Client Subnet, но сохранить ваш IP в тайне? Можно, и мы уже работаем над этим. Следите за нашими новостями, мы обязательно напишем про это в одном из будущих постов про DNS.

Понравился пост?