Как настроить VLESS REALITY SelfSteal в 3x-ui
Полная настройка 3x-ui, VLESS REALITY и локального SelfSteal-сайта на собственном домене: DNS, TLS, Nginx, клиент и проверка работы.
В этой инструкции мы развернём 3x-ui, создадим VLESS REALITY inbound и направим неподходящие TLS-соединения на локальный HTTPS-сайт. Такой вариант называется SelfSteal: SNI принадлежит владельцу сервера, домен указывает на эту же VPS, а target не зависит от стороннего ресурса.
Инструкция проверена на реальной VPS с Ubuntu 24.04 и 3x-ui 3.11.0. После настройки мы отдельно подключились к созданному VLESS REALITY с внешнего узла и проверили загрузку сайта через туннель. На снимках скрыты ключи, UUID, short ID и часть тестового домена.
1. Как устроен SelfSteal
- Публичный
TCP/443слушает Xray с VLESS REALITY. - Собственный домен, например
vpn.example.com, указывает A-записью на IPv4 этой VPS. - Локальный Nginx слушает только
127.0.0.1:9443и использует настоящий сертификат этого домена. - В REALITY используются
SNI: vpn.example.comиtarget: 127.0.0.1:9443. - Обычный браузер видит локальную HTTPS-страницу, а клиент с правильными параметрами устанавливает VLESS-соединение.
2. Что потребуется
- VPS с Ubuntu 22.04/24.04 или Debian 12/13 и доступом
root. - Свободные входящие порты
22,80и443. - Собственный домен или поддомен с доступом к DNS.
- Актуальный клиент с поддержкой VLESS REALITY и flow
xtls-rprx-vision.
cat /etc/os-release
ss -lntup | grep -E ':(22|80|443)\b' || true
getent ahostsv4 vpn.example.com3. Настройте DNS
Создайте A-запись vpn.example.com со значением публичного IPv4 вашей VPS. Для первого выпуска сертификата отключите CDN-проксирование и оставьте запись в режиме DNS only.
- Добавьте
A vpn.example.com → 203.0.113.10. - Удалите AAAA-запись, если IPv6 на сервере не настроен.
- Дождитесь, пока
dig +short A vpn.example.comвернёт IP этой VPS. - Проверьте домен через публичный резолвер:
dig @1.1.1.1 +short A vpn.example.com.
dig +short A vpn.example.com
dig @1.1.1.1 +short A vpn.example.com4. Установите 3x-ui
apt update && apt install -y curl
bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/master/install.sh)Установщик покажет адрес панели, логин, пароль, порт и web base path. Сохраните их в менеджере паролей. Не публикуйте URL панели и не используйте эти данные в клиентской конфигурации.

