VLESS REALITY
Профиль VLESS: REALITY поверх TCP и XHTTP или TLS с XHTTP и WebSocket, напрямую или за CDN. Когда выбирать его вместо Hysteria2, все настройки, цель REALITY, порты и что получают и что требуют приложения.
На этой странице
VLESS — протокол поверх TCP. С REALITY ему не нужен собственный сертификат: всех, кто не клиент, нода просто передаёт настоящему сайту — цели, — поэтому проверяющий видит подлинное TLS-рукопожатие этого сайта. Человека с правильными ключами нода узнаёт прямо внутри того же рукопожатия и пускает в туннель. На этой странице — настройки профиля VLESS и что они делают; как профиль создаётся и ставится на ноды, описано в разделе Профили, а как он уживается с Hysteria2 на одной ноде — в разделе VLESS и Hysteria2 на одной ноде.
VLESS поддерживает REALITY поверх TCP и XHTTP, а также XHTTP+TLS и WebSocket+TLS. TLS можно использовать напрямую с доменным сертификатом ACME или через CDN.
Когда выбирать#
Hysteria2 и VLESS могут лежать в одной подписке; приложение (или человек) пользуется тем, что подключается.
| Hysteria2 | VLESS REALITY | |
|---|---|---|
| Транспорт | UDP (QUIC) | TCP |
| Где выручает | Каналы с потерями и большим расстоянием: QUIC восстанавливается быстрее | Сети, которые режут или блокируют UDP и QUIC, а так делают многие мобильные и офисные сети |
| Сертификат и домен | Для Let's Encrypt нужен домен; самоподписанный работает и на IP | На ноде не нужны. Работает на ноде, известной только по IP |
| Порт 80 | Нужен для Let's Encrypt | Не нужен |
| Нагрузка на ноду | Небольшая | Выше: нода копирует каждый байт в пользовательском пространстве; из двух транспортов VLESS дешевле TCP с Vision |
Начните с Hysteria2, а VLESS добавьте тем, у кого сеть мешает, или сначала попробуйте на нескольких людях: см. Пробуем VLESS на нескольких людях.
Настройки#
Редактор раскладывает настройки по группам Основное, Обфускация и Продвинутое. Критичные настройки ломают уже выданные людям серверы, пока их приложение не обновит подписку; перед их сохранением редактор переспрашивает (см. Профили).
| Настройка | По умолчанию | Критичная | Что делает |
|---|---|---|---|
| TCP-порт | 443 | да | TCP-порт, на котором слушает нода. От 1 до 65535, кроме 80. |
| Транспорт | XHTTP | да | XHTTP, TCP (RAW + Vision) или WebSocket с TLS. Для TCP Vision включён всегда. |
| Защита | REALITY | да | REALITY или TLS. TCP с Vision доступен только с REALITY; WebSocket — только с TLS. |
| Сертификат источника | Let's Encrypt | да | Только для TLS: прямому подключению нужен доменный сертификат ACME. Самоподписанный сертификат разрешён только за CDN, который принимает такой сертификат. |
| Имя источника | домен ноды | да | Только для TLS: имя сертификата ноды. Переопределение Domain (SNI) для входящего подключения имеет приоритет. |
| Хост и порт CDN | пусто, 443 | да | Только для TLS: клиент подключается к этому адресу и использует хост CDN в Host и SNI. Подключение CDN к источнику остаётся зашифрованным TLS. |
| Какой сайт видят все остальные | Сайт этой ноды | да | Сайт этой ноды — собственный сайт ноды с её сертификатом Let's Encrypt. Другой сайт — настоящий сайт, который вы называете. См. ниже. |
| Цель host:port | нет | да | Только для другого сайта: сайт, который REALITY показывает всем остальным, например www.example.org:443. Для другого сайта обязательно, для сайта ноды не показывается. |
| Имена сервера | пусто | да | Только для другого сайта: до 8 имён, на которые выдан сертификат цели. Пусто — хост цели. Нужны, если цель задана IP-адресом. Подстановочные знаки не допускаются. |
| Короткие ID | два, сгенерированы | да | От 1 до 8 шестнадцатеричных значений чётной длины, не длиннее 16 символов. Каждому устройству достаётся одно из них. |
| Отпечаток клиента | Chrome | нет | Какой браузер имитирует TLS-рукопожатие клиента: Chrome, Firefox, Safari, iOS, Edge или случайный. |
| Путь XHTTP | сгенерирован | да | Начинается с /, не длиннее 64 символов: буквы, цифры и / _ -. Новый профиль получает случайный. |
| Заголовок Host для XHTTP | пусто | да | Пусто — заголовка нет. |
| Режим XHTTP | Авто | нет | Авто, Packet up, Stream up или Stream one. Выбирает клиент; нода принимает любой. |
| Заполнение XHTTP | 100-1000 | да | Случайное заполнение каждого запроса в виде мин-макс, от 1 до 4096 байт. |
| Путь и хост WebSocket | случайный, пусто | да | Только для TLS. На сервере хост пустой; клиент использует хост CDN, если он задан, иначе необязательное значение Host WebSocket. |
| Выход | Напрямую | нет | Напрямую или WARP. См. WARP. |
Настройки XHTTP действуют только на транспорт XHTTP. Какое имя сервера и какой короткий ID достанутся устройству, определяется самим устройством, поэтому его ссылка не меняется от одного обновления подписки к другому.
TLS и CDN#
Выберите TLS с XHTTP или WebSocket для прямого подключения или CDN. Для прямого подключения нужен доменный сертификат ACME. Нода может ответить на TLS-ALPN-01 через TCP 443 и на HTTP-01 через TCP 80, если порт свободен. Сертификат выпускается по запросу и обновляется без перезапуска входящего подключения.
Для CDN укажите его хост и порт. Клиент подключается к этому адресу и отправляет хост CDN одновременно в Host и SNI. CDN подключается к ноде по TLS; Mistgate не настраивает незашифрованное HTTP-подключение к источнику. Для CDN режим XHTTP по умолчанию — Packet up, поскольку некоторые CDN буферизуют тело запроса целиком. Используйте Stream up, только если CDN передаёт тело потоком. WebSocket+TLS служит запасным транспортом, если XHTTP не работает с CDN.
Самоподписанный сертификат источника подходит только для CDN, настроенного принимать непроверенный сертификат источника. Для прямого подключения к ноде он не подходит.
У каждого устройства одна личность VLESS — UUID, общий для всех серверов VLESS этого устройства. Он создаётся при очередном обновлении подписки устройством. Нода хранит UUID как есть, потому что VLESS сверяет их сам; у Hysteria2 иначе: нода хранит только хеш.
VLESS за CDN#
CDN встаёт между клиентом и нодой: клиент подключается к CDN, а CDN подключается к ноде. Это помогает там, где адрес ноды заблокирован, а адрес CDN нет.
В профиле выберите Защита: TLS, транспорт (XHTTP или WebSocket) и заполните Хост CDN — имя, к которому подключаются клиенты, например cdn.example.org. Тогда в каждой ссылке это имя стоит как адрес, как имя сервера (SNI) и как заголовок Host, а XHTTP начинается с Packet up. Своё имя нода оставляет для сертификата; клиенты им не пользуются.
Что настроить на стороне CDN:
- Источник: собственное имя ноды (Имя сервера профиля или домен ноды) и TCP-порт профиля. Запись DNS этого имени держите только DNS (без проксирования через CDN): CDN должен достучаться до ноды, и Let's Encrypt тоже.
- Разрешённые запросы: GET и POST на путь профиля. XHTTP отправляет данные запросами POST, а получает их одним длинным GET. Если CDN пропускает только GET, ничего не заработает.
- Кеширование: выключено для этого пути. CDN не должен ни хранить ответы, ни переделывать их.
- WebSocket: если транспорт профиля — WebSocket, включите его на CDN.
- Сертификат источника: источник всегда TLS, никогда не простой HTTP, потому что заголовок VLESS прошёл бы по сети открытым. Let's Encrypt работает, если CDN проверяет сертификат источника. Самоподписанный сертификат работает, только если CDN настроен его не проверять, и Mistgate разрешает его лишь профилю с хостом CDN.
- Порт источника: некоторые CDN передают трафик только на фиксированный список портов. Возьмите порт, который CDN поддерживает (надёжнее всего 443).
Если XHTTP зависает, возможно, CDN копит тело запроса целиком: оставьте Packet up. Если всё равно не работает, сделайте второй профиль с WebSocket; люди увидят оба. Против CDN, который рвёт простаивающие соединения через 60-100 секунд, нода шлёт на тихой загрузке заполнение-пульс; на настоящем CDN это тоже не проверялось.
настоящие CDN пока не проверены. Весь путь — от клиента через TLS-часть ноды в интернет — проверяется в сквозном прогоне проекта, где роль CDN играет сама нода. Как конкретный CDN обходится с долгими загрузками, размерами запросов и простаивающими соединениями, неизвестно, пока кто-то не попробует.
Собственный сайт ноды#
Так по умолчанию. Нода держит за REALITY собственный веб-сайт — тот же, что показывает её профиль Hysteria2 (см. Сайт-приманка). Посетитель домена ноды на TCP 443 видит этот сайт с собственным сертификатом Let's Encrypt ноды, и то же видит тот, кто зашёл по QUIC, так что в ноде нет ничего, что указывало бы на заимствованный сайт. Не нужно выбирать, проверять и передавать посторонних чужому сайту.
Что для этого нужно:
- Домен. Let's Encrypt выдаёт сертификаты только на домены. Адрес ноды должен быть именем хоста с A-записью на ноду, либо для профиля на этой ноде вы вписываете домен (Домен (SNI) при добавлении профиля на ноду). На ноде, известной только по IP, панель отказывает и говорит об этом; там берите профиль, где цель — другой сайт.
- Агент v0.1.35 или новее. Старые агенты эту цель не знают. Панель им её не отправляет: профиль на такой ноде показан как не запустившийся с причиной «агент слишком старый», остальное на ноде не затрагивается. Обновите ноду на странице Обновления. Профилю с другим сайтом в роли цели нужен только агент, в котором вообще есть VLESS.
- Открытый TCP 443, если хотите, чтобы сертификат продлевался.
Сертификат. Пока Let's Encrypt его не выдал, сайт показывает самоподписанный сертификат на то же имя, поэтому клиенты и посетители не ждут выдачи; потом сайт переходит на сертификат Let's Encrypt. Для продления TCP 80 не нужен: Let's Encrypt спрашивает по TCP 443 (TLS-ALPN-01), REALITY передаёт этот запрос собственному сайту ноды, и сайт отвечает. TCP 80, если он свободен, по-прежнему подходит. Срок действия сертификата появляется на странице ноды, когда сертификат есть, а за ним следит тревога Сертификат скоро истечёт.
Цель этого вида нода не проверяет (внешнего, что проверять, нет), и первый клиент после запуска не ждёт.
Как выбрать другой сайт в роли цели REALITY#
Выберите Другой сайт, чтобы нода передавала посетителей настоящему сайту, который вы назвали. Цель — сайт, под который маскируется ваша нода. От неудачного выбора нода легко отличается от настоящего сайта или рукопожатия просто не проходят.
- Сайт должен поддерживать TLS 1.3 и постквантовый обмен ключами X25519MLKEM768. Большинство крупных современных сайтов его поддерживают. Проверить можно OpenSSL 3.5 или новее:
openssl s_client -connect www.example.org:443 -tls1_3 -groups X25519MLKEM768. - Лучше сайт в той же сети (ASN), что и нода, или хотя бы в той же стране и недалеко: адрес совпадает с тем, к которому подключается посетитель, а рукопожатие быстрое.
- Берите сайт, который стабильно работает и не заблокирован там, где живут ваши люди: нода обращается к нему при каждом посетителе.
- Не берите сайт за общим CDN или крупным анонимизирующим прокси: чужой человек сможет использовать вашу ноду как переходник к нему. Не берите свою панель, другие свои ноды и вообще сайты, которые вы ведёте.
- В цели пишите точный хост, а в Именах сервера — имена из его сертификата. Если оставить имена пустыми, возьмётся хост цели; когда цель задана IP-адресом, редактор попросит имена.
При старте сервера нода один раз обращается к цели с рукопожатием TLS 1.3, предлагающим X25519MLKEM768, и записывает результат в детали здоровья сервера: цель не отвечает, не поддерживает TLS 1.3 или не предлагает этот обмен. Плохая цель — это предупреждение, сервер из-за неё не останавливается.
после запуска агента, а также когда впервые появляется новая цель или новое имя сервера, первому клиенту может понадобиться 5–10 секунд, чтобы подключиться. Нода один раз измеряет, как отвечает цель, и дальше все подключения быстрые.
Порты#
По умолчанию — TCP 443. Порт в UFW нода открывает сама, с комментарием mistgate-node-managed-tcp-v1-<порт>; в firewalld или в файрволе хостера порт открываете вы. Порт 80 не принимается: он занят под Let's Encrypt.
На TCP 443 свой сайт показывает и профиль Hysteria2. Профиль VLESS с другим сайтом в роли цели на TCP 443 той же ноды приостанавливает этот сайт; если целью служит собственный сайт ноды, REALITY показывает тот же сайт, и ничего не теряется; сам Hysteria2, работающий по UDP, это не затрагивает. Прочитайте VLESS и Hysteria2 на одной ноде, прежде чем так делать.
Два профиля не могут слушать один TCP-порт ноды. TCP- и UDP-порт с одним номером друг другу не мешают.
Что получают приложения#
VLESS несут четыре формата (два ниже, Xray JSON и sing-box JSON); какой получит приложение, решают правила в разделе Подписки. VLESS идёт через тот же переключатель, что и Hysteria2, — переключатель приложений по ссылке в Приложения в подписке: кто получает серверы Hysteria2, получает и серверы VLESS своей группы.
Список ссылок. По ссылке на каждый сервер; её читают Happ и другие приложения. XHTTP с REALITY:
vless://<uuid>@de1.example.com:443?encryption=none&fp=chrome&mode=auto&path=%2Fq8x2kd7w&pbk=<публичный ключ>&security=reality&sid=6ba85179&sni=www.example.org&spx=%2F57999bb8&type=xhttp#de1%20%C2%B7%20vless%20%C2%B7%20443У TCP с Vision стоят flow=xtls-rprx-vision и type=tcp, а mode, path и extra нет. host появляется, если вы задали заголовок Host для XHTTP, а extra — если заполнение не 100-1000. В ссылке только то, что отличается от умолчаний приложения: записанное явно значение по умолчанию стало бы отпечатком.
Mihomo YAML. Приложения на ядре mihomo (kl!ck, Clash Verge, FlClash и другие) получают по прокси на каждый сервер:
- name: "🇩🇪 DE · VLESS"
type: vless
server: "de1.example.com"
port: 443
uuid: "<uuid>"
udp: true
packet-encoding: xudp
tls: true
servername: "www.example.org"
client-fingerprint: chrome
skip-cert-verify: false
network: xhttp
xhttp-opts:
path: "/q8x2kd7w"
mode: auto
reality-opts:
public-key: "<публичный ключ>"
short-id: "6ba85179"С TCP вместо xhttp-opts стоят network: tcp и flow: xtls-rprx-vision.
Если адрес ноды — не простое имя хоста и не IP-адрес, ссылки на такой сервер не будет вовсе.
Что нужно приложениям#
- Приложение, которое читает ссылки VLESS REALITY (Happ и большинство приложений семейства Xray), или приложение на ядре mihomo. Вывод для Mihomo Mistgate проверяет на Mihomo 1.19.32.
- XHTTP новее, чем TCP с Vision. Если старое приложение не подключается к серверу XHTTP, сделайте второй профиль с транспортом TCP: люди увидят оба.
- TCP-порт должен доходить до ноды. Если хостер его фильтрует, приложение будет упираться в таймаут.
Ограничения сейчас#
- Проверка «глазами клиента» на панели теперь тестирует VLESS с теми же параметрами клиента, что и ссылка подписки, включая рукопожатие и туннель. См. Здоровье.
- Проверить порты на странице ноды показывает, доходит ли TCP-соединение до Mistgate с одной другой ноды, см. Ноды. Это одна точка наблюдения, полного рукопожатия REALITY проверка не делает. Чтобы увидеть то, что видит клиент, проверьте порт из другой сети (
nc -vz de1.example.com 8443) или подключитесь с телефона. - sing-box JSON несёт VLESS только по TCP (RAW + Vision) и WebSocket, без XHTTP; Xray JSON и Mihomo YAML несут все варианты. См. что где работает.
- VLESS за CDN пока не проверен на настоящем CDN, см. VLESS за CDN.