Транспорт · Qeli 0.8.1

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

Как выбрать plain, fake-tls, obfs, reality, reality-tls или udp-quic, какие значения должны совпасть на сервере и клиенте и какие настройки меняют форму трафика.

Выбор

Шесть режимов без смешения терминов

Несущий транспорт задаётся отдельно от wire-режима. Поэтому fake-tls и obfs работают как поверх TCP, так и поверх UDP, а reality — это профиль fake-tls с включённым распознаванием клиента и проксированием чужих подключений.

РежимНесущий транспортСерверКлиентСмысл
plainTCPobf.mode=plainproto=tcp
mode=plain
Базовый шифрованный туннель без TLS-shaped слоя; только X25519
fake-tlsTCP / UDPobf.mode=fake-tlsmode=fake-tlsTLS-shaped ClientHello и записи, но не настоящий TLS
obfsTCP / UDPobf.mode=obfs
obf.obfs_key
mode=obfs
obfs_key
ChaCha20-обёртка с общим PSK; для TCP доступен WebSocket-fronting
realityTCPobf.mode=fake-tls
reality_proxy.enabled=true
real_tls=false
mode=fake-tls
reality_sid + sni
Сервер распознаёт своего клиента, а чужой ClientHello мостит на target; внутреннего TLS нет
reality-tlsTCPobf.mode=reality-tls
reality_proxy.enabled=true
real_tls=true
mode=reality-tls
key + reality_sid + sni
Туннель внутри настоящего TLS 1.3 с сертификатом целевого сайта
udp-quicUDPobf.mode=fake-tls
obf.quic.enabled=true
mode=udp-quicСокращение для UDP + fake-tls + QUIC-shaped framing
Два разных дефолта: встроенный профиль конфигурации использует fake-tls, а официальный установщик 0.8.1 разворачивает reality-tls на TCP/443.
Ограничение UDP: допустимы fake-tls и obfs, включая алиасы udp-quic и udp-obfs. plain, reality и reality-tls поверх UDP отвергаются проверкой.
Новое в релизе 0.8.0

Новый Reality/H2 carrier и PACKET_MUX_V1

В 0.8.0 изменяется не название режима, а его внутренний carrier: reality-tls после REALITY TLS 1.3 открывает настоящий HTTP/2 stream. Общий recordizer согласуется отдельно после AUTH и может работать поверх любого TCP/UDP carrier.

Carrier 0.8.0Политика recordizer
Один долгоживущий двунаправленный POST /v1/events/stream, ALPN h2, стандартные SETTINGS/HEADERS/DATA/WINDOW_UPDATE и batching 2–8 мс. Пользовательского переключателя H2 нет.prefer согласует PACKET_MUX_V1 с новым клиентом и оставляет legacy-клиента рабочим; required отвергает старый клиент до lease; off сохраняет прежний data plane.
server.conf · [profile:reality-tls]
obf.mode = reality-tls
obf.recordizer.policy = prefer
Для Reality/H2 qeli heartbeat принудительно отключён: liveness обеспечивает transport, а отдельные heartbeat frames создавали бы повторяемый признак. Промежуточный proxy/LB должен делать прозрачный TCP pass-through без TLS termination и H2 conversion.
Обновляйте сервер первым. Сервер 0.8.0 принимает новый H2 и legacy carrier; клиент 0.8.0 требует H2 и не делает downgrade. После обновления проверьте профиль и затем переходите к recordizer.policy=prefer.
До AUTH

Параметры, которые сервер ещё не может запушить

Wire-настройки нужны для самого рукопожатия, поэтому они должны быть известны клиенту заранее — из qeli:// или client.conf. Серверный push приходит только после успешного AUTH.

Ключ сервераКлюч клиентаПравило
bind.transportprotoДолжны совпасть: tcp или udp
obf.modemodeДолжны описывать один wire-режим; reality без inner TLS использует client mode=fake-tls
obf.obfs_keyobfs_keyОдин и тот же непустой PSK для obfs
obf.obfs_frontingfrontДля TCP obfs: websocket или none
reality_proxy.short_idsreality_sidКлиентский short ID должен входить в разрешённый список
reality_proxy.targetsniДля reality/reality-tls SNI обязан совпадать с target
obf.quic.enabledquicСервер распознаёт QUIC framing по соединению; флаг сервера добавляет quic=1 в выдаваемую ссылку
obf.awg.jcjcНа TCP obfs должен совпасть jc; на UDP junk является sender-only
Не редактируйте QR вручную. Выпускайте ссылку через панель или qeli add-client --link --link-profile <profile>: она возьмёт wire-параметры именно выбранного профиля.
Минимальные пары

