Технические детали

Как устроен Qeli

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

Как работает соединение

Установка соединения шаг за шагом

При закреплённом ключе сервер подтверждает свою подлинность до того, как клиент отправит пароль. Порядок шагов важен для безопасности; при TOFU первое подключение нужно проверить отдельно.

1

Знакомство

Клиент ⇄ Сервер

Соединение начинается через выбранный транспорт: plain использует голый X25519, остальные режимы — TLS-shaped или настоящий TLS с гибридным key share.

2

Отпечаток

внутри

Подлинность привязана к хешу всего рукопожатия — подмена ломает соединение.

3

Сервер → клиент

Сервер → Клиент

Сервер доказывает владение ключом, клиент сверяет с закреплённым — до отправки пароля.

4

Вход клиента

Клиент → Сервер

По защищённому каналу — логин и пароль; проверка Argon2id и доступ по профилю.

Передача данных

Клиент ⇄ Сервер

Каждый пакет шифруется и уходит в выбранном транспорте — HTTPS, WebSocket или QUIC-shaped UDP.

Транспортные режимы

Один протокол — шесть транспортных режимов

Режим определяет форму трафика и задаётся согласованной парой параметров профиля и клиента. Установщик по умолчанию разворачивает reality-tls; встроенный дефолт конфига — fake-tls. Остальные режимы подходят для доверенных сетей, совместимости и резервных каналов.

для доверенных сетей · новоеTCP · базовый

Базовый туннель — plain

plain · голый шифрованный туннель

Сырой обмен X25519 и голые записи [len][nonce][ct] — никакой TLS-обёртки и лишних слоёв. Самый быстрый и дешёвый по CPU режим (≈ как fake-tls по скорости). Нужен там, где дополнительный транспортный слой не требуется: доверенная сеть, внутренний канал. Только TCP.

в трафике обмен X25519 → [len][nonce][ct] · без TLS-обёртки
  • Максимальная скорость, минимум накладных расходов
  • Без дополнительного транспортного слоя — это базовый туннель
~571 ↑ / 714 ↓ Мбит/с · ранее опубликованный лабораторный прогон
запасной · лёгкийTCP · уровень 1

TLS-совместимый транспорт

fake-tls · 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)
  • Данные передаются в TLS-записях
  • Порядок TLS-расширений рандомизирован
  • Минимальная структура — почти нет накладных расходов
Транспортный слой почти бесплатен · ~563 ↑ / 697 ↓ Мбит/с
дополнительное шифрованиеTCP · уровень 2

Дополнительное шифрование (obfs)

obfs · дополнительный криптослой ChaCha20

Весь поток дополнительно шифруется потоковым ключом 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
  • Начало совместимо с WebSocket — печатаемый HTTP-текст
  • Дополнительный слой ChaCha20 поверх основного шифрования
  • Лимит потока — 256 ГиБ на направление, затем безопасный реконнект
Дополнительный криптослой · ~498 ↑ / 582 ↓ Мбит/с
разделение портаTCP · уровень 3

Разделение порта (reality)

reality · разделение порта

Сервер криптографически опознаёт свой клиент по токену в session_id ClientHello. Неопознанные подключения перенаправляются на указанный хост. Токен представляет собой AEAD-шифротекст (short_id, timestamp), связанный с DH-обменом. В режиме reality-tls поверх прокси-слоя добавляется терминирование настоящего TLS 1.3 (realtls).

в трафике токен в session_id → опознан → туннель нет токена → перенаправление на целевой хост
  • Неопознанные подключения перенаправляются на сторонний хост
  • Опознание криптографическое, защита от повторного воспроизведения
  • Доступен режим с настоящим TLS 1.3 (reality-tls)
Один peek на accept · reality + Recordizer: 1767 Мбит/с TCP P=4
UDPUDP · уровень 2

UDP в QUIC-shaped форме

quic · UDP с QUIC-shaped Initial

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]
  • Новые пакеты используют точную форму qeli Initial с байтом 0xC3
  • Парсер проверяет все длины и полное потребление датаграммы
  • Для rolling upgrade принимается только историческая форма 0xE3
~400 Мбит/с при потерях менее 0.5% · 4.08% на 500 Мбит/с
Безопасность

Криптография и честная защита

Современный криптостек: гибридный X25519 + ML-KEM-768 во всех режимах, кроме plain, эфемерные ключи, шифрование с проверкой целостности и настоящий TLS в reality-tls. Вот что содержится в пакете data plane.

