Skip to content

Latest commit

 

History

History
141 lines (120 loc) · 12.7 KB

masque.md

File metadata and controls

141 lines (120 loc) · 12.7 KB

MASQUE α (HTTP/3)

MASQUE — экспериментальная поддержка, обозначенная α в интерфейсе. Реализация влита в main в PR #70; опубликованные APK v1.0.3 поддерживают только HTTPS/SSH. Нужна сборка, включающая эту реализацию. APK из PR предназначены для тестирования; см. установку.

Настройка GOST

Клиент использует TCP CONNECT и CONNECT-UDP в общей HTTP/3-сессии с Basic Auth. Для GOST 3.3.0 нужны listener http3 и handler masque; h3 — другой транспорт. Включите QUIC datagrams и откройте выбранный UDP-порт.

Минимальная конфигурация сервера с действительным сертификатом:

{
  "services": [{
    "name": "masque",
    "addr": ":443",
    "handler": {
      "type": "masque",
      "auth": {"username": "USER", "password": "PASSWORD"}
    },
    "listener": {
      "type": "http3",
      "metadata": {"enableDatagrams": true},
      "tls": {
        "certFile": "/path/to/fullchain.pem",
        "keyFile": "/path/to/privkey.pem"
      }
    }
  }]
}

Замените реквизиты и пути сертификата, ограничьте доступ к файлу и запустите gost -C gost.json. Сертификат должен соответствовать имени прокси и иметь цепочку, которой доверяет Android. Продление сертификата и перезапуск GOST настраиваются отдельно.

В MegaProxy выберите MASQUE α (HTTP/3), укажите имя сервера, UDP-порт (по умолчанию 443) и реквизиты. Оставьте проверку сертификата включённой. Запустите Тест, затем Подключить. Тест должен показать выходной IP и страну сервера. При таймауте QUIC проверьте доступность UDP, облачный и серверный firewall, а также VPN на компьютере с эмулятором: доступность TCP/443 не доказывает доступность UDP.

Для MASQUE действуют глобальная/по приложениям маршрутизация, обход локальной сети, учёт трафика, DoH/fallback, диагностика, переподключение/failover и шифрование реквизитов. JSON использует proxy.type: "MASQUE"; ProxyList — masque://user:password@host:port. Jump поддерживается только для HTTPS/SSH.

Запросы UDP и TCP на порт 53, поступающие в VPN, преобразуются в DoH, включая повторные и конвейерные TCP-запросы. Private DNS и Secure DNS браузера следуют обычной маршрутизации и не преобразуются в запросы к выбранному DoH-провайдеру.

Отпечатки и ограничения

  • uQUIC использует пресеты Chrome 146 или Firefox 116 независимо от TCP-пресетов uTLS. Randomized использует Chrome со случайным порядком расширений/параметров. Ручному JA3 нужны шифры TLS 1.3 и расширения 16, 43, 51, 57; содержимое QUIC-параметров берётся из Chrome. Это приближение TLS/QUIC браузера; HTTP/3 SETTINGS и управление перегрузкой остаются библиотечными.
  • В режиме ручного JA3 у каждого MASQUE-профиля задаётся отдельный QUIC JA3; HTTPS использует общий JA3 из настроек. Они независимы при смешанном failover и сохраняются в JSON. ProxyList не переносит настройки отпечатка.
  • UDP должен помещаться в согласованный QUIC datagram и MTU пути. В GOST 3.3.0 нет надёжного capsule fallback для слишком больших пакетов. Лимит Firefox в 1200 байт не вмещает внутренний QUIC Initial в 1200 байт вместе с обрамлением; используйте Chrome. Слишком большие исходящие пакеты отбрасываются целиком, с одним событием на UDP-поток; последующие малые пакеты продолжают проходить. Исходящий размер также ограничен объявленным лимитом приёма, чтобы GOST не закрывал поток на слишком большом echo-ответе.
  • Проверка API 35 от 2026-10-11 выявила потерю последних TCP-данных при немедленном write half-close с GOST 3.3.0: его relay обрабатывает EOF раньше байтов, возвращённых тем же чтением. Отказ воспроизводится также прямым native-клиентом без Android TUN. Это ограничение сервера; задержка перед FIN не является исправлением. См. отчёт проверки.
  • GOST 3.3.0 отклоняет IPv6 literal targets в CONNECT-UDP. TCP IPv6 и локальный UDP-bypass следуют настройкам IPv6/маршрутизации профиля. По умолчанию используется только IPv4.
  • Карточка показывает QUIC RTT и исходящие пакеты, объявленные потерянными за пять минут. Метрики TCP ядра для UDP-сокета недоступны. Счётчики и скорость учитывают полезные данные TCP/UDP. Журнал сессии содержит multiplexed=true и выбранный отпечаток; это не доказательство точного полного отпечатка браузера.