Готовые настройки сервера и клиента

Показаны только transport-ключи. Адреса TUN, пул, пользователи, NAT и DNS добавляются как обычно и от выбранного режима не зависят. Замените демонстрационные short ID, ключ сервера и PSK своими значениями.

reality-tls · TCP

server.conf · [profile:reality-tls]
bind.transport = tcp
obf.mode = reality-tls
obf.tls.server_name = www.microsoft.com
obf.tls.reality_proxy.enabled = true
obf.tls.reality_proxy.target = www.microsoft.com
obf.tls.reality_proxy.target_port = 443
obf.tls.reality_proxy.real_tls = true
obf.tls.reality_proxy.short_ids = 0123456789abcdef
obf.padding.enabled = false
client.conf · [qeli]
proto = tcp
mode = reality-tls
key = <64-hex-server-key>
sni = www.microsoft.com
reality_sid = 0123456789abcdef

reality · TCP

server.conf + client.conf
[profile:reality]
bind.transport = tcp
obf.mode = fake-tls
obf.tls.server_name = www.microsoft.com
obf.tls.reality_proxy.enabled = true
obf.tls.reality_proxy.target = www.microsoft.com
obf.tls.reality_proxy.real_tls = false
obf.tls.reality_proxy.short_ids = fedcba9876543210

[qeli]
proto = tcp
mode = fake-tls
key = <64-hex-server-key>
sni = www.microsoft.com
reality_sid = fedcba9876543210

obfs · TCP

server.conf + client.conf
[profile:obfs]
bind.transport = tcp
obf.mode = obfs
obf.obfs_key = <strong-shared-secret>
obf.obfs_fronting = websocket

[qeli]
proto = tcp
mode = obfs
obfs_key = <strong-shared-secret>
front = websocket

udp-quic · UDP

server.conf + client.conf
[profile:udp-quic]
bind.transport = udp
obf.mode = fake-tls
obf.quic.enabled = true

[qeli]
mode = udp-quic
mtu = 0
Алиасы клиента: mode=udp-quic разворачивается в proto=udp + mode=fake-tls + quic=true; mode=udp-obfs — в proto=udp + mode=obfs.
REALITY

Распознавание клиента и настоящий TLS

REALITY-параметры принадлежат профилю. Неопознанный ClientHello перенаправляется на target; распознанный клиент получает либо обычный Qeli data plane, либо настоящий TLS 1.3 при real_tls=true.

КлючДефолтНазначение
obf.tls.server_namewww.cloudflare.comSNI, который сервер помещает в выдаваемую ссылку
reality_proxy.enabledfalseВключает классификацию своих клиентов и проксирование проб
reality_proxy.targetwww.cloudflare.comЦелевой HTTPS-хост; клиентский SNI должен совпасть
reality_proxy.target_port443Порт target
reality_proxy.short_idsпустоРазрешённые short ID: hex, не более 8 байт. При enabled=true нужен хотя бы один ID
reality_proxy.real_tlsfalsetrue включает настоящий TLS 1.3 для распознанного клиента
reality_proxy.handrolledtrueByte-grade TLS с заимствованной цепочкой сертификатов и зеркальным JA3S
reality_proxy.peek_timeout_ms1500Время ожидания ClientHello до классификации подключения
SNI не ротируется в REALITY. Для reality и reality-tls он должен совпадать с единственным target. Для нескольких front-доменов создайте несколько профилей.
Дополнительные оболочки

Obfs, QUIC-shaped framing и AWG junk

КлючДефолтНазначение
obf.obfs_keyОбязательный общий секрет для obfs; должен совпасть с client obfs_key
obf.obfs_frontingwebsocketTCP obfs: настоящие WebSocket binary frames или none
obf.quic.enabledfalseUDP: помечает выдаваемую ссылку для QUIC-shaped framing
obf.awg.enabledfalseДобавляет junk-пакеты до рукопожатия: TCP obfs и любой UDP-профиль
obf.awg.jc0Количество junk-пакетов, максимум 128
obf.awg.jmin / jmax40 / 300Диапазон размера; jmin ≤ jmax ≤ 1400, на UDP пакет ограничивается 1200
Разная синхронизация AWG: в TCP obfs сервер и клиент должны использовать одинаковый jc. В UDP клиент отправляет junk перед ClientHello, а сервер дёшево отбрасывает его — совпадение счётчика не требуется.
Форма потока