заголовоктранспорт
nonce12 байт · псевдослучайный
зашифрованные данные + тегChaCha20-Poly1305
паддингслучайный

Так выглядит пакет data plane. Во всех режимах, кроме plain, ключи выводятся из гибридного X25519 + ML-KEM-768 через HKDF-SHA256; plain использует классический X25519. Данные защищает ChaCha20-Poly1305, пароли — Argon2id. В reality-tls пакет дополнительно идёт внутри TLS 1.3 с AES-GCM 128/256.

X25519 X25519MLKEM768 · кроме plain ChaCha20-Poly1305 Argon2id reality-tls · TLS 1.3 (Chrome JA4) Channel-binding Ключ на каждый профиль

Безопасность и надёжность

Защита ключа сервера, разграничение доступа, защита от подбора пароля и устойчивость к сбоям — встроены в протокол.

Защита подключения

  • Закрепление ключа сервераклиент пиннит ключ — подменный сервер не пройдёт
  • Привязка к рукопожатиюподмена данных в канале рвёт соединение (анти-MITM)
  • Обязательная проверка ключаклиенты без ключа отклоняются, ключ скрыт от сканеров

Доступ и атаки

  • Раздельный доступпрофили изолированы — чужой профиль недоступен
  • Защита от подбора пароляблокировка «пользователь + адрес», пароли на Argon2id
  • Защита от усиления атакответ ограничен ~3× от запроса — сервер невыгоден как DDoS-усилитель

Надёжность связи

  • Автопереподключениепри смене Wi-Fi и мобильной сети клиент сам переподключается за секунды
  • Устойчивый к сбоям DNSинтернет не пропадает после падения программы
  • Скрытый счётчик пакетовпоследовательный счётчик не виден на проводе
Data plane · новое в 0.8.1

UDP batching: меньше системных вызовов, тот же wire format

Linux и Android группируют уже готовые UDP-датаграммы в bounded-пачки до 32 через recvmmsg/sendmmsg. Таймер накопления не добавляется; порядок, roaming, pacing, фрагментация и PMTU fallback сохраняются.

01

Upload: 320,8 → 694,7 Мбит/с

Медиана чередующегося same-window A/B на двухъядерном стенде: +116,5%.

02

Download: 359,8 → 697,5 Мбит/с

На том же стенде и окне измерения: +93,9%.

03

Ниже относительная нагрузка CPU

−13,2% у upload-клиента и −7,9% у server download worker.

04

Отдельный релизный A/B

Этот узкий тест проверяет конкретную оптимизацию. Полный сравнительный benchmark 0.8.0 с 34 режимами сохранён ниже без изменения цифр.

Результат относится к конкретной двухъядерной лаборатории и не является обещанием одинаковой скорости на любом VPS, телефоне или сетевом пути. Методика и полный контекст релиза 0.8.1 →

Benchmark · 1 сентября 2026

Qeli 0.8.0: полный dual-stack прогон

Полный прогон охватывает 34 режима на одном стенде: две Debian VM с 2 vCPU и 2 GiB RAM, iperf3 3.18, MTU 1400, IPv4 и IPv6. Ниже отдельно показаны профильные результаты Qeli и сравнение транспортов с одинаковым уровнем маскировки.

01

Один стенд

Две Debian VM: по 2 vCPU и 2 GiB RAM, одинаковый сетевой путь, iperf3 3.18 и MTU 1400.

02

TCP без случайного пика

Четыре параллельных потока, три повтора. В таблице используется медиана, поэтому единичный удачный прогон не определяет результат.

03

IPv4 и IPv6

Для каждого режима измерены отдача и загрузка по обеим семьям адресов. Итог сравнения — среднее этих четырёх направлений.

04

Раздельные категории

Полностью маскируемые режимы сравниваются между собой. Частичная и отсутствующая маскировка показаны отдельно как контроль.

TCP P=4 · медиана трёх прогонов · IPv4

отдача (Мбит/с) загрузка (Мбит/с)
plainraw + recordizer
fake-tlsrecordizer
realityrecordizer
obfsrecordizer
reality-tlsrecordizer + H2

Все показанные профили Qeli 0.8.0 работали с обязательным PACKET_MUX_V1. Это медианы трёх TCP P=4-прогонов IPv4; значения IPv6 и все 12 профилей приведены в подробной таблице.

Средний найденный UDP ceiling по группам Qeli

