1. Как работает Reality: почему его не блокируют
Обычные VPN (WireGuard, OpenVPN) создают зашифрованный туннель с характерным «отпечатком», который DPI распознаёт и блокирует. VLESS Reality работает иначе.
Что видит DPI при Reality-соединении
TLS ClientHello с реальным SNI
Клиент начинает TLS-хендшейк, указывая SNI целевого сайта (например, www.microsoft.com). DPI видит запрос к доверенному домену.
Сервер получает сертификат целевого сайта
Xray-сервер обращается к настоящему целевому сайту (dest) и получает его реальный TLS-сертификат. Для неаутентифицированных клиентов (DPI, сканеры) соединение просто проксируется к настоящему сайту.
Аутентификация через shortId
Клиент, знающий публичный ключ x25519 и shortId, аутентифицируется через общий секрет. Обычный браузер или сканер пройти не может — и просто получит контент настоящего сайта.
XTLS Vision убирает двойное шифрование
Flow xtls-rprx-vision пропускает уже зашифрованные TLS-данные без повторного шифрования — выше скорость, меньше нагрузка.
Итог
DPI видит корректный TLS к доверенному домену — заблокировать означает заблокировать этот домен. Reality не использует собственный домен и не требует SSL-сертификата.
Ситуация в России (2026)
С февраля 2026 года Роскомнадзор развернул на ТСПУ (российский DPI) ИИ-систему статистического анализа трафика, которая детектирует и замедляет VLESS Reality-соединения к зарубежным IP. Степень блокировки зависит от региона и провайдера — у кого-то работает стабильно, у кого-то скорость падает до нуля. Если столкнётесь с замедлением — попробуйте случайный высокий порт (например, 43821) вместо 443: ТСПУ пропускает deep inspection на нестандартных портах для экономии ресурсов. При смене порта не забудьте: (1) поменять порт в inbound 3X-UI, (2) открыть новый порт в UFW, (3) открыть его в firewall панели провайдера, (4) скопировать vless:// ссылку заново из 3X-UI — панель автоматически обновит порт в ссылке и QR-коде. Альтернатива — транспорт XHTTP вместо TCP (он меняет паттерн трафика после хендшейка). WebSocket без CDN тоже детектируется, однако VLESS+WS+TLS через Cloudflare CDN работает стабильнее — трафик идёт через IP Cloudflare, которые нельзя заблокировать без последствий.
2. Требования к VPS
| Параметр | Минимум | Рекомендуется |
|---|---|---|
| CPU | 1 vCPU | 1–2 vCPU |
| RAM | 512 МБ | 1 ГБ |
| Диск | 5 ГБ SSD | 10 ГБ SSD |
| ОС | Ubuntu 22.04 | Ubuntu 22.04 / 24.04 |
| Виртуализация | KVM / OpenVZ | KVM (нужен для BBR) |
| Расположение | Вне РФ | Европа (DE, NL, FI, LV) |
| IPv4 | Обязателен | Обязателен |
Важно: локация VPS
Для маскировки Reality использует сторонний сайт (dest). Задержка до этого сайта должна быть минимальной с вашего VPS — иначе хендшейк будет заметно медленнее. Выбирайте VPS в крупных европейских дата-центрах — там легко найти подходящий dest-сайт в том же ASN. Пинг от VPS до dest ≤ 30 мс — хорошо.
3. Установка 3X-UI
3X-UI — это веб-панель управления Xray с удобным интерфейсом. Один скрипт устанавливает всё: Xray-core, панель, systemd-сервис.
Все команды ниже предполагают вход под root. Если вы работаете под обычным пользователем — добавляйте sudo перед каждой командой.
Шаг 1: обновить систему
apt update && apt upgrade -yШаг 2: запустить установщик
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)Перед запуском установщика
В 3X-UI выбор SSL-сертификата обязательный (пропустить нельзя). На самой работе VLESS это не сказывается — SSL нужен только для веб-панели. Подготовьтесь заранее:
- Вариант по умолчанию (проще всего) — откройте входящий порт 80/tcp в firewall панели провайдера. Тогда сработает вариант 2 (Let's Encrypt IP-сертификат, 6 дней с автопродлением, Enter — и всё).
- Если порт 80 открыть нельзя — сгенерируйте самоподписанный сертификат заранее (команда ниже) и в установщике выберите вариант 3, указав пути к этим файлам.
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout /root/xui-key.pem -out /root/xui-cert.pem \
-days 3650 -subj "/CN=localhost"Что спросит установщик
Что покажет в конце (обязательно запишите — повторно не выводится)
Сохраните данные для входа!
После установки скрипт покажет логин, пароль, порт и URL панели. Запишите их — больше они не будут показаны. Если потеряете: запустите x-ui → пункт 6 (Reset Username & Password),7 (Reset Web Base Path), 9 (Change Port) или 10 (View Current Settings).
# Проверить статус
systemctl status x-ui
# Открыть меню управления (статус, перезапуск, смена порта)
x-ui
# Панель доступна по адресу (из вывода установщика):
# https://IP_СЕРВЕРА:ПОРТ/ВЕБ-ПУТЬ/Войдите в панель
Откройте браузер, перейдите по адресу из финального вывода установщика: https://IP:ПОРТ/ПУТЬ. Введите логин и пароль. Дополнительные меры защиты — в разделе «UFW и безопасность сервера».
Браузер ругается «Your connection is not private»?
Это нормально, если вы выбрали вариант 3 (самоподписанный сертификат). Такой cert не подписан публичным CA — браузер не может его проверить, но шифрование работает. Нажмите Advanced → Proceed to IP (unsafe) (Chrome / Edge) или Подробнее → Перейти на сайт(Яндекс.Браузер, Firefox). Если выбирали вариант 1 или 2 (Let's Encrypt) — такого предупреждения быть не должно.
Не открывается панель?
У Hetzner, Selectel, Aeza, AWS, DigitalOcean и других провайдеров есть отдельный сетевой firewall на уровне панели управления — он режет трафик до того, как тот дойдёт до VPS. Откройте нужный порт там (Firewall / Security Groups / Правила сети). Подробнее в разделе «Если не работает».
4. Настройка VLESS Reality inbound
В 3X-UI перейдите в Inbounds → Add Inbound. Настройте параметры по таблице ниже — объяснение каждого поля.
| Поле | Значение | Почему |
|---|---|---|
| Protocol | VLESS | Лёгкий протокол без лишней аутентификации |
| Port | 443 | Стандартный HTTPS-порт. Если замедляют — случайный высокий порт (40000+) |
| Transmission | TCP (RAW) | В dropdown подписано именно так. TCP + Reality: нативный XTLS Vision |
| Security | Reality | Включает режим маскировки под HTTPS |
| uTLS | chrome | Имитирует TLS-отпечаток Chrome — самый распространённый |
| Dest (SNI Target) | www.microsoft.com:443 | Сайт, под который маскируемся. Должен поддерживать TLS 1.3 и H2 |
| Server Names | www.microsoft.com | Совпадает с Dest. Можно добавить несколько |
| Certificates | Кнопка «Get New Cert» | Генерирует пару ключей x25519. ShortId заполняется автоматически |
| Flow | xtls-rprx-vision | Устанавливается при добавлении клиента (раздел 5) |
Выбор Dest: что важно
Сайт-маска должен: поддерживать TLS 1.3 и HTTP/2, не стоять за Cloudflare. Хорошие варианты: www.microsoft.com:443, www.samsung.com:443, www.nvidia.com:443.
Идеально — найти сайт в том же дата-центре (ASN), что и ваш VPS, с помощью утилиты RealiTLScanner (github.com/XTLS/RealiTLScanner). Запускайте сканер с локальной машины, а не на VPS — иначе IP сервера может попасть в чёрные списки. Избегайте сайтов за Cloudflare — активные зонды увидят, что TLS-сертификат Cloudflare приходит с IP, не принадлежащего Cloudflare. Не используйте apple.com (ASN-несоответствия) и слишком популярные цели (dl.google.com) — массовое использование создаёт паттерн для DPI.
# 1. TLS 1.3 — обязательно для Reality (-servername нужен для CDN-сайтов)
openssl s_client -connect www.microsoft.com:443 -servername www.microsoft.com -tls1_3 </dev/null 2>&1 | grep -iE "TLSv1.3|Cipher is"
# Ожидаем строку вида: "New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384".
# Если ошибка или TLSv1.2 — выберите другой dest.
# 2. HTTP/2 (ALPN h2) на TLS 1.3 — тоже обязательно для Reality
openssl s_client -connect www.microsoft.com:443 -servername www.microsoft.com -tls1_3 -alpn h2 </dev/null 2>&1 | grep -i "ALPN"
# Ожидаем: ALPN protocol: h2. Если "no application protocol" — сайт не годится.
# 3. Проверка, что сайт НЕ за Cloudflare
curl -sI https://www.microsoft.com | grep -iE "^cf-ray:|^server: cloudflare"
# Хорошо, если вывод ПУСТОЙ. Любая строка в выводе — признак Cloudflare, берите другой сайт.
# 4. Задержка до целевого сайта (Microsoft блокирует ICMP, поэтому меряем TLS-handshake)
curl -so /dev/null -w "TLS handshake: %{time_appconnect}s | total: %{time_total}s\n" https://www.microsoft.com/
# Ожидаем time_appconnect < 0.2 s (в идеале <100 мс, нормально до 200 мс с европейского VPS).
# Если >300 мс — возможны заметные задержки, рассмотрите dest ближе к вашему ДЦ.Все четыре проверки должны пройти успешно. Если хоть одна не проходит — возьмите другой dest из списка или проверьте кандидата вручную.
Нажмите Create. Inbound создан — 3X-UI автоматически применит конфигурацию к Xray без перезапуска.
5. Добавление клиента и получение ссылки
В списке Inbounds найдите созданный inbound и нажмите иконку редактирования (карандаш) → в открывшемся окне раздел Clients → кнопка + Add Client. Альтернатива: кликнуть в столбце Clients на значок с числом клиентов — откроется список с кнопкой «+». Для каждого пользователя — отдельный UUID и своя vless://-ссылка.
После создания клиента нажмите иконку QR-кода или ссылки в строке клиента. Вы получите:
vless://UUID@IP_СЕРВЕРА:443?encryption=none&type=tcp&security=reality&pbk=ПУБЛИЧНЫЙ_КЛЮЧ&fp=chrome&sni=www.microsoft.com&sid=SHORT_ID&flow=xtls-rprx-vision#МЕТКАQR-код или ссылка
Мобильные клиенты проще подключить через QR-код — отсканировать камерой прямо из 3X-UI. Для Windows — скопируйте vless:// ссылку в буфер обмена и импортируйте в клиент.
6. Подключение клиентов
Windows — v2rayN
v2rayN — самый популярный клиент для Windows, бесплатный. Скачать: github.com/2dust/v2rayN → Releases. Обе версии — с графическим интерфейсом: v2rayN-windows-64.zip (WPF, классический Windows-стиль, рекомендуется большинству) или v2rayN-windows-64-desktop.zip (Avalonia UI, новее, кроссплатформенный движок).
- 1Распакуйте архив и запустите
v2rayN.exe - 2Скопируйте vless:// ссылку из 3X-UI в буфер обмена
- 3В главном окне: Configuration → Import Share Links from clipboard (или просто Ctrl+V в главном окне)
- 4В списке серверов правой кнопкой на добавленный → Set as active
- 5В нижней строке статуса главного окна v2rayN (слева) — выпадающий список System proxy, выберите пункт Set system proxy (прокси для браузера и приложений, которые его уважают). Альтернатива — правый клик по иконке v2rayN в трее → System proxy → Set system proxy. Для заворачивания всего трафика системы — тумблер Enable Tun в той же строке статуса рядом с ComboBox.
Альтернатива для Windows: Hiddify — красивый современный клиент с автоматическим выбором протокола. Скачать: github.com/hiddify/hiddify-app.
Android — v2rayNG или Hiddify
v2rayNG
- 1.Скачать APK с github.com/2dust/v2rayNG → Releases (в Google Play приложение удалено — не ищите там)
- 2.Нажать + → Scan QR code
- 3.Включить переключатель VPN
Hiddify
- 1.Установить из Google Play или github.com/hiddify/hiddify-app
- 2.Нажать + → Scan QR / Import link
- 3.Нажать Connect
iOS — Streisand, Hiddify или Shadowrocket
Streisand
App Store (бесплатно)
Простой и стабильный, поддерживает VLESS Reality
Hiddify
App Store (бесплатно)
Кроссплатформенный — тот же клиент на iOS, Android, Windows
Shadowrocket
App Store (платный, ≈ $3)
Самый популярный iOS-клиент, множество протоколов
На iOS: установите приложение → нажмите + или «Добавить конфигурацию» → выберите «QR-код» и отсканируйте код из 3X-UI. Разрешите создание VPN-профиля.
Проверить подключение
После подключения откройте 2ip.ru или whoer.net — должен отображаться IP вашего VPS, а не домашний. Пинг и трассировку проверить можно через browserleaks.com.
7. UFW и безопасность сервера
Панель 3X-UI доступна извне — это потенциальная точка атаки. Минимальная защита: файрвол UFW и SSH-ключи.
Настройка UFW
# Сначала добавить все правила, потом включать UFW
# SSH (обязательно — добавить ДО включения, иначе потеряете доступ)
# Если ваш SSH на нестандартном порту — укажите его вместо 22
ufw allow 22/tcp
# VLESS Reality (порт из настроек inbound, обычно 443)
# Если в разделе 1 выбрали нестандартный порт против ТСПУ — замените 443 на свой
ufw allow 443/tcp
# Порт 80 — нужен для автопродления Let's Encrypt сертификата (варианты 1 и 2).
# Если выбрали вариант 3 (свой сертификат) — эту строку можно пропустить.
ufw allow 80/tcp
# Порт панели — ТОЛЬКО с вашего домашнего IP (безопаснее всего)
# Узнать свой публичный IP: откройте 2ip.ru или выполните на локальной машине: curl ifconfig.me
ufw allow from ВАШ_ДОМАШНИЙ_IP to any port ПОРТ_ПАНЕЛИ
# Или открыть для всех (менее безопасно, но проще):
# ufw allow ПОРТ_ПАНЕЛИ/tcp
# Включить UFW (после добавления правил)
ufw enable
# Проверить правила
ufw status verboseUFW — не единственный firewall
UFW работает внутри VPS. У Hetzner, Selectel, Yandex Cloud, AWS, DigitalOcean, Aeza и многих других есть ещё и сетевой firewall на уровне панели провайдера — он срабатывает до UFW. Те же порты (22, 443, порт панели) нужно открыть и там: обычно в разделе Firewall / Security Groups / Правила сети.
SSH-ключи вместо пароля
# Создать SSH-ключ (если ещё нет)
ssh-keygen -t ed25519 -C "vps-proxy"
# Скопировать публичный ключ на сервер
ssh-copy-id root@IP_СЕРВЕРА
# Проверить, что ключ реально оказался на сервере:
# ssh root@IP_СЕРВЕРА "grep -c ssh-ed25519 /root/.ssh/authorized_keys"
# (команда выполняется локально, внутри кавычек — grep, который отработает на сервере)
# Ожидаем число ≥ 1. Если 0 — ssh-copy-id не сработал, повторите.Важно: cloud-init override на Ubuntu 22.04/24.04
Облачные образы Ubuntu обычно поставляются с файлом /etc/ssh/sshd_config.d/50-cloud-init.conf (у некоторых провайдеров имя другое — например, 60-cloudimg-settings.conf), в котором прописано PasswordAuthentication yes. Этот файл подключается после основного конфига и перекрывает ваши настройки. Если просто отредактировать sshd_config — пароль останется включённым. Ниже — правильный способ: находим и удаляем override, после перезапуска проверяем итоговое состояние.
# 1. Убедитесь что ключ работает — откройте НОВУЮ сессию SSH и попробуйте войти
# без пароля. Не закрывайте текущую сессию, пока не проверите!
# 2. Удалить cloud-init override (флаг -f, чтобы не было ошибки,
# если на вашем образе этого файла нет)
rm -f /etc/ssh/sshd_config.d/50-cloud-init.conf
# 3. Отредактировать основной конфиг
nano /etc/ssh/sshd_config
# Найти и установить:
PasswordAuthentication no
PermitRootLogin prohibit-password
# 4. Перезапустить SSH (работает и на 22.04, и на 24.04)
systemctl restart ssh
# 5. Проверить итоговое значение (не содержимое файлов, а effective config):
sshd -T | grep -iE "passwordauthentication|permitrootlogin"
# Должно быть:
# passwordauthentication no
# permitrootlogin prohibit-passwordПункт 5 — критичный. Если sshd -T показывает passwordauthentication yes — остался ещё один override-файл в /etc/ssh/sshd_config.d/. Посмотрите содержимое: grep -r PasswordAuth /etc/ssh/.
Смена порта и пути панели (если нужно после установки)
# Открыть меню управления 3X-UI
x-ui
# Актуальные пункты меню (проверено на 3X-UI 2.x):
# 6 — Reset Username & Password
# 7 — Reset Web Base Path
# 9 — Change Port
# 10 — View Current Settings (посмотреть текущие значения)
# 13 — Restart (перезапустить панель)
# 2 — Update (обновить 3X-UI)✓ Делать
- Нестандартный порт и путь панели
- UFW с минимумом открытых портов
- SSH только по ключам
- Сложный пароль панели (16+ символов)
- Регулярно обновлять x-ui (x-ui → обновить)
✗ Не делать
- Оставлять порт панели открытым для всего интернета
- Использовать простые пароли (admin/admin)
- Использовать CDN-сайты (Cloudflare) как dest
- Игнорировать обновления Xray-core
- Передавать ссылки через незащищённые каналы
Обновление 3X-UI
x-ui
# Выбрать пункт 2 (Update)
# Или запустить установщик повторно — он обновит, сохранив настройки:
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)8. Если не работает
В 95% случаев «не подключается» — это одна из шести причин ниже. Проверяйте по порядку.
1. Не открывается веб-панель (адрес из финального вывода установщика)
Это причина номер один. Обычно дело в firewall провайдера (не UFW), который работает до того, как пакет попадает на VPS. Последовательность проверки:
# 1. Статус сервиса
systemctl status x-ui
# 2. Порт реально слушается? (замените ПОРТ_ПАНЕЛИ на значение из вывода установщика)
ss -tlnp | grep ':ПОРТ_ПАНЕЛИ'Если панель запущена и порт слушается, но снаружи не открывается — проверьте доступность с локального компьютера:
nc -zv IP_ВАШЕГО_VPS ПОРТ_ПАНЕЛИTest-NetConnection -ComputerName IP_ВАШЕГО_VPS -Port ПОРТ_ПАНЕЛИConnection refused / быстрый отказ — сервис на VPS не запущен (см. systemctl выше).
Connection timed out / долгое зависание — блокирует firewall, скорее всего в панели провайдера. Зайдите в панель провайдера → Firewall / Security Groups / Правила сети → добавьте входящее правило TCP на порт панели — лучше только с вашего публичного IP (безопаснее), либо временно из 0.0.0.0/0 на время диагностики.
2. Клиент не подключается (vless:// ссылка)
Симптом: клиент (v2rayN, v2rayNG, Hiddify) показывает таймаут или «connection failed». Проверки по порядку:
- Firewall VPS и провайдера — порт VLESS (443 или другой, который вы задали при создании inbound) открыт в UFW и в панели провайдера? Проверить:
nc -zv IP ПОРТ_VLESSс локальной машины. - Xray реально слушает? — на VPS:
ss -tlnp | grep :ПОРТ_VLESS(замените на свой порт; если выбрали нестандартный против ТСПУ — см. раздел 1). Если пусто — Xray не запущен или inbound не активирован в 3X-UI (тумблер напротив inbound должен быть включён). - Время клиента и сервера — Reality чувствителен к рассинхрону. Проверьте что на VPS и на клиенте время точное (разница < 5 минут):
timedatectlна VPS, настройки даты/времени на клиенте. - Совпадение параметров — vless:// ссылка содержит pbk (публичный ключ), sid (shortId), sni (домен), fp (fingerprint), flow. Все они должны совпадать с настройками inbound. После смены чего-либо в inbound — регенерируйте ссылку из 3X-UI, не переносите параметры вручную.
3. Клиент подключается, но интернета нет / сильно тормозит
- Reality-хендшейк ломается — dest не поддерживает HTTP/2 или TLS 1.3, или стоит за Cloudflare. Проверьте dest командами из раздела 4 (openssl с флагами
-tls1_3и-alpn h2). - ТСПУ замедляет соединение (Россия) — в 2026 активно детектирует Reality к нестандартным IP. Смените dest, порт VPS (не 443, а случайный высокий вроде 43821), регион/провайдера. Альтернатива — VLESS+WS+TLS через Cloudflare CDN.
- DNS-утечки или блокировка DNS — в настройках клиента проверьте, что DNS-запросы идут через прокси (обычно включено по умолчанию). Проверить утечки:
browserleaks.com/dns. - Роутинг в клиенте — в v2rayN/v2rayNG/Hiddify проверьте, что выбран режим «Global» или «Proxy», а не «Bypass LAN/China». В противном случае трафик может идти мимо прокси.
- Зонды от провайдера — если dest отдаёт 403/404 при прямом запросе с VPS (
curl -I https://DEST), выберите другой сайт-маску: Reality должен пересылать неаутентифицированный трафик на живой сайт.
4. Потерял SSH-доступ после отключения пароля
Частый сценарий: ключ не был корректно добавлен, пароль выключен — пользователь заперт снаружи. Единственный способ восстановления — через консоль в панели провайдера (VNC / Serial Console / Rescue mode). У любого нормального VPS-провайдера такая консоль есть.
Войдя через консоль, проверьте:
# 1. Посмотреть итоговые настройки SSH
sshd -T | grep -iE "passwordauthentication|permitrootlogin|authorizedkeysfile"
# 2. Посмотреть какие публичные ключи у root
cat /root/.ssh/authorized_keys
# 3. Временно включить вход по паролю, пока не настроите ключ
rm -f /etc/ssh/sshd_config.d/50-cloud-init.conf
sed -i 's|^#*PasswordAuthentication.*|PasswordAuthentication yes|' /etc/ssh/sshd_config
systemctl restart sshУрок: никогда не закрывайте текущую SSH-сессию, пока в отдельной новой сессии не убедитесь, что ключ работает. Откройте второе окно терминала и войдите туда, прежде чем закрывать первое.
5. 3X-UI / x-ui service не запускается
Сервис в состоянии failed или activating:
# Логи сервиса панели
journalctl -u x-ui -n 100 --no-pager
# Отдельно — логи Xray-core внутри systemd-журнала
journalctl -u x-ui -n 100 --no-pager | grep -iE "xray|error"
# Интерактивно следить за логами в реальном времени
journalctl -u x-ui -fЧастые причины:
- Порт VLESS уже занят (Nginx/Apache/Caddy на 443) — проверить:
ss -tlnp | grep :ПОРТ_VLESS. Либо остановите конфликтующий сервис, либо смените порт VLESS. - Порт панели занят — то же самое, проверьте и смените через
x-ui→ пункт 9. - Битая конфигурация — сбросьте через
x-ui→ пункт 8 (Reset Settings), потом перезапустите сервис (пункт 13).
6. VPS за NAT (серый IP)
На некоторых дешёвых тарифах нет публичного IPv4 — вы получаете только «серый» адрес за NAT провайдера. Порт снаружи не проброшен, и VLESS не работает. Проверка:
ip -4 addr show | grep inet
curl -4 ifconfig.meЕсли IP на сетевом интерфейсе начинается с 10., 172.16–31. или 192.168., а ifconfig.me показывает другой — у вас NAT. Решение — заказать «белый» IPv4 (обычно платно) или сменить тариф.