Skip to content

Repository files navigation

🌌 Nova для Android

Приложение для Android с активной адаптацией к DPI-фильтрации. Бесплатное, без подписок, рекламы и телеметрии.

Главный экран Nova Настройки Nova

⬇️ Скачать APK

Видео о работе приложения: https://youtu.be/0oqZ0_x2Dnw


Возможности

Работает сразу после установки. Ничего искать, регистрировать и оплачивать не нужно: рабочие узлы уже встроены, и приложение подключается само. Поиск ключей, подписок и платного доступа не требуется ни на первом запуске, ни потом.

Если же свои конфигурации есть — их можно добавить и пользоваться ими вместо встроенных.

  • Встроенные узлы — Cloudflare WARP поверх AmneziaWG, MASQUE поверх QUIC и серверы Opera VPN в Европе и Северной Америке. Переход между ними при отказе выполняется без участия пользователя.
  • Импорт своих конфигураций — профили AmneziaWG и ссылки vless:// со всеми современными транспортами, включая XHTTP, WebSocket, gRPC и HTTP Upgrade. Переключение между встроенными и импортированными выполняется вручную: выбор источника остаётся за пользователем.
  • Подписки — списком ссылок, в base64, с метаданными в заголовках.
  • Раздача на другие устройства без прав суперпользователя: телефон работает шлюзом для ноутбука, телевизора, игровой приставки или другого телефона на Android либо iOS.
  • Раздельное туннелирование — правила для отдельных приложений.
  • Настройка DNS, включая DoH и DoT, с отдельными правилами для приложений.
  • Лицензия WARP+ — если ключ есть, его можно указать в настройках: он привязывается к устройству и открывает MASQUE, недоступный бесплатным учётным записям Cloudflare.

VLESS с REALITY доступен только через импорт: встроенных узлов этого протокола в приложении нет.

Данные не покидают устройство: телеметрия не собирается, статистика никуда не передаётся, адреса в журнале обезличиваются перед сохранением.

Требования

Android 7.0 и новее. Поддерживаются телефоны, планшеты и приставки Android TV — на последних работает навигация пультом.

Принцип работы

Ограничение доступа редко выглядит как отсутствие связи. Гораздо чаще перестаёт работать что-то одно, а остальное продолжает функционировать — и клиент, рассчитанный на единственный протокол, в такой сети замирает без объяснения причин.

Показательный случай, зафиксированный при разработке. Оборудование оператора разрывает обращения к управляющему серверу Cloudflare по имени узла в приветственном сообщении TLS. Тот же самый адрес с именем www.cloudflare.com отвечает кодом 200, а с именем api.cloudflareclient.com соединение обрывается; при этом разрешение имён работает корректно, соединение TCP устанавливается, обычный доступ в сеть сохраняется. Клиент, умеющий только WARP, в такой сети не зарегистрируется никогда.

Отсюда устройство приложения: не один протокол с попытками его починить, а несколько независимых путей, между которыми выполняется переход.

Порядок перебора среди встроенных узлов. Сначала Cloudflare WARP поверх AmneziaWG. Если он недоступен, следуют серверы Opera VPN в Европе и Северной Америке. Любой из способов можно выбрать и вручную в списке регионов.

Импортированные конфигурации в этот перебор не подмешиваются: источник — встроенные узлы или свои — выбирает пользователь.

Проверка работоспособности, а не факта подключения. Установленное соединение ещё ничего не гарантирует: рукопожатие может пройти, а полезные данные — фильтроваться. Поэтому состояние туннеля подтверждается живой пробой. Накопленные счётчики трафика для этого непригодны, и это выяснилось опытным путём: они описывают всё время существования туннеля, а после смены сети остаются прежними, из-за чего неработающее соединение выглядело исправным.

Удержание при смене сети. Переход между Wi-Fi и мобильной связью, потеря сигнала, включение точки доступа — всё это приводит к пересозданию подложной сети. Туннель переносится на новую сеть, а если перенос не удался, выполняется повторное подключение.

