Flutter VLESS: создание VPN-приложений с поддержкой VLESS, Reality и других протоколов

Обзор пакета flutter_vless для Flutter: возможности, поддерживаемые протоколы, настройка под Android, iOS, macOS и Windows, примеры использования и ответы на частые вопросы.

Что такое flutter_vless и зачем он нужен

Flutter_vless — это открытый плагин для Flutter, который позволяет встраивать в приложение поддержку популярных прокси-протоколов, включая VLESS Reality, XHTTP, VMess, Trojan, Shadowsocks, Hysteria2 и WireGuard. Он работает на Android, iOS, macOS и Windows, предоставляя единый Dart API для парсинга ссылок, подписок и конфигураций, а также для запуска прокси или VPN-туннеля через нативные бэкенды.

Плагин разработан и поддерживается студией 13FOX Studio (tfox.dev) и распространяется под лицензией MIT, что допускает коммерческое использование при сохранении уведомления об авторских правах. Он включён в официальный список Xray-core как обёртка, что подтверждает его совместимость с экосистемой Xray.

Основная ценность flutter_vless — в том, что разработчику не нужно разбираться в тонкостях нативной реализации Xray для каждой платформы. Достаточно один раз написать логику на Dart, а плагин позаботится о взаимодействии с системными VPN-сервисами, управлении дочерними процессами и обработке конфигураций.

Поддерживаемые протоколы и форматы импорта

Плагин поддерживает импорт конфигураций из нескольких источников:

  • Share-ссылки: vmess://, vless://, trojan://, ss://, socks://, hysteria2://, hy2://.
  • Подписки: base64-закодированные списки ссылок.
  • Сырые конфигурации Xray: JSON-файлы, используемые самим Xray.
  • Clash YAML: популярный формат конфигурации для Clash-клиентов.
  • sing-box JSON: конфигурации для sing-box.

Каждый из этих форматов может содержать профили для VLESS Reality, XHTTP, VMess, Trojan, Shadowsocks, Hysteria2 и WireGuard. Плагин автоматически распознаёт тип профиля и преобразует его во внутреннее представление.

Для работы с несколькими профилями из подписки предусмотрен метод parseMany(), который возвращает список всех поддерживаемых профилей. Это удобно при создании приложений со списком серверов.

Режимы работы: прокси и VPN-туннель

Flutter_vless поддерживает два основных режима:

  • Proxy-only: приложение работает как прокси, обрабатывая трафик только тех приложений, которые явно настроены на использование прокси. Этот режим не требует прав администратора и работает на всех платформах.
  • VPN/tunnel: создаётся виртуальный сетевой адаптер (TUN), через который проходит весь трафик операционной системы. Этот режим требует специальных разрешений и настроек на каждой платформе.

Выбор режима зависит от задачи. Если нужно обеспечить безопасный доступ только для браузера или конкретного приложения, достаточно proxy-only. Если требуется скрыть весь трафик устройства, необходим VPN-туннель.

На Android VPN-режим использует VpnService, на iOS и macOS — Network Extension и Packet Tunnel, на Windows — локальный xray.exe и, возможно, права администратора. Плагин предоставляет готовые реализации для каждой платформы, но требует предварительной настройки.

Настройка под Android

Для Android плагин использует VpnService для создания VPN-туннеля. Это стандартный механизм Android, который позволяет приложению перехватывать и маршрутизировать сетевой трафик. Плагин поддерживает функцию blockedApps, которая позволяет исключить определённые приложения из туннеля (per-app bypass).

Для работы в эмуляторе не требуется дополнительных действий — бинарные файлы для эмулятора включены в основной AAR-артефакт. Плагин также поддерживает современные устройства с 16KB page size, что важно для новых версий Android.

Для запуска VPN-режима необходимо запросить разрешение у пользователя через requestPermission(). После получения разрешения можно запускать туннель с помощью startVless(). В proxy-only режиме разрешение не требуется.

Настройка под iOS и macOS

Для iOS и macOS плагин использует Network Extension framework. Это требует настройки App Group и подписанного физического устройства для тестирования VPN-режима на iOS. Симулятор не поддерживает VPN-туннели, поэтому для проверки потребуется реальное устройство.

На macOS необходимо создать Packet Tunnel extension и настроить подпись приложения. Плагин предоставляет скрипт prepare_apple_swiftpm.sh, который генерирует метаданные Swift Package Manager. Для proxy-only режима достаточно выполнить подготовку с флагом --prepare-only, для VPN-режима требуется полная настройка.

Важно: для macOS необходимо указать Apple Team в настройках проекта Xcode для обоих таргетов (Runner и XrayTunnel). Без этого подпись не будет работать.

Настройка под Windows

