Одна из функций Chromium создаёт огромную нагрузку на корневые DNS-серверы

Автор оригинала: Jim Salter
  • Перевод


Браузер Chromium, активно развивающийся open-source-родитель Google Chrome и нового Microsoft Edge, обратил на себя серьёзное негативное внимание из-за функции, которая задумывалась с благими намерениями: она проверяет, не «похищает» ли провайдер пользователя несуществующие результаты запросов доменов.

Intranet Redirect Detector, создающий поддельные запросы случайных «доменов», существование которых статистически маловероятно, ответственен примерно за половину общего трафика, получаемого корневыми DNS-серверами по всему миру. Инженер Verisign Мэтт Томас написал пространный пост в блоге APNIC с описанием проблемы и оценкой её масштаба.


Как обычно выполняется DNS-преобразование



Эти сервера являются высшей инстанцией, к которой следует обращаться для резолвинга .com, .net и так далее, чтобы они сообщили вам, что frglxrtmpuf — это не домен верхнего уровня (TLD).

DNS, или Domain Name System («система доменных имён») — это система, благодаря которой компьютеры могут преобразовывать запоминающиеся доменные имена наподобие arstechnica.com в гораздо менее удобные IP-адреса, например 3.128.236.93. Без DNS Интернет не мог бы существовать в пригодном для людей виде, а значит, ненужная нагрузка на инфраструктуру верхнего уровня является реальной проблемой.

Для загрузки единственной современной веб-страницы может потребоваться невообразимое количество операций DNS-поиска. Например, когда мы анализировали главную страницу ESPN, то насчитали 93 отдельных доменных имени, от a.espncdn.com до z.motads.com. Все они необходимы для полной загрузки страницы!

Чтобы такую нагрузку могла выдерживать система поиска, которой необходимо обслуживать весь мир, DNS спроектирована как многоуровневая иерархия. На вершине этой пирамиды находятся корневые серверы — каждый домен верхнего уровня, например, .com, имеет собственное семейство серверов, являющихся высшей инстанцией для каждого домена ниже них. Одной ступенькой выше этих серверов находятся сами корневые сервера, от a.root-servers.net до m.root-servers.net.

Как часто это происходит?


Благодаря многоуровневой иерархии кэширования инфраструктуры DNS, корневых серверов достигает очень малый процент мировых DNS-запросов. Большинство людей получает информацию DNS-резолвера непосредственно от своего провайдера. Когда устройству пользователя нужно узнать, как попасть на определённый сайт, запрос сначала отправляется DNS-серверу, управляемому этим локальным провайдером. Если локальный DNS-сервер не знает ответа, он перенаправляет запрос собственным «серверам пересылки» (в случае, если они указаны).

Если ни у DNS-сервера локального провайдера, ни у заданных в его конфигурации «серверов пересылки» нет кэшированного ответа, запрос поднимается непосредственно к полномочному серверу домена выше того, который вы пытаетесь преобразовать. В случае домен.com это будет означать, что запрос отправляется к полномочным серверам самого домена com, которые находятся по адресу gtld-servers.net.

Система gtld-servers, к которой был запрос, отвечает на него списком полномочных серверов имён для домена домен.com, а также как минимум одной связующей записью, содержащей IP-адрес одного такого сервера имён. Далее ответы спускаются по цепочке — каждый сервер пересылки передаёт эти ответы вниз тому серверу, который их запрашивал, пока ответ наконец не достигнет сервера локального провайдера и компьютера пользователя. Все они при этом кэшируют этот ответ, чтобы без необходимости не беспокоить системы более верхнего уровня.

В большинстве случаев записи серверов имён для домен.com уже будут кэшированы на одном из этих серверов пересылки, поэтому корневые серверы никто не тревожит. Однако пока мы говорим о привычном нам виде URL — том, который преобразуется в обычный веб-сайт. Запросы Chrome относятся к уровню выше этого, на ступеньке самих кластеров root-servers.net.

Chromium и проверка похищения NXDomain



Проверки Chromium «этот DNS-сервер меня не обманывает?» составляют почти половину всего трафика, достигающего кластера корневых DNS-серверов Verisign.