Диагностические логи

События сессии содержат версию TLS/шифр, ALPN, версию QUIC, согласованные возможности, отпечаток и локальные номера сессии/соединения для сопоставления. Отказ CONNECT содержит HTTP-статус и причину авторизации/отказа. GOAWAY и отбрасывание больших UDP-пакетов отмечаются отдельно; обычный Stop не создаёт ложных ошибок UDP/DPI. Текст ошибок от сервера, реквизиты, адреса назначений, данные владельцев сертификатов и сетевые connection IDs не записываются. В crash-логах остаются классы исключений и stack frames, без исходных сообщений исключений и произвольных имён потоков. Библиотечные логи потоков в обход фильтра отключены. Повторяющиеся события connection/DoH/SSH transport/UDP ограничены в файле до 20 на категорию за 10 секунд; следующее записанное событие содержит число подавленных сообщений. До этого ограничения каждое событие поступает восстановлению/UI. Сессии, жизненный цикл и crash-события не ограничиваются по частоте; действуют ротация и ограниченная очередь записи.

Таймаут/сброс отдельного назначения при исправной QUIC-сессии записывается с scope=target dpi_hint=none: это не перезапускает весь VPN и не запускает failover. Таймеры приложения/half-close имеют scope=local_deadline. Ошибки handshake и транспорта прокси сохраняют диагностику восстановления. TCP half-close передаёт FIN через CONNECT, оставляя направление ответа открытым.

English version

Необязательный HTTP/3 в HTTPS

В HTTPS-профиле можно включить «Предпочитать HTTP/3 α», сохранив тип HTTPS. Приложение пробует MASQUE на том же хосте и номере UDP-порта в течение трёх секунд. Для отката сервер должен также предоставлять HTTPS по TCP. Если QUIC недоступен, отпечаток или настройки сервера не поддерживаются, выбирается существующий HTTPS-транспорт (HTTP/2 или HTTP/1.1). Главный экран и кнопка «Тест» показывают предупреждение: при откате обычный UDP блокируется, а перехваченный DNS продолжает работать через DoH.

Ошибки сертификата, авторизации, защиты сокета и неизвестные ошибки не приводят к откату. После выбора HTTP/3 ошибки остаются на этом транспорте; активные соединения не переносятся. Выбор повторяется при новой VPN-сессии или тесте. Настройка выключена по умолчанию и игнорируется для типов без HTTPS. Отдельный MASQUE-профиль по-прежнему требует HTTP/3 без отката. Глобальный отпечаток браузера используется в пределах поддержки QUIC; неподдерживаемые Edge/custom JA3 используют HTTPS. JSON сохраняет profiles[].proxy.preferHttp3; обычные ссылки на прокси эту настройку не содержат.

Для HTTPS с Jump поддержка MASQUE нужна на обоих узлах. Имя конечного прокси разрешается удалённо через CONNECT-UDP. При недоступности любого узла вся цепочка использует HTTPS/TCP через Jump. Учётные данные и проверка сертификата сохраняются для каждого узла. Лимит пакетов вложенного QUIC рассчитывается по проверенной ёмкости внешнего пути в обоих направлениях с учётом обрамления QUIC и CONNECT-UDP. Перед выбором транспорта проверяется также MTU ответа конечного узла с учётом запаса на завершение PMTU-проверки и консервативного DATAGRAM-лимита сервера. Дополнительный OPTIONS round trip подтверждает доставку ACK пробных пакетов. Одна запись MTU на сессию содержит только числовые лимиты. Padding/receive-MTU адаптируются с сохранением TLS-отпечатка. Firefox с Jump откатывается из-за недостаточного DATAGRAM-лимита.

Ответы CONNECT-UDP 404/405/501 и отсутствие заголовка Capsule-Protocol выбирают HTTPS; ошибки авторизации, запреты доступа и неожиданные ошибки сервера остаются фатальными. Диагностика фатального отказа указывает узел и этап без текста ответа сервера и приватных адресов. Регрессии проверяют HTTP/3 сайта и UDP-пакеты 1280/1350 байт, асимметричный MTU, потери, GOAWAY и отмену handshake конечного узла.