Self-steal для VLESS Reality: маскировка под собственный сайт

Почему Reality с чужим сайтом в SNI блокируют и как перевести сервер на self-steal: свой домен, nginx на 127.0.0.1:8443, Xray с target на локальный сайт. Для чистого Xray, 3X-UI, Marzban и Remnawave. Ubuntu и Debian.

9 октября 2026 г.·5 мин чтения·xray, reality, nginx, self-steal

Reality прячет VPN под обычный сайт. Если сайт чужой — microsoft.com, dl.google.com, — сервер вычисляется по косвенным признакам, и в 2026 году такие серверы блокируют массово. Self-steal убирает главный признак: сервер маскируется под ваш собственный сайт с настоящим сертификатом, и домен, сертификат и IP совпадают, как у тысяч обычных сайтов.

Результат — VLESS Reality, который снаружи выглядит как ваш сайт. Время — около 20 минут. Подходит для Xray без панели, 3X-UI, Marzban и Remnawave.

Почему блокируют

Сам Reality не взломан. Фильтры провайдеров ищут косвенные признаки, и главный — чужой сайт в SNI:

  • SNI передаётся открыто;
  • microsoft.com на IP небольшого хостинга выглядит неестественно;
  • любой, кто подключится к серверу, увидит настоящий сайт Microsoft на чужом адресе.

Xray с 2026 года сам предупреждает, если целью выбраны apple.com, icloud.com или microsoft.com, а с середины года — и сайты в зонах .ru, .ir и .cn. Официальная рекомендация — брать сайт из той же сети, что и сервер. Проще всего выполнить её, разместив сайт на самом сервере.

Как работает self-steal

Кто подключается Что видит
Ваш клиент с ключом VPN-туннель
Провайдер, сканер, браузер Ваш сайт с настоящим сертификатом

Xray слушает порт 443. Своих пускает в туннель, всех остальных пересылает на nginx, который крутится на внутреннем адресе 127.0.0.1:8443 с вашим сайтом и сертификатом Let’s Encrypt.

Полной гарантии нет. Под блокировки подсетей хостингов попадали и такие серверы. Схема работает лучше всего вместе с нейтральным доменом, небольшим числом пользователей и отпечатком firefox.

Что нужно

  • Сервер на tanaka.host с Ubuntu 22.04/24.04 или Debian 12.
  • Домен или поддомен, направленный на сервер. Нейтральное имя — блог, портфолио, без слов vpn, proxy, xray, reality, node. Для сервера в Европе лучше .com/.net/.org или .de, не .ru.
  • Свободные порты 80 и 443.

1. DNS

A-запись с IP сервера. Если домен на Cloudflare — выключите прокси (серое облако), через CDN Reality не работает.

dig +short example.com

Должен вывести IP сервера.

2. Сайт и сертификат

apt update && apt install -y nginx certbot
nano /var/www/html/index.html

Положите на сайт что-то осмысленное — визитку, пару страниц блога. Пустая заглушка выглядит хуже. Выпустите сертификат, подставив домен и почту:

certbot certonly --webroot -w /var/www/html -d example.com -m you@example.com --agree-tos --no-eff-email --deploy-hook "systemctl reload nginx"

Certbot сам продлит сертификат и перезагрузит nginx. Подробнее — в статье про Let’s Encrypt.

3. nginx

Замените содержимое /etc/nginx/sites-available/default, подставив домен:

server {
    listen 80;
    listen [::]:80;
    server_name example.com;

    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 127.0.0.1:8443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
nginx -t && systemctl reload nginx

Порт 80 — продление сертификата и редирект на HTTPS. 127.0.0.1:8443 — сам сайт, доступен только изнутри, а 443 остаётся Xray. Предупреждение listen ... http2 is deprecated игнорируйте и не меняйте на http2 on; — nginx в Ubuntu 22.04/24.04 и Debian 12 такой директивы не знает и не запустится.

4. Xray и ключи

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
xray uuid
xray x25519
openssl rand -hex 8
Значение Откуда Куда
UUID xray uuid Сервер и клиент
Приватный ключ xray x25519, строка PrivateKey Только сервер
Публичный ключ xray x25519, строка Password (PublicKey) или Public key Только клиент
Short ID openssl rand -hex 8 Сервер и клиент

5. Конфигурация Xray

Если в /usr/local/etc/xray/config.json уже есть ваши подключения, не стирайте файл — потеряете пользователей. Правьте только блок realitySettings по таблице ниже.

Для новой установки — nano /usr/local/etc/xray/config.json, замените значения в верхнем регистре:

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "UUID",
            "flow": "xtls-rprx-vision"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "realitySettings": {
          "target": "127.0.0.1:8443",
          "xver": 0,
          "serverNames": ["example.com"],
          "privateKey": "PRIVATE_KEY",
          "shortIds": ["SHORT_ID"]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls", "quic"]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}

Три поля, ради которых всё затевалось:

Поле Значение Зачем
target 127.0.0.1:8443 Посторонние уходят на ваш сайт. Раньше поле называлось dest
xver 0 Иначе nginx получит заголовок PROXY protocol и сайт не откроется
serverNames ваш домен Должен совпадать с доменом в сертификате
xray run -test -config /usr/local/etc/xray/config.json
systemctl restart xray

6. Брандмауэр

ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw enable

Если SSH на другом порту — укажите его вместо 22. Подробнее — брандмауэр UFW и firewalld.

7. Проверка

Откройте https://example.com в браузере. Ваш сайт без предупреждений о сертификате — значит, Xray правильно отдаёт посторонних в nginx.

8. Клиент

vless://UUID@example.com:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=example.com&fp=firefox&pbk=PUBLIC_KEY&sid=SHORT_ID&type=tcp#My-server

Подставьте значения и импортируйте в любой клиент на Xray-core. Про fp=firefox — в статье про Marzban.

Self-steal в панелях

Шаги 1–3 выполняются на том сервере, где работает Xray. Затем меняется подключение в панели, ключи перевыпускать не нужно.

  • 3X-UI. Откройте подключение VLESS Reality: Target — 127.0.0.1:8443, SNI — ваш домен, Xver — 0. См. статью про 3X-UI.
  • Marzban. В Core Settings в блоке realitySettings: target — 127.0.0.1:8443, serverNames — домен, xver — 0. В Host Settings — домен в поле SNI.
  • Remnawave. В Config Profiles откройте профиль ноды и внесите те же три правки в realitySettings. Если в Hosts переопределён SNI — укажите новый домен. См. статью про Remnawave.

Xray в Docker без network_mode: host — 127.0.0.1 указывает внутрь контейнера, и nginx будет недоступен. Нода Remnawave работает в режиме host, ей это не мешает.

Переход с чужого сайта

  1. cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.bak
  2. Шаги 1–3.
  3. Поменяйте target, serverNames и xver. Если есть и dest, и target — оставьте одно.
  4. xray run -test и systemctl restart xray.

UUID, ключи и Short ID не меняются. Пользователям достаточно обновить подписку — в ней поменяется sni.

AmneziaVPN. Если Reality ставился через него, приложение само перезаписывает настройки сервера, и ручные правки могут пропасть. Для self-steal надёжнее поставить Xray отдельно.

Если не работает

Симптом Что проверить
Сайт не открывается A-запись, nginx -t, слушает ли nginx 8443: ss -tlnp | grep 8443
Xray не запускается journalctl -u xray -n 50, синтаксис JSON, не занят ли 443
Сайт есть, VPN нет UUID, sni, pbk, sid совпадают с сервером; клиент обновлён
Не продлевается сертификат Открыт ли 80, certbot renew --dry-run
Не работает у одного провайдера Другой отпечаток, другая сеть, не заблокирован ли IP

Меньше пользователей — менее заметный профиль. Держите Xray и клиенты свежими (Xray обновляется той же командой установки). И заведите запасной транспорт, например VLESS + TLS + XHTTP, на случай, если Reality перестанет проходить.