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

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, ей это не мешает.
Переход с чужого сайта
cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.bak- Шаги 1–3.
- Поменяйте
target,serverNamesиxver. Если есть иdest, иtarget— оставьте одно. 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 перестанет проходить.