Мониторинг блокировок Роскомнадзором доменов на Cloudflare по IP-адресам
Однажды тестируя один свой проект, я обнаружил, что на проводном интернете на компьютере и мобильнике все работает как часы, а на мобильном интернете — страница не открывается. При проведении расследования обнаружилось, что IP-адрес, выдаваемый домену сервисом Cloudflare при использовании проксирования, попал под блокировку Роскомнадзором, а решение суда по этому случаю было вынесено аж месяц назад. То есть какие-то провайдеры уже блокировали этот IP-адрес, а какие-то еще нет (и может не стали бы никогда). Самое плохое в том, что я узнал об этом случайно, так как из-за особенностей проекта пользователи не дали бы обратную связь что что-то сломалось, они просто не знали, как это сделать.
Начать надо с того, как это быстро исправить. Так как я использую бесплатный тариф в Cloudflare, на помощь тех. поддержки особо рассчитывать не приходится. На своем форуме они так и пишут, бесплатным пользователям IP-адрес менять не будем, удаляйте домен из старого аккаунта и заводите в новый, тогда он получит новый IP-адрес. Так я поступил и это действительно быстрое и рабочее решение. Попутно протестировал, что будет, если удалить домен, а затем снова добавить его на старый аккаунт — это не помогает, IP-адрес выдается тот же.
Далее я стал искать способ избежать этой проблемы в дальнейшем с этим и другими доменами. Несмотря на распространенность этой проблемы (в интернете много жалоб на подобные блокировки по IP-адресу), ни платных, ни бесплатных рабочих сервисов для мониторинга найти не удалось. Что же, придется делать свой. Как оказалось Роскомнадзор практикует 2 вида блокировок: по домену+IP и только по IP. Первый вид практикуется значительно чаще, 400 тысяч записей, но не опасен для обычных сайтов, не связанных с политикой, пиратством, казино и тому подобным. Второй вид редкий, всего 5 тысяч IP-адресов, но значительно опаснее и цепляет всех подряд на этих адресах. Он то нам и нужен.
Утилита для мониторинга написана на .Net стеке, это консольное приложение и предполагается его регулярный запуск с помощью Планировщика заданий Windows. Информация о выявленных проблемах приходит на email. Утилита достаточно простая и любой программист легко повторит ее на своем любимом стеке. А смысл моей статьи донести до аудитории о существовании проблемы и способе ее решения. Ведь когда эта палка на стене раз в год выстрелит, вы можете узнать об этом с большой задержкой. Далее рассмотрим принцип работы мониторинга.
Для получения списка заблокированных IP-адресов воспользуемся открытым API Роскомсвободы. Данные там обновляются раз в 2 часа, что более чем достаточно для наших целей.
Наша следующая задача - извлечь список доменов из аккаунтов Cloudflare, мы же не хотим вести этот список вручную. У Cloudflare существует 2 API, устаревший на базе ключа, и новый на базе токенов. Недостаток ключа в том, что он имеет полный доступ ко всему аккаунту, а на выпущенный токен можно навесить разные ограничения, в нашем случае задать права только на чтение. Для обоих API существует множество библиотек, мне больше всех понравилась FluentCloudflare.
С извлеченным списком доменов нам нужно выяснить в какие IP они разрешаются и сравнить со списком Роскомсвободы. DNS-клиентов для .Net великое множество, я остановился на DnsClient.NET.
Для обработки ошибок и оповещении о блокировке используется небезызвестный NLog.
Код проекта выложен на GitHub. Да минуют вас блокировки!