3x-ui: установка и настройка VLESS + Reality
Установка 3x-ui и настройка VLESS + Reality с XTLS Vision на своём VPS и домене: закрытая панель, свой сайт для маскировки, клиенты и что делать при блокировках.
Xray с Reality отвечает на TLS-рукопожатие от имени сайта-цели — в этой статье это ваш собственный сайт на том же сервере. Своих клиентов он узнаёт по ключу внутри рукопожатия, а всех остальных, включая системы активного зондирования, пропускает к сайту. Поэтому Reality блокируют по косвенным признакам: IP-адрес, правдоподобие пары «адрес + SNI», отпечаток клиента, объём и число соединений. Почти каждая настройка ниже нужна, чтобы эти признаки не выдавали сервер.
Актуально на сентябрь 2026 года: 3x-ui v3.8.5 со встроенным Xray-core v26.9.9; команды и значения по умолчанию сверены с официальным репозиторием.
Что понадобится
- VPS ForestsNet Cloud с актуальной Ubuntu или Debian и доступ по SSH под
root— см. «Консоль VNC и первое подключение». Если на сервере уже что-то стоит, проще начать с чистой системы. - Свой домен или поддомен с A-записью на IP сервера — см. «Как привязать домен к серверу». Запись должна вести прямо на сервер, без проксирования Cloudflare.
- Свободный порт 443: на нём не должен работать nginx или другой веб-сервер — сайт для маскировки встанет на локальный порт 8443.
- Для личного VPN хватает 1 vCPU и 1 ГБ памяти.
Шаг 1. Подготовьте сервер
Обновите систему и закройте всё входящее, кроме SSH, 80 и 443. Порт 80 нужен для выпуска и продления сертификата вашего сайта, а порт панели открывать не нужно: в шаге 3 вы будете заходить в неё через SSH-туннель.
apt update && apt full-upgrade -y
apt install -y curl ufw
ufw default deny incoming
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enableПодробнее о правилах — в статье «Файрвол ufw: порты».
Шаг 2. Установите 3x-ui
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)Конкретную версию ставят, дописав в конец тег, например v3.8.5, — пригодится, если свежий выпуск что-то сломал. С v3.8.0 скрипт сверяет архив с опубликованной суммой SHA-256.
Установщик задаст три вопроса:
- База данных — SQLite (пункт 1). PostgreSQL нужен при сотнях клиентов.
- Порт панели — ответьте
n, и скрипт выберет случайный порт из диапазона 1024–62000. - SSL для панели — не жмите Enter не глядя. По умолчанию выбирается сертификат Let's Encrypt на IP-адрес: он живёт около шести дней и продлевается через порт 80, который в шаге 4 займёт веб-сервер вашего сайта. Выберите пункт 4 (без SSL) и ответьте
yна вопрос о привязке панели к 127.0.0.1 — тогда панель не видна из интернета вовсе.
В конце скрипт выведет логин, пароль, порт и WebBasePath — случайный путь панели из 18 символов. Те же данные лежат в /etc/x-ui/install-result.env, доступном только root. Текущие настройки показывает x-ui settings, меню управления открывает x-ui без аргументов.
Шаг 3. Закройте панель от интернета
Панель ищут сканеры, а уязвимости находят в любом проекте. Есть и довод, специфичный для Reality: порт 443 изображает чужой сайт, а страница входа 3x-ui на соседнем порту выдаёт, чем сервер занят на самом деле.
Панель, привязанную к 127.0.0.1, открывают через SSH-туннель. На своём компьютере (OpenSSH есть в Linux, macOS и Windows 10/11) выполните:
ssh -L 2222:127.0.0.1:ПОРТ_ПАНЕЛИ root@IP_СЕРВЕРАПока сессия открыта, панель доступна по адресу http://localhost:2222/WEBBASEPATH/, а трафик идёт внутри SSH. Если при установке вы не привязали панель к локальному адресу, сделайте это сейчас:
/usr/local/x-ui/x-ui setting -listenIP 127.0.0.1
x-ui restartЕсли панель нужна снаружи — только с сертификатом на домен, на случайном порту, с длинным WebBasePath и 2FA, а порт открывайте лишь для своего адреса: ufw allow from ВАШ_IP to any port ПОРТ_ПАНЕЛИ proto tcp.
После первого входа смените логин и пароль и включите двухфакторную аутентификацию (TOTP) в настройках панели. Сервер подписок включён по умолчанию и слушает порт 2096 на всех адресах: если подписки не нужны, выключите его в разделе «Подписка», если нужны — подключите сертификат, иначе ссылка и параметры подключения идут открытым текстом.
Шаг 4. Поднимите свой сайт для маскировки
Цель (поле «Цель», в конфиге Xray — target, старое имя dest) — сайт, чьим TLS-рукопожатием прикрывается сервер, а SNI (serverNames) — его имя, которое клиент отправляет открытым текстом. Провайдер видит именно пару «IP сервера + SNI». Здесь цель — ваш сайт на этом же сервере: домен указывает на адрес сервера, сертификат выпущен на этот домен, и пара «IP + SNI» честная.
На серверах ForestsNet Cloud Reality разрешён только так: выдавать сервер за чужой сайт — указывать в SNI, цели или сертификате домен, который вам не принадлежит, — запрещено Условиями использования. Такие настройки приводят к блокировкам адресов, а блокировки бьют по всем клиентам сети.
Чужая цель плоха и технически. www.microsoft.com, www.apple.com, dl.google.com стоят на тысячах серверов, и такой сервер находится одним запросом к логам: популярный SNI, гигабайты трафика, сеть, которая владельцу домена не принадлежит. Xray 26.9 даже предупреждает в логе, если SNI содержит apple, icloud или microsoft либо оканчивается на .ru, .ir или .cn.
Схема такая: nginx отдаёт сайт на 127.0.0.1:8443 с сертификатом Let's Encrypt, а порт 80 держит для его выпуска; Xray на 443 пропускает к nginx всех, кто не прошёл проверку Reality. Домен в примерах — cloud.example.com. Выбирайте нейтральное имя, без vpn или proxy: SNI провайдер видит открытым текстом. Поставьте nginx и certbot, создайте каталог сайта и уберите стандартный сайт nginx, чтобы по IP сервера не открывалась страница-заглушка:
apt install -y nginx certbot
mkdir -p /var/www/cloud
rm /etc/nginx/sites-enabled/defaultСоздайте /etc/nginx/sites-available/cloud с блоком для порта 80 — через него certbot подтвердит домен:
server {
listen 80;
server_name cloud.example.com;
root /var/www/cloud;
location /.well-known/acme-challenge/ { }
location / { return 301 https://$host$request_uri; }
}Включите сайт и выпустите сертификат. Команда certbot --nginx без certonly здесь не подойдёт: она допишет в конфиг порт 443, а его занимает Xray.
ln -s /etc/nginx/sites-available/cloud /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
certbot certonly --webroot -w /var/www/cloud -d cloud.example.com --deploy-hook "systemctl reload nginx"Допишите в тот же файл блок самого сайта и снова выполните nginx -t && systemctl reload nginx:
server {
listen 127.0.0.1:8443 ssl http2;
server_name cloud.example.com;
ssl_certificate /etc/letsencrypt/live/cloud.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/cloud;
}Reality нужен TLS 1.3 — отсюда строка ssl_protocols; параметр http2 в listen понимают и старые версии nginx из Debian и Ubuntu. Вместо nginx подойдёт Caddy, принцип тот же: сайт на 127.0.0.1:8443, сертификат через порт 80.
Сайт должен быть живым и подходить к имени домена: несколько страниц, картинки, favicon, а не страница «Welcome to nginx». Положите туда и файл на пару мегабайт, например photo.jpg, — он пригодится для проверок в конце статьи. Проверьте сайт на сервере, ответ должен начинаться с HTTP/2 200:
curl -sI --resolve cloud.example.com:8443:127.0.0.1 https://cloud.example.com:8443/ | head -1Шаг 5. Создайте инбаунд VLESS + Reality + Vision
В панели откройте «Входящие» → «Создать подключение»:
- Вкладка «Основное»: протокол
vless, порт443. - Вкладка «Поток»: транспорт
RAW— это обычный TCP. - Вкладка «Безопасность»:
Reality, uTLS —chrome, «Цель» —127.0.0.1:8443(с портом, иначе Xray не запустится), SNI —cloud.example.com. - «Получить новый сертификат» сгенерирует пару ключей x25519. Пустые Short IDs и SpiderX заполните кнопками обновления рядом с полями.
- «Мин. версия клиента», «Макс. разница во времени», mldsa65 и ограничения fallback оставьте пустыми.
- Вкладка «Сниффинг»: включите с
http,tlsиquic— без сниффинга не работают правила маршрутизации, в том числе встроенный запрет BitTorrent.
Почему так:
- Порт 443. Настоящий HTTPS живёт на 443, и Xray предупреждает в логе, если Reality слушает другой порт.
- Отпечаток chrome. Клиент подделывает приветствие TLS (ClientHello) под браузер. С Xray v26.9.8 сервер Reality отвергает ClientHello без ключа X25519MLKEM768, как у современных браузеров. Из пресетов Xray-клиента этому отвечают
chrome,firefoxиsafari;randomиrandomizedразработчики XTLS сейчас не советуют. - Short ID — hex-строка чётной длины до 16 символов. Удалив значение из списка, вы отзываете доступ у клиентов с ним.
- Приватный ключ остаётся на сервере, клиенты получают публичный. Его тоже не раздавайте: в Xray поле даже переименовали в
password. - «Мин. версия клиента» пустая. В Xray v26.7.x пустое поле означало минимум 26.3.27, и сторонние клиенты получали отказ с верными ключами; с v26.9.8 пустое поле — «без ограничения».
- mldsa65 без необходимости не включайте: если цепочка сертификатов цели короче 3500 байт, соединения молча уходят в fallback.
Результат в JSON инбаунда выглядит так:
"realitySettings": {
"target": "127.0.0.1:8443",
"serverNames": ["cloud.example.com"],
"privateKey": "<приватный ключ x25519>",
"shortIds": ["6ba85179e30d4fc2"]
}После сохранения проверьте journalctl -u x-ui -n 50 --no-pager | grep XRAY: предупреждения Xray о цели или порте появятся там. Затем откройте https://cloud.example.com в браузере без VPN — должен открыться ваш сайт с действующим сертификатом. Это Xray не узнал в вас клиента и пропустил к nginx; то же самое увидит и любой сканер.
Шаг 6. Добавьте клиентов и подключите устройства
В разделе «Клиенты» → «Добавить клиента» заведите клиента на каждое устройство: так видно, кто сколько тратит, и отключить можно одного. Email — просто уникальное имя, например anna-phone. Привяжите клиента к инбаунду и выберите Flow xtls-rprx-vision; там же задаются лимит трафика, срок и «Лимит IP» — число одновременных адресов.
Карточка клиента даёт ссылку и QR-код:
vless://UUID@IP_СЕРВЕРА:443?type=tcp&security=reality&pbk=ПУБЛИЧНЫЙ_КЛЮЧ&fp=chrome&sni=cloud.example.com&sid=6ba85179e30d4fc2&spx=%2F&flow=xtls-rprx-vision#anna-phoneСсылка равносильна паролю. Подписка удобнее: приложение само подтянет изменения цели или порта, но для пары своих устройств хватит и ссылки.
Приложения на сентябрь 2026 года — лучше на ядре Xray:
- Windows: v2rayN (открытый код, есть XHTTP; для режима TUN нужны права администратора). Запасной вариант — Throne (бывший NekoRay) с профилями на Xray.
- macOS: v2rayN (сборка без подписи Apple, первый запуск разрешите вручную), Happ или OneXray.
- Android: v2rayNG только с GitHub (2dust/v2rayNG) — в Google Play его нет, а клонов много. Альтернатива — Happ.
- iOS: с российским Apple ID — OneXray или incy, с Apple ID другой страны — ещё Happ, Streisand, V2Box. В российском App Store много клонов с теми же названиями: оригинальный Happ, например, выпускает Flyfrog LLC.
Импорт везде одинаковый: из буфера обмена, по QR-коду или по адресу подписки; после него проверьте в профиле отпечаток и flow. В России включите раздельную маршрутизацию, чтобы российские сайты шли напрямую: банки и госсервисы часто не пускают зарубежные IP, а весь трафик устройства на один зарубежный адрес — лишний признак VPN в логах оператора.
Шаг 7. Обновляйте панель и делайте бэкапы
Обновление — x-ui update, но сначала прочитайте примечания к выпуску: как показывает история с ML-KEM, новое ядро может отрезать часть клиентов. Пункт 5 меню x-ui ставит нужную версию панели.
Инбаунды, клиенты и ключи хранятся в /etc/x-ui/x-ui.db. Это SQLite в режиме WAL: копия файла на ходу может потерять последние изменения из x-ui.db-wal. Скачайте бэкап в дашборде («Бэкап и восстановление») или остановите панель на время копирования:
x-ui stop
cp /etc/x-ui/x-ui.db /root/x-ui-$(date +%F).db
x-ui startВ базе лежат приватные ключи Reality и UUID клиентов — храните копии вне сервера. Присылать базу и config.json по расписанию умеет Telegram-бот панели.
Шаг 8. Проверьте безопасность
- Файрвол: снаружи открыты только SSH, 80, 443 и, если используется, порт подписки. Пункт «Firewall Management → Install» меню
x-uiне используйте: он разрешает порты 22, 80, 443, 2053 и 2096, но не ваш случайный порт панели и не нестандартный порт SSH. - fail2ban: установщик настроил его для «Лимита IP» (jail
3x-ipl), но от перебора паролей SSH нужен отдельный jailsshd— см. «Fail2ban: защита от брутфорса». - SSH: вход только по ключу — см. «Усиление SSH».
- Панель: слушает 127.0.0.1, включена 2FA. Встроенный ограничитель блокирует вход на 15 минут после пяти неудачных попыток.
- Обновления системы — автоматические, см. «Чеклист базовой защиты VPS».
- Торренты: жалобы правообладателей придут вам, а встроенное правило ловит не всё — см. «Как заблокировать торренты на своём VPN или прокси».
Если Reality перестал работать
По наблюдениям на ntc.party и разборам на Хабре за 2025–2026 годы, сам протокол Reality ТСПУ не распознаёт. Работают «ковровые» меры: баны адресов, заморозка соединений к подсетям хостеров, лимит числа соединений, белые списки на мобильном интернете. Лечатся они по-разному, так что сначала выясните, что сработало.
Сначала контроль, потом проверки из России
Подключитесь тем же клиентом не из России — из роуминга или через знакомых за границей. Если не работает и оттуда, дело в сервере: смотрите x-ui status, ss -ltnp | grep ':443' и journalctl -u x-ui -n 100 --no-pager. Частая причина — порт 443 занят другим процессом.
Если сервер жив, проверьте путь от провайдера. Reality отдаёт посторонним настоящую цель, так что сервер открывается обычным curl как сайт цели. Запускайте из сети, где не работает; в Windows — в PowerShell, через curl.exe и с NUL вместо /dev/null:
# 1. TCP и TLS: время соединения, время рукопожатия, код ответа
curl -sk -o /dev/null --resolve cloud.example.com:443:IP_СЕРВЕРА -w 'tcp=%{time_connect} tls=%{time_appconnect} code=%{http_code}\n' https://cloud.example.com/
# 2. Объём: файл с вашего сайта больше 64 КБ, например photo.jpg из шага 4
curl -sk -o /dev/null --max-time 10 --resolve cloud.example.com:443:IP_СЕРВЕРА -w 'bytes=%{size_download}\n' https://cloud.example.com/photo.jpg
# 3. Число соединений: 50 параллельных TLS-сессий
curl -sk -I --parallel --parallel-max 50 -m 10 -o /dev/null -w '%{http_code}\n' --resolve cloud.example.com:443:IP_СЕРВЕРА "https://cloud.example.com/?[1-50]"- TCP не устанавливается, а из-за границы всё открывается — адрес забанен целиком, поможет только смена IP.
- TCP есть, рукопожатие висит. Через пару минут повторите первую команду с другим именем на тот же IP, например с основным доменом
example.com. Висит и так — бан адреса; ответ пришёл, хоть и с ошибкой, — блокируют ваш SNI: заведите новый поддомен с сертификатом и смените SNI в инбаунде и у клиентов. - Приходит 14–25 КБ, потом тишина — заморозка по объёму.
- Первые ответы есть, дальше тайм-ауты — лимит числа соединений. Сама проверка при этом включит блок на пару минут.
Обрыв после нескольких килобайт
С июня 2025 года ТСПУ у многих провайдеров замораживает TCP-соединения к подсетям крупных хостеров и CDN: Hetzner, OVH, DigitalOcean, AWS, Oracle, Contabo, Scaleway, Cloudflare и других. Первые 14–25 КБ проходят, потом данные перестают приходить без RST, и так на каждом соединении: VPN «подключается», а страницы виснут. Картина зависит от провайдера и региона; летом 2026 года часть операторов ограничение сняла.
Пропускаются только SNI из белого списка — около тысячи популярных доменов, так что свой домен на хостере под ограничением не пройдёт. Остаются два пути:
- Хостер не под ограничением — тогда Reality на своём сайте работает. Режет ли ваш провайдер соединения к серверу, покажет веб-чекер hyperion-cs «TCP 16-20»: в параметр
hostподставьте свой домен. - Промежуточный сервер в России — для исходящих из российских дата-центров правила мягче. Но после волны банов 21 сентября 2026 года забаненные адреса не видны и оттуда.
Не помогают XHTTP, mux и gRPC (ответ всё равно идёт одним длинным соединением), фрагментация и паузы. Классический запасной путь — XHTTP через Cloudflare — в России тоже работает плохо: подсети Cloudflare сами под ограничением.
Заморозка при всплеске соединений
С ноября 2025 года у части провайдеров, в 2026 году прежде всего у мобильных МегаФона и Yota, серия примерно из десятка TLS-рукопожатий с одним SNI к одному серверу замораживает новые соединения на пару минут. По разбору hyperion-cs (июнь 2026), хватает и больше трёх почти одновременных попыток, если отпечаток — Chrome, Safari или iOS, а адрес — в «подозрительной» подсети; порт и версия TLS не важны.
Vision уязвим по устройству: на каждое соединение приложения он открывает своё TLS-соединение, и браузер легко даёт десяток рукопожатий за секунду. Помогают:
- XHTTP — упаковывает соединения приложений в несколько TLS-соединений. С Xray v26.7.28 клиент по умолчанию держит их не больше трёх: значение снизили именно из-за ТСПУ.
- Отпечаток firefox вместо chrome в клиенте на свежем ядре Xray (26.3.27 и новее) — в июне 2026 года эта замена возвращала работу.
Для XHTTP создайте второй инбаунд: VLESS, транспорт XHTTP, безопасность Reality, та же цель 127.0.0.1:8443 и тот же SNI. В настройках XHTTP задайте только путь, например /api/v2/c7f3, режим оставьте auto: с Reality клиент выберет stream-one, который, по отзывам, хорошо работает и на мобильных сетях. XMUX в панели не включайте, Flow для XHTTP не используется. Два инбаунда не займут один порт: переведите 443 на XHTTP или дайте запасному инбаунду другой порт.
Бан IP-адреса
Адреса VPN-серверов банят волнами — например, 4 августа и 21 сентября 2026 года. ValdikSS различает два вида бана. При первом из домашних сетей России не проходят ни TCP, ни UDP, ни ping, и сразу у всех провайдеров. При втором TCP-рукопожатие проходит, а после первого пакета с данными наступает тишина, и только у части провайдеров. Помогает лишь смена адреса.
Адреса ForestsNet Cloud каждый день проверяются из России по TCP и TLS, заблокированные выводятся из выдачи, так что новый сервер получает адрес, который на момент проверки открывался. Но бан может прийти позже, а вашу связку цели, объёма и числа соединений эта проверка не касается. Если проверки выше показывают бан самого адреса, напишите в поддержку и приложите их вывод.
Белые списки на мобильном интернете
В этом режиме оператор пропускает только разрешённые IP-диапазоны, и зарубежный VPS недоступен напрямую никаким протоколом. Обходят это входным сервером в российском облаке с адресом из белого списка — это отдельная схема.
Диагностика
- Клиент «подключён», но сайты не открываются. В логе клиента —
received real certificateилиprocessed invalid connection: сервер не узнал клиента и отдал сертификат цели. Сверьте публичный ключ, Short ID и SNI, обновите приложение, поставьте отпечатокchrome. - После обновления до 3x-ui 3.8 отвалилась часть клиентов. Требование X25519MLKEM768 — см. шаг 6. На панели 3.5–3.7 похожий отказ сторонним клиентам даёт минимальная версия 26.3.27 в ядре 26.7.x.
- Не работает ни из России, ни из-за границы. Xray не запустился: порт 443 занят или в «Цели» нет порта.
- Из России рукопожатие висит. Бан адреса, SNI или заморозка при всплеске — различите проверками.
- Первые килобайты приходят, потом тишина. Заморозка на подсети хостера: другой хостер или каскад через российский сервер.
- На тяжёлых страницах всё замирает на пару минут. Лимит соединений: XHTTP, отпечаток
firefox. - Все клиенты отвалились разом, а сайт по домену не открывается. Reality обращается к цели при каждом подключении, и без nginx не проходят даже свои клиенты. Проверьте
systemctl status nginxи продление сертификата:certbot renew --dry-run. - Панель не открывается. Она слушает 127.0.0.1 — заходите через SSH-туннель.
- Трафик клиента в панели растёт рывками. Норма для Vision: данные идут через splice в ядре Linux, и Xray учитывает их после закрытия соединения.
- Не работает приложение, которому нужен QUIC. Vision перехватывает UDP на порт 443, чтобы браузеры перешли на TCP. Для такого клиента выберите flow
xtls-rprx-vision-udp443.
Что дальше
Панели на несколько серверов — Marzban и Remnawave. Сравнение протоколов — в статье «Свой VPN на VPS: какой протокол выбрать», запасной канал — Amnezia VPN или Hysteria2.
Источники
- MHSanaei/3x-ui: README, install.sh и x-ui.sh, выпуски v3.8.0 и v3.8.5
- Документация 3x-ui: REALITY, безопасность, бэкап
- 3x-ui: #5141, #6543
- Документация Xray: REALITY
- XHTTP: Beyond REALITY
- XTLS/REALITY: обязательный X25519MLKEM768, обсуждение отпечатков в Xray-core #6714, sing-box #4520
- Xray-core #6376: maxConnections 3 из-за ТСПУ
- Хабр: О схеме ограничений РКН в июне 2026-го, РКН и «сибирская блокировка», механика «отсечки» в 16 килобайт, Кратко про XHTTP для VLESS, Введение в Xray
- ntc.party: блокировка Cloudflare, OVH, Hetzner, DigitalOcean с 09.06.2025, 16кб блокировка, блокировка IP VPN-серверов 04.08.2026, мобильная сеть и белые списки, TCP handshake проходит, а payload — нет
- net4people: #490 и #546
- hyperion-cs/dpi-checkers