Padding, fragmentation, heartbeat и multipath

Это надстройки над базовым режимом. Они меняют размеры и тайминг записей либо число потоков, но не заменяют правильный transport/mode.

ГруппаОсновные дефолтыНазначение
obf.padding.*enabled=true
32..512
probability=1.0
Случайная добивка записей; для reality-tls обычно отключается как лишний слой
obf.fragmentation.*enabled=true
256..1024
max=4
Делит только ServerHello при рукопожатии, не data plane
obf.heartbeat.*enabled=true
15000 ms
16 B
Периодический keepalive/cover; shaping заменяет фиксированный heartbeat
obf.traffic_shaping.*enabled=false
mean=700 ms
budget=16384 B/s
Непериодический idle-cover; stealth дополнительно ограничивает скорость под нагрузкой
obf.traffic_normalization.*enabled=falseОкругляет размеры записей к заданным значениям
obf.anti_fingerprinting.*enabled=falseДобавляет джиттер ответа рукопожатия
obf.multipath.*enabled=false
max_streams=4
adaptive=false
Объединяет несколько TCP-соединений; на UDP не используется
Не отключайте всю liveness-политику UDP. Если heartbeat и shaping выключены, задайте конечный perf.connection.idle_timeout_secs, иначе исчезнувший UDP-клиент может долго удерживать IP и слот.
client.conf и qeli://

Клиентские transport-ключи

КлючДефолтНазначение
prototcpНесущий сокет tcp или udp
modefake-tlsplain, fake-tls, obfs, reality-tls либо алиасы udp-quic/udp-obfs
keyПиннинг ключа сервера; обязателен для reality-tls и политик require_client_key_proof/H-1
sniавтоFake-tls: заданное имя, hostname или случайный decoy при подключении по IP; REALITY: строго target
reality_sidShort ID для reality/reality-tls
obfs_keyPSK режима obfs
frontwebsocketFronting TCP obfs: websocket или none
quicfalseQUIC-shaped UDP handshake; alias udp-quic включает автоматически
awg / jc / jmin / jmaxoff / 0 / 40 / 300Предрукопожатная junk-последовательность
mtu00 принимает push; на UDP запускает path-MTU probe, если mtu_probe=true
recv_buffer_sizeauto 4→8/16 MiBUDP receive buffer; явное значение отключает авто-рост, 0 оставляет настройку ОС
send_buffer_size0UDP send buffer; 0 не меняет настройку ОС
Криптография: fake-tls, obfs, reality/reality-tls и UDP используют гибридный X25519 + ML-KEM-768. Plain использует X25519 без ML-KEM.
До restart

Проверка пары конфигов

Сначала проверьте серверный и клиентский INI отдельно, затем сравните выданную ссылку с выбранным профилем.

валидация и выпуск ссылки
$ sudo qeli check-config --config /etc/qeli/server.conf
$ qeli check-config --client --config /etc/qeli/client.conf
$ sudo qeli show-identity --config /etc/qeli/server.conf
$ sudo qeli add-client <user> --password '<strong-password>' --link --host vpn.example.com:443 \
    --link-profile <profile> --config /etc/qeli/server.conf
СимптомЧто проверить
Timeout до handshakebind.transport против proto, порт и firewall
Handshake discriminator / wire errormode, obfs_key, front, QUIC и AWG
REALITY bridge вместо AUTHreality_sid, SNI/target, key и режим real_tls
UDP profile rejectedИспользуйте fake-tls или obfs; multipath выключите
UDP работает только на малых пакетахmtu=0, mtu_probe, путь ICMP/DF и фактический PMTU

Полная диагностика по стадиям →

Первоисточники

Полные параметры и готовые профили

Ссылки закреплены на теге v0.8.1. Для практического старта удобнее multiprofile-пример, а CONFIG.md и отдельная страница recordizer содержат ограничения и значения по умолчанию.