Pull to refresh

Мониторинг блокировок Роскомнадзором доменов на 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. Да минуют вас блокировки!

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.