IPv4/IPv6 и отдача/загрузка · Мбит/с
быстрые TCP-профили
тяжёлые TCP-профили
нативные UDP-профили

UDP ceiling — максимальная найденная предложенная скорость с успешным окном при потерях не более 1%. Это среднее четырёх направлений rep1; pass/n и медиана потерь каждого профиля доступны в полном отчёте.

Qeli 0.8.0: результаты всех 12 профилей

Все значения — Мбит/с, порядок в ячейке: отдача / загрузка. TCP P=4 — медиана трёх прогонов; UDP — найденный rep1 ceiling.

ПрофильTCP P=4 · IPv4TCP P=4 · IPv6UDP ceiling · IPv4UDP ceiling · IPv6
tcp-plain-raw + Recordizer1705 / 16891825 / 18071300 / 14501350 / 1425
tcp-faketls + Recordizer1752 / 16951823 / 18201225 / 14001300 / 1475
tcp-padding + Recordizer1751 / 16831841 / 17991175 / 14501325 / 1500
tcp-frag + Recordizer1774 / 16841834 / 18001350 / 14251250 / 1500
tcp-obfs + Recordizer1256 / 12931371 / 1386925 / 1200925 / 1200
tcp-reality + Recordizer1741 / 17051834 / 17861275 / 14001275 / 1450
tcp-reality-tls + Recordizer1212 / 10661219 / 1074925 / 1125975 / 1200
udp-faketls + Recordizer484 / 528458 / 507350 / 450325 / 450
udp-padding + Recordizer499 / 513468 / 512375 / 450375 / 500
udp-quic + Recordizer491 / 520473 / 506350 / 475325 / 475
tcp-obfs-awg + Recordizer1312 / 13001407 / 1389875 / 1175875 / 1175
udp-faketls-awg + Recordizer479 / 509479 / 515375 / 450350 / 475

Все 12 профилей Qeli использовали обязательный PACKET_MUX_V1; runtime подтвердил маркер PACKET_MUX_V1 active ... policy=required. Поэтому они относятся к группе с полной маскировкой. TCP-тест повторён трижды; полный отчёт содержит pass/n, медиану потерь, CV, CPU, RSS и kernel drops.

Как оценивается маскировка: форма рукопожатия, размеры и границы записей, интервалы и пакетирование, а также ответ на активную проверку. Это описание работающих механизмов, а не обещание «невидимости для DPI».

Отчёт и воспроизводимостьполный отчёт
Интерпретация

Что видно из результатов

  • Пять быстрых TCP-профилей Qeli образуют плотную группу около 1,7–1,8 Гбит/с; IPv6 не показывает заметного штрафа.
  • obfs, reality-tls и связка obfs + AWG меняют больше признаков внешнего трафика, но требуют больше вычислений.
  • UDP-транспорты нужно оценивать отдельно: их ceiling измеряет устойчивую предложенную нагрузку при потерях не более 1%.
Границы вывода

Чего этот тест не доказывает

  • Результат стенда не гарантирует ту же скорость на другом VPS, маршруте или процессоре.
  • Высокая пропускная способность не является оценкой стойкости к блокировкам или безопасности протокола.
  • Контрольные режимы без маскировки показывают масштаб производительности, но не участвуют в честном рейтинге маскируемых транспортов.
1767 Мбит/с
Среднее TCP P=4 быстрых TCP-профилей Qeli
1365 Мбит/с
Средний UDP ceiling быстрых TCP-профилей
409 Мбит/с
Средний UDP ceiling нативной UDP-линейки

Продуктовый агрегат всех 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 показывает нативный kernel dataplane, а OpenVPN UDP + DCO переносит data channel в ядро. Они могут быть быстрее именно потому, что не маскируют трафик, поэтому это не прямая победа над защищёнными конфигурациями.

Средняя TCP-скорость · IPv4 и IPv6

WireGuard plainбез маскировки · kernel baseline
AmneziaWG full 3.1
OpenVPN UDP + DCOбез маскировки · kernel offload
Qeli fast TCP + Recordizer
Qeli · 12 профилей
Hysteria 2 QUIC TLSчастичная маскировка
Xray VLESS REALITY Vision
Hysteria 2 Salamander
WireGuard + wg-obfuscator STUN
OpenVPN TCP + Cloak

Серые полосы — контрольные варианты без маскировки: 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.11900 UDP + DCO · без маскировки
453 TCP + Cloak
не измерялся997 REALITY Vision1134 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