Комментарии 94
Закреплённые комментарии
Зачем автор все сообщения и описание написал на английском, если утилита сугубо для России...
Чтобы дуболомы из ркн не догадались 😂
ага, только вы тут все такие вумные, стоите в пальто белом xD
Вот и обиделся сотрудник РКН, про белое пальто заговорил))
Профдеформация. Что бы не было такого: ПривеÑ
Да, нынче не каждый вспомнит про "RTFM ВХРЮК?" (:
Ой, ностальгия в глаз попала. CP1251 передает пламенный привет)
А что это, кстати?
Помню нечто подобное на переведённых на русский играх на первой PS.
Вот и выросло поколение, которое не знает о том, что существует несколько кодировок русского языка...
Это не поколение, это просто безграмотность в моём случае.
На китайских телефонах если переносить архивы с компа такое частенько бывает)
Сегодня утилита для РФ, а завтра Иран или Китай подтянут к себе, алгоритмы-то везде похожие)
Потому что во многих других странах есть свой аналог РКН (Китай, Индия, Иран, Туркменистан) и борьба с ними наиболее эффективная всем вместе.
x-ray родом из Китая, документация на английском, hiddify из Ирана, документация на Английском.
Просто чтобы все друг друга понимали
Использование национальных языков для подобных целей - это экзотика. А вот поддержка строк перевода в зависимости от значения глобальных переменных и подгрузка их из внешнего файла - здравая идея. Покажите мне программиста, которому привычнее писать системные сообщения, тексты ошибок и комментарии в коде не на английском. Вы не найдёте такого. И это касается не только России: во всем мире обычно пишут на английском. Те, кто хочет видеть перевод, всегда могут перевести самостоятельно.
В UNIX-like совместимых окружениях для таких целей принято использовать переменную LANG. Выставляете:
export LANG=ru_RU.UTF-8
После запуска программы она будет выводить сообщения на русском языке, если, конечно, автор предусмотрел такую возможность.
PS: Если бы компьютерная отрасль в СНГ не пришла в упадок после распада СССР или если бы страна не развалилась, сейчас бы во всем мире писали комментарии и сообщения программ одновременно и на русском, и на английском. Даже китайские программисты. Но история сложилась иначе, и теперь все используют английский язык.
Кстати, а всякие .mo/.po трансляции сейчас делать через LLMки стало легко и быстро, хоть на португальский.
даже китайские программисты
китайские программисты в своих репах на github как-то не особо озабочены тем что кто-то не сможет прочитать их комментарии на китайском
Вы не найдёте такого.
Так и знал, што я уникальный.
Также есть Network Censorship Checker by Nikola Teslawget -qO- censorcheck.tlab.pw | bash
Checker, для которого делать pipe в bash?
MGIMO Universitet Bezopasnosti finished?
Это обычная практика для запуска скриптов-установщиков из интернета
Обычная практика получить себе троян в систему.
не лучше и не хуже, чем скачать готовый бинарник и запустить
Хуже, потому что готовый бинарник можно изолировать перед запуском и посмотреть, что он делает. А wget something | bash предлагает шагнуть в пропасть неизведанного - и будь что будет. К примеру, может скачаться эксплойт, который затроянит ваш роутер, добавит его в ботнет и будет рассылать спам.
а как вы будете изолировать бинарник, который запускает wget something | bash ?
Это вопрос доверия к софту, которым вы пользуетесь. Если вы ему не доверяете, используйте песочницу. Сегодня хорошей практикой является запуск сервисов в контейнерах. А для пущей изоляции - чтобы процессы в контейнере не могли использовать zero-day эксплойты ядра - можно использовать gVisor.
вот всё ровно то же самое вы УЖЕ и САМИ можете сделать с `wget something | bash` - в контейнере, в gVisor, в любой пробирке и песочнице, которой вы доверяете
Тот факт, что риск можно купировать с помощью песочницы, не делает сам метод доставки кода безопасным по определению.
Главный риск здесь даже не в отсутствии песочницы, а в отсутствии неизменяемого артефакта. При скачивании бинарника у меня есть файл > хеш > возможность аудита. При pipe в bash я исполняю то, что сервер решил прислать мне именно в эту миллисекунду. Даже если я запущу это в контейнере, я все равно исполняю “черный ящик”, который может вести себя по-разному при каждом перезапуске. подробнее уже писал ниже, чтобы я не повторялся, можете прочитать
> При скачивании бинарника у меня есть файл > хеш > возможность аудита. При pipe в bash я исполняю то, что сервер решил прислать мне именно в эту миллисекунду
Вот эта разница в самом деле есть, но она никак не соотносится с вашей первой формулировкой, которая сводилась к тому, что все программы хорошие, а bash плохой.
Но тут вопрос удобства и безопасности. Я подозреваю, что исчезающе малая часть пользователей вообще знает про контрольные суммы и программы для их проверки. И даже из тех кто знает - только исчезающе малая часть будет брать эти подписи не с сайта производителя программы (где их точно так же можно подменить в любую секунду), а с сайтов независимых аудиторов.
Большинство же пользователей предпочтет, чтобы программа обновлялась и исправляла ошибки (и обрастала свистелками-перделками, да)
Я никогда не утверждал, что “все программы хорошие, а bash плохой”. Речь идет не о моральной оценке инструментов, а о векторе атаки. Если разработчик выпустил вредоносный бинарник, он одинаков для всех. Его найдут, зафиксируют хеш, внесут в базы антивирусов, и сообщество поднимет шум. Если же сервер отдает разный код через pipe в зависимости от IP или User-Agent, то атаку подвергается только конкретная жертва. Для всего остального мира софт остается “чистым”. Это идеальный инструмент для скрытого внедрения бэкдоров в системы конкретных компаний или людей.
Я подозреваю, что исчезающе малая часть пользователей вообще знает про контрольные суммы и программы для их проверки.
Безопасность системы не должна базироваться на надежде, что пользователь окажется достаточно бдительным. Она должна быть заложена в архитектуру процесса. Существуют пакетные менеджеры (APT, DNF, pacman, Nix, Homebrew и т.п.), которые объединяют и удобство обновлений, и проверку подписей, и контроль зависимостей. wget | bash - это не “путь к удобству”, это попытка сократить путь в обход всех стандартов безопасности, которые создавались десятилетиями именно для того, чтобы пользователь мог нажать “обновить” и не стать частью ботнета или вымогателя, который зашифрует или удалит все данные с диска.
тем не менее для большинства обычных пользователей которые ставят что-то по мануалам, что выходит за рамки их компетенций, это обычная практика
Это может быть нормальным для Quick Start в тестовой среде, чтобы быстро проверить “взлетит или нет”. Но важно разделять PoC и полноценную установку. Для основной системы или продакшена пайп в bash - это недопустимый риск. Инструмент, который должен работать долго и надежно, ставится через репозиторий или пакеты, а не через слепой запуск скрипта из сети. Если пакетов нет, любую программу можно опакетить самому или контейнеризировать.
Когда-то давно еще до запуска ppa репов в уютненькой `make install` был обычным делом. Много ли пользователей смотрело в инструкции make файла, не говоря о исходниках? Ой что-то я сомневаюсь )) Собирало в пакет еще меньше. Так что эта проблема не нова совершенно, и пайп в баш это просто редукция до однокнопочного решения "скопировать и запустить".
А контейнеризация на юзерской машине это абсолютное зло. Желание мамкиных девопсов обмазать всё контейнерами, это максимально "стильно модно молодежно" и для обычного юзера оверкилл. Пользователю нужен пакет, желательно тот который не тащит за собой кучу экзотических зависимостей.
Проблема “pipe в bash” не в том, что это “сложнее”, а в том, что это исключает возможность аудита кода перед запуском. Это, фактически, передача управления удаленному серверу в реальном времени. Сервер может отдать разный код в зависимости от вашего IP, User-Agent или времени суток. Это “черный ящик”, где между скачиванием и исполнением нет ни одной точки контроля.
С make install всё иначе: код локален. Можно проверить хеши скачанных файлов, открыть Makefile в текстовом редакторе перед запуском.
Что касается контейнеров, это не про “моду”, а про изоляцию. Чтобы какая-нибудь зависимость из сомнительного скрипта не затерла системные конфиги или не притащила в систему мусор, который потом придется вычищать вручную. Это вопрос гигиены системы, а не “девопсовства”.
.. всё иначе .. можно проверить
Вы не уловили суть того что я написал. Я прекрасно понимаю опасность pipe в bash. Но никакого "всё иначе" с make install нет. В обоих случаях подавляющая масса пользователей абсолютно доверяет источнику данных. Без проверок, без сомнений.. даже если их компетенций хватает не только на то чтобы нажимать да да да да, это все равно происходит. Вы думаете категориями "можно открыть", а этого почти никто не делает.
Во вторых, аргумент о "можно проверить" не состоятелен еще и по тому, что формально-то, делая какой-нибудь wget github/wireguard-installer.sh | bash пользователь имеет все возможности для того чтобы зайти и посмотреть на содержимое репы, но делает ли он это? Вопрос лежит исключительно в плоскости доверия, отсутствия компетенций и цифровой гигиены. С этой точки зрения, запуск какого-нибудь make никак не отличается от пайпа.
Вы смешиваете психологию пользователя и техническую безопасность метода. По логике “всё равно никто не проверяет”, можно вообще перестать подписывать пакеты цифровой подписью или перестать использовать HTTPS, ведь обычный пользователь не проверяет цепочки сертификатов в браузере.
При make install или запуске локального файла пользователь запускает статичный объект. Если завтра этот софт признают вредоносным, у пользователя остался артефакт (файл), который можно отправить в вирусный анализ или сравнить с версией из репозитория.
pipe в bash - это запуск динамического потока. Сервер может отдавать разный код в зависимости от вашего IP, User-Agent или времени суток. Это позволяет реализовать таргетную атаку: 99% пользователей получат чистый установщик, а один конкретный администратор с определенным IP - бэкдор. В этом случае никакой “цифровой гигиены” не поможет, потому что код, который был исполнен, никогда не существовал в публичном репозитории и не сохранился на диске.
Аргумент “пользователи всё равно не проверяют” в безопасности не работает. Это как сказать, что подушки безопасности в авто бесполезны, потому что большинство водителей не читают инструкцию к ним. Инструмент должен быть безопасен по определению, а не полагаться на внезапную бдительность юзера.
Что касается контейнеризации - это не “мода”, а банальный принцип изоляции. Если однокнопочный скрипт окажется вредоносным и попытается снести систему через rm -rf / или переписать /etc/shadow, контейнер ограничит его влияние только своей средой, а запуск напрямую в ОС - нет. Удобство установки не должно идти в ущерб базовой безопасности системы.
Это практика камикадзе - героических людей, которые летят в один конец и надеются на успех без гарантий этого успеха.
А как запустить скрипт-деустановщик, если приложение не понравилось или больше не нужно?
Оно отличает геоблок от ркнблока ?
Годный тул. Когда все отваливается быстрее прогнать один скрипт чем руками дергать курлом и ковырять дампы трафика
Автор тулзы тут. Спасибо denis-19 за внимание к проекту, готов отвечать на вопросы по коду/архитектуре
Вот бы в приложение apk это запихнуть на мобилку. Допустим есть у меня семейный vpn. И не всегда родители могут объяснить где что у них не работает и точно ли из-за блокировок. А этот чекер давал бы более простой способ это выяснить в наше непростое время. Если я, конечно, всё правильно понял...
За проект спасибо!
а под винду будет версия?
На то это и Open-Source - здесь бы уже посыпались комментарии о нежелательном поведении. К товарищу майору и так достаточно улетает через РУ приложения, если кто-то посещает их напрямую через VPN.
но ожидал увидеть в readmi пункт о том что никакие логи проверяемых серверов не улетают куда то к товарищу майору или РКН в очередь на блокировку.
Если вы готовы верить на слово человеку, которого видите впервые в жизни (автору утилиты), то вряд ли вы всерьёз переживаете о какой-то приватности или безопасности.
Ну, т.е. в ридми можно написать абсолютно, что угодно.
ozon ✓ OK
DNS mismatch: sys=185.73.193.68 vs doh=185.73.194.82 (may indicate transparent DNS rewriting)
В данном случае это не вмешательство в dns. Просто ozon.ru резолвится в кучу адресов. Хорошо бы такие случаи отличать от реального DNS rewriting.
100% достоверно отличать не выйдет, DNS может отдавать только часть из кучи адресов и разные части в зависимости от фазы луны (загруженности серверов, геолокации запрашивающего, etc). И способа гарантированно узнать весь список не существует.
А он только фиксированный набор ресурсов проверяет? Можно свой домен/ip указать? Не увидел ни в доке, ни в примерах
Скрытый текст
======================================================================
RKN Block Checker
======================================================================
IP: *
ISP: AS44068 Arbital ISP
Location: Saint Petersburg, St.-Petersburg, RU
----------------------------------------------------------------------
Whitelist (should always work)
name verdict TCP TLS PLT status
--------------------------------------------------------------------
gosuslugi ? TLS DPI? 6ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
sberbank ? TLS DPI? 6ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
kinopoisk ? TLS DPI? 6ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
yandex ? TLS DPI? 5ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
yandex-maps ? TLS DPI? 8ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
nalog ? TLS DPI? 11ms - - -
└ DNS mismatch: sys=46.235.184.211 vs doh=46.235.188.74 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
mos.ru ? TLS DPI? 9ms - - -
└ DNS mismatch: sys=94.79.51.170 vs doh=94.79.51.169 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
rkn ? TLS DPI? 8ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
vtb ? TLS DPI? 94ms - - -
└ DNS mismatch: sys=195.242.82.13 vs doh=195.242.83.13 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
ok ? TLS DPI? 6ms - - -
└ DNS mismatch: sys=95.163.61.73 vs doh=95.163.61.74 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
vk ? TLS DPI? 7ms - - -
└ DNS mismatch: sys=87.240.137.164 vs doh=93.186.225.194 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
wildberries ? TLS DPI? 11ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
alfabank ? TLS DPI? 9ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
rbc ? TLS DPI? 4ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
lenta ? TLS DPI? 5ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
avito ? TLS DPI? 7ms - - -
└ DNS mismatch: sys=176.114.120.24 vs doh=176.114.122.24 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
ozon ? TLS DPI? 6ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
tass ? TLS DPI? 5ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
rutube ? TLS DPI? 14ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
dzen ? TLS DPI? 22ms - - -
└ DNS mismatch: sys=185.180.200.2 vs doh=5.61.23.39 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
gov.ru ~ LIKELY TLS DPI 5ms - - -
└ TLS handshake silently dropped — consistent with DPI filtering by ClientHello, but could be a flaky path
Blacklist (RKN-restricted)
name verdict TCP TLS PLT status
--------------------------------------------------------------------
soap2day ? TLS DPI? 13ms - - -
└ DNS mismatch: sys=104.26.5.122 vs doh=172.67.74.223 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
patreon ? TLS DPI? 22ms - - -
└ DNS mismatch: sys=104.16.25.14 vs doh=104.16.24.14 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
tor-project ? TLS DPI? 6ms - - -
└ DNS mismatch: sys=116.202.120.166 vs doh=95.216.163.36 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
linkedin ? TLS DPI? 97ms - - -
└ DNS mismatch: sys=10.16.1.152 vs doh=104.18.41.41 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
dw-russian ? TLS DPI? 7ms - - -
└ DNS mismatch: sys=184.29.233.152 vs doh=23.222.47.224 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
meduza ? TLS DPI? 14ms - - -
└ DNS mismatch: sys=8.6.112.0 vs doh=104.18.0.79 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
dailymotion ? TLS DPI? 8ms - - -
└ DNS mismatch: sys=188.65.124.90 vs doh=188.65.124.92 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
deepl ? TLS DPI? 48ms - - -
└ DNS mismatch: sys=10.16.1.152 vs doh=172.64.148.47 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
rutracker ? TLS DPI? 5ms - - -
└ DNS mismatch: sys=104.21.32.39 vs doh=172.67.182.196 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
twitter/x ? TLS DPI? 35ms - - -
└ DNS mismatch: sys=10.16.1.152 vs doh=172.66.0.227 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
discord ? TLS DPI? 7ms - - -
└ DNS mismatch: sys=162.159.128.233 vs doh=162.159.138.232 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
bbc-russian ? TLS DPI? 9ms - - -
└ DNS mismatch: sys=151.101.192.81 vs doh=151.101.0.81 (may indicate transparent DNS rewriting)
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
protonvpn ? TLS DPI? 10ms - - -
└ TLS error: SSLError: CERTIFICATE_VERIFY_FAILED
facebook ~ LIKELY TLS DPI 9ms - - -
└ DNS mismatch: sys=57.144.248.1 vs doh=57.144.222.1 (may indicate transparent DNS rewriting)
└ TLS handshake silently dropped — consistent with DPI filtering by ClientHello, but could be a flaky path
instagram ~ LIKELY TLS DPI 22ms - - -
└ DNS mismatch: sys=57.144.248.34 vs doh=57.144.222.34 (may indicate transparent DNS rewriting)
└ TLS handshake silently dropped — consistent with DPI filtering by ClientHello, but could be a flaky path
======================================================================
Summary
----------------------------------------------------------------------
Whitelist: 0/21 working
Blacklist: 0/15 open, 15/15 blocked
→ Inconclusive - control whitelist is also failing.
Can't separate censorship from a broken uplink without a working baseline. Try a different network, or check the local connection.
Block types in the blacklist:
✗ TLS DPI: 15
======================================================================попробовал на двух разных провайдерах/роутерах в двух разных домах - результат один и тот же, всё валится с CERTIFICATE_VERIFY_FAILED, что делаю не так ?
А сами эти сайты (ГУ, Яндекс, кинопоиск, сбербанк) у вас открываются? У них нормальные сертификаты?
Попробуйте поставить showcert (pipx install showcert) и посмотреть, что он выдаст на них. Если ругается, то добавить `-i`. Есть подозрение, что не хватает какого-то питоновского пакета с сертификатами, showcert тоже средствами python проверяет и интересно сравнить.
showcert yandex.ru например и так далее (может быть с -i)
Поддержу вопрос про виндовую версию
https://habr.com/ru/news/1031950/#comment_29935890
|А в чем преимущества\отличия от например
Видимо пора и мне на хабр написать про dpi-detector :)
Не, не надо: https://habr.com/ru/news/1032344/
Я понял так, что это утилита для проверки моего интернета.
У меня есть другая потребность: когда какой-то сайт не открывается, узнать, с этой или с той стороны он заблокирован. Возможно ли это вообще?
Установил на PowerShell =) Надеялся вообще из-под MobaXterm для подсветки синтаксиса поставить, но чёт она не захотела шевелиться.
Жаль, что тулза показывает только меня, потому как хотелось и интереснее было бы проверять кого-то, к кому не можешь достучаться. Потому что я, ну что я... сижу себе с работы, на белом корпоративном IPшнике и что мне енто даёт, не буду же я в контору другого провайдера заводить, хотя итак 2 заходят. Ну понятно, что провайдер по указанию РКН режет нам трафик.
А вот кого-то снаружи чекнуть... было бы очень любопытно. Или знать, на каком хостинге можно веб-сервак развернуть
У меня вообще:
Whitelist: 5/21 working
Blacklist: 0/15 open, 11/15 blocked, 1 timed out
Хотя тут, я так подозреваю, ещё мой NGFW корпоративный влияет и проверка неточная
проверять кого-то, к кому не можешь достучаться
А это совсем иное направление трафика и картина по входящему трафику может абсолютно не совпадать с исходящим.
Например, там, где исходящий WG блокируется, входящий может вполне нормально пропускаться. А до домашних абонентов за операторским NAT-ом вы вообще не доберётесь снаружи.
Не особо понял, про что вы. Не знаю, может не выспался =)
Обычно же как раз мы (клиент) устанавливаем TCP соединение с сайтом/сервером. Исходящий-то пакет, который сессию устанавливает - от нас летит на какой-нибудь веб-сервер. Вот и интересно проверить - а что с ним по пути происходит? На каком уровне сети он блокируется, анализируется ли DPIем и так далее. И было бы более менее понятно, например, почему у меня не открывается сайт, который хостится в какой-нибудь Германии на сетях Hetzner и тому подобное...
Сделайте кто-нибудь пожалуйста порт на Android ☺️
При первом прочтении заголовка показалось что РКН выпустил опен соурс утилиту :-)
Давно жду похожую утилиту для проверки wireguard, а то порой непонятно, почему не работает: то ли РКН - ..... , то ли сам дурак и что-то напортачил.
Чтобы запустил на двух сторонах, не заморачиваясь с ключами (либо hardcoded ключи, либо сгенерить их по какой-то фразе типа "1234", криптостойкость не важна ведь), указал адрес сервера, и клиент с сервером состыковался, какой-нибудь мегабайт трафика отправил (скажем, файл с диска или просто 10 мегабайт нулей), и с той стороны принялось. В общем, чтобы полностью fool-proof, чтоб сложно было ошибиться, и любая неудача показывала бы, что wireguard заблочен.
Она ведь может быть userspace и даже non-root.
А еще, по хорошему, можно добавить к ней простые способы обхода, чтобы их тоже тестировала. (например N байт мусора перед коннектом, симметричное шифрование с двух сторон, AWG разных версий)
Разраб ты красава, держи обертку, позже вэб версию, возможно сделаем.
#!/usr/bin/env python3
-- coding: utf-8 --
“”" RKN Block Checker PRO — Unified IPv4-only checker with interactive UI & smart analysis. Drop-in replacement for original rkn-check. “”" import re import sys import socket import io
==========================================================
1. ПАТЧ: Принудительный IPv4 (до импорта библиотеки)
==========================================================
oldgetaddrinfo = socket.getaddrinfo def ipv4only_getaddrinfo(*args, **kwargs): res = oldgetaddrinfo(*args, **kwargs) v4 = [r for r in res if r[0] == socket.AF_INET] return v4 if v4 else res socket.getaddrinfo = ipv4only_getaddrinfo
==========================================================
2. ИМПОРТ ОРИГИНАЛЬНОГО CLI
==========================================================
from rkn_checker.cli import main as origmain
==========================================================
3. УТИЛИТЫ: Цвета и Форматирование
==========================================================
class C: G = ‘\033[92m’; Y = ‘\033[93m’; R = ‘\033[91m’ B = ‘\033[94m’; GR = ‘\033[90m’; BOLD = ‘\033[1m’; RES = ‘\033[0m’
def print_box(title, lines): w = 70 print(f"{C.BOLD}{C.B}{‘═’*w}{C.RES}“) print(f”{C.BOLD} {title}{C.RES}“) print(f”{C.BOLD}{C.B}{‘═’*w}{C.RES}“) for l in lines: print(f” {l}“) print(f”{C.B}{‘═’*w}{C.RES}\n")
==========================================================
4. АНАЛИЗАТОР ВЫВОДА
==========================================================
def analyze(raw_output, target): status_line = “” status_color = C.GR raw_lower = raw_output.lower()
# === БЛОКИРОВКИ РН ===
if 'TCP_RESET' in raw_output or 'Connection reset' in raw_output:
status_line = "🔴 Заблокировано РН: сброс соединения (RST)"
status_color = C.R
elif 'TLS_BLOCK' in raw_output or 'handshake failed' in raw_output or 'SNI filtered' in raw_lower:
status_line = "🟡 Заблокировано РН: фильтрация по SNI (TLS)"
status_color = C.Y
elif 'DNS poisoning' in raw_output or 'DNS_BLOCK' in raw_output:
status_line = "🔴 Заблокировано РН: отравление DNS"
status_color = C.R
elif 'TIMEOUT' in raw_output and any(x in raw_lower for x in ['telegram','discord','twitter','youtube','instagram','whatsapp']):
status_line = "🔴 Заблокировано РН: пакеты отбрасываются (DROP)"
status_color = C.R
# === САЙТ НЕ РАБОТАЕТ / ТЕХНИЧЕСКИЕ ОШИБКИ ===
elif 'NXDOMAIN' in raw_output or 'non-existent domain' in raw_lower:
status_line = "⚫ Домен не существует"
status_color = C.GR
elif 'Connection refused' in raw_output:
status_line = "⚫ Сайт не отвечает на порту 443"
status_color = C.GR
elif 'No route to host' in raw_output or 'Network unreachable' in raw_lower:
status_line = " Нет маршрута до хоста (проблема сети)"
status_color = C.GR
elif 'HTTP 5' in raw_output or '502' in raw_output or '503' in raw_output:
status_line = "⚫ Ошибка на стороне сервера (5xx)"
status_color = C.GR
elif 'DOWN' in raw_output and 'TCP failed' in raw_output:
status_line = "⚫ Сайт недоступен"
status_color = C.GR
# === ДОСТУПЕН ===
elif '[✓]' in raw_output or 'HTTP: 200' in raw_output or 'HTTP: 301' in raw_output:
status_line = "🟢 Сайт доступен"
status_color = C.G
# === НЕ ОПРЕДЕЛЕНО ===
else:
status_line = "⚪ Статус не определён"
status_color = C.GR
# === Сбор технических деталей ===
details = []
ip_match = re.search(r'IP:\s*([\d\.]+)', raw_output)
if ip_match: details.append(f"Ваш IP: {ip_match.group(1)}")
isp_match = re.search(r'ISP:\s*(.+?)(?=\n)', raw_output)
if isp_match: details.append(f"Провайдер: {isp_match.group(1).strip()}")
dns_match = re.search(r'DNS:\s*(.+?)(?:\n|$)', raw_output)
if dns_match: details.append(f"DNS: {dns_match.group(1).strip()}")
tcp_match = re.search(r'TCP:\s*(.+?)(?:\n|$)', raw_output)
if tcp_match: details.append(f"TCP: {tcp_match.group(1).strip()}")
http_match = re.search(r'HTTP:\s*(.+?)(?:\n|$)', raw_output)
if http_match: details.append(f"HTTP: {http_match.group(1).strip()}")
# === Формируем вывод ===
lines = [f"{status_color}{status_line}{C.RES}", ""]
if details:
lines.append(f"{C.GR}Детали:{C.RES}")
for d in details:
lines.append(f" • {d}")
lines.append("")
if '🔴' in status_line or '🟡' in status_line:
lines.append(f"{C.GR}Ресурс:{C.RES} {target}")
print_box(f"RKN Block Checker — {target}", lines)
return 0 if '🟢' in status_line else 1
==========================================================
5. MAIN: Логика запуска
==========================================================
def main(): args = sys.argv[1:]
# Пропускаем перехват, если запрошен JSON, help или version
if any(x in args for x in ['--json', '-h', '--help', '--version', '-V']):
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(_orig_main())
# === Логика обработки аргументов ===
if not args:
# Интерактивный режим
print(f"\n{C.BOLD}🔍 RKN Block Checker PRO (IPv4-only){C.RES}")
print(f"{C.GR} Введите домен или IP (Ctrl+C для выхода){C.RES}\n")
try:
target = input(f"{C.B}→{C.RES} Цель: ").strip()
if not target: sys.exit(0)
target = re.sub(r'^https?://', '', target).rstrip('/')
args = ['--url', target, '-v', '--timeout', '12', '--no-self-info']
except (KeyboardInterrupt, EOFError):
print("\nВыход.")
sys.exit(0)
elif args[0] and not args[0].startswith('-'):
# Прямой ввод домена
target = args[0]
target = re.sub(r'^https?://', '', target).rstrip('/')
args = ['--url', target, '-v', '--timeout', '12', '--no-self-info']
# Если есть флаги, оставляем args как есть
# Извлекаем целевой домен для отчёта
if '--url' in args:
target = args[args.index('--url') + 1]
else:
target = "unknown"
sys.argv = ['rkn-check'] + args
# Перехватываем вывод
buf = io.StringIO()
real_out = sys.stdout
sys.stdout = buf
try:
_orig_main()
except SystemExit:
pass
except Exception as e:
buf.write(f"CRITICAL: {e}\n")
finally:
sys.stdout = real_out
raw = buf.getvalue()
exit_code = analyze(raw, target)
sys.exit(exit_code)
if name == ‘main’: main()
Первая команда проходит нормально, все устанавливается. Вторая - rkn-check, что в CMD, Power shell выдает ошибку что не является приложением и не запускается....
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Представлен открытый проект RKN Block Checker