Уважение к импортированным настройкам. Профиль AmneziaWG применяется в том виде, в каком его выдал поставщик услуги: ключи, адреса, параметры обфускации, MTU. Собственные варианты приложения к нему не подмешиваются — даже если подключиться не удалось. Пользователь, добавивший профиль, вправе рассчитывать, что работает именно он.

Если связь не восстановилась

Дайте приложению около минуты: при первом запуске выполняется перебор параметров.

Затем проверьте по порядку:

  1. Другое приложение VPN. Android допускает только одно активное подключение VPN. Отключите остальные — они вытесняют друг друга.
  2. Ограничения фоновой работы. На прошивках Xiaomi, Huawei, Honor, OPPO, vivo и Tecno система выгружает приложения из памяти. В настройках Nova есть пункты автозапуска и работы в фоне — они открывают нужные системные экраны и отображаются только там, где такие экраны действительно существуют.
  3. Выбор региона. Если AUTO не находит рабочий путь, попробуйте MASQUE или EU — перебор начнётся сразу с выбранного транспорта.
  4. Импортированный профиль. Убедитесь, что в списке конфигураций выбран источник «импортированные»: при выборе «встроенные» используются собственные узлы приложения, а добавленный профиль остаётся в стороне.

Если ничего не помогло — напишите в группу, разберёмся вместе 😉


Устройство

Ниже описано, как приложение устроено внутри. Для повседневной работы эти сведения не требуются — раздел адресован тем, кому интересно, что происходит «под капотом».

Ядро VLESS

Поддержка VLESS с REALITY построена на форке Xray-core. Прямое объединение с существующим ядром оказалось невозможным: Xray требует qpack версии 0.6.0, что нарушает работу quic-go 0.55.0, на котором держится MASQUE. Кроме того, две библиотеки, собранные средствами gomobile, не уживаются в одном пакете приложения — каждая приносит собственную libgojni.so, и символы конфликтуют.

Поэтому ядро подключено как обычная библиотека c-shared с тонким слоем JNI. У неё собственный граф зависимостей, и оба препятствия исчезают.

Работа с большими подписками

Публичные агрегаторы конфигураций достигают значительных размеров, и построчный разбор такого списка на телефоне заканчивается не задержкой, а аварийным завершением по нехватке памяти.

Разбор выполнен потоковым: конфигурации передаются в обработчик по мере чтения, повторы отсеиваются по отпечаткам, а чтение прекращается при достижении предела — тело подписки не загружается целиком.

Смешанные подписки, где рядом с VLESS размещены другие протоколы, разбираются корректно: посторонние ссылки учитываются отдельно от повреждённых строк, чтобы отчёт об импорте не выглядел перечнем ошибок.

Раздача на другие устройства

Прозрачно направить трафик подключённых устройств в туннель без прав суперпользователя невозможно. Причина в устройстве маршрутизации Android: правила для приложений содержат условие iif lo — «только для трафика, порождённого на этом устройстве». Пакет, пересылаемый от клиента точки доступа, приходит с интерфейса раздачи и не совпадает ни с одним из них. Изменение правил требует прав суперпользователя.

Вместо этого телефон работает шлюзом: HTTP, HTTPS CONNECT и SOCKS5 на адресе раздачи. Исходящие соединения шлюза — это соединения самого приложения, поэтому они проходят через туннель на общих основаниях.

Интерфейс раздачи определяется по отсутствию признака выхода в сеть у соответствующего сетевого объекта: сторона раздачи никуда не ведёт, она лишь принимает клиентов. Проверка «известен ли интерфейс системе» здесь ошибочна — режим модема виден системе как обычная сеть. Диапазоны адресов не задаются заранее: у проверенных устройств они оказались нестандартными.

Учётные данные выдаются странице настройки только тем клиентам, которые пришли через раздачу самого телефона. Решает адрес, на котором принято соединение, — адрес отправителя поддаётся подмене.

