В России сохраняются проблемы с доступностью сайтов, но никто их не замечает

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 недели:

Давайте разберемся с причинами проблем и способами их устранения.

Геобалансировка и 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 года интернет в России до сих пор нормально не работает: то тут, то там можно встретить кратковременную недоступность ресурсов, неполную загрузку сайтов и прочие атрибуты блокировок. Специалисты Роскомнадзора не знают об этой проблеме или игнорируют её, а из-за отсутствия визуального оповещения о блокировке такого типа, пользователи вынуждены винить владельцев сайтов или интернет-провайдера.

В данную минуту (01:21 10.02.2021) у меня не загружаются аватарки пользователей на Github, т.к. 3 из 4 адресов на домене находятся в Реестре.

$ host avatars.githubusercontent.com
avatars.githubusercontent.com is an alias for github.map.fastly.net.
github.map.fastly.net has address 151.101.0.133
github.map.fastly.net has address 151.101.64.133
github.map.fastly.net has address 151.101.128.133
github.map.fastly.net has address 151.101.192.133  

reestr.rublacklist.net/record/2747066

$ host -t a www.teamviewer.com 1.1.1.1
Using domain server:
Name: 1.1.1.1
Address: 1.1.1.1#53
Aliases: 

www.teamviewer.com is an alias for dp01e0e26epjj.cloudfront.net.
dp01e0e26epjj.cloudfront.net has address 65.9.50.34

https://reestr.rublacklist.net/search/?q=65.9.50.34