
Салют, Хабр! Я думаю, каждый из вас знаком или, по крайней мере, слышал о такой прекрасной утилите как GoodbyeDPI (большое спасибо @ValdikSS!). Сегодня я хочу представить вам (почти) свою разработку - аналог GoodbyeDPI.
Около полугода назад в своей статье Обвиваем YouTube змеем, или как смотреть и скачивать видео с YouTube без VPN на чистом Python-е. Часть 1 (заблокирована по требованию РКН) я рассказывал о том, как скачивать видео с YouTube на Python, а так как YouTube у нас "деградировал", я поделился инструментом, с помощью которого можно исправить этот вопиющий недостаток. Инструмент тогда выглядел достаточно сыро, и несмотря на то, что он выполнял свою задачу, требовал серьезных улучшений. Увидев интерес общественности, я решил допилить его, и вот, спустя полгода, после немалой работы, я рад представить вам NoDPI - проект, который явно не понравится РКН (и он опять меня заблокирует).
В этой статье я хочу рассказать о его возможностях, внутреннем устройстве, отличии от аналогов. Надеюсь, статья будет вам полезна и интересна. Поехали!

Вкратце о NoDPI
Существует множество проектов, которые позволяют бороться с DPI и обходить блокировки.
NoDPI - это программа, которая играет роль локального прокси-сервера. Она обрабатывает проходящий через нее трафик таким образом (каким - чуть ниже), что это позволяет сбивать с толку системы DPI, установленные у провайдера. Она отлично справляется с "разблокировкой" всех сайтов, к которым ограничен доступ с помощью DPI. Исключение составляют сайты на HTTP (незащищенном протоколе) и сайты, которые не поддерживают TLS v1.3.
С чего все началось
Около года назад я искал (без особой надежды) какой-нибудь простенький инструмент, альтернативу GoodbyeDPI и ему подобных, для встраивания в свой пет-проект. К удивлению, такой инструмент нашелся - https://github.com/theo0x0/nodpi. Это было как раз то, что мне нужно - небольшой скриптик на python. Правда работал он не очень стабильно, в коде был полный бардак, и все это требовало доработки. После тестирования в проекте он мне понравился и я стал использовать его в повседневной жизни для просмотра YouTube и иже с ним. К удивлению, на моем провайдере он оказался лучше, чем GoodbyeDPI. Потом я рассказал о нем в статье и, увидев интерес, стал развивать его - улучшил алгоритм обхода DPI, разобрался с ошибками, прикрутил красивый TUI и кучу мелких фишек. Вобщем, превратил его в более-менее нормальную консольную утилиту с приятным интерфейсом.
Как это работает
Принцип работы довольно простой и понятный, а минимальная работающая реализация занимает всего 110 строк кода (сейчас, со всеми улучшениями, она разрослась до 480). Весь проект полностью написан на Python без использования сторонних библиотек.
Итак, NoDPI представляет собой асинхронный прокси-сервер, реализованный на базе библиотеки asyncio
. Мы создаем сервер с помощью asyncio.start_server()
и направляем через него HTTPS-трафик (HTTP обрабатываться не будет и просто пропускается дальше) и программа действует по следующему алгоритму:
Извлекает из заголовка запроса целевой хост и порт, а затем открывает соединение и отправляет клиенту статус "OK".
client_ip, client_port = writer.get_extra_info("peername")
http_data = await reader.read(1500)
if not http_data:
writer.close()
return
headers = http_data.split(b"\r\n")
first_line = headers[0].split(b" ")
method = first_line[0]
url = first_line[1]
if method == b"CONNECT":
host_port = url.split(b":")
host = host_port[0]
port = int(host_port[1]) if len(host_port) > 1 else 443
else: # Для HTTP
host_header = next(
(h for h in headers if h.startswith(b"Host: ")), None
)
if not host_header:
raise ValueError("Missing Host header")
host_port = host_header[6:].split(b":")
host = host_port[0]
port = int(host_port[1]) if len(host_port) > 1 else 80
if method == b"CONNECT":
writer.write(b"HTTP/1.1 200 OK\r\n\r\n")
await writer.drain()
remote_reader, remote_writer = await asyncio.open_connection(
host.decode(), port
)
-
Если тип соединения "CONNECT" (т. е. это HTTPS) мы перехватываем tls-рукопожатие (handshake) и отправляем его на фрагментацию.
Напомню, как выглядит tls запись для протокола handshake:
Здесь первый (нулевой) байт несет информацию о типе содержимого (для handshake это 22 в dec или 0x16 в hex). Затем идет байт для major version (всегда 0x03) и minor version, которая обозначает конкретную версию и может варьироваться от 0 до 4:
После этого идет вся полезная нагрузка - в данном случае нас она не интересует.
Что делает программа? Она тупо разбивает пэйлоад на несколько кусков случайного количества и случайной длины, и склеивает с байтовой последовательностью
\x16\x03\x04
(+ data). Т. е. одна tls запись превращается в несколько записей разной длины. После этого они объединяются и отправляются как один пакет:
try:
head = await reader.read(5)
data = await reader.read(2048)
except Exception as e:
...
if all(site not in data for site in self.blocked):
writer.write(head + data)
await writer.drain()
return
parts = []
host_end = data.find(b"\x00")
if host_end != -1:
parts.append(
bytes.fromhex("160304")
+ (host_end + 1).to_bytes(2, "big")
+ data[: host_end + 1]
)
data = data[host_end + 1:]
while data:
chunk_len = random.randint(1, len(data))
parts.append(
bytes.fromhex("160304")
+ chunk_len.to_bytes(2, "big")
+ data[:chunk_len]
)
data = data[chunk_len:]
writer.write(b"".join(parts))
await writer.drain()
Замечу, что эта фрагментация применима только к https-трафику, так как в http, понятное дело, tls-а нет.
И все! Все остальные данные отправляются "как есть", без какой-либо обработки:
while not reader.at_eof() and not writer.is_closing():
data = await reader.read(1500)
writer.write(data)
await writer.drain()
Честно говоря, я до сих пор не очень понял, почему сайтам пофиг на такой формат, но это работает! И оно работает даже если в поле minor version вставлять абсолютно случайный байт.
Что еще интересного
Из основных фич утилиты я бы выделил следующие пункты:
-
Приятный и понятный консольный интерфейс с подсчетом трафика и скорости:
Полное логирование ошибок и доступа (какой ip куда обращался)
Программа не требует админских прав (как GoodbyeDPI).
Программа не требует настройки. Все, что нужно - указать список доменов и включить прокси в браузере или системе.
Так как это прокси, то не нужно пускать через него весь трафик, достаточно указать выбранные домены, если вам это нужно.
Инструмент не лезет в потроха системы, не устанавливает хуков, не требует драйверов и пр.
Кроссплатформенность. Гарантированно работает на Windows и Linux (Android пока не тестировался).
Тестирование
Инструмент тестировался на провайдерах МТС и ТТК на компьютерах с ОС Windows и Linux. В 98% случаях никаких проблем не возникает. Иногда, при резких перепадах скорости в сети, наблюдается зависание видео; проблема решается перезагрузкой страницы. Также, есть проблемы с работой HTTP-сайтов в Firefox - в некоторых случаях отображается предыдущая страница, а не запрашиваемая в данный момент. Исследование проблемы находится в процессе.
Заключение
Весь исходный код и бинарники вы можете найти на моем GitHub-е: https://github.com/GVCoder09/nodpi/ Там же находится подробная инструкция по запуску. Я искренне надеюсь, что эта программа принесет вам пользу, или, по крайней мере, заинтересует ее идея. Если вы хотите поддержать меня, то это можно сделать единственным способом - поставить плюсик статье :-)
Ну и конечно, я буду рад, если кто-то присоединится к разработке - issues и пул реквесты приветствуются)
Примечание
С разрешения модераторов статья публикуется в профильных хабах, без хаба "Я пиарюсь"
Комментарии (113)
alex1iam
30.05.2025 15:17C:\Windows\System32>python C:\Users\Специалист\Downloads\NoDPI-main\src\main.py --blacklist ./blacklist.txt
[Error]: File blacklist.txt not foundчто я делаю не так
Lord_of_Rings Автор
30.05.2025 15:17Или путь полный укажите, или запускайте там же, где лежит файл blacklist
Serfer999
30.05.2025 15:17Москва Бляйн на macos High Sierra
- обновил python
- файл blacklist перекинул в src - иначе не видел
- запустил в терминале
- в браузере прокси в настройках сети прописал на HTTPS
Недостатки, возможно только у меня:
- терминал логгирует всю стату, отчего у меня проц греется
- ютуб работает, но чуть с тормозами
- отрубаешь терминал, в брузере прокси тоже надо тушить, а в Файрфоксе это неудобно.
- прописал в blacklist другие сайты - торренты всякие - на них не работает
а в целом спасибо!Lord_of_Rings Автор
30.05.2025 15:17терминал логгирует всю стату, отчего у меня проц греется
Учет статистики не может так сильно влиять на проц, сам сервер больше потребляет
прописал в blacklist другие сайты - торренты всякие - на них не работает
Прогу перезапускали после того, как отредактировали файл? Можете в ЛС написать, поразбираюсь
Serfer999
30.05.2025 15:17Проц греется на уровне 45-48% - возможно это у меня так.
blacklist - да не перезагрузил. Торренты, ПиратбЭй, THREADS, facebook залетают с 2-х ног. А Например Xcom, GrokCom, Notion, Инсту, Linkedn, chatgpt не берет. Tiktok еле-еле. Хотя думаю эти сайты со своей стороны палки в колеса суют. Gemini, notebookLM - только через ВПН как обычно.
учитываю самые распространенные сайты, ну как-то так.
tage_whanuvur
30.05.2025 15:17попробуй добавить днс от comss (от него и авасты всякие начинают работать да тп)
Novenkij
30.05.2025 15:17chatgpt блокируется по признаку страны же
stgmakarov
30.05.2025 15:17Вероятно, но с dns от comss и chatgpt открывается с российским ip без vpn.
NecroSpider
30.05.2025 15:17Дак днс от comss это тоже своего рода впн.Потому что по сути это прокси. Он работает на уровне dns запросов и отправляет твой запрос через сервер в другой стране. Из плюсов, Легковесный. Из минусов трафик дополнительно не шифруется и утечка местоположения происходит через более продвинутые способы детекта местоположения. Из прямых аналогов это платный ControlD, чем раньше пользовались comss, но впоследствии из-за некоторых причин отказались.
Zrgk
30.05.2025 15:17Как минимум большая часть серверов X заблокирована по IP, особенно cdn. Против такого не поможет фрагментация
ligor
30.05.2025 15:17В статье есть упоминание что работает для сайтов с Tls1.3, может Ваш случай и те торренты его не поддерживают. Проверил на одном заблокированном - точно, на cloudflare включаешь 1.3 и все работает.
kambala
30.05.2025 15:17у меня на Макос Сонома тоже отлично работает. Но проблем с загрузкой проца не наблюдаю.
вывод статистики там можно отключить через параметр
-q
Ded_Keygen
30.05.2025 15:17Супер, очень хотел версию в виде exe и http proxy. Единственное можете добавить параметр чтобы программа не искала blacklist.txt, а проксировала все запросы?
nulovkin
30.05.2025 15:17По названию я почти подумал, что кто-то удалил весь нейроконтент в шортсах. Было бы круто
0x22
30.05.2025 15:17100 плюсов вам в карму :)
Спасибо! Изучаю Python, как раз интересно посмотреть код. На Linux всё работает отлично.
SoulRiets
30.05.2025 15:17У меня на МГТС в москве работает плохо. в популярной версии zapret'а для МГТСа отдельный пресет специально написали умельцы, видимо у МГТСа какие-то особенные ТСПУ стоят.
Tangent
30.05.2025 15:17А можно прикрутить, чтобы Discord тоже заработал?
SoulRiets
30.05.2025 15:17там достаточно дискордовские домены вписать в blacklist.txt
martofski
30.05.2025 15:17Не подскажете список нужных доменов? У меня вот эти добавлены, как будто всё работает, но картинки не грузятся.
SoulRiets
30.05.2025 15:17Скрытый текст
domain:discord-attachments-uploads-prd.storage.googleapis.com
domain:dis.gd
domain:i.dis.gd
domain:discord.co
domain:discord.com
domain:discord.design
domain:discord.dev
domain:discord.gg
domain:discord.gift
domain:discord.gifts
domain:discord.media
domain:discord.new
domain:discord.store
domain:discord.tools
domain:discordapp.com
domain:discordapp.net
domain:discordmerch.com
domain:discordpartygames.com
domain:discord-activities.com
domain:discordactivities.com
domain:discordsays.com
domain:discordsez.com
domain:discordstatus.com
у меня стоят эти, с впном работаёт всё.
Alexey_Volchanskiy
30.05.2025 15:17Win 10, запускаю в распакованном архиве, как E:\nodpi_v1_7_win64\nodpi_v1.7.exe. Ошибок не пишет, ютуб не пашет. Провайдер дом.ру
Lord_of_Rings Автор
30.05.2025 15:17Прокси настроен? Статистика nodpi что пишет о количестве соединений?
LF69ssop
30.05.2025 15:17Продолжаете гадить окружающим?
Я уже не раз писал что действия таких как вы (реклама способов обхода, и предоставление готового инструмента) только привлекают внимание, и блочить начинают все основательнее. Работа с иностранными хостерами типа Хетцнер уже начинает вызывать проблемы.
А закончится все очередными дурными поправками в закон предусматривающими уголовку. Пример с дискредитацией армии и сво вас ничему не учит?
diakin
Работает только на Win10?
Lord_of_Rings Автор
Win 8+, Linux. На семерке не пробовал, но тоже должно работать
diakin
Lord_of_Rings Автор
Какая ОС (в смысле версия)?
diakin
Win7, но у меня нет питона )
Lord_of_Rings Автор
У меня, к сожалению, нет семерки, поэтому в ближайшее время пересобрать exe не смогу (надо именно на ней это делать).
AntonyKozm
Советую всё-таки изучить создание dockerfile и docker-compose. Если есть вариант запихнуть это в контейнер, то можно спокойно это делать. Так же добавить инструкцию для виртуализации допустим с помощью VirtualBox. Так можно избавиться от вопросов "почему на Win7/XP/98 не работает". Проблема появилась при использовании актуального ПО, а не устаревшего. Есть проблемы? Виртуализируйте актуальную версию linux и в большинстве случаев все заработает
aldekotan
А что нужно для пересборки? Может, смогу оказать помощь?
Lord_of_Rings Автор
Python 3.8+, библиотека pyinstaller
VADemon
Там последний Python 3.9/3.10. Более новый решили запитать от нового SDK, который потянул за собой все остальное новое.
Lord_of_Rings Автор
Да, я в курсе. Но все равно, если собирать из win10 под win7 даже со старой версией, могут возникнуть проблемы
remzalp
если погуглить, то в интернете есть недостающие виндовые библиотеки для питона, пропатченные с поддержкой WIN7
Например пропатченные инсталляторы (не является рекомендацией)
https://github.com/adang1345/PythonWin7
supinepandora43
У меня тоже раньше была семёрка - перешёл на линукс
Borelli
Из setup.exe - не работает, пишет
nodpi.exe - Системная ошибка
Запуск программы невозможен, так как на компьютере отсутствует api-ms-win-core-path-l1-1-0.dll. Попробуйте переустановить программу.
ОК
В интернетах пишут, что это из-за "попытки запустить Python 3.9 в Windows 7 или 8". Решения - ставить "Update for Universal C Runtime in Windows" (KB2999226). Но оно не помогло. Или ставить альтернативную версию с github. Но она на virustotal набирает 2 обнаружения и, в том числе, не работает.
zurabob
На вин7 и питоне 3.8.10 скрипт работает, запускаю
main.py --blacklist ../blacklist.txt
Barma2012
На семерке не работает.
[img]https://i.ibb.co/GNRf7Jk/image.jpg[/img]
(не могу вставить картинку, местный маркдаун глючит безбожно, отключил его)
Lord_of_Rings Автор
@diakin, @Borelli, @Barma2012 у меня, к сожалению, нет семерки, поэтому в ближайшее время пересобрать exe не смогу (надо именно на ней).
tage_whanuvur
наверное проще переписать код на более совместимое и менее рессурсоёмкое
Lord_of_Rings Автор
На что именно?
GiveMeFreeNickName
На Malbolge
Svinna_golova
Или проще использовать хотя бы виндовс 10, а не 7 и удивляться, что часть программ не работает
Barma2012
Знал бы прикупБыла бы возможность использовать десятку - использовал бы. .Значит,, возможности нет. Причины освещать не стану, они касаются только меня. Но есть пожелание - не стоит считать других настолько тупыми, что они не догадываются о вашем "простом решении" )))
PavelL100
проще python установить
zurabob
На вин7 работает, устраняет "деградацию" там, где не справляется goodbyDPI, но ESC-последовательности не отрабатываются и вместо красоты просто поток символов и по CTRL-C выходит с кучей эксепшенов. Но это мелочи, автору огромное спасибо.
APh
@Lord_of_Rings (кому «многа букаф» —> ИТОГИ в конце)
По случаю встречи с другом в Мск (под оптоволокном от МГТС, что есть с МТС уже давно одним яичком — аппаратная скорость отменная то бишь), опробованию выходной селедочки с лучком )) и прочтению сей интересной публикации замечу:
1. Проверяем на аппарате:
- Дохлый комп с ЦП Pentium G2030, ОЗУ 16 ГБ и c каким-то заржавевшим НЖМД от IBM на шине SATA, отдельной видеоплаты не имеется (особо аппаратно ускорять нечем — понимаем);
- Windows 7 x64 c последними сервис-паками;
- браузеры с последними релизами под Win7 (у них старый код, выходят только патчи; на Win11 уже далеко ушли все браузеры): G Chrome, Opera, Firefox — наш тестовый набор.
2. Как и написано на GitHab'е у автора в README:
- в Уиндоуз сделали в сетевых настройках для прокси указанный адрес и порт (Панель управления > Свойства браузера > Подключения > Настройка сети);
- запускаем из терминала командой
python src/
main.py
--blacklist ./blacklist.txt
N. B.! Бинарную версию NoDPI не запускали (да, простят меня Боги!). Но зачем, если есть рабочий транслятор с языка программирования? )) Обычным юзерам лучше запускать бинарник, чтобы мороку не иметь.
3. ПО работает!!! Автора качать!!! Ура, товарищи!!! Но... )))
Opera открывает Ю-Труб замечательно, как и FireFox
Заказал показ роликов 4К на мониторе 1600x1200 (Ну, деанонимизируйте меня теперь! Это же редкость нонче — такой размер матрицы.)) Ладно, пошутили и буде. Если надо, то деанонимизируют любого. Вон, крутейших взломщиков достают тёпленькими из постели.) — показывается всё ОЧЕНЬ ПЛАВНО! Красота!
Chrome отказывается работать.
Подозрение, что бродящие в умах обывателей на тематических ИТ-телеконференциях теории, что Гугл сам, в первую очередь, прикладывает усилия по недопущению россиян к некоторым сервисам — НЕ теории заговора. ;-)
В консоли терминала Уиндоуз, кою открываем, как обычно, в ConEmu и никак по другому, программа показывает все сообщения красиво и понятно! Неподготовленному пользователю не понятно, как программу остановить. ))
Но, мы-то с вами еще по CP/M и UNIX горячие клавиши учили, не так ли! )
Ох, забыл про Питон сказать!
Установлен на Win7 такой — Python 3.13.3 (main, Apr 19 2025, 21:02:55).
Да, питоноделатели решили не поддерживать Win7 уже давно. (Странные люди! Такое впечатление, что девяносто пяти процентам разработчиков Майкрософт c Интелом приплачивают, чтобы их программы были запилены под только самые последние их продукты.))) Тем более это странно видеть в мире открытого ПО. Хотя... Чего тут странного? Вон, в КПРФ тоже многие идут не потому, что идеалам дедушки Ленина верны. Хотя, говорят, "хороший был вождь" (кто помнит).
Так откуда же брать свежий Питон под неподдерживаемую ОС?
Есть умельцы на селе! (Кто пишет про какие-то вирусы... Ну, даже не знаю, как тут по политике сайта и выразится.))
https://github.com/adang1345/PythonWin7
Да, вот, ещё легковесный браузер K-Meleon пробовал, пока друг в 55-ку удалился. Ой, я 5-ку иммелл ввиду. Извините! Ну, такой лёгонький для стареньких аппаратов. Там не зашло что-то. Он страшненький для неофитов. Но работает! )) UI минималистичный и всё можно под себя настроить. Короче, "обои поклеите сами", типа. Видимо, без нового килограмма маринованного лука мы тут с ним не справимся...
ИТОГИ:
ПО работает!
На сетях провайдера МГТС (МТС) работает.
На Windows 7 x64 работает.
Приятнейший текстовый интерфейс работает. (Команду остановки программы, если запускаете не бинарник, а исходный код на Питоне, гуглите сами. Как там в бинарнике — не ведаю.)
Современный Python под Windows 7 берём у «сельских умельцев» тут:
https://github.com/adang1345/PythonWin7
Производительность указанной вычислительной системы никак принципиально не страдала. Появились процессы, но ни память не отожрало, ни график ЦП вверх не полез. (Точные замеры — не для нас нонче. Просим прощения!) После Секд-С процессы закрылись, а графики потребления ОЗУ и загрузки ЦП остались в такой же волатильности, на фоне выполнявшихся прочих процессов: как небольших фоновых с низким приоритетом по массовой обработке данных, так и высокоприоритетных от GUI.
Возможно, замеченные перегревы процессоров на изделиях Эппл, как тут писали — результат каких-то маркетинговых и/или управленческих решений, что уже бывало. Увы. (Шутка. Но в каждой шутке от шутки лишь доля шутки, не так ли, мой юный друг?!)))
Попердю напоследок: В который раз убеждаюсь, что не туда герцы и конвейеры идут... Компы по мощности возросли кратно, а делают для большинства обывателей всё то же, что и 30 лет назад.
P. S.: Спасибо всем, кто традиционно отминусит меня, чтобы попытаться ограничить на данной площадке, дабы не иметь возможностей выставлять оценки и пр. вещи. Вы — крутые ребята! Уважуха! )
Log:
редакция: вставка пропущенной запятой.
редакция: добавлен п. 6 в ИТОГИ. Содержит внесистемное содержание и удушающие слова (попердю), что выходит за требования раздела (краткие итоги). Автору вынести предупреждение за самоуправство с занесением + в личную карточку рейтинга за разбавление унылости.
ilyamodder
А что странного, что Win7 перестают поддерживать разработчики софта? Майкрософт ее давно уже похоронила, секьюрити-апдейтов даже нет, зачем плыть против течения, если можно просто поставить десятку?
mihmig
Старый софт для старого (но работающего дорогого железа)
Word 2010 на Win7 запускается быстрее, чем WordPad на Windows11...
aldekotan
Adobe Audition запускается на Win7 быстрее (и быстрее работает), чем на Win10. Хотя компьютер один и тот же, обе системы в дуалбуте.