Через шлюз проходит только TCP. Трафик UDP — сетевые игры, голосовая связь, QUIC — идёт в обход туннеля, как и запросы к серверу имён от приложений, не использующих прокси. Это сказано на странице настройки прямым текстом, без мелкого шрифта.

Состав проекта

Компонент Назначение
app/ Приложение: интерфейс, служба VPN, шлюз раздачи, разбор конфигураций
nova-core/ Ядро на Go: AmneziaWG, MASQUE, подбор узлов, перехват DNS
nova-xray/ Обёртка над Xray-core и слой JNI для VLESS с REALITY
tools/xray-core/ Вендоренный форк Xray-core
docs/ Архитектурные решения: что выбрано, на каком основании и что измерено

Сборка

Требуются JDK 17 и Android SDK. Библиотеки для собственного кода включены в репозиторий, пересобирать их для обычной сборки не требуется.

./gradlew assembleDebug

Пересборка ядра для VLESS выполняется отдельно:

cd nova-xray && ./build.sh

Полное описание, включая подпись выпуска и внешние зависимости, — в docs/BUILD.md.

Используемые компоненты

Nova создана с участием проверенных временем решений: вместо повторного прохождения уже пройденного пути отобрано лучшее из существующего и объединено в единую систему вместе с ядром Nova. За каждым из этих проектов — годы работы их авторов.

  • Xray-core, XTLS — VLESS, REALITY и современные транспорты.
  • AmneziaWG, Amnezia — обфусцированный WireGuard.
  • opera-proxy, Snawoot — благодаря этому решению доступны серверы Opera.
  • opera-proxy-android-wrapper, SLY-F0X — адаптация для Android.
  • tun2proxy — передача трафика туннельного интерфейса прокси-серверу.
  • tg-ws-proxy, Flowseal — слой совместимости прозрачного ретранслятора Telegram.

Условия использования — GPL-3.0; лицензии сторонних компонентов — THIRD-PARTY.md.

Документация


Правовая информация

Nova — программное средство управления сетевым трафиком на устройстве пользователя. Оно распределяет исходящие соединения между доступными маршрутами.

Программа:

  • не размещает, не хранит и не распространяет какую-либо информацию с сайтов;
  • не содержит собственных серверов: встроенные точки входа принадлежат общедоступным службам Cloudflare WARP и Opera VPN, к которым приложение подключается напрямую;
  • не содержит подписок и перечней запрещённых ресурсов; свои конфигурации добавляет пользователь и отвечает за них сам;
  • не собирает сведений о пользователе и не передаёт данные третьим лицам;
  • не осуществляет доступ к чужим информационным системам и не нарушает их работу;
  • не преодолевает средства защиты информации.

Исходные тексты опубликованы в исследовательских и образовательных целях, а также для правомерного применения: защиты трафика в общедоступных беспроводных сетях, доступа к собственным ресурсам и изучения сетевых протоколов. Проект не рекламирует и не популяризирует средства обхода ограничений доступа и не предназначен для получения информации, распространение которой запрещено.

Законодательство в отношении средств туннелирования различается по странам: где-то их применение ограничено, где-то запрещено. Ответственность за соблюдение применимых норм несёт пользователь. Устанавливая приложение, вы подтверждаете, что действуете в рамках законодательства своей юрисдикции.

Настоящий раздел не является юридической консультацией.

Лицензия

Nova распространяется на условиях GNU General Public License v3.0. Программу можно свободно использовать, изучать, изменять и распространять; производные работы должны оставаться под той же лицензией с открытыми исходными текстами. Сторонние компоненты сохраняют собственные условия распространения — перечень в THIRD-PARTY.md.


Создано с ❤️

🙋 Группа в Телеграм: @nova_txt — вопросы, новости, поддержка.

Отблагодарить — если Nova оказалась полезной. Это необязательный способ сказать "спасибо".

About

Обход большинства блокировок трафика в России для Android

Resources

Stars

309 stars

Watchers

4 watching

Forks

Releases

Packages

Contributors

Languages