Браузер Chromium, родительский проект Google Chrome, нового Microsoft Edge и бесчисленного количества менее известных браузеров, хочет обеспечить пользователям простоту поиска в одном поле, иногда называемого «Omnibox». Другими словами, пользователь вводит и реальные URL, и запросы к поисковому движку в одно и то же текстовое поле в верхней части окна браузера. Делая ещё один шаг к упрощению, он также не заставляет пользователя вводить часть URL с http:// или https://.

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

Если пользователь в интранете своей компании вводит «marketing», а в интранете компании есть внутренний веб-сайт с таким же названием, то Chromium отображает информационное окно, спрашивающее пользователя, хочет ли он искать «marketing», или перейти к https://marketing. Это ещё куда ни шло, но многие провайдеры Интернета и провайдеры общих сетей Wi-Fi «похищают» каждый введённый с опечаткой URL, перенаправляя пользователя на какую-нибудь напичканную рекламными баннерами страницу.

Случайная генерация


Разработчики Chromium не хотели, чтобы пользователи в обычных сетях при каждом поиске одного слова видели информационное окно, спрашивающее, что те имели в виду, поэтому они реализовали тест: при запуске браузера или смене сети Chromium выполняет операции DNS-поиска трёх случайно сгенерированных «доменов» верхнего уровня длиной от семи до пятнадцати символов. Если любые два из этих запросов возвращаются с одинаковым IP-адресом, то Chromium предполагает, что локальная сеть «похищает» ошибки NXDOMAIN, которые он должен получать, поэтому браузер до дальнейшего уведомления считает все введённые запросы из одного слова попытками поиска.

К сожалению, в сетях, которые не похищают результаты DNS-запросов, эти три операции обычно поднимаются на самый верх, до самих корневых серверов имён: локальный сервер не знает, как преобразовать qwajuixk, поэтому перебрасывает этот запрос своему серверу пересылки, который делает то же самое, пока, наконец, a.root-servers.net или один из его «братьев» не будет вынужден сказать «Простите, но это не домен».

Так как существует приблизительно 1,67*10^21 возможных фальшивых доменных имён длиной от семи до пятнадцати символов, чаще всего каждый из этих тестов, выполненных в «честной» сети, добирается до корневого сервера. Это составляет аж половину от общей нагрузки на корневые DNS, если верить статистике от той части кластеров root-servers.net, которые принадлежат компании Verisign.

История повторяется


Это не первый случай, когда созданный с самыми благими намерениями проект заваливал или едва не заваливал общественный ресурс необязательным трафиком — нам это сразу же напомнило долгую и печальную историю D-Link и NTP-сервера (Network Time Protocol) Поуля-Хеннинга Кампа середины 2000-х.

В 2005 году разработчик FreeBSD Поуль-Хеннинг, владевший также единственным в Дании сервером Network Time Protocol уровня Stratum 1, получил неожиданный и большой счёт за переданный трафик. Если вкратце, то причина заключалась в том, что разработчики D-Link прописали адреса NTP-серверов Stratum 1, в том числе и сервера Кампа, в прошивку линейки коммутаторов, маршрутизаторов и точек доступа компании. Это мгновенно повысило в девять раз трафик сервера Кампа, из-за чего Danish Internet Exchange (точка обмена Интернет-трафиком Дании) сменила его тариф с «Бесплатного» на «9 000 долларов в год».

Проблема заключалась не в том, что маршрутизаторов D-Link было слишком много, а в том, что они «нарушали субординацию». Почти как и DNS, NTP должны работать в иерархической форме — серверы уровня Stratum 0 передают информацию серверам Stratum 1, которые передают информацию серверам Stratum 2, и так далее, вниз по иерархии. Обычный домашний маршрутизатор, коммутатор или точка доступа наподобие тех, в которые D-Link прошила адреса NTP-серверов, должны были отправлять запросы серверу Stratum 2 или Stratum 3.

Проект Chromium, вероятно, имея самые благие намерения, повторил проблему с NTP в проблеме с DNS, загрузив корневые серверы Интернета запросами, которые они никогда не должны были обрабатывать.

Надежда на скорое решение есть


