Знакомство
Клиент ⇄ СерверСоединение начинается как обычный заход на сайт по HTTPS — обмен временными ключами.
Полный разбор: рукопожатие, все шесть транспортных режимов, криптография, измеренные бенчмарки и матрица сравнения. Для тех, кто хочет проверить детали.
Сервер подтверждает свою подлинность до того, как клиент отправит пароль, — перехватить пароль посреднику не удастся. Порядок шагов важен для безопасности.
Соединение начинается как обычный заход на сайт по HTTPS — обмен временными ключами.
Подлинность привязана к хешу всего рукопожатия — подмена ломает соединение.
Сервер доказывает владение ключом, клиент сверяет с закреплённым — до отправки пароля.
По защищённому каналу — логин и пароль; проверка Argon2id и доступ по профилю.
Каждый пакет шифруется и уходит в выбранном транспорте — HTTPS, WebSocket или QUIC.
Режим определяет, как трафик туннеля выглядит со стороны сети, и переключается одной настройкой — одинаково на сервере и клиенте. По умолчанию работает reality-tls; остальные — на выбор под задачу или как запасные каналы.
Главный режим Qeli: клиент шлёт браузерное рукопожатие TLS 1.3 (отпечаток JA4 t13d1516h2_8daaf6152771), а сервер терминирует настоящий TLS 1.3 (rustls) и несёт туннель внутри. Это полноценный TLS-канал — обычное защищённое HTTPS-соединение современного уровня. Работает на всех клиентах (Linux, Android, Windows, macOS) через общий realtls-движок.
ClientHello (Chrome JA4) → TLS 1.3 (rustls)
зашифрованный flight → туннель внутри настоящего TLS
Сырой обмен X25519 и голые записи [len][nonce][ct] — никакой TLS-обёртки и лишних слоёв. Самый быстрый и дешёвый по CPU режим (≈ как fake-tls по скорости). Нужен там, где дополнительный транспортный слой не требуется: доверенная сеть, внутренний канал. Только TCP.
обмен X25519 → [len][nonce][ct] · без TLS-обёртки
Соединение начинается с рукопожатия в формате TLS 1.3: клиент шлёт ClientHello с именем сайта (SNI), обменом ключами X25519 (key_share) и GREASE-значениями. Порядок TLS-расширений рандомизируется. Дальше данные идут в TLS-записях типа Application Data.
ClientHello · SNI · x25519 · 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 (rustls).
токен в session_id → опознан → туннель
нет токена → проксируем на реальный сайт :443
Для UDP датаграммы оформляются под заголовок QUIC версии 1. Зашифрованная датаграмма принимает форму QUIC short-header: первый байт — с установленным fixed-битом QUIC, затем 12-байтовый nonce как connection-id, далее защищённые данные. Начальная датаграмма добивается до ≥1200 байт (защита от усиления атак).
[flag 0x40|x][nonce:12 как conn-id][protected]
initial ≥ 1200 байт (анти-амплификация)
Современный криптостек: постквантовый обмен ключами (X25519 + ML-KEM-768), эфемерные ключи, шифрование с проверкой целостности и настоящий TLS в режиме REALITY. Вот что едет в каждом пакете.
Так выглядит один пакет. Ключи — X25519 + ML-KEM-768 (постквант) + HKDF-SHA256, шифр — ChaCha20-Poly1305 с проверкой целостности, пароли — Argon2id. В режиме reality-tls всё это едет внутри настоящего TLS 1.3 (внешний слой — AES-128-GCM).
Защита ключа сервера, разграничение доступа, защита от подбора пароля и устойчивость к сбоям — встроены в протокол.
Замеры на двух одинаковых серверах: по 2 ядра процессора, канал около 1 Гбит/с. Версия 0.7.1 (бета), 12 июня 2026 года.
plain, fake-tls и reality (proxy) — самые быстрые (~563–577 ↑ / ~697–721 ↓). Полностью зашифрованный режим (obfs) теряет 12–16% на двойном шифровании. У reality-tls загрузка ниже (~417 ↓) — цена настоящего TLS внутри туннеля (двойной AEAD на клиенте).
До 300 Мбит/с — практически без потерь (<0.15%). На 400 держит <0.5% потерь, к 500 насыщается (3–4%) — расшифровка не успевает на одном ядре процессора.
Узкое место — расшифровка на одном ядре процессора (worker ~34% в среднем, пики ~60%). На более мощном оборудовании скорость будет выше. Для сравнения, без VPN на том же стенде: TCP около 20 Гбит/с, UDP около 1 Гбит/с. 161 unit-тест зелёный, e2e всех режимов подтверждён на лабе.
Без маркетинга. Показатели Qeli измерены на нашем тестовом стенде; данные других решений — типовые опубликованные значения на сопоставимом оборудовании (2 ядра процессора, канал около 1 Гбит/с). В сравнение включены и приватные туннели, и обычные VPN — для ориентира.
WireGuard быстрее всех как базовый VPN. Среди приватных туннелей Qeli держит ~575 ↑ / ~715 ↓ Мбит/с стабильно — выше типового V2Ray и наравне с лучшими.
| Возможность | WireGuard | AmneziaWG | OpenVPN | Shadowsocks | V2Ray | Hysteria 2 | Qeli |
|---|---|---|---|---|---|---|---|
| Полноценный VPN (а не прокси) | да | да | да | прокси | прокси | прокси | да |
| Скорость | ★★★★★ | ★★★★ | ★★★ | ★★★ | ★★★ | ★★★★ | ★★★★ |
| Приватный транспорт | нет | ★★★ | нет | ★★★ | ★★★★ | ★★★★ | ★★★★ |
| Несколько транспортных режимов | нет | один | нет | плагины | ★★★★ | частично | ★★★★ plain / fake-tls / obfs / reality / reality-tls / quic |
| Настоящий TLS | нет | нет | реальный TLS | через плагин | TLS + REALITY | под HTTP/3 | да reality-tls · Chrome JA4 |
| Встроенная панель управления | нет | приложение | нет | нет | нет | нет | да |
| Защита от подбора пароля | нет | нет | плагин | нет | нет | нет | да |
| Закрепление ключа сервера | ключ узла | ключ узла | сертификат | пароль | да | сертификат | да |
| Раздельный доступ по профилям | нет | нет | нет | нет | частично | нет | да |
| Несколько профилей в одной службе | нет | нет | нет | нет | да | нет | да |
| Работа в ядре системы | да | да | нет | нет | нет | нет | нет |
| Независимый аудит безопасности | ★★★ | ★★ | ★★★ | ★★ | ★★★ | ★★ | нет |
| Постквантовая криптография | нет | нет | нет | нет | нет | нет | Постквантовое шифрование клиент отправляет ML-KEM-768 · сервер ожидает |
Один формат настроек для сервера, клиента и списка пользователей. Настройки клиента — это та же ссылка для подключения и QR-код.
# минимальный набор настроек
[qeli]
server = vpn.example.com:443
proto = tcp
mode = obfs
front = websocket
obfs = ОБЩИЙ-СЕКРЕТНЫЙ-КЛЮЧ
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