Как настроить 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.com

3. Настройте DNS

Создайте A-запись vpn.example.com со значением публичного IPv4 вашей VPS. Для первого выпуска сертификата отключите CDN-проксирование и оставьте запись в режиме DNS only.

  1. Добавьте A vpn.example.com → 203.0.113.10.
  2. Удалите AAAA-запись, если IPv6 на сервере не настроен.
  3. Дождитесь, пока dig +short A vpn.example.com вернёт IP этой VPS.
  4. Проверьте домен через публичный резолвер: dig @1.1.1.1 +short A vpn.example.com.
Проверка DNS
dig +short A vpn.example.com
dig @1.1.1.1 +short A vpn.example.com

4. Установите 3x-ui

Официальный установщик 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 панели и не используйте эти данные в клиентской конфигурации.

Реальная страница входа в панель 3x-ui после установки
Страница входа тестового стенда. Учётные данные на снимок не попали.
Привязка панели к localhost
/usr/local/x-ui/x-ui setting -listenIP 127.0.0.1
systemctl restart x-ui
ss -lntp | grep x-ui
SSH-туннель с вашего компьютера
ssh -L 14500:127.0.0.1:ПОРТ_ПАНЕЛИ [email protected]

Пока SSH-сеанс открыт, панель доступна на компьютере по адресу http://127.0.0.1:14500/ВАШ_WEB_BASE_PATH/.

5. Поднимите локальный HTTPS-сайт

Nginx, Certbot и каталог сайта
apt update
apt install -y nginx certbot
mkdir -p /var/www/selfsteal /var/www/letsencrypt/.well-known/acme-challenge
/var/www/selfsteal/index.html
<!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>
Временный HTTP-конфиг для выпуска сертификата
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.com
Итоговый Nginx-конфиг
server {
    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; }
}
Проверка локального target
nginx -t && systemctl reload nginx
curl --resolve vpn.example.com:9443:127.0.0.1 https://vpn.example.com:9443/
Реальная SelfSteal-страница тестового стенда в desktop-браузере
Локальная HTTPS-страница тестового стенда на desktop.
Реальная SelfSteal-страница тестового стенда на мобильном экране
Та же страница на мобильном экране.

6. Создайте VLESS inbound

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

Реальный раздел Inbounds панели 3x-ui
Раздел входящих подключений 3x-ui на тестовом стенде.
  • Remark: понятное имя, например SelfSteal.
  • Protocol: VLESS.
  • Listen IP: оставьте пустым.
  • Port: 443.
  • Transmission: TCP/RAW.
  • Security: Reality.
Базовые параметры VLESS inbound в реальной панели 3x-ui
На тестовом стенде создан VLESS inbound на публичном TCP-порту 443.

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.
Параметры REALITY с локальным target и собственным SNI в реальной панели 3x-ui
Реальная конфигурация тестового стенда. Ключи, short ID и часть домена скрыты.

8. Добавьте клиента

  1. Откройте созданный inbound и нажмите Add Client.
  2. Задайте понятную метку клиента.
  3. Сгенерируйте новый UUID.
  4. Выберите flow xtls-rprx-vision.
  5. Сохраните клиента и экспортируйте ссылку или QR-код только в доверенное приложение.
Созданный VLESS-клиент в реальной панели 3x-ui
Клиент прикреплён к SelfSteal inbound. Его идентификатор скрыт.

В клиентском профиле должны совпадать адрес 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.

Проверка публичного SelfSteal-сайта
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-run
Резервная копия базы 3x-ui
install -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/