RKN Alert — база Роскомнадзора у вас в браузере

    Как и все, я пользуюсь одним из простых способов обхода блокировок, коих сейчас море. Все сайты открываются без проблем и тормозов. Но с недавних пор (2 недели назад) у меня встал вопрос: а какие сайты на самом деле заблокированы из тех, что открываются, а какие нет? Каждый сайт проверять вручную на официальном сайте РКН — не вариант, хоть это и самый надёжный способ. Естественно, я пошёл гуглить подходящие инструменты, но к великому удивлению ничего не нашёл.

    Идея


    Так родилась идея сделать расширение (опенсорсное), которое будет проверять каждый сайт на соответствие записям в базе РКН. Сначала оно было простое, проверяло только домен. Сейчас оно даже показывает, был ли сайт заблокирован неправомерно (попал под раздачу). Например, reactos.org или 7-zip.org (на момент прочтения статьи они могут быть уже разблокированы). Вообще с начала войны с Телеграмом многие сети до сих пор находятся в постоянной блокировке, периодически этот список меняется по неизвестным законам.

    Как работает расширение


    • Скачивает базу РКН и хранит её локально.
    • В текущей вкладке проверяет URL (есть ли он в базе).
    • Вырезает домен из URL и проверяет, есть ли домен в базе.
    • Проверяет текущий ip-адрес в базе, по которому загружен текущий сайт.
    • Проверяет принадлежность ip-адреса заблокированным подсетям.
    • Показывает отчёт в форме иконки. Если её нажать, то чуть более подробная информация.

    Вот и всё, никакой магии. Проверка домена всегда доступна, даже если сайт не грузится, блокируется, подменяется и т.д. — потому что анализируется строка адреса, то есть URL, который вы вбиваете в строке адреса или который появляется там сам. Все проблемы связаны только с проверкой ip.

    А что если в браузере прокси?


    Если в браузере настроен прокси, то расширение работает в пол силы, т.к. испытывает проблемы с определением текущего ip сайта. Вместо этого определяется ip прокси-сервера. Речь только о прокси в самом браузере, а не о VPN и прочих способах обхода. Кстати, для определения ip понадобились права webRequest (доступ к данным). Также ip не определяется из браузера Tor (к сожалению).

    А если сайт заблокирован провайдером?


    Другая техническая трудность — это определение текущего ip, когда сайт недоступен (предположительно заблокирован, а обход блокировок не настроен). В этом случае браузер не предоставляет информацию об ip-адресе. А нам нужен именно тот ip, по которому браузер пытается установить соединение — и его определить невозможно, увы. Но проверка по URL и домену при этом работает исправно.

    А что, если сайт просто лежит?


    На этот случай есть функция проверки доступности сайта, — она работает независимо от DNS и блокировок (пока соответствующий сервис работает без сюрпризов). После установки расширения её нужно включить в настройках. Но определить ip не получится по той же причине, что и в предыдущем абзаце.

    Что если провайдер перенаправляет DNS?


    Если у провайдера блокировка на уровне DNS, то расширение будет получать ложный текущий ip сайта и не подозревать об этом. И наоборот, если вы пропишите нужные ip в файл hosts (или даже у вас свой DNS-сервер), то во всплывающем отчёте будут именно они. Проверка по URL и домену при этом работает исправно, т.к. они берутся из строки адреса в браузере.

    Пытаемся решить проблемы с ip


    В качестве полумеры для решения подобных проблем расширение осуществляет DNS запрос и определяет все ip сайта, а также их статус нахождения в базе РКН. При этом расширение точно не знает, какой из нескольких ip используется в данный момент для обращения к проверяемому сайту. Поэтому если хоть один ip заблокирован, то расширение бьёт тревогу и меняет цвет иконки на красный.

    Для получения DNS записей приходится использовать внешний сервис через HTTP-DNS, потому что сам браузер не позволяет резолвить адреса. Но это и хорошо, т.к. провайдеры не блокируют и не перенаправляют подобные запросы. Надёжность информации высокая. Можно использовать днс от Google или Cloudflare, а также пользователь brzsmg захостил вечный бесплатный днс, за что ему спасибо.

    Где взять свежую базу РКН?


    Конечно же, отдельный квест был поиск наиболее адекватной базы РКН. Дело в том, что сам РКН не держит базу в открытом доступе. Вместо этого он предлагает провайдерам использовать цифровую подпись для доступа к базе. У меня лишней ЭЦП под рукой не оказалось. Между тем, РКН рекомендует провайдерам обновлять базу раз в час. А некоторые «срочные» обновления базы происходят ещё чаще. То есть ковровая блокировка может задеть ключевые (или ваши) ресурсы всего на пару часов, а потом исчезнуть, как ни в чём не бывало. Наиболее приемлемым оказался часто обновляемый файл на github. Спасибо добрым людям!

    Заглушка провайдера


    Ситуации, когда показывается заглушка провайдера, расширение распознаёт. Оно запоминает информацию о странице, с которой был редирект на заглушку, и показывает информацию о сайте, а не о заглушке. Сейчас поддерживаются: Ростелеком, МТС, Билайн, Йота, ТТК, Дом.ру. Если у вас особая заглушка у провайдера, её можно указать в настройках, и она будет распознаваться (не будет рассматриваться, как сайт).

    Заключение


    Какие ещё хотелки добавить? Пишите. Как по мне, расширение имеет уже законченный вид. Дальше остаётся исправление мелких багов раз в год (если найдёте).

    Насчёт будущего RKN Alert ничего сказать не могу, потому что он завязан на работу внешних сервисов, а также зависит от наличия базы в свободном доступе. Но пока я жив, мониторю ситуацию. Выход, думаю, всегда найдётся.

    Спасибо всем, кто помогает! Всем добра!

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Полезно ли расширение?
    Поделиться публикацией
    Комментарии 43
      0
      Ура! Наконец я смогу различать заблокированные и просто не работающие сайты. Надоело время тратить.
        0
          0
          Спасибо за идею.
          Добавил это «решение», чтобы работало в 1 клик.
          Заголовок спойлера
          Теперь видно, какой сайт доступен из США (не смотря на блокировку):


          А какой не доступен:


          А вот забавный момент: сам себя сервис отказывается проверять.

          Отшучивается: If you can see this page and still think we're down, it's just you.
          Расширение шуток не понимает.
        +2
        Хорошая тема. Понять сайт идет штатным образом, или через черный ход. Хотя практической применимости этих сведений пока не придумал.
          +1
          Я вовсе не устанавливаю VPN/Proxy на основной браузер. Чтобы в один день не оказалось что весь интернет доступен только через него.
          Заметил что помимо сайтов с плашкой РКН или Ростелеком что сайт заблокирован, появились такие: «Не удается получить доступ к сайту Соединение сброшено.» При этом целевая аудитория сайта Россия, через VPN прекрасно работает(но в реестре нет). Не знаю с чем связано, но похоже не на прямую блокировку, а какого то важного сервиса, на который сайт опирается.
          И таких все больше. Опять ковровые бомбардировки задели что то важное для инфраструктуры.
          P.S. Сайт на https. Если последнюю букву удалить, тогда вылезает плашка РКП о блокировке.
            +1
            Все верно. Смысла ставить VPN на браузер нет. (а если 2 браузера… а если мобильные клиенты… нудно) Надо организовывать более правильное решение — на уровне всей подсети. Заодно можно решить проблему DPI и перехвата DNS запросов.
            Всем мира.
              0
              Заметил что помимо сайтов с плашкой РКН или Ростелеком что сайт заблокирован, появились такие: «Не удается получить доступ к сайту Соединение сброшено.»

              Это те, которые попали под раздачу при блокировки подсети. Мой сервер на DO в такой-же ситуации.
                +2
                Всё очень просто. Нельзя отобразить заглушку для https соединения без подмены сертификатов. У провайдеров есть два варианта — оборвать соединение (что вы и видите) или подменить сертификат и показать заглушку (привет красному предупреждению от браузера и пуганию людей).
                  0
                  Вопрос в том, почему сайт уже месяц в блокировке и даже более того убран из выдачи гугла. Имя его при этом ни в каком варианте на сайте РКН не ищется.
                  0
                  Это мелкие провайдеры делают, чтобы их не обвиняли в MITM-атаках с поддельными сертификатами (т.е. не пилили нервы техподдержке из-за предупреждений браузера). «Сайт не работает» — это одно, а «небезопасно» — это намного хуже с точки зрения пользователя.
                    0
                    Вы считаете Ростелеком мелкой компанией?
                      0
                      Это такой бегемот, который съел много мелких компаний и использует бывшее их оборудование. OK, «Это мелкие провайдеры (и не только они) делают, чтобы ...»
                0
                Есть же плагин от Антизапрета, который показывает в блоке сайт или нет, а также позволяет узнать подробности через меню.
                  0

                  Я пользуюсь GoodbyeDPI, работает на Ростелекоме и лучше, чем VPN

                  0
                  Если пров
                  а) перехватывает DNS-запросы к чужим DNS-серверам и перенаправляет на свои;
                  б) резольвит IP заблоченных сайтов на 127.0.0.1,
                  то как будет работать эта система?
                    0
                    Система будет показывать тот ip, который подсовывает dns или файл hosts. Это тот ip, по которому браузер обращается к сайту.

                    Чтобы резолвить каждый сайт, нужно, чтобы кто-то у себя поднял http-dns. Потому что тот сервис, которым пользуется расширение, имеет лимиты (200 запросов в час, потом бан). Поэтому резолвит только если ip заблокирован или если сайт недоступен.

                    В любом случае расширение не меняет ip. И если у вас провайдер шалит с dns, то поможет DNSCrypt. В этом случае, кстати, ip станет правильным, и расширение будет его показывать.
                      +1

                      А гугловый dns использовать не пробовали? Упоминаний каких-либо ограничений не, но и не проверял есть ли они на самом деле: https://developers.google.com/speed/public-dns/docs/dns-over-https

                        0
                        Пробовал, разумеется. Тоже резольвит в 127.0.0.1, будто на Гугле их тоже блочат по DNS :D

                        Я ж говорил — пров перехватывает запросы к чужим DNS. Будь то Гугл или кто еще. Тупо по UDP#53.
                          +1

                          Так это через https, провайдер не может изменить запрос. Вот, например, linkedin.com: https://dns.google.com/resolve?name=linkedin.com

                            0
                            Мы об одном и том же говорим?

                            Я говорю, что провайдер искажает информацию по DNS-протоколу.
                            Для этого он перехватывает весь трафик по UDP#53 к любому серверу и направляет на свои DNS-сервера. А те для заблоченных доменов выдают 127.0.0.1.
                            Весьма просто и эффективно для блокировки сайтов, использующих HTTPS. Конечно, пока что и это обходится, но все равно неприятно.
                              +1

                              Я предложил вместо одного сервиса использовать другой (Google DNS over https):


                              Потому что тот сервис, которым пользуется расширение, имеет лимиты (200 запросов в час, потом бан)
                                0
                                Да, спасибо, добавлю в расширение.
                                Упустил этот сервис из виду.
                                  0
                                    0
                                    Пытался. С гугл всё сразу завелось. А cloudflare выдаёт ошибку 400 (DNS query not specified or too small). Вроде всё по инструкции делаю:
                                    cloudflare-dns.com/dns-query?name=yandex.ru&type=AAAA
                                      +1
                                      Видимо нужен заголовок в запросе: Accept: application/dns-json
                                        +1
                                        Всё получилось.
                                        Немного переоформил статью с учётом изменений.
                                        Теперь больше нечего улучшать.
                                        Расширение можно считать законченным.
                                        Всем спасибо!
                      0
                      Надо добавить заглушки на всех провайдеров и будет счастье.
                      Логика: если адрес сайта поменялся на заглушку (или ip резолвится в заглушку) — значит в бане сайт.

                      А так это не система обхода блокировок. Это информация для тех у кого все хорошо и без нее :)
                        0

                        Давайте начнём с вашей заглушки. Жду URL.
                        Уже добавлены Ростелеком, Beeline и МТС.

                          0
                          Со следующей версии будет возможность указать свою заглушку в настройках.
                        0

                        Для огнелиса будет?

                          +1
                          Конечно. Уже есть.
                            0
                            Этой ссылки много где не хватает, например на github.
                              0
                              Странный глюк попался, возможно виновата сама Лиса, но если открыть два окна в одном оставить для наглядности новую вкладку, а в другом окне открыть любой сайт, то на новой вкладке изменится иконка — это явно некорректное поведение. Кроме того не похоже, что другие расширения страдают от этой проблемы.
                                0
                                Возможно, что из-за глюка выше проявляется ещё один: очень часто пишет неправильный адрес во всплывашке если открыто больше одного окна браузера, например сейчас мне на яндекс музыку написало что это вообще не сайт :)

                                issue 4.
                              0

                              Полезно, но не для моего браузера

                                0
                                Хорошая штука. Спасибо. Можете таки выложить ссылку на репозиторий с кодом? Не проблема, что кривой — вместе допилим.

                                UPD. Код посмотрел, код в целом понятный. Красота, модульность, тесты и прочее — дело наживное. Выкладывайте — буду пулл реки делать.
                                  +2
                                  Разобрался. Оказывается, веб-интерфейс на github совсем не сложный. :)
                                  github.com/MarisKori/rknalert
                                  0
                                  К сожалению, расширение бесполезно.
                                  Я практически ежедневно сталкиваюсь с заблокированными сайтами, а то и по 2-3 раза на день. Но лишь малая часть из них (буквально единицы) дейстивтельно оказываются в реестре. Всем остальным, а это процентов 99 на глаз, просто не повезло отказаться в каком-то «плохом» диапазоне IP-адресов.
                                    0
                                    Значит, у вас очень жёсткий провайдер, сочувствую.
                                    В реестре есть, можно сказать, два типа ip:
                                    1) Отдельные — когда блокировка идёт конкретно по ip или подсети. Расширение помечает такие ip красным цветом.
                                    2) С привязкой к домену. То есть реально блокировка идёт по домену или URL, а ip в базе указывается в качестве дополнительной информации (для провайдеров, которые не умеют блокировать по домену). Расширение помечает такие ip оранжевым.
                                    Расширение не в курсе, какой у вас провайдер, но может пробить ip по базе данных и определить, к какому типу относится этот ip. Полезность чисто информативная.
                                      +1
                                      Уточнение:

                                      IP указывается не для тех, кто не умеет блокировать по URL, а ровно наоборот, для реализации DPI-IP-фильтрации.

                                      Т.е. сначала засекается обращение к подозрительному IP и трафик направляется маршрутизатором через более скрупулезный фильтр, который проверяет используемый протокол, URL (если этот протокол HTTP) и т.д.

                                      Таким образом основной канал разгружается от необходимости проверять весь трафик. А массовая блокировка по IP не будет применяться. Но только если это не HTTPS-протокол, а простой HTTP.

                                      Но это в идеале.
                                      На практике, конечно, и по площадям получается…
                                    0

                                    Сайт операционной системы ReactOS уже давно страдает от блокировки всего диапазона 178.63.0.0/16 (это хостинг Hetzner), но плагин почему-то не смог определить блокировку.


                                    Скриншоты


                                      +1
                                      Эта проблема уже исправлена (версия 0.18). В магазине Chrome, FireFox и на github уже доступно обновление.
                                      Скриншот

                                        +1
                                        Ого, быстрая реакция, спасибо! :)

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое