VPNSmith
tunneling-obfuscationINFO

Configuración sing-box VLESS Reality 2026: los campos que casi todas las guías siguen equivocando

Una configuración actual de sing-box VLESS + Reality, contrastada con la documentación oficial de la 1.13. Incluye los campos del inbound que quedaron obsoletos en la 1.11 y que se siguen copiando en la mayoría de tutoriales.

Por Eric Gerard · Fundador · VPNSmith - Especialista en VPN self-host y VPS GDPR7 min de lecturaPhoto via Pexels

Busca una guía de sing-box Reality y encontrarás un montón de archivos de configuración que eran correctos en 2024. Siguen parseándose, y ahí está el problema: nada te avisa de que acabas de construir sobre campos que el proyecto declaró obsoletos. Aquí repasamos una configuración VLESS Reality campo por campo contra la documentación actual, y señalamos las partes que se han movido en silencio.

Como referencia, la versión contra la que se ha contrastado esto es sing-box 1.13.15, publicada el 29 de julio de 2026.

Qué cambia Reality en realidad

Los proxies convencionales basados en TLS tienen una debilidad estructural: el certificado es tuyo. Un censor que inspecciona el handshake ve un dominio y un certificado que no se corresponden con un sitio web real y popular, y ese desajuste es en sí mismo la señal.

El enfoque de Reality consiste en tomar prestado el handshake de un sitio de terceros genuino. Tu servidor se configura para apuntar a un host externo real, y el tráfico que no supera la autenticación se le pasa a él. Para un observador, la conexión se parece a una conexión con ese sitio, porque en parte lo es.

Por eso la configuración tiene un bloque handshake. No es decoración, y su elección importa más que cualquier otro valor que vayas a fijar.

Los tres campos Reality obligatorios en el servidor

Dentro del objeto tls, el bloque reality requiere exactamente tres cosas según la documentación:

  • handshake (objeto), que contiene server y server_port, el sitio externo del que tu servidor toma prestado
  • private_key (cadena), que según la documentación se genera con sing-box generate reality-keypair
  • short_id (cadena), descrita como una cadena hexadecimal de cero a ocho dígitos

También hay un booleano enabled, y un max_time_difference opcional, que fija la diferencia de reloj tolerada entre los dos extremos. La documentación señala que la comprobación se desactiva cuando se deja vacío. Si lo fijas, ten en cuenta que ahora dependes de que ambas máquinas mantengan la hora exacta.

Generar las claves

Hay dos valores que hay que generar antes de escribir nada:

sing-box generate reality-keypair
sing-box generate uuid

El keypair imprime una clave privada y una clave pública. La clave privada se queda en el servidor. La clave pública va a cada cliente. El UUID es la identidad de usuario VLESS.

Guarda el par junto en un sitio seguro cuando lo generes. La clave pública no se puede recuperar a partir de un archivo de configuración que solo almacena la privada, y regenerar el par invalida a todos los clientes que ya hayas repartido.

Cables ethernet azules enchufados en los puertos numerados de un switch de red, con LED de estado verdes encendidos a lo largo del panel frontal.
Cables ethernet azules enchufados en los puertos numerados de un switch de red, con LED de estado verdes encendidos a lo largo del panel frontal.

El inbound del servidor

Un inbound VLESS requiere type, tag, los campos de escucha y un array users. Cada entrada de usuario admite un uuid, opcionalmente un name, y opcionalmente un flow. La documentación lista exactamente un valor de flow disponible: xtls-rprx-vision.

{
  "type": "vless",
  "tag": "vless-in",
  "listen": "::",
  "listen_port": 443,
  "users": [
    {
      "name": "me",
      "uuid": "PASTE-YOUR-GENERATED-UUID",
      "flow": "xtls-rprx-vision"
    }
  ],
  "tls": {
    "enabled": true,
    "server_name": "your-handshake-host.example",
    "reality": {
      "enabled": true,
      "handshake": {
        "server": "your-handshake-host.example",
        "server_port": 443
      },
      "private_key": "PASTE-YOUR-PRIVATE-KEY",
      "short_id": "0123abcd"
    }
  }
}

Fíjate en server_name y en el server del handshake. Son campos separados que normalmente contendrán el mismo host, y un desajuste entre ellos es una causa habitual de un montaje que se construye bien y luego falla en el momento de la conexión.

La parte que casi todas las guías equivocan

Aquí está la diferencia entre una configuración de 2024 y una actual. Estos tres campos del inbound quedaron obsoletos en la versión 1.11.0:

  • sniff
  • sniff_timeout
  • domain_strategy

Salieron del inbound y pasaron a ser acciones de reglas de enrutado. La guía de migración da las equivalencias directas:

{
  "route": {
    "rules": [
      { "inbound": "vless-in", "action": "sniff", "timeout": "1s" },
      { "inbound": "vless-in", "action": "resolve", "strategy": "prefer_ipv4" }
    ]
  }
}

Así, "sniff": true pasa a ser un action de sniff, sniff_timeout pasa a ser el timeout de esa acción, y domain_strategy pasa a ser un action de resolve con un strategy.

Por ser exactos sobre lo que está en juego: la documentación los marca como obsoletos y no anuncia una fecha de eliminación. Hoy no se rompe nada. Pero una configuración que todavía los lleva está escrita contra una interfaz de la que el proyecto se ha alejado, y eso conviene saberlo cuando eliges qué tutorial seguir.

Dos campos relacionados, sniff_override_destination y udp_disable_domain_unmapping, también aparecen marcados como obsoletos en la documentación actual de los campos de escucha.

