Транспортные режимы и параметры
Как выбрать plain, fake-tls, obfs, reality, reality-tls или udp-quic, какие значения должны совпасть на сервере и клиенте и какие настройки меняют форму трафика.
Шесть режимов без смешения терминов
Несущий транспорт задаётся отдельно от wire-режима. Поэтому fake-tls и obfs работают как поверх TCP, так и поверх UDP, а reality — это профиль fake-tls с включённым распознаванием клиента и проксированием чужих подключений.
| Режим | Несущий транспорт | Сервер | Клиент | Смысл |
|---|---|---|---|---|
plain | TCP | obf.mode=plain | proto=tcpmode=plain | Базовый шифрованный туннель без TLS-shaped слоя; только X25519 |
fake-tls | TCP / UDP | obf.mode=fake-tls | mode=fake-tls | TLS-shaped ClientHello и записи, но не настоящий TLS |
obfs | TCP / UDP | obf.mode=obfsobf.obfs_key | mode=obfsobfs_key | ChaCha20-обёртка с общим PSK; для TCP доступен WebSocket-fronting |
reality | TCP | obf.mode=fake-tlsreality_proxy.enabled=truereal_tls=false | mode=fake-tlsreality_sid + sni | Сервер распознаёт своего клиента, а чужой ClientHello мостит на target; внутреннего TLS нет |
reality-tls | TCP | obf.mode=reality-tlsreality_proxy.enabled=truereal_tls=true | mode=reality-tlskey + reality_sid + sni | Туннель внутри настоящего TLS 1.3 с сертификатом целевого сайта |
udp-quic | UDP | obf.mode=fake-tlsobf.quic.enabled=true | mode=udp-quic | Сокращение для UDP + fake-tls + QUIC-shaped framing |
fake-tls, а официальный установщик 0.8.1 разворачивает reality-tls на TCP/443.fake-tls и obfs, включая алиасы udp-quic и udp-obfs. plain, reality и reality-tls поверх UDP отвергаются проверкой.Новый 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. |
obf.mode = reality-tls
obf.recordizer.policy = prefer
recordizer.policy=prefer.Параметры, которые сервер ещё не может запушить
Wire-настройки нужны для самого рукопожатия, поэтому они должны быть известны клиенту заранее — из qeli:// или client.conf. Серверный push приходит только после успешного AUTH.
| Ключ сервера | Ключ клиента | Правило |
|---|---|---|
bind.transport | proto | Должны совпасть: tcp или udp |
obf.mode | mode | Должны описывать один wire-режим; reality без inner TLS использует client mode=fake-tls |
obf.obfs_key | obfs_key | Один и тот же непустой PSK для obfs |
obf.obfs_fronting | front | Для TCP obfs: websocket или none |
reality_proxy.short_ids | reality_sid | Клиентский short ID должен входить в разрешённый список |
reality_proxy.target | sni | Для reality/reality-tls SNI обязан совпадать с target |
obf.quic.enabled | quic | Сервер распознаёт QUIC framing по соединению; флаг сервера добавляет quic=1 в выдаваемую ссылку |
obf.awg.jc | jc | На TCP obfs должен совпасть jc; на UDP junk является sender-only |
qeli add-client --link --link-profile <profile>: она возьмёт wire-параметры именно выбранного профиля.Готовые настройки сервера и клиента
Показаны только transport-ключи. Адреса TUN, пул, пользователи, NAT и DNS добавляются как обычно и от выбранного режима не зависят. Замените демонстрационные short ID, ключ сервера и PSK своими значениями.
reality-tls · TCP
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
proto = tcp
mode = reality-tls
key = <64-hex-server-key>
sni = www.microsoft.com
reality_sid = 0123456789abcdef
reality · TCP
[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
[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
[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.Распознавание клиента и настоящий TLS
REALITY-параметры принадлежат профилю. Неопознанный ClientHello перенаправляется на target; распознанный клиент получает либо обычный Qeli data plane, либо настоящий TLS 1.3 при real_tls=true.
| Ключ | Дефолт | Назначение |
|---|---|---|
obf.tls.server_name | www.cloudflare.com | SNI, который сервер помещает в выдаваемую ссылку |
reality_proxy.enabled | false | Включает классификацию своих клиентов и проксирование проб |
reality_proxy.target | www.cloudflare.com | Целевой HTTPS-хост; клиентский SNI должен совпасть |
reality_proxy.target_port | 443 | Порт target |
reality_proxy.short_ids | пусто | Разрешённые short ID: hex, не более 8 байт. При enabled=true нужен хотя бы один ID |
reality_proxy.real_tls | false | true включает настоящий TLS 1.3 для распознанного клиента |
reality_proxy.handrolled | true | Byte-grade TLS с заимствованной цепочкой сертификатов и зеркальным JA3S |
reality_proxy.peek_timeout_ms | 1500 | Время ожидания ClientHello до классификации подключения |
Obfs, QUIC-shaped framing и AWG junk
| Ключ | Дефолт | Назначение |
|---|---|---|
obf.obfs_key | — | Обязательный общий секрет для obfs; должен совпасть с client obfs_key |
obf.obfs_fronting | websocket | TCP obfs: настоящие WebSocket binary frames или none |
obf.quic.enabled | false | UDP: помечает выдаваемую ссылку для QUIC-shaped framing |
obf.awg.enabled | false | Добавляет junk-пакеты до рукопожатия: TCP obfs и любой UDP-профиль |
obf.awg.jc | 0 | Количество junk-пакетов, максимум 128 |
obf.awg.jmin / jmax | 40 / 300 | Диапазон размера; jmin ≤ jmax ≤ 1400, на UDP пакет ограничивается 1200 |
jc. В UDP клиент отправляет junk перед ClientHello, а сервер дёшево отбрасывает его — совпадение счётчика не требуется.Padding, fragmentation, heartbeat и multipath
Это надстройки над базовым режимом. Они меняют размеры и тайминг записей либо число потоков, но не заменяют правильный transport/mode.
| Группа | Основные дефолты | Назначение |
|---|---|---|
obf.padding.* | enabled=true32..512probability=1.0 | Случайная добивка записей; для reality-tls обычно отключается как лишний слой |
obf.fragmentation.* | enabled=true256..1024max=4 | Делит только ServerHello при рукопожатии, не data plane |
obf.heartbeat.* | enabled=true15000 ms16 B | Периодический keepalive/cover; shaping заменяет фиксированный heartbeat |
obf.traffic_shaping.* | enabled=falsemean=700 msbudget=16384 B/s | Непериодический idle-cover; stealth дополнительно ограничивает скорость под нагрузкой |
obf.traffic_normalization.* | enabled=false | Округляет размеры записей к заданным значениям |
obf.anti_fingerprinting.* | enabled=false | Добавляет джиттер ответа рукопожатия |
obf.multipath.* | enabled=falsemax_streams=4adaptive=false | Объединяет несколько TCP-соединений; на UDP не используется |
perf.connection.idle_timeout_secs, иначе исчезнувший UDP-клиент может долго удерживать IP и слот.Клиентские transport-ключи
| Ключ | Дефолт | Назначение |
|---|---|---|
proto | tcp | Несущий сокет tcp или udp |
mode | fake-tls | plain, 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_sid | — | Short ID для reality/reality-tls |
obfs_key | — | PSK режима obfs |
front | websocket | Fronting TCP obfs: websocket или none |
quic | false | QUIC-shaped UDP handshake; alias udp-quic включает автоматически |
awg / jc / jmin / jmax | off / 0 / 40 / 300 | Предрукопожатная junk-последовательность |
mtu | 0 | 0 принимает push; на UDP запускает path-MTU probe, если mtu_probe=true |
recv_buffer_size | auto 4→8/16 MiB | UDP receive buffer; явное значение отключает авто-рост, 0 оставляет настройку ОС |
send_buffer_size | 0 | UDP send buffer; 0 не меняет настройку ОС |
Проверка пары конфигов
Сначала проверьте серверный и клиентский 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 до handshake | bind.transport против proto, порт и firewall |
| Handshake discriminator / wire error | mode, obfs_key, front, QUIC и AWG |
| REALITY bridge вместо AUTH | reality_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 содержат ограничения и значения по умолчанию.