Files
3x-ui/docs/content/docs/en/config/reality.mdx
T
libmur-dev ce221c33d0 fix(sub): carry REALITY ML-KEM hint in VLESS links (#6712)
* fix(sub): carry REALITY ML-KEM hint in VLESS links

Keep raw share links in parity with Clash subscriptions for Xray 26.9.8+. Preserve the URI hint through Go and frontend imports, expose it in the outbound editor, and update the documentation tooling.

* fix(link): accept REALITY ML-KEM boolean aliases

* test(frontend): isolate Happ preset notifications

* fix(link): keep the ML-KEM hint out of Xray REALITY settings

support-x25519mlkem768 is a Mihomo reality-opts option; xray-core's
REALITYConfig (infra/conf/transport_security.go) has no such field and its
JSON loader drops unknown keys silently. The PR also stored it as
realitySettings.supportX25519Mlkem768 in Xray outbounds (form switch, Go and
TS link import, docs outbound builders) and as an inbound settings default
that is stripped before Xray and read by no link generator. The outbound
switch therefore did nothing, and imported links carried a dead key into the
JSON subscription.

The share-link hint itself stays: Go, frontend and docs still emit
support-x25519mlkem768=true on VLESS REALITY links and drop it on a TLS host
override.

---------

Co-authored-by: libmur-dev <333915961+libmur-dev@users.noreply.github.com>
Co-authored-by: MHSanaei <ho3ein.sanaei@gmail.com>
2026-10-02 15:44:41 +02:00

152 lines
5.6 KiB
Plaintext

---
title: REALITY
description: Set up a VLESS + REALITY inbound with XTLS-Vision in 3x-ui — keys, short IDs, SNI, fingerprints, and common pitfalls.
icon: ShieldCheck
---
**REALITY** is an Xray transport security that disguises your proxy as ordinary
traffic to a real, popular website. Unlike classic TLS, your server needs **no
certificate of its own** — it borrows the TLS handshake of the target site
(`dest`). Combined with the **XTLS-Vision** flow, it is fast and resistant to
deep-packet inspection.
REALITY is used with **VLESS** (and Trojan). The recommended flow is
`xtls-rprx-vision`.
## Key settings
When you choose **REALITY** as the security mode on a VLESS inbound, 3x-ui
exposes these fields:
| Field | What it is |
| ------------------------ | ------------------------------------------------------------------ |
| **Dest (target)** | A real TLS site to impersonate, e.g. `www.microsoft.com:443`. |
| **SNI / Server Names** | The hostname(s) clients send; must match the target's certificate. |
| **Public / Private key** | An **x25519** keypair. The private key stays on the server. |
| **Short IDs** | Hex strings used to authenticate clients (you can have several). |
| **Flow** | Set to `xtls-rprx-vision`. |
| **Fingerprint (uTLS)** | The client TLS fingerprint to mimic, e.g. `chrome`. |
The private key is generated with Xray's `x25519` utility (the panel can
generate the pair for you):
```bash title="generate an x25519 keypair"
xray x25519
```
## Set it up in the panel
<Steps>
<Step>
### Create a VLESS inbound
Add a new inbound, choose protocol **VLESS**, and set **Security** to
**reality**.
</Step>
<Step>
### Choose a target (dest) and SNI
Pick a reputable site that supports TLS 1.3 and HTTP/2 and is reachable from your
server and your clients (for example `www.microsoft.com:443`). Set the server
names / SNI to match that site's certificate.
</Step>
<Step>
### Generate keys and short IDs
Generate the x25519 keypair and one or more short IDs. Keep the **private key**
secret; clients only ever receive the **public key**.
</Step>
<Step>
### Set the flow and fingerprint
Use the `xtls-rprx-vision` flow and a common uTLS fingerprint such as `chrome`.
</Step>
<Step>
### Add a client and share the link
Create a client, then use its share link or QR code in a compatible app
(v2rayNG, Hiddify, Mihomo, and others).
</Step>
</Steps>
## What the configuration looks like
On the server, a REALITY inbound's `streamSettings` looks roughly like this:
```json title="server inbound (excerpt)"
{
"network": "tcp",
"security": "reality",
"realitySettings": {
"dest": "www.microsoft.com:443",
"serverNames": ["www.microsoft.com"],
"privateKey": "<x25519 private key>",
"shortIds": ["<hex short id>"],
"fingerprint": "chrome"
}
}
```
The matching client share link carries the **public** parameters:
```text title="vless:// (excerpt)"
vless://<uuid>@<server>:443?security=reality&pbk=<public-key>&sid=<short-id>&sni=www.microsoft.com&fp=chrome&spx=%2F&flow=xtls-rprx-vision#my-reality
```
- `pbk` — REALITY **public** key
- `sid` — short ID (matches one on the server)
- `sni` — server name (matches the target's certificate)
- `fp` — client fingerprint
- `spx` — spiderX path
- `flow` — `xtls-rprx-vision`
## Common pitfalls
<Callout type="warn">
- **Bad target.** The `dest` must be a real site that supports **TLS 1.3** and
**HTTP/2**, is reachable, and isn't blocked in your region. Pick a site you do
not own and that sees lots of traffic.
- **SNI mismatch.** The SNI / server names must match the target's real
certificate, or the handshake gives the disguise away.
- **Leaked private key.** Only ever distribute the **public** key to clients.
- **Wrong flow.** REALITY + XTLS-Vision needs `flow = xtls-rprx-vision` on both
the inbound client entry and the share link.
- **Client version limits.** Xray-core v26.9.8+ no longer sets a minimum when
**Min Client Ver** is empty. An explicitly saved minimum still applies. Earlier
builds may use a built-in minimum (such as `26.3.27`), rejecting third-party
clients even with correct keys. Check the running core version before changing
this gate; lowering it also admits older fingerprints.
- **Mihomo and ML-KEM.** Xray-core v26.9.8+ independently requires an
`X25519MLKEM768` key share before the optional `X25519` share. The Clash/Mihomo
YAML subscription enables `reality-opts.support-x25519mlkem768` for REALITY
nodes, including external links, and uses `chrome` when no fingerprint was set.
Explicit fingerprints are preserved: choose one that offers ML-KEM (`chrome`
with Mihomo's uTLS v1.8.7); enabling the flag cannot upgrade an old fingerprint.
Raw `vless://` links carry the equivalent `support-x25519mlkem768=true` hint;
clients that support this URI extension, including current Mihomo builds, apply
it on import. Very old REALITY servers that reject ML-KEM require a per-node
client override setting this option to `false`, or a server upgrade. Clearing
the version limit alone does not fix the handshake.
</Callout>
## Generate a config
Use the generator below to create a fresh X25519 keypair, UUID, and short ID,
then copy the server inbound JSON and the client share link. Everything is
computed **in your browser** — no keys or links are sent anywhere.
<RealityConfigGenerator />
<Callout type="info">
The **private key** belongs only on your server. Share the generated
`vless://` link (which contains the **public** key) with clients.
</Callout>