El lado del cliente

El cliente necesita menos que el servidor. Reality en el cliente requiere:

  • public_key, la contraparte de la clave privada del servidor
  • short_id, que debe coincidir con un valor que el servidor acepte

El objeto utls va junto a él, con enabled y fingerprint. Los valores de fingerprint aceptados que están documentados son chrome, firefox, edge, safari, 360, qq, ios, android, random y randomized. La documentación indica que se usa el fingerprint de Chrome cuando el campo está vacío.

Un apunte de honestidad aquí, porque las guías tienden a afirmar lo contrario: la documentación de sing-box presenta utls como una opción TLS independiente y no afirma que Reality lo requiera. La mayoría de configuraciones de cliente lo activan de todos modos.

Elegir el host de handshake

Ningún valor de la configuración afecta más al resultado, y ninguna guía puede elegirlo por ti, porque la respuesta correcta depende de dónde está tu servidor y dónde están tus clientes.

Las propiedades que importan:

  • Debe ser un host que soporte de verdad TLS 1.3 en el puerto al que apuntas
  • Debe ser tráfico plausible desde la ubicación de red de tu servidor
  • No debe ser un sitio que esté bloqueado en el país desde el que te conectas, lo que echaría por tierra todo el propósito
  • No debe ser un sitio que tú controles, porque la gracia está en que sea tráfico real de otra persona

Un consejo que se repite mucho es elegir algo grande y genérico. Cuidado con ese razonamiento: un host que todos los tutoriales recomiendan es, por definición, un host que aparece en todas las configuraciones, y ser popular dentro de la comunidad de proxies no es lo mismo que pasar desapercibido.

Antes de dar por hecho que funciona

Dos comprobaciones que merecen la pena y que van más allá de "el cliente conectó".

Confirma que el fallback se comporta. Apunta un navegador normal a la dirección y el puerto de tu servidor. Lo que deberías ver es el sitio del handshake, no un error ni un timeout. Si obtienes otra cosa, el passthrough no está haciendo su trabajo y el montaje resulta más llamativo que un proxy corriente.

Comprueba los dos relojes. Si fijas max_time_difference, la deriva en cualquiera de las dos máquinas producirá fallos que parecen problemas de autenticación y te mandará a editar claves que nunca estuvieron mal.

Si todavía estás decidiendo entre motores en vez de configurando uno, las ventajas y contrapartidas están detalladas en nuestra comparativa sing-box frente a Xray.

La versión corta

Tres campos Reality obligatorios en el servidor: handshake, private_key, short_id. Dos en el cliente: public_key, short_id. Las claves salen de sing-box generate reality-keypair. Y si la guía que estás leyendo pone sniff o domain_strategy dentro del inbound, es anterior a la versión 1.11 y el equivalente actual es una acción de regla de enrutado.

Los nombres de campo, los requisitos y las obsolescencias de este artículo se han tomado de la documentación oficial de sing-box y de su guía de migración, contrastados con la release 1.13.15 el 30 de julio de 2026. Las interfaces de configuración cambian entre versiones, así que verifica contra la documentación de la release que estés ejecutando. Sortear la censura está restringido o es ilegal en algunas jurisdicciones; comprueba qué se aplica donde estés.

★ Datacenter Núremberg GDPR · ✓ IPv4 dedicada incluida · 200+ Mbps garantizados

Un VPS que controlas para túnel y ofuscación → ContaboAcceso root · abre cualquier puerto · tu propia stack

Preguntas frecuentes

¿Qué campos de sing-box necesito realmente para un inbound VLESS Reality?
El propio inbound VLESS requiere type, tag, una dirección de escucha y un puerto, y un array users donde cada entrada lleva un uuid. La parte Reality vive dentro del objeto tls y requiere tres cosas en el servidor: un objeto handshake que apunte a un sitio externo real con su server y su server_port, una private_key generada por sing-box, y un short_id. Todo lo demás en el inbound es opcional.
¿Qué genera la clave privada y la clave pública de Reality?
El comando sing-box generate reality-keypair. Imprime un par emparejado. La private_key se queda en la configuración del servidor y la public_key va en la configuración del cliente. No son intercambiables, y un cliente que use la public_key equivocada fallará el handshake en lugar de caer a TLS normal.
¿Se permite que el short_id esté vacío?
La documentación describe short_id como una cadena hexadecimal de cero a ocho dígitos, así que un valor vacío entra dentro de la especificación. El valor en el cliente debe coincidir con un valor que el servidor acepte, que es la parte que la gente pasa por alto cuando copia una configuración de servidor y solo edita el UUID.
¿Por qué los tutoriales antiguos de sing-box ponen sniff y domain_strategy dentro del inbound?
Porque eso era correcto antes de la versión 1.11.0. Esos campos, junto con sniff_timeout, quedaron obsoletos entonces y se movieron a acciones de reglas de enrutado: action sniff con un parámetro timeout, y action resolve con un parámetro strategy. Las configuraciones escritas a la antigua siguen parseándose, pero estás siguiendo una vía obsoleta, algo que conviene saber antes de construir sobre ella.
¿Necesito utls en el cliente?
La documentación de sing-box presenta utls como su propia opción dentro del bloque TLS, con un flag enabled y un fingerprint, y no afirma que Reality lo requiera. Muchas configuraciones de cliente lo activan igualmente. Si dejas el fingerprint vacío, la documentación dice que se usa el fingerprint de Chrome.