nativeToken auth, TCP/UDP tunnel semantics, reverse publish, and resumable logical streams.
Config
Describe inbounds, outbounds, and security in one strict config. Focus on native + raw + reality automatic carriers, resumable streams, and field reference.
Config
Describe inbounds, outbounds, and security in one config. Start with native, then REALITY and protocol choice.
v0.2.4 · native + raw + reality
native + raw + reality + group muxThis is the recommended automatic stack in v0.2.4: one listen address, dual Reality carriers, QUIC preferred, TCP fallback, and optional resumable TCP streams. Without mux, ordinary native / VLESS / VMess / Trojan REALITY remains TCP-only.
Force TCP with reality-tcp, or force QUIC with reality-quic + mux.mode=quic.
nativeToken auth, TCP/UDP tunnel semantics, reverse publish, and resumable logical streams.
rawRequired base transport for automatic dual carriers. Do not stack ws / h2 / h3 in this mode.
realityAutomatic mode: QUIC-first Reality with TCP fallback on one address (not the forced reality-quic stack).
mux (group)Group mux enables the dual-carrier path. Optional mux.resume preserves eligible TCP flows across carrier replacement.
reality + group mux
Binds TCP and UDP on one address, prefers QUIC, falls back to Reality TCP with backoff, and probes to restore QUIC preference.
reality-tcp
Uses only the Reality TCP carrier. Choose this when UDP is intentionally unavailable or deterministic TCP-only behavior is required.
reality-quic + quic mux
Uses the dedicated QUIC pool without TCP fallback. The server listen port must be reachable over UDP.
Automatic dual carriers need all of: type=native, transport.type=raw, mux present (group mode), and security.type=reality. Missing mux keeps ordinary TCP-only Reality.
The inbound binds TCP and UDP to the same host:port. Clients race the same address over both carriers without a second listen entry.
Outbounds prefer the Reality QUIC carrier. When UDP is blocked or unhealthy, they fall back to Reality TCP with jittered exponential backoff, then probe to restore QUIC preference.
Both carriers share the same REALITY keys, short IDs, SNI, and dest. The camouflage destination should support HTTPS over TCP and HTTP/3 over UDP.
TCP streams, UDP relay, and reverse carriers follow the same automatic carrier policy when the stack is Reality-auto.
security.type=reality-tcp forces TCP only. security.type=reality-quic with mux.mode=quic forces the dedicated QUIC pool and never falls back to TCP.
Top-level fields include log, resources, inbounds, outbounds, route, and dns. Unknown fields are rejected; resources.resumable_buffer_budget controls the shared replay-buffer budget.
inbound.address and outbound.address are both host:port arrays. Multiple addresses race as candidate entry points; use balance for independent nodes.
Components link through tags; via chains and balance members are checked for missing refs and cycles.
Load → Validate → Compile → Start. Listening begins only after validation succeeds.
Native
Supports TCP / UDP and mux, with transport options raw / ws / h2 / h3. Server users[].id and client token must match.
users[].idtokenServer users[].id and client token must match.
address is a host:port array. Multiple addresses race as candidate entry points for the same service; they are not balance.
native + raw + group mux + security.type=reality prefers QUIC, falls back to TCP, and shares one camouflage identity on both carriers.
mux.resume=true on both Reality-auto peers can preserve an eligible TCP logical stream across carrier replacement (v0.2.4+).
Prefer native + raw + mux. Forced TLS / REALITY / ws / h2 / h3 add flexibility but cost more.
Server publish + client expose can hang NAT-side TCP/UDP services on edge listeners (requires mux).
Native QUIC
native + raw + reality-quicThis is not three interchangeable modes, but one layered stack: native is the tunnel protocol, raw is the transport, and reality-quic is the QUIC-only security layer. You must also set mux.mode=quic to enable the native QUIC connection pool.
Carry TCP streams and UDP DATAGRAMs together without managing TLS certificates.
nativeHandles token auth, TCP / UDP tunnel semantics, and reverse publish.
rawRequired base transport for QUIC mode; do not stack ws / h2 / h3.
reality-quicProtects the QUIC handshake with REALITY keys and site parameters; no cert deploy needed.
mux.mode: quicUses a QUIC connection pool for streams and UDP DATAGRAMs.
{
"log": { "level": "info" },
"inbounds": [
{
"tag": "server",
"type": "native",
"address": ["0.0.0.0:9443"],
"network": ["tcp", "udp"],
"users": [{ "id": "change-me" }],
"transport": { "type": "raw" },
"mux": {}
}
],
"outbounds": [
{ "tag": "direct", "type": "direct" }
],
"route": { "default_outbound": "direct", "rules": [] },
"dns": {}
}The server exposes a native inbound; the client forwards a local mixed inbound to a native outbound. Replace the sample credentials and addresses to run.
Common field overview.
tagbothtypebothaddressbothnetworkbothtransportbothsecuritybothmuxbothaddressserverusers[].idserverpublishserversecurity.cert/keyserveraddressclienttokenclientsecurity.server_nameclientexposeclientmux.max_sessionsclientmux.max_streams_per_sessionclientmux.warm_sparesclientmux.udp_modeclientmux.resumebothmux.resume_timeoutbothmux.resume_buffer_sizebothmux.*_receive_windowbothEnable mux for short-connection workloads. Prefer native + raw + mux for peak throughput.
Any mux object enables mux (commonly "mux": {}). Do not use enabled; omit the mux field to disable it.
Reuses physical connections. Unreachable targets are not reported as success to the local proxy early.
native + raw + group mux + reality prefers QUIC, falls back to Reality TCP with bounded backoff, then probes to restore QUIC preference.
mux.resume keeps eligible native TCP logical streams alive while an automatic Reality carrier is replaced. Enable matching settings on both peers.
mux.mode: "quic" uses a UDP/QUIC connection pool and requires native + raw; security.type may be tls or reality-quic.
reliable uses streams; auto prefers DATAGRAM with fallback; datagram does not degrade. DATAGRAM supports fragmentation, recovery, and adaptive FEC.
"mux": {
"max_sessions": 4,
"max_streams_per_session": 16,
"warm_spares": 1
}v0.2.4 continuity
Add resume to matching Reality-auto mux blocks to preserve an eligible TCP logical stream while its physical QUIC or TCP attachment is replaced.
native + raw + security.type=reality + group mux only. UDP, reverse publish, reality-tcp, reality-quic, and mux.mode=quic are not resumable.
Set mux.resume=true on both endpoints running v0.2.4+. There is no silent downgrade when only one peer enables it.
resume_timeout defaults to 15s (100ms–5m). resume_buffer_size defaults to 4 MiB (64 KiB–64 MiB).
The registry is process-local. Use one unique outbound address whose TCP and UDP paths reach the same server process.
"mux": {
"mode": "group",
"resume": true,
"resume_timeout": "15s",
"resume_buffer_size": 4194304
}Hang NAT-side TCP/UDP services on tunnel server listen ports. Configure publish on the server and expose on the client.
Only native + raw, and group mux or QUIC mux must be enabled. VLESS / VMess / Trojan are rejected during validation.
Server publish and client expose service names must match, and network must match as well (default tcp).
The client local target is not sent to the server; the server can only open allowlisted services.
QUIC reverse publish needs matching TLS or reality-quic on both ends; TLS servers need cert/key.
Generate → validate → start.
Writes server.json and client.json.
tcptun config native --server proxy.example.com --port 9443Does not listen; useful after editing a config.
tcptun config check --config server.jsonWrites matching reality-quic + QUIC mux configs.
tcptun config native --quic --server proxy.example.com --port 9443Start the server first, then the client.
tcptun --config server.json
tcptun --config client.jsonExports URIs from tunnel outbounds; multiple addresses become multiple URIs.
tcptun uri export --config client.json --output client.uriREALITY
Configured under security. All four tunnel protocols can use it; VLESS generated configs enable Vision by default.
transport must be raw and cannot be combined with ws / h2 / h3.
Plain reality cannot stack with security.type=tls; choose exactly one security type.
Works with native / vless / vmess / trojan. mixed and socks5 are unsupported.
Server private_key pairs with client public_key; short_id must match on both ends.
On native + raw + group mux, security.type=reality enables dual carriers: QUIC-first with TCP fallback. Without mux, Reality stays TCP-only.
reality-tcp forces TCP only. reality-quic with mux.mode=quic forces the dedicated QUIC pool (no TCP fallback) and does not use spider_x.
typeprivate_keyserver_namesshort_idsdestmax_time_difftypepublic_keyserver_nameshort_idfingerprintspider_x{
"log": { "level": "info" },
"inbounds": [
{
"tag": "server",
"type": "vless",
"address": ["0.0.0.0:443"],
"network": ["tcp", "udp"],
"users": [
{
"id": "00000000-0000-4000-8000-000000000000",
"flow": "xtls-rprx-vision"
}
],
"transport": { "type": "raw" },
"security": {
"type": "reality",
"private_key": "REPLACE_WITH_SERVER_PRIVATE_KEY",
"server_names": ["example.com"],
"short_ids": ["00"],
"dest": "example.com:443",
"max_time_diff": "30s"
}
}
],
"outbounds": [
{ "tag": "direct", "type": "direct" }
],
"route": { "default_outbound": "direct", "rules": [] },
"dns": {}
}Writes paired server.json and client.json; run tcptun uri export if you need URIs.
tcptun config vless --server proxy.example.com --port 443 --server-name example.com --dest example.com:443Generates matching REALITY configs for native on both ends.
tcptun config native --server proxy.example.com --port 9443 --server-name example.com --dest example.com:443Generates matching reality-quic + QUIC mux configs for native on both ends.
tcptun config native --quic --server proxy.example.com --port 9443 --server-name example.com --dest example.com:443Validate keys and fields first, then start.
tcptun config check --config server.json && tcptun --config server.jsonNative + raw + group mux + reality is automatic QUIC-first with TCP fallback in v0.2.4. The separate forced mux.mode=quic stack requires certificate TLS or security.type=reality-quic; tcptun config native --quic generates the latter.
Compare
Xray compatibility is for wire protocols, not config files.
| Protocol | Credential | Interop | Default security | Vision | Mux | Best for |
|---|---|---|---|---|---|---|
native | token ↔ users[].id | tcptun only | raw + REALITY | — | Private mux, recommended | Throughput / reverse publish |
vless | uuid ↔ users[].id | Xray VLESS | raw + REALITY + Vision | xtls-rprx-vision | Optional | Xray interop / camouflage |
vmess | uuid ↔ users[].id | Xray VMess | raw + REALITY | — | Optional | VMess ecosystem |
trojan | password ↔ users[].password | Xray Trojan | raw + REALITY | — | Optional | Password auth |
{
"tag": "proxy",
"type": "native",
"address": ["proxy.example.com:9443"],
"token": "change-me",
"transport": { "type": "raw" },
"mux": {}
}tcptun config native --server … --port …