/usr/local/x-ui/x-ui setting -listenIP 127.0.0.1
systemctl restart x-ui
ss -lntp | grep x-uissh -L 14500:127.0.0.1:ПОРТ_ПАНЕЛИ [email protected]Пока SSH-сеанс открыт, панель доступна на компьютере по адресу http://127.0.0.1:14500/ВАШ_WEB_BASE_PATH/.
5. Поднимите локальный HTTPS-сайт
apt update
apt install -y nginx certbot
mkdir -p /var/www/selfsteal /var/www/letsencrypt/.well-known/acme-challenge<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Secure network endpoint</title>
<style>
body{margin:0;background:#050505;color:#f4f4f4;font:16px/1.55 Arial,sans-serif}
main{max-width:760px;margin:15vh auto;padding:32px}
h1{font-size:clamp(44px,8vw,84px);line-height:.95;font-weight:400}
p{max-width:560px;color:#a5a5a5}
</style>
</head>
<body><main><h1>Secure network endpoint.</h1><p>This host provides an encrypted network service. The web endpoint is online and configured correctly.</p></main></body>
</html>server {
listen 80;
listen [::]:80;
server_name vpn.example.com;
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
}
location / {
return 200 "certificate setup\n";
add_header Content-Type text/plain;
}
}Сохраните конфигурацию в /etc/nginx/sites-available/vpn.example.com, включите её и выпустите сертификат.
ln -s /etc/nginx/sites-available/vpn.example.com /etc/nginx/sites-enabled/vpn.example.com
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
certbot certonly --webroot -w /var/www/letsencrypt -d vpn.example.comserver {
listen 80;
listen [::]:80;
server_name vpn.example.com;
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 127.0.0.1:9443 ssl http2;
server_name vpn.example.com;
ssl_certificate /etc/letsencrypt/live/vpn.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vpn.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/selfsteal;
index index.html;
location / { try_files $uri $uri/ /index.html; }
}nginx -t && systemctl reload nginx
curl --resolve vpn.example.com:9443:127.0.0.1 https://vpn.example.com:9443/

6. Создайте VLESS inbound
Откройте Inbounds, нажмите Add Inbound и заполните базовые параметры. Названия вкладок могут немного отличаться между версиями 3x-ui.

Remark: понятное имя, напримерSelfSteal.Protocol: VLESS.Listen IP: оставьте пустым.Port: 443.Transmission: TCP/RAW.Security: Reality.

7. Заполните параметры REALITY
uTLS: chrome.Target:127.0.0.1:9443.SNI / Server Names: ваш доменvpn.example.com.Xver: 0.Max Time Diff: 0, если не вводите отдельное ограничение.SpiderX:/.- Сгенерируйте новую пару Private/Public Key и хотя бы один Short ID.

8. Добавьте клиента
- Откройте созданный inbound и нажмите
Add Client. - Задайте понятную метку клиента.
- Сгенерируйте новый UUID.
- Выберите flow
xtls-rprx-vision. - Сохраните клиента и экспортируйте ссылку или QR-код только в доверенное приложение.

В клиентском профиле должны совпадать адрес VPS, порт 443, UUID, flow Vision, Public Key, Short ID и ваш собственный Server Name/SNI.
9. Проверьте результат
systemctl --no-pager --full status x-ui nginx
ss -lntp | grep -E ':(80|443|9443)\b'В норме Nginx слушает публичный 80/tcp и локальный 127.0.0.1:9443, а Xray — публичный 443/tcp.
curl -I https://vpn.example.com/
curl --resolve vpn.example.com:443:203.0.113.10 -I https://vpn.example.com/- Откройте профиль в клиентском приложении и подключитесь.
- Проверьте внешний IP через доверенный сервис: он должен совпасть с IP VPS.
- Откройте несколько HTTPS-сайтов и убедитесь, что соединение остаётся стабильным.
- В 3x-ui проверьте счётчики трафика созданного клиента.
10. Обновление сертификата и резервная копия
install -d -m 755 /etc/letsencrypt/renewal-hooks/deploy
printf '#!/bin/sh\nsystemctl reload nginx\n' > /etc/letsencrypt/renewal-hooks/deploy/reload-nginx
chmod 755 /etc/letsencrypt/renewal-hooks/deploy/reload-nginx
certbot renew --dry-runinstall -m 600 /etc/x-ui/x-ui.db /root/x-ui-backup-$(date +%F).dbСоздавайте копию базы перед обновлением 3x-ui, массовым изменением клиентов или переустановкой сервера. Не храните копию только на той же VPS.
11. Если соединение не работает
curl: Could not resolve host— A-запись ещё не распространилась или домен указан с ошибкой.Connection refusedна 443 — inbound выключен, порт занят или закрыт firewall.SSL certificate problem— сертификат выпущен для другого имени либо клиент идёт по неверному домену.- Сайт открывается, а VLESS нет — сравните UUID, Public Key, Short ID, flow и SNI в клиенте.
- После смены ключей или SNI удалите старый профиль из клиента и импортируйте новый.
- 502/пустой fallback — проверьте Nginx на
127.0.0.1:9443и путь к сертификату.
journalctl -u x-ui -n 100 --no-pager
journalctl -u nginx -n 100 --no-pager
nginx -t
ss -lntp | grep -E ':(80|443|9443)\b'
curl -vk --resolve vpn.example.com:9443:127.0.0.1 https://vpn.example.com:9443/