Reality esconde la VPN detrás de un sitio web normal. Si ese sitio es ajeno, por ejemplo microsoft.com o dl.google.com, el servidor es fácil de detectar, y por eso en 2026 este tipo de servidores se bloquean de forma masiva. Self-steal resuelve el problema – el servidor se hace pasar por tu propio sitio web con un certificado real.
TIP
El artículo en pocas palabras
- Resultado – un VLESS Reality que, para todo el mundo, parece tu sitio web;
- Tiempo – unos 20 minutos;
- Necesitarás – un VPS con Ubuntu o Debian y tu propio dominio;
- Sirve para – Xray sin panel, 3X-UI, Marzban y Remnawave.
Por qué se bloquean los servidores
| Cuándo | Qué pasó |
|---|---|
| Noviembre de 2025 | Cortes masivos de VLESS Reality en el puerto 443 con los proveedores domésticos |
| 17 de febrero de 2026 | Una gran oleada de bloqueos de VLESS Reality sobre TCP en todo el país |
| Mayo de 2026 | Pruebas de nuevos métodos en Siberia, el Lejano Oriente y Moscú |
| Agosto – septiembre de 2026 | Bloqueos de direcciones IP y subredes de proveedores de VPS populares |
Reality en sí no ha sido vulnerado. Los filtros de los proveedores (TSPU) buscan señales indirectas, y la principal es hacerse pasar por un sitio ajeno:
- el nombre del sitio (SNI) se envía sin cifrar;
- microsoft.com en la dirección IP de un pequeño proveedor de hosting resulta poco natural;
- cualquiera que se conecte al servidor verá el sitio real de Microsoft en una dirección IP ajena.
Qué dicen los desarrolladores de Xray
Desde 2026, Xray muestra un aviso si eliges como destino apple.com, icloud.com o microsoft.com, y desde julio de 2026 también con los sitios de las zonas .ru, .ir y .cn. La documentación oficial de Reality recomienda elegir un sitio de la misma red que el servidor. La forma más sencilla de cumplir esta condición es alojar el sitio en el propio servidor.
Cómo funciona self-steal
| Quién se conecta | Qué ve |
|---|---|
| Tu cliente con la clave | Una conexión VPN |
| Proveedor, escáner, navegador | Tu sitio web con un certificado real |
El dominio, el certificado y la dirección IP coinciden, así que el servidor parece uno más entre miles de sitios web normales. Xray acepta las conexiones en el puerto 443, y el sitio funciona en nginx en la dirección interna 127.0.0.1:8443.
WARNING
Self-steal no es una garantía total. En agosto y septiembre de 2026 también cayeron servidores así en los bloqueos de subredes. El esquema funciona mejor junto con un dominio neutro, pocos usuarios y la huella firefox.
Qué necesitas
- un VPS con Ubuntu 22.04, 24.04 o Debian 12 – para uso personal basta con DE-PROMO, y para un canal de 1 Gbit/s va bien DE-RZ9-1;
- un dominio o subdominio que apunte a este servidor;
- los puertos 80 y 443 libres.
TIP
Elige un nombre de dominio neutro, como el de un blog o un portfolio, sin las palabras vpn, proxy, xray, reality ni node. Para un servidor en Alemania es mejor una zona internacional (.com, .net, .org) o .de – con la zona .ru Xray muestra un aviso.
Paso 1. Registro DNS
Crea en tu registrador un registro A con la dirección IP del servidor. Si el dominio está conectado a Cloudflare, desactiva el proxy (nube gris) – Reality no funciona a través de una CDN.
dig +short example.comEl comando debe mostrar la dirección IP del servidor.
Paso 2. Sitio web y certificado
Instala nginx y certbot y luego pon en el sitio una página sencilla – un blog, una tarjeta de visita, lo que quieras menos una página vacía:
apt update && apt install -y nginx certbot
nano /var/www/html/index.htmlEmite el certificado, cambiando el dominio y el correo por los tuyos:
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 renovará el certificado y recargará nginx por su cuenta.
Paso 3. Configuración de nginx
Abre el archivo /etc/nginx/sites-available/default y sustituye su contenido, poniendo tu propio dominio:
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 nginxQué hace esta configuración
- Puerto 80 – renovación del certificado y redirección de los visitantes a HTTPS.
- 127.0.0.1:8443 – el propio sitio. Solo es accesible desde dentro del servidor, y el puerto 443 queda libre para Xray.
- El aviso
listen ... http2 is deprecatedde las versiones nuevas de nginx puedes ignorarlo. No cambies la línea porhttp2 on;– el nginx de Ubuntu 22.04, 24.04 y Debian 12 no conoce esa directiva y no arrancará.
Paso 4. Instalar Xray y generar las claves
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
xray uuid
xray x25519
openssl rand -hex 8Guarda cuatro valores:
| Valor | De dónde sacarlo | Dónde se necesita |
|---|---|---|
| UUID | xray uuid | Servidor y cliente |
| Clave privada | xray x25519, la línea PrivateKey | Solo el servidor |
| Clave pública | xray x25519, la línea Password (PublicKey) o Public key | Solo el cliente |
| Short ID | openssl rand -hex 8 | Servidor y cliente |
Paso 5. Configurar Xray
WARNING
Si el archivo /usr/local/etc/xray/config.json ya contiene tus conexiones, no lo borres – perderías a tus usuarios. Cambia solo el bloque realitySettings según la tabla de abajo.
Para una instalación nueva, abre el archivo con el comando nano /usr/local/etc/xray/config.json y pega la configuración, sustituyendo los valores en mayúsculas.
Configuración de Xray para una instalación nueva
{
"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"
}
]
}Lo más importante de esta configuración son tres campos:
| Campo | Valor | Para qué |
|---|---|---|
target | 127.0.0.1:8443 | A los extraños los enviamos a tu sitio. Antes este campo se llamaba dest |
xver | 0 | Si no, nginx recibirá una cabecera PROXY protocol de más y el sitio no se abrirá |
serverNames | Tu dominio | Debe coincidir con el dominio del certificado |
Comprueba la configuración y reinicia Xray:
xray run -test -config /usr/local/etc/xray/config.json
systemctl restart xrayPaso 6. Cortafuegos
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw enableSi SSH funciona en otro puerto, indícalo en lugar de 22.
Paso 7. Comprobación
Abre https://example.com en el navegador. Si aparece tu sitio sin avisos sobre el certificado, Xray está pasando bien a nginx las conexiones ajenas.
Paso 8. Conectar el cliente
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-serverPon tus valores e importa el enlace en la aplicación, como se muestra en las instrucciones de importación. Por qué el enlace lleva fp=firefox lo explicamos en el artículo sobre 3X-UI.
Self-steal en los paneles
Primero haz los pasos 1–3 en el servidor donde funciona Xray. Después cambia la conexión en el panel.
Abre la conexión VLESS Reality e indica:
- Target –
127.0.0.1:8443; - SNI – tu dominio;
- Xver –
0.
No hace falta volver a generar las claves.
- En Core Settings, en el bloque
realitySettings, pontarget–127.0.0.1:8443,serverNames– tu dominio,xver–0. - En Host Settings, escribe este dominio en el campo SNI.
- En Config Profiles, abre el perfil del nodo y haz los mismos tres cambios en
realitySettings. - Si en la sección Hosts el SNI está redefinido, pon ahí el nuevo dominio.
Tienes más información sobre el panel en el artículo «Instalación de Remnawave en un VPS».
INFO
Si Xray funciona en Docker sin network_mode: host, la dirección 127.0.0.1 apunta al interior del contenedor y nginx no será accesible. El nodo de Remnawave funciona en modo host, así que a él no le afecta.
Cómo pasar de un sitio ajeno a self-steal
- Haz una copia de la configuración con el comando
cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.bak. - Haz los pasos 1–3.
- Cambia
target,serverNamesyxversegún la tabla del paso 5. Si en la configuración aparecen a la vezdestytarget, deja solo uno de los dos. - Comprueba la configuración y reinicia Xray.
El UUID, las claves y el Short ID no cambian. Los usuarios solo tienen que actualizar la suscripción o el enlace – en él cambiará sni.
WARNING
Si Reality se instaló con la aplicación AmneziaVPN, esta escribe la configuración del servidor por su cuenta, y los cambios manuales pueden perderse. Para self-steal es más fiable instalar Xray por separado.
Si algo no funciona
| Síntoma | Qué comprobar |
|---|---|
| El sitio no se abre | El registro A, la salida de nginx -t, si nginx escucha en el puerto 8443 (ss -tlnp | grep 8443) |
| Xray no arranca | El log de journalctl -u xray -n 50, la sintaxis del JSON, si el puerto 443 ya está ocupado |
| El sitio se abre, pero la VPN no | Si UUID, sni, pbk y sid coinciden con el servidor, si el cliente está actualizado |
| El certificado no se renueva | Si el puerto 80 está abierto, el resultado de certbot renew --dry-run |
| No funciona con un proveedor concreto | Otra huella en el cliente, la conexión desde otra red, si la IP está bloqueada |
Consejos
- Menos usuarios – un perfil de tráfico menos llamativo.
- Una página real – parece más natural que una página vacía.
- Versiones recientes – Xray se actualiza con el mismo comando de instalación, y los clientes mantenlos también al día.
- Una conexión de reserva – por ejemplo, VLESS + TLS + XHTTP, por si la principal deja de funcionar.