«Facebook не может "упасть", не так ли?», — подумали мы на секунду.
Сегодня в 15:51 UTC у нас произошел "внутренний инцидент" под названием "Facebook DNS lookup returning SERVFAIL" , потому что мы были обеспокоены тем, что что-то не так с нашим dns-сервером 1.1.1.1.
Но когда мы собирались опубликовать сообщение на нашей странице публичного статуса, мы поняли, что происходит что-то еще более серьезное.
Социальные сети "горели" сообщениями об этом, а наши инженеры быстро подтвердили. Facebook и связанные с ним сервисы WhatsApp и Instagram, по сути, были недоступны. DNS-имена перестали инициализироваться, а их инфраструктурные IP-адреса были недоступны. Это было похоже на то, как если бы кто-то «вытащил кабели» из всех центров обработки данных сразу и отключил их от Интернета.
Это не было проблемой DNS само по себе, но ошибка DNS была первым симптомом, который мы видели в более крупном масштабе недоступности сервисов Facebook.
Как это вообще возможно?
Обновление от Facebook
Facebook опубликовал сообщение в блоге, в котором подробно рассказывается о том, что произошло. Внешне мы видели проблемы BGP и DNS, описанные в этом посте, но проблема фактически началась с изменения конфигурации, которое повлияло на всю внутреннюю магистраль. Это каскадом перетекло в Facebook и другие объекты, которые оказались недоступны, а сотрудники испытывают трудности с тем, чтобы снова начать обслуживание.
Facebook опубликовал еще один пост в блоге с гораздо более подробной информацией о том, что произошло.
Теперь о том, что же мы обнаружили.
Познакомьтесь с BGP
BGP расшифровывается как Border Gateway Protocol. Это механизм обмена информацией о маршрутизации между автономными системами (AS) в Интернете. Большие маршрутизаторы, которые заставляют Интернет работать, имеют огромные, постоянно обновляемые списки возможных маршрутов, которые могут быть использованы для доставки каждого сетевого пакета в конечные пункты назначения. Без BGP интернет-маршрутизаторы не знали бы, что делать, и Интернет не работал бы.
Интернет — это буквально сеть сетей, и он связан друг с другом BGP. BGP позволяет одной сети (скажем, Facebook) афишировать свое присутствие другим сетям, которые формируют Интернет. Поскольку Facebook не афиширует свое присутствие, интернет-провайдеры и другие сети не могут найти сеть Facebook, и поэтому она недоступна.
Каждая из отдельных сетей имеет ASN: номер автономной системы. Автономная система (AS) — это индивидуальная сеть с единой внутренней политикой маршрутизации.
AS может порождать префиксы (скажем, они контролируют группу IP-адресов), а также транзитные префиксы (скажем, они знают, как достичь определенных групп IP-адресов).
Каждый ASN должен объявить свои префиксные маршруты в Интернет с помощью BGP; в противном случае никто не будет знать, как подключиться и где нас найти.
На этой упрощенной схеме вы можете увидеть шесть автономных систем в Интернете и два возможных маршрута, которые один пакет может использовать для передачи от начального к конечному. AS1 → AS2 → AS3 является самым быстрым, а AS1 → AS6 → AS5 → AS4 → AS3 является самым медленным, но это может быть использовано, если первый выйдет из строя.
В 15:58 UTC мы заметили, что Facebook перестал сообщать маршруты к своим префиксам DNS. Это означало, что, по крайней мере, DNS-серверы Facebook были недоступны. Из-за этого DNS-сопоставитель Cloudflare 1.1.1.1 больше не мог отвечать на запросы с запросами IP-адреса facebook.com.
Между тем, другие IP-адреса Facebook оставались маршрутизованными, но не были особенно полезны, поскольку без DNS Facebook и связанные с ним сервисы были фактически недоступны.
Мы отслеживаем все обновления и объявления BGP, которые мы видим в нашей глобальной сети. В нашем масштабе данных, которые мы собираем, дают нам представление о том, как и куда трафик идет траффик.
Сообщение BGP UPDATE информирует маршрутизатор о любых изменениях, внесенных в объявление префикса, или полностью отзывает префикс. Мы можем ясно видеть это в количестве обновлений, которые мы получили от Facebook при проверке нашей базы данных BGP. Обычно этот график довольно спокойный: Facebook не вносит много изменений в свою сеть ежиминутно.
Но примерно в 15:40 UTC мы увидели пик изменений маршрутизации от Facebook. Вот тогда и начались проблемы.
DNS под ударом
Как прямое следствие этого, DNS-сопоставители во всем мире перестали инициализировать свои доменные имена.
Это происходит потому, что DNS, как и многие другие системы в Интернете, также имеет свой механизм маршрутизации. Когда кто-то вводит https://facebook.com в браузере, распознаватель DNS, отвечающий за преобразование доменных имен в фактические IP-адреса для подключения, сначала проверяет, есть ли что-то в кэше, и использует его. Если нет, он пытается получить ответ от серверов доменных имен.
Если серверы доменных имен недоступны или не отвечают по какой-либо другой причине, возвращается SERVFAIL, и браузер выдает пользователю сообщение об ошибке.
Из-за того, что Facebook прекратил объявлять свои маршруты префиксов DNS через BGP, наши и все остальные DNS-сопоставители не имели возможности подключиться к своим серверам имен. Следовательно, 1.1.1.1, 8.8.8.8 и другие основные публичные DNS-устройства начали выдавать (и кэшировать) ответы SERVFAIL.
Но это не всё. Теперь срабатывают человеческое поведение и логика приложений и вызывают еще один экспоненциальный эффект. За этим следует цунами дополнительного DNS-трафика (больше запросов - больше нагрузки).
Это произошло отчасти потому, что приложения не принимают ошибку за ответ и начинают повторную попытку, иногда агрессивно, а отчасти потому, что конечные пользователи также не будут принимать ошибку за ответ и начнут перезагружать страницы или перезапускать свои приложения, иногда также агрессивно.
Это увеличение трафика (по количеству запросов), которое мы видели на 1.1.1.1:
Итог
Недавние события является напоминанием о том, что Интернет является очень сложной и взаимозависимой системой миллионов систем и протоколов, работающих вместе. И они находятся в центре внимания почти пяти миллиардов активных пользователей по всему миру.