На Windows плагин требует наличия локального исполняемого файла xray.exe. Его необходимо разместить в папке windows/xray/ вашего проекта. Для VPN-режима могут потребоваться права администратора, так как создание TUN-адаптера требует повышенных привилегий.

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

Для proxy-only режима права администратора не требуются, но приложение должно быть настроено на использование системного прокси.

Пример использования: подключение по vless-ссылке

Рассмотрим базовый пример подключения к серверу по vless-ссылке. Сначала необходимо создать экземпляр FlutterVless и подписаться на изменения статуса:

final flutterVless = FlutterVless(
  onStatusChanged: (status) {
    debugPrint('status=${status.state} connection=${status.connectionState.name} delay=${status.duration}s');
  },
);

Затем парсим ссылку и получаем конфигурацию:

final parsed = FlutterVless.parse(shareLink);
final config = parsed.getFullConfiguration();

Далее инициализируем плагин с идентификаторами bundle и group:

await flutterVless.initializeVless(
  providerBundleIdentifier: 'com.example.myapp',
  groupIdentifier: 'group.com.example.myapp',
);

После запроса разрешения запускаем подключение:

if (await flutterVless.requestPermission()) {
  await flutterVless.startVless(
    remark: parsed.remark,
    config: config,
  );
}

Для proxy-only режима нужно передать proxyOnly: true в startVless() и пропустить запрос разрешения.

Расширенные возможности и настройка конфигурации

Плагин предоставляет доступ к низкоуровневым картам Xray для тонкой настройки. Это позволяет изменять параметры входящих соединений, маршрутизации, логирования и потоковой передачи. Для более безопасной работы рекомендуется использовать типизированные помощники из xray_config_model.dart и xray_config_validator.dart, которые проверяют корректность конфигурации перед отправкой в нативный слой.

Плагин также поддерживает проверку задержки сервера через getServerDelay(), что полезно для отображения пинга в интерфейсе. Статус подключения отслеживается через колбэк onStatusChanged.

Для импорта подписок и Clash-конфигураций используйте parseMany(). Это позволяет загрузить все доступные профили и предоставить пользователю выбор.

Ограничения и требования к платформам

Несмотря на широкую поддержку, у плагина есть ограничения:

  • iOS: VPN-режим работает только на реальном устройстве с подписью. Симулятор не поддерживается.
  • macOS: требуется macOS 13.0 или новее, а также настроенная подпись Apple Team.
  • Windows: для VPN-режима нужен xray.exe и права администратора.
  • Android: VPN-режим требует разрешения пользователя, но работает на эмуляторе.

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

Также важно помнить, что использование VPN-протоколов может регулироваться законодательством в некоторых странах. Разработчик несёт ответственность за соблюдение местных законов.

Заключение и рекомендации

Flutter_vless — это мощный инструмент для создания кроссплатформенных VPN-приложений на Flutter. Он избавляет от необходимости писать нативный код для каждой платформы и предоставляет единый API для работы с популярными протоколами.

Для начала рекомендуется изучить пример приложения и документацию, особенно разделы Platform Guides и Configuration Guide. Это поможет избежать типичных ошибок при настройке.

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

В целом, flutter_vless — отличный выбор для разработчиков, которые хотят быстро создать VPN-клиент с поддержкой современных протоколов, не углубляясь в детали реализации Xray.

Вопросы и ответы

Какие протоколы поддерживает flutter_vless?

Плагин поддерживает VLESS Reality/XHTTP, VMess, Trojan, Shadowsocks, Hysteria2 и WireGuard. Импорт возможен из share-ссылок, подписок, raw Xray JSON, Clash YAML и sing-box JSON.

Нужен ли root или jailbreak для работы плагина?

Нет, плагин использует официальные системные API: VpnService на Android, Network Extension на iOS/macOS и TUN-адаптер на Windows. Root или jailbreak не требуются.

Можно ли использовать flutter_vless в коммерческих проектах?

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

Как проверить задержку сервера?

Используйте метод getServerDelay(), который возвращает время отклика сервера. Это удобно для отображения пинга в интерфейсе приложения.

Какие платформы поддерживает flutter_vless?

Плагин поддерживает Android, iOS, macOS и Windows. Для iOS VPN-режим требует реального устройства, для Windows — наличие xray.exe.

Можно ли импортировать подписку с несколькими серверами?

Да, используйте метод parseMany(), который возвращает список всех поддерживаемых профилей из подписки. Это позволяет предоставить пользователю выбор сервера.

Что делать, если VPN-режим не работает на iOS?

Убедитесь, что вы используете физическое устройство с подписью, настроили App Group и правильно указали bundle identifier. Симулятор не поддерживает VPN-туннели.