В проекте Chromium есть открытый баг, требующий для устранения этой проблемы отключения по умолчанию Intranet Redirect Detector. Надо отдать должное проекту Chromium: баг был найден до того, как Мэтт Томас из Verisign привлёк к нему огромное внимание своим постом в блоге APNIC. Баг был открыт в июне, но оставался в забвении до поста Томаса; после поста он начал находиться под чутким присмотром.

Есть надежда, что проблема скоро будет решена, и корневым DNS-серверам больше не придётся отвечать ежедневно на примерно 60 миллиардов фиктивных запросов.



На правах рекламы


Эпичные серверы — это VPS на Windows или Linux с мощными процессорами семейства AMD EPYC и очень быстрыми NVMe дисками Intel. Спешите заказать!

VDSina.ru — хостинг серверов
Серверы в Москве и Амстердаме

Комментарии 28

    0
    Речь про Chromium, но в заголовке упомянут исключительно Chrome.
      0
      Изначально поставили заголовок как в оригинальном материале, но сейчас исправил в нашем переводе.
      +1
      Почти как и DNS, NTP должны работать в иерархической форме — серверы уровня Stratum 0 передают информацию серверам Stratum 1, которые передают информацию серверам Stratum 2, и так далее, вниз по иерархии. Обычный домашний маршрутизатор, коммутатор или точка доступа наподобие тех, в которые D-Link прошила адреса NTP-серверов, должны были отправлять запросы серверу Stratum 2 или Stratum 3.

      Странная ситуация, что такая иерархия не форсируется вайтлистами. А то выходит, что зная адреса 0 и 1, конечному юзеру нет никакого профита в подключении к 2 и 3, кроме абстрактного всеобщего блага.

        +1

        Теперь — форсируется. А раньше было джентельменство. А конечному пользователю нет никакого профита использовать stratum 0 или stratum 1 — он не заметит разницы.

          –1
          Я тот человек который синхронизируется с Stratum 1.
          И да — мне стыдно. Но есть девайсы в которых нельзя прописать FQDN для синхронизации, только IP.
          На ntp.org указаны IP серверов Stratum 1 и 2. Дальнейшие уровни только в виде FQDN. Резолвить их в IP и пользоваться этими адресами не получается, потому что они периодически меняются и старые IP перестают отвечать (уже пройдённый этап).
          Вот как в таком случае правильно поступить?
            +1

            Поднять свой NTP сервер?

              –1
              Я ждал это комментарий. Но нет. Поднять свой сервер это конечно выход, не спорю. Но одновременно это и размножение сущностей и вообще по факту костыль (я не знаю надо ли объяснять почему?).
                +2
                Костыль для инвалида — это благо, а железки, не умеющие FQDN самые настоящие инвалиды. ntpd или любой, самый дохлый микротик в помощь.

                ps я именно так и поступаю. Ставил несколько раз видеонаблюдение, и везде, где микротики — синхронизирую их часы c ru.pool.nto.org, а камеры уже с этим сервером.

                А уж если я позволяю себе брать время со Statum-1, то получившийся Stratum-2 сервер добавляю ntp.org пул.
                  0
                  Подскажите, как вы это сделали. У меня при вводе в ntp-клиенте адресов ntp-серверов они ресолвятся в ip и в таком виде сохраняются.
                  package: ntp 6.46.6
                    0
                    Без пакета ntp в «SNTP Client» то же поведение.
                      0
                      Без пакета «ntp» можно прописывать FQDN — надо прописывать в поле «Server DNS Names».
                      Но без этого пакета с него нельзя время брать, вот в чём проблема.
                        0
                        Точно, так оно и работает.
                    0
                    Присоединяюсь к вопросу про Микротик. При установке пакета «ntp» там меняется NTP-клиент, который не позволяет прописывать FQDN для синхронизации (точнее прописывать позволяет, но при сохранении он резолвится в IP и так и сохраняется).
                    Т.е. нужно как минимум делать скриптом отслеживание изменения IP.
                    Или я чего-то не знаю? С Микротиком никогда нельзя быть уверенным, что знаешь всё.
                +1

                Неизвестны другие условия задачи, потому могу только предполагать:


                1. Завести свой NTP сервер, если это возможно. Если у вас много таких устройств, то найти куда установить ntpd, думаю, не составит особого труда.
                2. Написать скриптик, который будет по крону проверять, не сменился ли адрес у используемого NTP сервера, и посылающий письмо с уведомлением об этом. Если устройств немного, то это не должно доставить особых проблем.

                Собственно, предполагалось, как я понимаю, что п.1 всегда должен выполняться.


                P.S. Сам грешен: полтора десятка лет назад тоже синхронизировался со stratum 1, после исправился.

                  –1
                  Вот прям минуту назад выше ответил. Но разверну тогда.
                  Предположим у нас одна большая организация. Тогда без проблем — поднимаем где-то свой сервак и всё. Выделим для этого виртуалку или даже физическую машину, или поднимем где-то за компанию. Хотя это решение всё равно нельзя назвать красивым. Т.к. мы на ровном месте организовали себе еще один сервис/виртуальную или даже физическую машину, и это надо так или иначе поддерживать. А по факту оно нам надо? Если можно просто синхронизироваться с кем-то в интернете. Ну т.е. я имею в виду, что я не сторонник плодить лишние сущности там где они не нужны.
                  А теперь представим, что у нас много организаций. Причем в каких-то кроме роутера и юзерских компов вообще нет ничего. Надо в каждой поднять сервер? А если не на чем поднять? Или надо поднять один на всех где-то во внешнем мире? Тоже вариант так себе — почему мы должны завязывать сторонние организации на какой-то единый сервис (кто его при этом будет оплачивать и админить?). В общем идея со своим сервером не очень (как по мне).
                  Идея со скриптом в общем-то страдает от тех же недостатков. Скрипт надо где-то запускать. Если устройств много менять это всё потом. И т.д.
                  Но впрочем никто же не гарантирует, что ip серверов Stratum 1/2 тоже не поменяются. Так что и здесь не идеальное решение.
                  Вывод в общем такой, что производители не позволяющие прописать FQDN поступают очень плохо.
                    +1

                    Производители, не позволяющие прописать FQDN, конечно, не доработали свой продукт, но… Но давайте не забывать, что никто ничего нам не должен за бесплатно. Так что если нам нужно настолько точно синхронизировать часы, то об этом мы должны сами озаботиться. В данном случае, либо выбрав другой продукт, либо реализовав NTP сервер своими силами.

                      +1
                      Предположим у нас одна большая организация.

                      Значит, хотя бы 1 сервер должен быть. Поднять там ещё и ntpd несложно.


                      А теперь представим, что у нас много организаций. Причем в каких-то кроме роутера и юзерских компов вообще нет ничего. Надо в каждой поднять сервер? А если не на чем поднять? Или надо поднять один на всех где-то во внешнем мире? Тоже вариант так себе — почему мы должны завязывать сторонние организации на какой-то единый сервис (кто его при этом будет оплачивать и админить?)

                      Но вы ж и так завязываете их на сторонний сервис. Который может в любой момент решить что вы обнаглели и закрыться файерволом.


                      кто его при этом будет оплачивать и админить?

                      Ну, если у вас есть доступ к оборудованию сторонних организаций и обязанности по поддержке — значит, деньги тоже должны быть.

                        +1
                        Значит, хотя бы 1 сервер должен быть. Поднять там ещё и ntpd несложно.

                        С большой организацией в общем особых проблем нет, я не спорю. Кстати если есть домен Active Directory, то время можно брать с любого контроллера домена (не забыв предварительно настроить эмулятор PDC на синхронизацию с внешним источником, благо FQDN он понимает).
                        Проблема больше с мелкими конторами, особенно если их много.
                        Но вы ж и так завязываете их на сторонний сервис. Который может в любой момент решить что вы обнаглели и закрыться файерволом.

                        Так я и не говорю, что синхронизироваться с Stratum 1/2 это идеальное решение. Надеялся, что кто-то подкинет какую-нибудь изящную идею (помимо поднятия своего сервера).
                        Ну, если у вас есть доступ к оборудованию сторонних организаций и обязанности по поддержке — значит, деньги тоже должны быть.

                        Понимаете в чём проблема. Завязывать сторонние организации на какой-то свой внешний сервис это плохой тон. Должно быть сделано так, что если вы завтра уволитесь отовсюду, то после вас следующему админу должна достаться автономная система, а не привязанная к каким-то внешним сервисам. Понятно, что в современном мире практически всегда какие-то внешние сервисы используются (особенно в мелких конторах). Какая-нибудь почта Google/Yandex, тот же pool.ntp.org. Но это сервисы поддерживаемые гигантами ранка или сообществом, вероятность их закрытия крайне мала. А вот если админ Вася поднял вовне какой-то сервис и подвесил на него кучу компаний, то это всё будет работать пока Васе это интересно.
                        Поэтому поднимать внешний сервер для разных контор я считаю плохой идеей (плохим тоном, если точнее). Свой сервер внутри — в некоторых случаях нерационально.
              –4
              1. Не надо никого обманывать: в Chromium нет никакой ошибки, ошибка в самом протоколе DNS, а Chromium с данной функцией всего лишь её триггер.
              2. Сама по себе функция появилась для детектирования мудаков-рекламщиков, нарушающих спецификацию и обманывающих пользователей DNS. Может, для начала, начать искать другие пути разрешения этой проблемы?
              3. А эта ли функция является основным генератором DNS запросов? А при вводе чего-то похожего на DNS имя в omnibox не производятся запросы для проверки, действительно ли это действительное DNS имя?
                +3

                Всего-то нужно было оставить отдельне поле поиска. Пользователь сам выберет, нажать ctrl+l или ctrl+k. Хотя сейчас это тоже должно срабатывать. Тогда, например, адреса без / и
                в начале и без / в конце считать поиском, если в них нет точки. Не очевидно, но это была бы не единственная неочевидная вещь в хроме

                  0

                  При чём тут поиск в браузере, когда проблема в поиске на стороне провайдера?

                    +2

                    Суть именно в этом. Поисковые провайдеры омнибокса (алгоритмы в браузере) пытаются "угадать", что именно пользовать вводит, адрес, доменное имя или поисковой запрос. Там всё довольно накручено, можно посмотреть, например, статью от "яндекс браузера" про подсказки и омнибокс.


                    Если бы поля поиска и адреса были бы разные, пользователь скорее всего реже вводил бы левые адреса в строку адреса, которые бы провайдеры перехватывали, и мог бы спокойно вводить что угодно в строку поиска, всё это бы уходило в поисковую систему без всяких неоднозначных ситуаций.

                      –1
                      Поиск, который просто поиск, пойдёт к google.com/?q=%s, а попытка перейти по введённому адресу сайта, это не «поиск на стороне провайдера», это запрос к DNS-серверу «куда ведёт этот адрес?». Провайдер только обрабатывает запрос, который к нему присылает компьютер, на котором запущен этот браузер.
                    +1
                    Я правильно понимаю, что для исправления «бага» достаточно поменять алгоритм проверки таким образом, чтобы он проверял qwajuixk.com вместо qwajuixk?
                      –1
                      Если я правильно ошибаюсь, то .com уже не пройдёт, фишка именно в самом верхнем уровне
                        +2
                        В локальных корпоративных сетях любят именно бездоменные названия делать для внутренних ресурсов. Что в нынешний век уже кажется глупостью, на фоне того что браузеры давно умеют добивать длинные названия часто используемых или просто сохраненных в закладки сайтов. Так что по большому счету, в удобстве пользователя большой разницы будет он писать «market» в строке браузера или «market.mycompanydomainname.com» — нет, все равно после третьей буквы адрес сам заполнится.

                        Но вообще, да, отвечая на вопрос: теоретически может сработать. Трюк ведь в том, чтобы послать такой запрос, на который не будет знать ответа dns провайдера, но который не дойдет до корневых серверов. Значит минимальное условие такое: корневой домен известен (.com например), а второй уровень — сгенерирован случайно.
                          0

                          Задолбать .com-ресолверы вместо root DNS? Так себе решение, мне кажется. Вот если вместо .com использовать разные TLD, выбранные из фиксированного списка случайно, то должно быть получше.

                          0
                          а как этот вопрос решается в Firefox?

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

                          Самое читаемое