VLESS + Reality + Vision 基础部署:目前抗检测能力最强的自建代理
在 443 空闲的 VPS 上部署最小可用的 Reality 节点

- 完成 Xray Reality 最小部署
- 生成 UUID、X25519 密钥和 Short ID
- 用客户端验证链路可用
- 得到目前抗检测能力最强的自建代理
- VPS 的 443 端口空闲
- root 或 sudo 权限
- 客户端支持 Reality
来源与后续讨论
这里不是普通友情链接,而是读完文章后最应该跳转确认的地方:官网确认版本,GitHub 看源码和 Issue,第三方来源做交叉参考,X 帖子看后续补充和讨论。
VLESS + Reality + Vision 基础部署:目前抗检测能力最强的自建代理
这篇适合只有一台 VPS,没有网站,443 端口空闲的情况.目标是让 Xray 直接监听 443,用 VLESS + Reality + XTLS-Vision 跑出一条最小可用链路.
如果你的服务器已经有 Nginx 网站占用 443,不要照抄本文.应该看 Nginx SNI 分流版,让 Nginx 接管 443,再把 Reality 流量转到 Xray 内部端口.
适合和不适合的场景
适合:
✅ VPS 443 端口空闲,没有跑任何网站
✅ IP 目前可以直连,没被墙
✅ 追求最简单的部署,配置文件越少越好
✅ 不需要域名,直接用 IP 连接
不适合:
- 443 已经由 Nginx,Caddy,Apache 或其他服务占用.
- 必须隐藏 VPS 源站 IP.
- 已经有 Cloudflare 代理域名,并且希望所有流量经 Cloudflare 中转.
如果你不确定 443 是否空闲,先执行:
ss -tulnp | grep ':443'没有输出,才适合继续使用本文的直连方案.
部署架构
客户端 | | VLESS + Reality + XTLS-Vision | SNI: www.microsoft.com vVPS:443 | vXray reality inbound这里没有 Nginx,也没有 Cloudflare.Xray 直接对外监听 443,所有连接都由 Xray 判断是否是合法 Reality 客户端.
前置条件
建议准备:
- Ubuntu 22.04 或 24.04 LTS,或 Debian 12.
- root 或 sudo 权限.
- 一个可直连的 VPS 公网 IPv4.
- 本地客户端,例如 v2rayN,v2rayNG,Nekoray 或其他兼容 Xray Reality 的客户端.
v2ray客户端v7.19.5,v7.18.0版本仍完整支持 security=reality,flow=xtls-rprx-vision 和 fp=chrome.
步骤一:更新系统并开启 BBR
# 系统更新apt update && apt upgrade -y vim /etc/sysctl.conf# 把下面三行内容复制到此文件的最末尾# 开启 BBR 拥塞控制,提升网络性能net.core.default_qdisc=fqnet.ipv4.tcp_congestion_control=bbr # 使配置生效sysctl -p # 验证 BBR 是否生效sysctl net.ipv4.tcp_congestion_control# 应输出:net.ipv4.tcp_congestion_control = bbr最后一条命令输出 bbr,说明拥塞控制已生效.
如果你的系统镜像已经默认开启 BBR,这一步重复执行通常不会影响服务.但正式发布前建议在目标系统上复测,避免不同云厂商镜像行为不一致.
步骤二:安装 Xray-core
使用 XTLS 官方安装脚本:
# 使用官方安装脚本(自动安装最新版)bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install # 验证安装xray version步骤三:生成 UUID,Reality 密钥和 Short ID
# 1. 生成 UUID(用于用户身份验证)xray uuid# 示例输出:a3b2c1d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx → 记为 <UUID> # 2. 生成 X25519 密钥对(Reality 核心)xray x25519# 示例输出:# PrivateKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx → 记为 <PRIVATE_KEY># Password (PublicKey): yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy → 记为 <PUBLIC_KEY> # 3. 生成 Short ID(8字节随机十六进制)openssl rand -hex 8# 示例输出:a1b2c3d4e5f6a7b8 → 记为 <SHORT_ID> # 4. 获取服务器公网 IPcurl -4 ifconfig.me# 记为 <SERVER_IP>记录四个值:
| 占位符 | 来源 | 用途 |
|---|---|---|
<UUID> | xray uuid | 客户端身份 |
<PRIVATE_KEY> | xray x25519 的 PrivateKey | 服务端 Reality 私钥 |
<PUBLIC_KEY> | xray x25519 的 PublicKey 或 Password | 客户端 Reality 公钥 |
<SHORT_ID> | openssl rand -hex 8 | Reality shortId |
<SERVER_IP> | curl -4 ifconfig.me | 客户端连接地址 |
不要把 <PRIVATE_KEY> 放进客户端,也不要把真实 UUID 和私钥发布到博客,截图或公开仓库.
步骤四:写入 Xray 服务端配置
编辑配置文件:
vim /usr/local/etc/xray/config.json写入以下配置,并替换占位符:
{ "log": { "loglevel": "warning" }, "inbounds": [ { "tag": "reality-in", "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": { "show": false, "dest": "www.microsoft.com:443", "serverNames": ["www.microsoft.com", "microsoft.com"], "privateKey": "<PRIVATE_KEY>", "shortIds": ["<SHORT_ID>"] } }, "sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"], "routeOnly": true } } ], "outbounds": [ { "protocol": "freedom", "tag": "direct" }, { "protocol": "blackhole", "tag": "block" } ], "routing": { "domainStrategy": "IPIfNonMatch", "rules": [ { "type": "field", "ip": ["geoip:private"], "outboundTag": "block" }, { "type": "field", "protocol": ["bittorrent"], "outboundTag": "block" } ] }}伪装域名应该选择稳定的大型 HTTPS 站点,并且客户端 SNI,服务端 serverNames 和 dest 要保持一致.不要随意把 dest 改成无法正常 TLS 握手的站点.
步骤五:检查配置并启动服务
# 检查配置是否正确xray -test -config /usr/local/etc/xray/config.json# 重新加载配置systemctl daemon-reload# 启动服务并设置开机自启systemctl enable --now xray# 检查运行状态systemctl status xray# 等一会,再查看443 是否在正常监听. 一定要出现类似的输出,才算服务正常ss -tulnp | grep 443tcp LISTEN 0 4096 *:443 *:* users:(("xray",pid=9013,fd=3)) # 如果443还是没有监听到,就重启一下试试systemctl restart xray# 查看日志(排错用,查看启动情况)journalctl -u xray -f预期结果:
xray -test没有报错.systemctl status xray显示服务正在运行.ss能看到 Xray 监听0.0.0.0:443或*:443.
如果 443 没有监听,先看日志:
systemctl status xray --no-pager -l# 如果有以下问题,则修改文件后從重启一下:/etc/systemd/system/xray.service:7: Special user nobody configured, this is not safe! vim /etc/systemd/system/xray.service# User=nobody <-- 注释掉或删除这行sudo systemctl daemon-reloadsudo systemctl restart xray步骤六:配置防火墙(看情况需要)
不要在没有放行 SSH 的情况下启用 UFW,否则可能把自己锁在服务器外.
# 安装 ufw(如未安装)apt install ufw -y # 放行 SSH(避免锁死)ufw allow 22/tcp # 放行 VLESS 端口ufw allow 443/tcp # 查看状态ufw status# 启用防火墙ufw enable如果云厂商还有安全组,也要同步放行 443/TCP.系统防火墙和云安全组缺一不可.
步骤七:服务端快速验证
先验证本机 443 是否有 TLS 响应:
curl -sIv https://www.microsoft.com \ --resolve www.microsoft.com:443:127.0.0.1 \ -m 8 2>&1 | grep -Ei 'SSL connection|ALPN|subject|issuer|HTTP/'类似结果如下:
* ALPN: offers h2,http/1.1* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384* ALPN: server accepted h2* subject: C=US; ST=WA; L=Redmond; O=Microsoft Corporation; CN=www.microsoft.com* subjectAltName: host "www.microsoft.com" matched cert's "www.microsoft.com"* issuer: C=US; O=Microsoft Corporation; CN=Microsoft TLS G2 RSA CA OCSP 04* using HTTP/2> HEAD / HTTP/2< HTTP/2 200HTTP/2 200再验证服务状态和端口:
systemctl is-active xrayss -tlnp | grep ':443'xray version # 类似结果如下:activeLISTEN 0 4096 *:443 *:* users:(("xray",pid=13712,fd=3))Xray 26.3.27 (Xray, Penetrates Everything.) d2758a0 (go1.26.1 linux/amd64)A unified platform for anti-censorship.脚本验证
- 写验证脚本
cat << 'EOF' > ~/check-reality.sh#!/bin/bash # --- 颜色与格式定义 ---GREEN="\033[32m"RED="\033[31m"YELLOW="\033[33m"RESET="\033[0m" VPS_IP=$(curl -4s ifconfig.me)SNI="www.microsoft.com"TARGET_IP="127.0.0.1" # 本机测试,排除外部防火墙干扰 echo -e "${YELLOW}=================================================${RESET}"echo -e "${YELLOW} REALITY 伪装防封锁深度诊断脚本 ${RESET}"echo -e "${YELLOW}=================================================${RESET}"echo -e "VPS 公网 IP: ${GREEN}${VPS_IP}${RESET}"echo -e "伪装目标域名(SNI): ${GREEN}${SNI}${RESET}"echo "" # ---------------------------------------------------echo -e "${YELLOW}[1] Xray 核心服务与端口监听${RESET}"if systemctl is-active --quiet xray; then echo -e "Xray 运行状态: ✅ ${GREEN}运行中 (Active)${RESET}"else echo -e "Xray 运行状态: ❌ ${RED}未运行 (请执行 systemctl status xray 查看错误)${RESET}"fiecho "监听端口(443/xray):"ss -tlnp | grep -E "xray|443" | sed 's/^/ /' || echo -e " ${RED}警告: 未发现监听 443 的进程${RESET}" # ---------------------------------------------------echo -e "\n${YELLOW}[2] 模拟 GFW 嗅探 (HTTP 响应提取)${RESET}"# 获取完整响应头并清除可能导致排版混乱的回车符HTTP_RES=$(curl -sI https://$SNI --resolve $SNI:443:$TARGET_IP -m 5 | tr -d '\r')HTTP_CODE=$(echo "$HTTP_RES" | grep -i "^HTTP/")SERVER_HEADER=$(echo "$HTTP_RES" | grep -i "^Server:") echo -e "HTTP 状态码: ${GREEN}${HTTP_CODE:-"请求失败/超时"}${RESET}" # ---------------------------------------------------echo -e "\n${YELLOW}[3] 验证身份铁证 (AkamaiGHost 等大厂 CDN)${RESET}"if [[ -n "$SERVER_HEADER" ]]; then echo -e "提取到的标识: ${GREEN}${SERVER_HEADER}${RESET}" if [[ "$SERVER_HEADER" =~ "AkamaiGHost" || "$SERVER_HEADER" =~ "Microsoft" ]]; then echo -e "结论: ✅ ${GREEN}身份铁证成立!GFW 探测时只会看到一个真实的微软 CDN 节点.${RESET}" else echo -e "结论: ⚠️ ${YELLOW}返回了响应,但 Server 不是微软/Akamai.请确认配置的 dest 是否对应.${RESET}" fielse echo -e "结论: ❌ ${RED}未提取到 Server 头信息,伪装被拒绝或未生效.${RESET}"fi # ---------------------------------------------------echo -e "\n${YELLOW}[4] 验证 TLS 握手无缝衔接${RESET}"# 捕获 curl 的底层 verbose 输出TLS_LOG=$(curl -sIv https://$SNI --resolve $SNI:443:$TARGET_IP -m 5 2>&1) # 提取核心的握手成功标志TLS_CONN=$(echo "$TLS_LOG" | grep -i "SSL connection using" | tr -d '\r')ALPN_ACCEPT=$(echo "$TLS_LOG" | grep -i "ALPN" | grep -i "accepted" | tr -d '\r') if [[ -n "$TLS_CONN" ]]; then echo -e "握手协议版本: ${GREEN}${TLS_CONN}${RESET}" if [[ -n "$ALPN_ACCEPT" ]]; then echo -e "ALPN 协商结果: ${GREEN}${ALPN_ACCEPT}${RESET}" fi echo -e "结论: ✅ ${GREEN}TLS 握手无缝衔接!底层加密通道已顺滑建立,无特征暴露.${RESET}"else echo -e "结论: ❌ ${RED}TLS 握手存在异常特征或被中途阻断!${RESET}" echo -e "${YELLOW}>> 详细错误日志: ${RESET}" echo "$TLS_LOG" | grep -i "SSL\|TLS\|error\|alert" | sed 's/^/ /'fi # ---------------------------------------------------echo -e "\n${YELLOW}[5] 验证数字证书归属 (偷天换日)${RESET}"CERT_INFO=$(echo | openssl s_client -connect $TARGET_IP:443 -servername $SNI 2>/dev/null | openssl x509 -noout -subject -issuer 2>/dev/null)if [[ -n "$CERT_INFO" ]]; then echo -e "结论: ✅ ${GREEN}成功获取目标网站的真实 TLS 证书:${RESET}" echo "$CERT_INFO" | sed 's/^/ /'else echo -e "结论: ❌ ${RED}无法获取证书,伪装可能已失效.${RESET}"fi echo -e "\n${YELLOW}=================================================${RESET}"EOF- 给脚本添加执行权限,并运行
chmod +x ~/check-reality.shbash ~/check-reality.sh- 类似输出结果
================================================= REALITY 伪装防封锁深度诊断脚本=================================================VPS 公网 IP: <SERVER_IP>伪装目标域名(SNI): www.microsoft.com [1] Xray 核心服务与端口监听Xray 运行状态: ✅ 运行中 (Active)监听端口(443/xray): LISTEN 0 4096 *:443 *:* [2] 模拟 GFW 嗅探 (HTTP 响应提取)HTTP 状态码: HTTP/2 200 [3] 验证身份铁证 (AkamaiGHost 等大厂 CDN)提取到的标识: server: AkamaiGHost结论: ✅ 身份铁证成立!GFW 探测时只会看到一个真实的微软 CDN 节点. [4] 验证 TLS 握手无缝衔接握手协议版本: * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384ALPN 协商结果: * ALPN, server accepted to use h2结论: ✅ TLS 握手无缝衔接!底层加密通道已顺滑建立,无特征暴露. [5] 验证数字证书归属 (偷天换日)结论: ✅ 成功获取目标网站的真实 TLS 证书: subject=C = US, ST = WA, L = Redmond, O = Microsoft Corporation, CN = www.microsoft.com issuer=C = US, O = Microsoft Corporation, CN = Microsoft TLS G2 RSA CA OCSP 04这些检查只能说明服务端形态正常,不能替代客户端连通性验证.真正能否使用,还要看客户端导入节点后是否能完成 Reality 握手,访问外部网站,并确认 DNS,出口 IP 和速度符合预期.
步骤八:生成客户端连接参数
VLESS 分享链接示例:
vless://<UUID>@<SERVER_IP>:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.microsoft.com&fp=chrome&pbk=<PUBLIC_KEY>&sid=<SHORT_ID>&type=tcp#MyServer-Realityv2rayN 参数表:
| 参数 | 值 |
|---|---|
| 地址 | <SERVER_IP> |
| 端口 | 443 |
| UUID | <UUID> |
| Flow | xtls-rprx-vision |
| 传输 | tcp |
| TLS | reality |
| SNI | www.microsoft.com |
| Fingerprint | chrome |
| PublicKey | <PUBLIC_KEY> |
| ShortId | <SHORT_ID> |
导入后,先测真连接延迟,再打开代理访问一个能显示出口 IP 的页面.不要只看客户端"测试成功",还要确认出口 IP 是 VPS 或你预期的网络出口.
常见错误
443 被其他服务占用
现象:
address already in use处理:
ss -tulnp | grep ':443'如果是 Nginx 占用,不要强行停站点,改用 Nginx SNI 分流版.
客户端公钥和服务端私钥不匹配
Reality 客户端使用 <PUBLIC_KEY>,服务端使用 <PRIVATE_KEY>.两者来自同一次 xray x25519 输出.重新生成后,服务端和客户端必须一起更新.
云安全组没放行 443
系统里 ss 显示已经监听,但客户端仍然连不上,优先检查云厂商控制台的安全组,防火墙和端口策略.
伪装站点不可用
如果 dest 指向的站点 TLS 响应异常,Reality 的回落表现也会异常.换站点前要同时更新服务端 dest,serverNames 和客户端 SNI.
小结
这一版是整个系列的最小闭环:
- Xray 直接监听 443,适合没有网站的 VPS.
- Reality 需要 UUID,X25519 密钥对和 Short ID 三类关键参数.
- 服务端配置通过
xray -test后,再启动 systemd 服务. - 防火墙要同时检查系统 UFW 和云安全组.
- 服务端验证只能证明形态正常,客户端验证才证明链路真正可用.
如果 443 已经被网站占用,下一步看 VLESS + Reality + Nginx SNI 分流,用 Nginx 把网站和 Reality 放在同一个 443 入口下.
按文章步骤复核自己的 VPS、域名、端口和客户端参数。
这篇已经可以直接看完,可以继续下一篇。