
Салют, Хабр! Прошел ровно год с момента публикации моей первой статьи про загрузку видео с YouTube. Бонусом к статье шла небольшая утилита для... кхм... модификации сетевых пакетов. Это был небольшой скриптик на Python, форкнутый от theo0×0/nodpi. Я не делал на него совершенно никаких ставок, но в комментариях посыпались восторженные (нет) отзывы, обсуждения и просьбы выложить на GitHub. Через полгода, в мае, я опубликовал статью с презентацией NoDPI и подробными объяснениями, что, как и почему. Публикация зашла, попала в топы Хабра, аудитория на GitHub стала расти. Еще через месяц вышел NoDPI for Android — немного сыроватый и неудобный, но вполне работающий и справляющийся со своей задачей.
И вот на дворе конец 2025 года. За окном мороз, падает снег, а значит самое время подвести небольшие итоги...
Итоги года развития
Мой проект еще совсем молодой — первый релиз v1.3 был залит 7 января 2025 года. Но текущая ситуация с интернетом в России ускорила его развитие. С простого скрипта, сыплющего ошибками, NoDPI дошел до красивого консольного приложения с ASCII‑графикой:

Вообще за этот год была проделана большая работа. Вот немного статистики по разработке:
За год было выпущено 11 релизов
Было сделано около 100 коммитов (из них всего 3 было сделано контрибьютерами)
Решено 45 проблем
Но самая важная метрика — это рост сообщества. За год NoDPI на GitHub собрал более 750 звёзд, а исполняемые файлы из раздела Releases были скачаны суммарно более 33 000 раз. Для меня, как для разработчика-одиночки, это лучший показатель того, что инструмент действительно полезен людям.
Скрытый текст

Как я уже говорил, изначально проект был форком (ответвлением) от theo0×0/nodpi. С выпуском версии 2.0 я принял решение отсоединить репозиторий и сделать его отдельным и самостоятельным проектом. Почему? В первую очередь это было сделано из‑за того, что от первоначальной кодовой базы осталось только небольшое ядро, и то было значительно переписано. Кроме того, я никогда не собирался делать PR в оригинальный репозиторий, поэтому в форке большого смысла не было.
Также с выходом версии 2.1 был запущен первый сайт проекта на GitHub Pages — https://gvcoder09.github.io/nodpi_site/ Пока он представляет собой user‑friendly гайд, но постепенно будет наполняться документацией, changelog‑ом и прочими фишками.
Но все это лишь отражение более важных изменений под капотом и в возможностях. Давайте пройдемся по ключевым направлениям.
Как изменился NoDPI спустя год
Итак, небольшая выжимка всего, что было сделано за год:
Фундаментальные изменения и стабильность
Полный рефакторинг в версии 2.0
В этой версии был переписан весь проект. Код стал более читабельным и понятным. Стало проще расширять функциональность и добавлять новые возможности. Эта была очень кропотливая и трудная работа — все переделать, но ничего не сломать. Но я справился)
Исправления утечек памяти
Соединения не закрывались должным образом, из‑за чего нагрузка на систему медленно, но верно росла.
Логирование
Утилита стала логировать все — ошибки внутренние и сетевые, доступ — кто и какие сайты посещал, а также сколько трафика было обработано.
Новые возможности
Автоматическое обнаружение блокировок
С параметром
--autoblacklistпрограмме не нужен список заблокированных сайтов — они выявляются самостоятельно по таймауту.Новый метод фрагментации по SNI и TLS 1.3
Старый метод дробил пакеты на случайные чанки. Новый метод целенаправленно «рвет» на части критически важное для DPI поле Server Name Indication, что делает трафик еще менее распознаваемым для систем цензуры. Также раньше поле версии TLS заполнялось случайными данными, теперь выбрана версия 1.3 (более старые DPI не пропускает).
Автозапуск через
systemdв Linux и через реестр в WindowsБолее практичный метод сопоставления доменов
Ранее при проверке наличия домена в чёрном списке проверялось, содержит ли запрашиваемое имя хотя бы одну строку из чёрного списка. Это приводило к фрагментации сайтов типа https://www.google.com/, https://googlevideo.com/ и т. д. из-за строки "google" в чёрном списке. Теперь домен должен точно соответствовать одному из доменов в чёрном списке или быть его поддоменом, если в списке указан родительский домен.
Настройка IP-адреса для исходящих соединений
Позволяет использовать разные сетевые интерфейсы.
User Experience
Обновленный информативный UI в ASCII-графике

Статистика соединений, трафика и скорости прямо на экране
Автоматическая проверка обновлений
Параметр
--quietдля отключения любого вывода на экран
Все эти изменения превратили NoDPI из простого скрипта в комплексный инструмент. Но на этом, конечно, развитие не заканчивается...
Что дальше?
NoDPI из моего личного эксперимента превратился в инструмент, которым пользуются сотни, если не тысячи людей. Поэтому его будущее теперь определяется не только мной, но и сообществом. Конечно, я не собираюсь останавливаться на достигнутом. Технический уровень блокировок растет, и следовательно, должны расти и уровни методов обхода.
На ближайшее время запланировано:
Усиление методов обхода: исследование и, возможно, реализация дополнительных техник фрагментации и маскировки трафика - внедрение DoH, фейковых пакетов и т. д. Однако, здесь встает глубокая дилемма: все эти изменения так или иначе требуют использования сторонних библиотек, более сложной логики и, что немаловажно, повышение уровня привилегий пользователя. Стоит ли пожертвовать принципами простоты и самодостаточности (один файл, только стандартные библиотеки) ради более изощренного обхода? Мне было бы интересно услышать ваше мнение в комментариях.
Продолжение работы над удобством: более продвинутый UI, возможно графическая версия приложения.
Глубокая доработка Android-версии: приведение её к тому же уровню надежности и функциональности, что и десктопная версия.
Все эти изменения невозможно осуществить без вашей поддержки, так как проект разрабатываю я один, и моя загруженность и давление текущего законодательства создают определенные сложности и риски. Но тем не менее, по мере своих сил, я буду стараться двигаться дальше)
Благодарности
Я хочу поблагодарить всех, кто принял участие в проекте, поддержал его звездочкой на GitHub, комментарием или просто скачал. Особенно признателен я аудитории Хабра, которая сподвигла меня на публикацию и распространение инструмента. Ваш вклад бесценен; без него проект бы просто не существовал!
Я искренне надеюсь, что смог принести кому-то пользу и облегчить жизнь в наше тяжелое время.
Заключение
Спасибо всем, кто дочитал статью до конца! Надеюсь, было немного полезно и информативно)
Ссылки
Репозиторий проекта на GitHub — https://github.com/GVCoder09/NoDPI
Репозиторий версии для Android — https://github.com/GVCoder09/NoDPI4Android
Веб‑сайт проекта — https://gvcoder09.github.io/nodpi_site/
P. S. Подписывайтесь на мой Telegram‑канал, где я... Ой... Сорри, у меня же нет Telegram‑канала... Ну тогда просто поставьте плюсик статье :‑)
