TL;DR: Из-за блокировок Роскомнадзора большое количество ресурсов, находящихся на Amazon CloudFront и Akamai, периодически становятся кратковременно недоступны. Проблема вызвана частой сменой (ротацией) IP-адресов на доменах, использующих эти сервисы, а также балансировками на основе геопризнака и EDNS Client Subnet: периодически DNS-серверы ресурсов выдают клиентам адреса, внесённые в Реестр запрещенных сайтов. Неосведомлённому человеку сложно определить причину проблемы, так как через минуту всё, как правило, снова работает (но через какое-то время опять перестаёт).
Введение
Около двух лет в России в рамках борьбы с Telegram были заблокированы диапазоны IP-адресов Amazon Web Services, CloudFlare, Digital Ocean, Scaleway, Hetzner, Softlayer и других менее известных хостингов и CDN. Перечисленные сервисы очень популярны, их услугами пользуется значительное количество сайтов в интернете.
Во времена блокировки пользователи сообщали о недоступности Playstation Network, Viber, Spotify, основного сайта Microsoft и некоторых его поддоменов, а также множества других сервисов, сайтов и интернет-игр.
18.06.2020 Роскомнадзор разблокировал все ранее блокированные диапазоны, жалобы на недоступность сайтов резко сократились.
Однако часть сайтов, использующих сервисы Amazon CloudFront и Akamai, до сих пор периодически не открывается либо не загружается полностью, а через минуту уже работают нормально. Вы могли списывать такое поведение на проблемы у интернет-провайдера или сайта, но на деле они вызваны интернет-блокировками в России и особенностями геобалансировки этих сервисов.
Вот краткий список хостов, к которым был затруднен доступ за последние 2 недели:
- www.adobe.com
- leonardo.osnova.io (картинки сайтов dtf.ru, tjournal.ru)
- cf-hls-media.sndcdn.com (аудио SoundCloud)
- blog.playstation.com (блог Playstation)
- clips-media-assets2.twitch.tv (видео с Twitch)
- ocsp.int-x3.letsencrypt.org (проверка сертификатов по протоколу OCSP)
- steamcommunity-a.akamaihd.net (форум Steam)
- *.zendesk.com (система поддержки Zendesk)
- a.slack-edge.com (мессенджер Slack)
- v16-web.tiktok.com, s16.tiktokcdn.com (приложение TikTok)
- cdn-images.deezer.com (картинки аудиосервиса Deezer)
Давайте разберемся с причинами проблем и способами их устранения.
Геобалансировка и EDNS Client Subnet
Для того, чтобы распределить запросы пользователей к наиболее близким серверам географически, DNS-резолверы при обращении к DNS-серверам добавляют IP-адрес клиента с точностью до подсети /24, и сервер учитывает его при ответе на запрос.
Akamai, например, может отдавать совершенно разный набор IP-адресов на разные подсети, даже если они географически близко и принадлежат одному провайдеру, и отдаёт ответ со значением TTL равным одной минуте.
Отрезолвим домен steamcommunity-a.akamaihd.net (домен Steam для изображений и различных ресурсов) через DNS-резолвер Google 8.8.8.8, используя диапазоны 87.245.224.0/24, 87.245.225.0/24, 87.245.226.0/24, 87.245.227.0/24 провайдера retn для Client Subnet:
$ dig +short steamcommunity-a.akamaihd.net @8.8.8.8 +subnet=87.245.224.0/24
92.123.77.32
92.123.77.19
$ dig +short steamcommunity-a.akamaihd.net @8.8.8.8 +subnet=87.245.225.0/24
185.5.160.202
185.5.160.187
$ dig +short steamcommunity-a.akamaihd.net @8.8.8.8 +subnet=87.245.226.0/24
185.5.160.202
185.5.160.187
$ dig +short steamcommunity-a.akamaihd.net @8.8.8.8 +subnet=87.245.227.0/24
87.245.213.51
87.245.213.9
Подождем пару минут, повторим опыт:
$ dig +short steamcommunity-a.akamaihd.net @8.8.8.8 +subnet=87.245.224.0/24
2.20.188.65
2.20.188.75
$ dig +short steamcommunity-a.akamaihd.net @8.8.8.8 +subnet=87.245.225.0/24
23.3.90.136
23.60.69.14
$ dig +short steamcommunity-a.akamaihd.net @8.8.8.8 +subnet=87.245.226.0/24
95.101.143.18
95.101.143.16
$ dig +short steamcommunity-a.akamaihd.net @8.8.8.8 +subnet=87.245.227.0/24
92.123.77.19
92.123.77.32
Как легко заметить, для каждого диапазона отдаются разные наборы адресов, которые меняются со временем.
Один из IP-адресов, 92.123.77.19, находится в Реестре запрещенных сайтов с 22.10.2020. При попытке браузера открыть сайт через этот IP-адрес, он либо сразу не откроет страницу, либо будет загружать её бесконечно долго (зависит от системы блокировок у провайдера).
Аналогичная ситуация наблюдается со многими другими доменами. Например, leonadro.osnova.io (изображения новостных сайтов tjournal.ru, dtf.ru) периодически резолвится в 2.19.204.32, 2.16.103.18, один из которых находится в Реестре.
Пример выполнения команды nslookup под Windows, используя DNS-резолверы провайдера ОнЛайм (Москва):
>nslookup leonardo.osnova.io
╤хЁтхЁ: ns1.onlime.ru
Address: 77.37.251.33
Не заслуживающий доверия ответ:
╚ь : a1844.dscd.akamai.net
Addresses: 2a02:26f0:98::58dd:844b
2a02:26f0:98::58dd:8452
2.19.204.32
2.16.103.18
Aliases: leonardo.osnova.io
leonardo.osnova.io.akamaized.net
История выявления проблемы
Пользователи АнтиЗапрета и расширения «Обход блокировок Рунета» визуально уведомляются о факте проксирования домена или IP-адреса, а при ошибке проксирования им предоставляется возможность отправки сообщения об ошибке.
При наличии домена проксирование всегда осуществляется по нему; на прокси-сервер не отправляется IP-адрес, полученный через DNS-резолвер пользователя.
Ошибка возникала из-за того, что локально у пользователя домен резолвился в заблокированный IP-адрес, из-за чего запрос, содержащий только домен, отправлялся на прокси-сервер проекта. Прокси-сервер искал домен по списку заблокированных, не находя его там резолвил IP-адреса, получал другой набор IP-адресов (не тот, который был у клиента), и блокировал запрос из-за отсутствия IP-адресов в Реестре заблокированных.
Возможные решения проблемы
Чтобы хоть как-то уменьшить проблемы с интернетом в России, производители некоторых комплексов DPI создают свои специализированные DNS-резолверы, которые при наличии сразу заблокированных и не заблокированных адресов в одном DNS-ответе убирают заблокированный, не давая клиенту возможности обращаться к нему. Данная функция есть, например, в системе Carbon Reductor DPI X, но работает она только при использовании DNS-резолверов провайдера (а не сторонних, DNS over HTTPS, и т.п.):
[…] Мы сделали сразу два решения проблемы с блокировкой популярных ресурсов.
Первый способ — интеграция с DNS-серверами для избежания частичных блокировок.
У некоторых больших ресурсов и сервисов, таких как Google, на одном домене используется большое количество IP-адресов. Некоторые из них могут случайно оказаться в списках на блокировку. В итоге абоненты испытывают проблемы, сайт у них открывается со второй или третьей попытки, пока браузер перебирает IP-адреса, возможно он так и не подключится. С помощью Carbon Reductor DPI X Вы можете настроить интеграцию с Вашим DNS-сервером и отдавать клиентам только незаблокированные IP-адреса.
Если абонент использует публичные DNS-сервера этот способ не поможет. При обращении в поддержку можно рекомендовать ему использовать DNS-сервер провайдера или Вы можете настроить переадресацию DNS на маршрутизаторе.
[…]
Готовое ПО с подобной функциональностью мне неизвестно, но это достаточно просто реализовать в Knot Resolver и PowerDNS Recursor.
В простых случаях должно быть достаточно добавить незаблокированные адреса для домена в файл hosts, но на мобильных устройствах это невозможно сделать без root или специального ПО.
Владельцы сайтов могут попробовать отключить геобалансировку и изменение IP-адресов, если такая настройка имеется, либо установить и использовать для домена собственный DNS-сервер, настроенный таким образом, чтобы отдавать только гарантированно не заблокированные адреса.
Вывод
Увы, по состоянию на конец ноября 2020 года интернет в России до сих пор нормально не работает: то тут, то там можно встретить кратковременную недоступность ресурсов, неполную загрузку сайтов и прочие атрибуты блокировок. Специалисты Роскомнадзора не знают об этой проблеме или игнорируют её, а из-за отсутствия визуального оповещения о блокировке такого типа, пользователи вынуждены винить владельцев сайтов или интернет-провайдера.
Автор: ValdikSS