Сайт-заглушка на 127.0.0.1:8443 с реальным сертификатом вашего домена:
server {
listen 127.0.0.1:8443 ssl http2 proxy_protocol;
# proxy_protocol нужен, чтобы видеть реальный IP клиента
server_name your.domain;
ssl_certificate /etc/letsencrypt/live/your.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your.domain/privkey.pem;
ssl_protocols TLSv1.3;
root /var/www/decoy; # положить сюда правдоподобный статичный сайт
location / {
try_files $uri /index.html;
}
}
Конфиг-профиль сервера целиком:
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "vless-selfsteal",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"show": false,
"target": "127.0.0.1:8443",
"xver": 1,
"serverNames": ["your.domain"],
"privateKey": "PRIVATE_KEY_X25519",
"shortIds": ["REALITY_SHORT_ID"]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": {
"rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:category-ads-all"], "outboundTag": "BLOCK" }
]
}
}
clients: [] не трогать вручную, если пользователей выдаёт панель — она сама подставит нужные записи. xver: 1 (PROXY protocol) обязателен в паре с proxy_protocol в nginx-заглушке — иначе заглушка не увидит реального IP клиента. Проверить, что стелс работает, просто: откройте https://your.domain в браузере — должен открыться ваш сайт-заглушка, а не ошибка.
Вариант B — Reality с чужим доменом-донором
Проще в настройке — не нужен свой домен и сертификат. Reality маскируется под чужой крупный сайт с TLS 1.3 (донор). Минус: SNI донора не резолвится в ваш IP, при более глубоком анализе это заметное несоответствие «SNI ≠ владелец IP». Для жёсткого DPI лучше вариант A.
{
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"show": false,
"target": "your-donor.de:443",
"xver": 0,
"serverNames": ["your-donor.de"],
"privateKey": "PRIVATE_KEY_X25519",
"shortIds": ["REALITY_SHORT_ID"]
}
}
}
В качестве донора берётся нейтральный стабильный сайт с TLS 1.3 + HTTP/2, который не стоит за CDN и не принадлежит вам. Если нод несколько, стоит использовать разные домены-доноры, а не один и тот же на всех.
Настройки на клиентской стороне (Host)
| Поле | Значение |
| Address | your.domain (для варианта B — your-donor.de) |
| Port | 443 |
| publicKey | REALITY_PUBLIC_KEY |
| shortId | REALITY_SHORT_ID |
| flow | xtls-rprx-vision |
| fingerprint | firefox |
На что обратить внимание
- Транспорт в актуальных версиях Xray называется
raw (раньше был tcp) — в новых конфигах используйте raw.
- Поле
allowInsecure в новых версиях убрано — если нужен пиннинг сертификата, это отдельное поле pinnedPeerCertSha256.
- Fingerprint клиента
chrome лучше не ставить — он более заметен и на части сборок клиент с ним не стартует. Предпочтительны firefox или random.