Знакомство
Клиент ⇄ СерверСоединение начинается через выбранный транспорт: plain использует голый X25519, остальные режимы — TLS-shaped или настоящий TLS с гибридным key share.
Полный разбор: рукопожатие, все шесть транспортных режимов, криптография, измеренные бенчмарки и матрица сравнения. Для тех, кто хочет проверить детали.
При закреплённом ключе сервер подтверждает свою подлинность до того, как клиент отправит пароль. Порядок шагов важен для безопасности; при TOFU первое подключение нужно проверить отдельно.
Соединение начинается через выбранный транспорт: plain использует голый X25519, остальные режимы — TLS-shaped или настоящий TLS с гибридным key share.
Подлинность привязана к хешу всего рукопожатия — подмена ломает соединение.
Сервер доказывает владение ключом, клиент сверяет с закреплённым — до отправки пароля.
По защищённому каналу — логин и пароль; проверка Argon2id и доступ по профилю.
Каждый пакет шифруется и уходит в выбранном транспорте — HTTPS, WebSocket или QUIC-shaped UDP.
Режим определяет форму трафика и задаётся согласованной парой параметров профиля и клиента. Установщик по умолчанию разворачивает reality-tls; встроенный дефолт конфига — fake-tls. Остальные режимы подходят для доверенных сетей, совместимости и резервных каналов.
Главный режим Qeli: клиент шлёт браузерное рукопожатие TLS 1.3 (отпечаток JA4 t13d1516h2_8daaf6152771), а сервер терминирует настоящий TLS 1.3 (realtls) и несёт туннель внутри. На проводе это настоящий TLS 1.3, а не имитация; внутри идёт туннель qeli, а доверие строится на закреплённом ключе сервера. Работает на Linux, Android, iOS, Windows и macOS через общий realtls-движок.
ClientHello (Chrome JA4) → TLS 1.3 (realtls)
зашифрованный flight → туннель внутри настоящего TLS
Сырой обмен X25519 и голые записи [len][nonce][ct] — никакой TLS-обёртки и лишних слоёв. Самый быстрый и дешёвый по CPU режим (≈ как fake-tls по скорости). Нужен там, где дополнительный транспортный слой не требуется: доверенная сеть, внутренний канал. Только TCP.
обмен X25519 → [len][nonce][ct] · без TLS-обёртки
Соединение начинается с рукопожатия в формате TLS 1.3: клиент шлёт ClientHello с именем сайта (SNI), гибридным X25519MLKEM768 key share и GREASE-значениями. Порядок TLS-расширений рандомизируется. Дальше данные идут в TLS-записях типа Application Data; это TLS-shaped framing, не настоящий TLS.
ClientHello · SNI · X25519MLKEM768 · GREASE
порядок расширений рандомизирован
данные → TLS record 0x17 (application_data)
Весь поток дополнительно шифруется потоковым ключом ChaCha20 на общем секрете (PSK). Начало оформлено как рукопожатие WebSocket Upgrade: клиент шлёт GET … Upgrade: websocket, сервер отвечает 101 Switching Protocols с Sec-WebSocket-Accept. Путь, Host, User-Agent и ключ рандомизированы.
GET /<rand> HTTP/1.1 · Host/UA/key рандом
Upgrade: websocket → 101 Switching Protocols
далее: поток ChaCha20 XOR
Сервер криптографически опознаёт свой клиент по токену в session_id ClientHello. Неопознанные подключения перенаправляются на указанный хост. Токен представляет собой AEAD-шифротекст (short_id, timestamp), связанный с DH-обменом. В режиме reality-tls поверх прокси-слоя добавляется терминирование настоящего TLS 1.3 (realtls).
токен в session_id → опознан → туннель
нет токена → перенаправление на целевой хост
Qeli оформляет UDP-датаграмму в строго заданной форме QUIC v1 Initial: байт 0xC3, версия 1, четырёхбайтовый DCID, пустые SCID и token, объявленная длина и четырёхбайтовый номер пакета. Это QUIC-shaped формат, а не полноценная реализация QUIC: здесь нет QUIC Initial AEAD, header protection, CRYPTO frames и обязательного padding до 1200 байт.
[0xC3][version=1][DCID:4][SCID:0][token:0]
[length][packet number:4][qeli payload]
Современный криптостек: гибридный X25519 + ML-KEM-768 во всех режимах, кроме plain, эфемерные ключи, шифрование с проверкой целостности и настоящий TLS в reality-tls. Вот что содержится в пакете data plane.
Так выглядит пакет data plane. Во всех режимах, кроме plain, ключи выводятся из гибридного X25519 + ML-KEM-768 через HKDF-SHA256; plain использует классический X25519. Данные защищает ChaCha20-Poly1305, пароли — Argon2id. В reality-tls пакет дополнительно идёт внутри TLS 1.3 с AES-GCM 128/256.
Защита ключа сервера, разграничение доступа, защита от подбора пароля и устойчивость к сбоям — встроены в протокол.
Linux и Android группируют уже готовые UDP-датаграммы в bounded-пачки до 32 через recvmmsg/sendmmsg. Таймер накопления не добавляется; порядок, roaming, pacing, фрагментация и PMTU fallback сохраняются.
Медиана чередующегося same-window A/B на двухъядерном стенде: +116,5%.
На том же стенде и окне измерения: +93,9%.
−13,2% у upload-клиента и −7,9% у server download worker.
Этот узкий тест проверяет конкретную оптимизацию. Полный сравнительный benchmark 0.8.0 с 34 режимами сохранён ниже без изменения цифр.
Результат относится к конкретной двухъядерной лаборатории и не является обещанием одинаковой скорости на любом VPS, телефоне или сетевом пути. Методика и полный контекст релиза 0.8.1 →
Полный прогон охватывает 34 режима на одном стенде: две Debian VM с 2 vCPU и 2 GiB RAM, iperf3 3.18, MTU 1400, IPv4 и IPv6. Ниже отдельно показаны профильные результаты Qeli и сравнение транспортов с одинаковым уровнем маскировки.
Две Debian VM: по 2 vCPU и 2 GiB RAM, одинаковый сетевой путь, iperf3 3.18 и MTU 1400.
Четыре параллельных потока, три повтора. В таблице используется медиана, поэтому единичный удачный прогон не определяет результат.
Для каждого режима измерены отдача и загрузка по обеим семьям адресов. Итог сравнения — среднее этих четырёх направлений.
Полностью маскируемые режимы сравниваются между собой. Частичная и отсутствующая маскировка показаны отдельно как контроль.
Все показанные профили Qeli 0.8.0 работали с обязательным PACKET_MUX_V1. Это медианы трёх TCP P=4-прогонов IPv4; значения IPv6 и все 12 профилей приведены в подробной таблице.
UDP ceiling — максимальная найденная предложенная скорость с успешным окном при потерях не более 1%. Это среднее четырёх направлений rep1; pass/n и медиана потерь каждого профиля доступны в полном отчёте.
Все значения — Мбит/с, порядок в ячейке: отдача / загрузка. TCP P=4 — медиана трёх прогонов; UDP — найденный rep1 ceiling.
| Профиль | TCP P=4 · IPv4 | TCP P=4 · IPv6 | UDP ceiling · IPv4 | UDP ceiling · IPv6 |
|---|---|---|---|---|
| tcp-plain-raw + Recordizer | 1705 / 1689 | 1825 / 1807 | 1300 / 1450 | 1350 / 1425 |
| tcp-faketls + Recordizer | 1752 / 1695 | 1823 / 1820 | 1225 / 1400 | 1300 / 1475 |
| tcp-padding + Recordizer | 1751 / 1683 | 1841 / 1799 | 1175 / 1450 | 1325 / 1500 |
| tcp-frag + Recordizer | 1774 / 1684 | 1834 / 1800 | 1350 / 1425 | 1250 / 1500 |
| tcp-obfs + Recordizer | 1256 / 1293 | 1371 / 1386 | 925 / 1200 | 925 / 1200 |
| tcp-reality + Recordizer | 1741 / 1705 | 1834 / 1786 | 1275 / 1400 | 1275 / 1450 |
| tcp-reality-tls + Recordizer | 1212 / 1066 | 1219 / 1074 | 925 / 1125 | 975 / 1200 |
| udp-faketls + Recordizer | 484 / 528 | 458 / 507 | 350 / 450 | 325 / 450 |
| udp-padding + Recordizer | 499 / 513 | 468 / 512 | 375 / 450 | 375 / 500 |
| udp-quic + Recordizer | 491 / 520 | 473 / 506 | 350 / 475 | 325 / 475 |
| tcp-obfs-awg + Recordizer | 1312 / 1300 | 1407 / 1389 | 875 / 1175 | 875 / 1175 |
| udp-faketls-awg + Recordizer | 479 / 509 | 479 / 515 | 375 / 450 | 350 / 475 |
Все 12 профилей Qeli использовали обязательный PACKET_MUX_V1; runtime подтвердил маркер PACKET_MUX_V1 active ... policy=required. Поэтому они относятся к группе с полной маскировкой. TCP-тест повторён трижды; полный отчёт содержит pass/n, медиану потерь, CV, CPU, RSS и kernel drops.
Как оценивается маскировка: форма рукопожатия, размеры и границы записей, интервалы и пакетирование, а также ответ на активную проверку. Это описание работающих механизмов, а не обещание «невидимости для DPI».
Продуктовый агрегат всех 12 Qeli-профилей — 1220 Мбит/с TCP P=4. Dual-stack gate пройден в 19 из 19 случаев, runtime-маркер обязательного recordizer получен для 12 из 12 Qeli-профилей. Дрейф прямого baseline после матрицы: +1.48% на отдачу и −1.71% на загрузку. CPU и RSS измерялись отдельно для VM и набора процессов; полные таблицы доступны в отчёте.
В основном рейтинге собраны транспорты, которые полностью меняют узнаваемые признаки VPN-трафика. Серые полосы показывают два быстрых контрольных режима без маскировки, а Hysteria 2 QUIC TLS отмечена как частично маскируемый режим. Скорость каждого варианта — среднее отдачи и загрузки по IPv4 и IPv6 в TCP-тесте с четырьмя параллельными потоками.
Серые полосы — контрольные варианты без маскировки: WireGuard plain 3161 Мбит/с и OpenVPN UDP + DCO 1900 Мбит/с. Hysteria 2 QUIC TLS 1134 Мбит/с имеет частичную маскировку. Среди режимов с полной маскировкой AmneziaWG full 3.1 показал 2820 Мбит/с, Qeli fast TCP + Recordizer — 1767 Мбит/с, а агрегат 12 Qeli-профилей — 1220 Мбит/с.
| Возможность | WireGuard | AmneziaWG | OpenVPN | Shadowsocks | Xray/VLESS | Hysteria 2 | Qeli |
|---|---|---|---|---|---|---|---|
| Полноценный VPN (а не прокси) | да | да | да | прокси | прокси | прокси | да |
| TCP P=4, Мбит/с | 3161 plain · без маскировки 510 wg-obfuscator STUN | 2820 full 3.1 | 1900 UDP + DCO · без маскировки 453 TCP + Cloak | не измерялся | 997 REALITY Vision | 1134 QUIC TLS · частично 760 Salamander · маскировка | 1767 fast TCP 1220 12 профилей |
| Приватный транспорт | нет | ★★★ | нет | ★★★ | ★★★★ | ★★★★ | ★★★★ |
| Несколько транспортных режимов | нет | один | нет | плагины | ★★★★ | частично | ★★★★ plain / fake-tls / obfs / reality / reality-tls / quic |
| Настоящий TLS | нет | нет | реальный TLS | через плагин | TLS + REALITY | под HTTP/3 | да reality-tls · Chrome JA4 |
| Встроенная панель управления | нет | приложение | нет | нет | нет | нет | да |
| Защита от подбора пароля | нет | нет | плагин | нет | нет | нет | да |
| Закрепление ключа сервера | ключ узла | ключ узла | сертификат | пароль | да | сертификат | да |
| Раздельный доступ по профилям | нет | нет | нет | нет | частично | нет | да |
| Несколько профилей в одной службе | нет | нет | нет | нет | да | нет | да |
| Работа в ядре системы | да | да | нет | нет | нет | нет | нет |
| Независимый аудит безопасности | ★★★ | ★★ | ★★★ | ★★ | ★★★ | ★★ | нет |
| Постквантовая криптография | нет | нет | нет | нет | нет | нет | да во всех режимах, кроме plain |
Один формат настроек для сервера, клиента и списка пользователей. Настройки клиента — это та же ссылка для подключения и QR-код.
# минимальный набор настроек
[qeli]
server = vpn.example.com:443
proto = tcp
mode = obfs
front = websocket
obfs_key = ОБЩИЙ-СЕКРЕТНЫЙ-КЛЮЧ
user = alice
pass = ••••••••
# закреплённый ключ сервера
key = 33f399e6…d532450
# одна ссылка → QR-код → импорт в клиент
qeli://alice:pass@vpn.example.com:443
?proto=tcp
&mode=obfs
&front=websocket
&obfs=ОБЩИЙ-СЕКРЕТНЫЙ-КЛЮЧ
&sni=www.google.com
&key=33f399e6…d532450
# создаётся в панели управления или командой:
$ qeli add-client alice --link --host vpn.example.com:443