Представьте себе молодой проект Chromium и не менее молодой браузер Chrome на его основе. Он уже известен, но до глобального доминирования ещё очень далеко. Так было 10 лет назад. Именно тогда в него внедрили едва ли заметную пользователями функцию, которая через многие годы создаст большую проблему для корневых DNS-серверов, на которых держится современный интернет.
Омнибокс и задачка, которую он породил
Вы ведь помните, чем на старте Хром отличался от других браузеров? Правильно, он объединил адресную и поисковую строки. Пользователь получил возможность вводить в единую строку, названную омнибоксом, всё что угодно. Пишет адрес — попадает на сайт, пишет слова — попадает в поиск.
Примерно в этот момент могли напрячься компании, которые во внутренней сети использовали внутренние веб-страницы с корявыми адресами. К примеру, если сотрудник вводил в адресную строку более древнего браузера слово mail, то внутренняя сеть могла показать ему корпоративный почтовый сервис http://mail. Но вот новенький омнибокс вполне мог посчитать это поисковым запросом и отправить в Google. На радость админам, у которых первой реакцией, я уверен, было желание запретить новый браузер. Запретить же всегда проще.
К счастью, ребята из Google испугались злых админов и продумали этот сценарий. Chrome предусмотрительно отправляет DNS-запросы для одиночных слов, введённых пользователем в омнибокс. Если сеть возвращает что-то осмысленное, то браузер предлагает открыть такой сайт. А вот если в ответ прилетает ошибка NXDOMAIN, то это точно сценарий поиска.
Мир, дружба, жвачка. Все довольны. Но не долго.
Intranet Redirect Detector спешит на помощь
Оказалось, что некоторые провайдеры (особенно американские) и владельцы халявных Wi-Fi точек настолько страх потеряли, что решили перехватывать некорректные, по их мнению, урлы и перенаправлять все такие запросы на заглушку с рекламой. Под капотом это работает так: пользователь вводит одностраничный запрос, Chrome отправляет проверочный DNS-запрос, провайдер видит, что такого сайта нет в реестре ... но вместо ошибки решает вернуть IP-адрес своей рекламной заглушки.
В результате Chrome почём зря показывает пользователю предложение перейти на сайт при поиске любых одиночных слов. Пользователей это бесит. Во-первых, потому что видит предложение куда-то там перейти на каждый поисковый запрос. Во-вторых, потому что все эти предложения ведут на рекламную заглушку.
И вот тут случился поворотный момент во всей нашей истории. Чтобы не бесить пользователей, нужно выявлять хитропопое поведение провайдера. А для этого придумали фичу Intranet Redirect Detector.
Работает она так. При каждом запуске или при смене источника сети браузер отправляет три DNS-запроса. Да не простые, а для сгенерированных из набора случайных букв слов. Таких доменов с высокой вероятностью не существует в мире, поэтому Хром ожидает получить в ответ три ошибки. Но если мы находимся в сети, в которой провайдер перехватывает и подменяет ошибки на свою страницу, то результат будет другой. Если браузер видит, что как минимум у двух запросов в ответ прилетает один и тот же адрес, то это признак перехвата. Значит, такой сети доверять нельзя. Значит, все одностраничные запросы обрабатываются как поисковые. И никаких вопросов пользователю.
Мир, дружба, жвачка. Все опять довольны. Проходит десять лет...
МИР НА ГРАНИ КОТОСТРОФЫ
За десяток лет Google Chrome превратился из гиковской игрушки в доминирующий браузер в мире. Более того, на проект Chromium перешли и другие популярные браузеры. А значит, абсолютное большинство браузеров в мире сейчас отправляют по три случайных DNS-запроса при каждом перезапуске.
Само по себе это звучит не страшно. Три запроса это ведь капля в море. Многие страницы в интернете содержат ссылки на десятки разных доменов, браузеры успешно резолвят их адреса в фоне. Но есть одно но. Проверочные «адреса» в Хроме генерируются случайно и в реальности не существуют. И чо, скажете вы.
Давайте на секунду вспомним, как вообще работает сеть DNS-серверов. Как правило, все запросы вашего браузера обрабатывает DNS-сервер вашего провайдера. Если вдруг к нему прилетает домен, который он не знает, то он обращается по цепочке к более верхнеуровневому серверу, который возвращает адрес, который провайдер кэширует к себе, а потом отдает всем своим пользователям. Запросы редко уходят в корень иерархической сети DNS-серверов, потому что адреса для существующих сайтов уже закэшированы на уровне провайдера.
А теперь представьте, что происходит с потоком DNS-запросов с уникальными доменами ото всех браузеров на базе Chromium. Провайдер ответа не знает, потому что в прошлом никогда не встречался с этим доменом. Он передаёт запрос дальше по цепочке. Следующий сервер тоже в шоке. И так далее, и так далее, пока запрос не попадает на самый верхний уровень — к корневому DNS-серверу. Да, он благополучно возвращает ошибку, которая ретранслируется обратно по цепочке и даже закэшируется на каждом слое. Вот только ВСЕ тестовые запросы уникальны. Понимаете? КАЖДЫЙ запрос от КАЖДОГО браузера в МИРЕ проходит всю цепочку и долбит корневой сервер. Корневых серверов, конечно, больше чем один, но их всё равно мало, и вся сеть была сконструирована без учёта такой возможной нагрузки.
В результате сейчас 50% всех запросов к корневым серверам — это фейковые/тестовые запросы от Chrome и других Chromium-based браузеров. И эта доля быстро растёт.
Чем больше бесполезной нагрузки, тем меньше остаётся ресурсов на полезную. Это значит, что в теории эта старенькая фича браузера Хром может даже привести к перебоям в работе интернета во всём мире.
Но не приведёт. Надеюсь. Потому что разработчики из Google решили таки прекратить ддосить DNS-серверы 60 миллиардами своих фейковых запросов в сутки. Готового решения ещё нет. Но работа уже обсуждается в двух тикетах: один был создан в июне этого года, другой в мае прошлого года. Активная работа в них по совершенно случайному стечению обстоятельств началась сразу после публичной огласки этой проблемы несколько дней назад. Следим!