这篇文章记录一套已经实际搭建并验证成功的方案:
海外 Ubuntu 服务器 + Xray + VLESS + TCP + REALITY + Clash Verge Rev它不需要购买域名,也不需要申请 TLS 证书。服务端只要有一个公网 IP,客户端保存好 UUID、REALITY 密钥和 shortId 即可连接。
本文仅用于合法的远程访问、开发调试与网络技术学习。请遵守服务器所在地和使用所在地的法律法规,以及云服务商的使用条款。
前置提醒:REALITY 伪装站使用 www.bing.com
本文所有服务端和客户端配置统一使用:
target: www.bing.com:443
serverNames: [www.bing.com]
servername: www.bing.com不要把本文中的 www.bing.com 换成 www.microsoft.com。
我在 Xray 26.3.27 上遇到过一个真实问题:Xray 处理 www.microsoft.com 返回的 8273 字节证书记录时超过 REALITY 的限制,导致客户端无法建立连接。服务器端口、UUID、密钥和防火墙当时都没有问题。将 REALITY 的伪装目标、允许的 SNI 和客户端 SNI 一起改成证书记录更小的 www.bing.com 后,连接立即恢复。
这个在最后还会再提一次。
方案原理
一次请求大致经历下面几层:
- Clash Verge Rev 接管需要代理的流量;
- Mihomo 内核使用 VLESS 和 UUID 完成客户端身份校验;
- 数据通过 TCP 传输;
- REALITY 让握手在外观上接近访问
www.bing.com的普通 TLS 流量; - 海外服务器上的 Xray 解封装后,代替客户端访问目标网站;
- 返回数据沿原连接回到客户端。
这套方案中几个容易混淆的概念如下:
| 名称 | 作用 | 是否需要保密 |
|---|---|---|
| 服务器公网 IP | 客户端连接的真实服务器地址 | 否,但不应随意公开 |
| UUID | VLESS 用户身份凭证 | 是 |
| REALITY 私钥 | 只保存在服务器 | 必须保密 |
| REALITY 公钥 | 客户端用于验证服务器 | 否 |
| shortId | REALITY 的附加识别值 | 建议保密 |
www.bing.com | REALITY 的伪装目标和 SNI | 否 |
REALITY 并不是把流量转发给 Bing。合法的 REALITY 客户端通过认证后,Xray 会正常代理其请求;未通过认证的探测流量才可能被转发至 target。
一、选择服务器
Xray 本身占用的资源很少,个人使用无需购买高配置服务器。更值得关注的是服务器位置、跨境线路、月流量和晚高峰丢包。
建议从下面的规格开始:
系统:Ubuntu 24.04 LTS
CPU:1 核或以上
内存:512MB 可运行,建议 1GB 或以上
硬盘:10GB 或以上
网络:独立公网 IPv4
流量:按自己的下载、视频和开发需求选择机房可以优先考虑东京、新加坡、洛杉矶、圣何塞或西雅图。地理距离近不等于线路一定好,最好先按月购买,分别在白天、晚高峰和周末测试,再决定是否长期续费。
轻量应用服务器通常比同厂商的通用云服务器便宜,也足够运行本方案。如果使用 NAT VPS,需要把本文的 443 改成服务商分配给你的公网映射端口,并确认公网端口正确映射到 Xray 的监听端口。
二、创建服务器并准备登录
创建实例时建议选择:
镜像:Ubuntu 24.04 LTS
登录方式:SSH 密钥
公网地址:独立 IPv4
自动续费:先关闭,测试稳定后再决定假设服务器公网 IP 为 <SERVER_IP>,本机私钥为 ~/.ssh/id_ed25519:
ssh -i ~/.ssh/id_ed25519 ubuntu@<SERVER_IP>不同厂商的默认用户可能是 ubuntu、root 或其他名称,以控制台提示为准。
如果创建时只能设置密码,先在本机生成密钥并上传公钥:
ssh-keygen -t ed25519 -a 64
ssh-copy-id ubuntu@<SERVER_IP>新开一个终端确认密钥可以正常登录后,再考虑关闭密码登录。不要在当前唯一的 SSH 会话里直接禁用密码,否则配置错误时可能把自己锁在服务器外。
三、初始化 Ubuntu
登录服务器后,先更新系统并安装本文所需工具:
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y curl openssl ufw ca-certificates
sudo timedatectl set-timezone Asia/Shanghai
timedatectl statusREALITY 对时间偏差有校验,正常的系统时间很重要。Ubuntu 通常已经启用时间同步,可检查:
timedatectl show -p NTPSynchronized期望看到:
NTPSynchronized=yes可选:加固 SSH
先确认公钥登录成功,再创建单独的 SSH 配置片段:
sudo nano /etc/ssh/sshd_config.d/99-hardening.conf写入:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes检查配置并平滑重载:
sudo sshd -t
sudo systemctl reload ssh保持原会话不要关闭,再从新终端登录一次。新会话确认正常后,才算加固完成。
四、放行云安全组和 UFW
这里有两层防火墙:
- 云厂商控制台中的安全组或轻量服务器防火墙;
- Ubuntu 本机的 UFW。
云控制台至少添加下面两条入站规则:
| 协议 | 端口 | 来源 | 用途 |
|---|---|---|---|
| TCP | 22 | 建议限制为自己的公网 IP;不固定时可暂用 0.0.0.0/0 | SSH |
| TCP | 443 | 0.0.0.0/0 | VLESS + REALITY |
如果 SSH 使用了自定义端口,请相应替换 22。
然后配置 UFW。顺序不能反:先允许 SSH,再启用防火墙。
sudo ufw allow OpenSSH
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose五、使用官方脚本安装 Xray
使用 XTLS 官方维护的安装脚本:
sudo bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install安装完成后检查版本和文件位置:
/usr/local/bin/xray version
systemctl cat xray官方脚本通常会安装到:
程序:/usr/local/bin/xray
配置:/usr/local/etc/xray/config.json
服务:/etc/systemd/system/xray.service六、生成 UUID、X25519 密钥和 shortId
1. 生成 UUID
/usr/local/bin/xray uuid保存输出,后文用 <UUID> 表示。
2. 生成 REALITY X25519 密钥对
/usr/local/bin/xray x25519不同 Xray 版本的输出名称可能不同,常见形式是:
PrivateKey: <REALITY_PRIVATE_KEY>
Password: <REALITY_PUBLIC_KEY>旧版本可能把第二行显示为 PublicKey。它们的对应关系不变:
| Xray 输出 | 填写位置 |
|---|---|
PrivateKey | 服务端 privateKey |
Password 或旧版 PublicKey | Clash 的 reality-opts.public-key |
私钥只能留在服务器。不要把私钥填进 Clash,也不要把它截图或提交到 Git 仓库。
3. 生成 shortId
openssl rand -hex 8这会生成 16 个十六进制字符,也就是 8 字节,例如:
6f1a2b3c4d5e7f80后文用 <SHORT_ID> 表示。shortId 必须只包含 0-9、a-f,字符数必须为偶数,最长 16 个字符。
4. 先整理好四个值
<SERVER_IP> 服务器公网 IP
<UUID> xray uuid 的输出
<REALITY_PRIVATE_KEY> xray x25519 的 PrivateKey
<REALITY_PUBLIC_KEY> xray x25519 的 Password 或 PublicKey
<SHORT_ID> openssl rand -hex 8 的输出七、编写 Xray 服务端配置
先备份安装脚本生成的默认配置:
sudo cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.bak
sudo nano /usr/local/etc/xray/config.json完整替换为下面的内容,只替换尖括号占位符:
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "vless-reality-in",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "<UUID>",
"flow": "xtls-rprx-vision",
"email": "my-device"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"show": false,
"target": "www.bing.com:443",
"xver": 0,
"serverNames": ["www.bing.com"],
"privateKey": "<REALITY_PRIVATE_KEY>",
"shortIds": ["<SHORT_ID>"]
}
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "block",
"protocol": "blackhole"
}
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "block"
}
]
}
}这里使用的是 Xray 新版文档中的 network: "raw"。它表示原始 TCP 字节流,也就是本文方案中的 TCP;在旧版教程里经常能看到 network: "tcp"。客户端 Mihomo 配置仍然写 network: tcp。
再次检查三个 Bing 字段:
服务端 target = www.bing.com:443
服务端 serverNames = www.bing.com
客户端 servername = www.bing.com八、测试配置并启动 systemd 服务
先只检查配置,不要急着重启:
sudo /usr/local/bin/xray run -test -config /usr/local/etc/xray/config.json看到类似下面的内容表示语法检查通过:
Configuration OK.然后启动并设为开机自启:
sudo systemctl enable --now xray
sudo systemctl restart xray
sudo systemctl status xray --no-pager -l确认 443 正在监听:
sudo ss -lntp | grep ':443'查看最近日志:
sudo journalctl -u xray -n 100 --no-pager如果服务启动失败,优先执行:
sudo /usr/local/bin/xray run -test -config /usr/local/etc/xray/config.json
sudo journalctl -u xray -n 200 --no-pager不要反复盲目重装。配置检查和 systemd 日志通常会直接指出 JSON、字段名、端口占用或权限问题。
九、编写 Clash Verge Rev 配置
在自己的电脑上新建一个文件,例如 my-vless.yaml,写入下面的完整配置:
mixed-port: 7897
allow-lan: false
mode: rule
log-level: info
ipv6: false
proxies:
- name: '我的-REALITY'
type: vless
server: <SERVER_IP>
port: 443
uuid: <UUID>
network: tcp
tls: true
udp: true
flow: xtls-rprx-vision
servername: www.bing.com
client-fingerprint: chrome
reality-opts:
public-key: <REALITY_PUBLIC_KEY>
short-id: <SHORT_ID>
proxy-groups:
- name: '节点选择'
type: select
proxies:
- '我的-REALITY'
- DIRECT
rules:
- GEOIP,CN,DIRECT
- MATCH,节点选择YAML 对缩进敏感,请使用空格,不要使用 Tab。下面这些值必须和服务端对应:
| Clash 字段 | 服务端来源 |
|---|---|
server | 服务器公网 IP |
port | Xray 入站端口 443 |
uuid | VLESS 客户 UUID |
servername | 服务端 serverNames 中的 www.bing.com |
public-key | X25519 的 Password 或旧版 PublicKey |
short-id | 服务端 shortIds 中的值 |
public-key 一定不能填服务端私钥。
十、在 Clash Verge Rev 中导入并启用
不同版本的界面名称可能略有差异,操作顺序基本相同:
- 打开 Clash Verge Rev;
- 进入“订阅”或“配置”;
- 选择“新建”或“导入本地配置”;
- 导入刚才的
my-vless.yaml; - 选中并启用这份配置;
- 在“代理”页面选择“节点选择”中的“我的-REALITY”;
- 打开“系统代理”;
- 需要接管更多应用流量时,再按需启用 TUN 模式。
建议先只打开系统代理验证。系统代理工作正常后,再配置 TUN,这样出现问题时更容易判断是节点本身还是本机接管规则的问题。
十一、连通性测试
1. 在本机测试服务器端口
macOS 或 Linux:
nc -vz <SERVER_IP> 443如果显示连接成功,说明公网 IP、云安全组、UFW 和 Xray 监听至少已经打通。
端口通不代表 REALITY 参数一定正确;UUID、密钥、shortId 或 SNI 错误时,TCP 仍可能连通,但代理不可用。
2. 测试代理出口
启用 Clash Verge Rev 后执行:
curl -x http://127.0.0.1:7897 https://api.ipify.org
echo如果输出的是服务器公网 IP,说明代理链路已经工作。
再测试普通 HTTPS:
curl -I -x http://127.0.0.1:7897 https://www.google.com3. 同时观察服务端日志
服务器执行:
sudo journalctl -u xray -f然后在客户端重新发起请求。测试结束按 Ctrl+C 退出日志跟踪。
十二、故障排查流程
排查时按层次进行,速度会比反复修改配置快得多。
1. Xray 服务是否正常
sudo systemctl is-active xray
sudo systemctl status xray --no-pager -l
sudo /usr/local/bin/xray run -test -config /usr/local/etc/xray/config.json如果不是 active,先修服务端配置,不要继续折腾 Clash。
2. 443 是否被监听
sudo ss -lntp | grep ':443'没有输出:Xray 没启动、配置没有生效,或监听了其他端口。
如果提示端口被占用:
sudo ss -lntp '( sport = :443 )'确认是哪个程序占用端口,再决定修改 Xray 端口还是调整现有服务。不要直接结束不认识的进程。
3. 两层防火墙是否都放行
sudo ufw status verbose同时到云厂商控制台检查 TCP 443 入站规则。只改 UFW、不改云安全组,外部仍然无法连接。
4. 六个客户端参数是否逐字一致
重点核对:
服务器 IP
端口
UUID
REALITY 公钥
shortId
servername = www.bing.com常见复制问题包括:值前后带空格、把私钥当成公钥、shortId 少一个字符、YAML 缩进错误、UUID 复制不完整。
5. 真实故障:Microsoft 证书记录超过 REALITY 限制
这次部署最隐蔽的问题发生在 REALITY 目标站。
当时使用:
target: www.microsoft.com:443
serverNames: [www.microsoft.com]
servername: www.microsoft.com在 Xray 26.3.27 中,www.microsoft.com 返回了 8273 字节证书记录,处理时超过 REALITY 的限制。表现为:
- Xray 服务可以正常启动;
- 443 端口可以连接;
- 云安全组和 UFW 都已放行;
- UUID、公私钥和 shortId 也一致;
- 但客户端 REALITY 握手失败,服务端日志指向证书记录或 REALITY 处理异常。
最终修复方式是同时修改服务端和客户端:
服务端 target → www.bing.com:443
服务端 serverNames → [www.bing.com]
客户端 servername → www.bing.com切换到证书记录更小的 www.bing.com 后恢复正常。
如果以后更换伪装目标,不能只看“浏览器能否打开”,还应实际验证 Xray 日志和 REALITY 握手。目标站的 TLS 行为、证书链和网络可达性都可能变化。
十三、常见错误速查
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
xray 启动失败 | JSON 逗号、引号或字段写错 | 先执行 xray run -test |
| 443 连接超时 | 云安全组或 UFW 未放行 | 同时检查两层防火墙 |
| 443 拒绝连接 | Xray 未监听或端口错误 | 检查 systemd 与 ss -lntp |
| TCP 能连接但代理失败 | UUID、密钥、shortId、SNI 不一致 | 逐项比对客户端与服务端 |
invalid shortId | 非十六进制、奇数长度或超过 16 字符 | 重新执行 openssl rand -hex 8 |
| REALITY 验证失败 | 把私钥填到了 Clash | Clash 必须使用 Password/PublicKey |
| YAML 导入失败 | 缩进、Tab 或冒号后缺空格 | 使用纯空格并检查层级 |
| 有些应用不走代理 | 只开启系统代理,应用不遵循系统设置 | 确认规则,必要时启用 TUN |
| 浏览器能用但命令行不行 | 终端没有使用系统代理 | 用 curl -x 显式测试 |
| 握手在目标站阶段失败 | 目标站 TLS 或证书记录不兼容 | 固定使用本文验证过的 www.bing.com |
十四、迁移到更便宜的服务器
迁移时不要直接删除旧服务器,建议并行验证:
- 创建新的 Ubuntu 服务器;
- 按本文安装 Xray;
- 可以沿用原 UUID,也可以生成新 UUID;
- 建议为新服务器重新生成 X25519 密钥和 shortId;
- 复制配置,但替换新服务器的私钥;
- 在 Clash 中复制原节点,修改 IP、公钥和 shortId;
- 新节点连续测试几天;
- 确认稳定并备份必要信息后,再释放旧服务器。
迁移后如果服务器 IP 变化,Clash 的 server 必须更新。若重新生成密钥,public-key 也必须更新。
十五、安全与维护建议
密钥管理
- 不要在博客、聊天截图、代码仓库中公开 UUID、私钥和 shortId;
- 每台服务器使用独立的 X25519 密钥;
- 每台设备可以使用独立 UUID,方便单独吊销;
- 怀疑配置泄露时,重新生成 UUID、密钥和 shortId,而不是只改节点名称。
系统维护
定期更新 Ubuntu:
sudo apt update
sudo apt full-upgrade -y更新 Xray 前先备份配置:
sudo cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.$(date +%F).bak
sudo bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
sudo /usr/local/bin/xray run -test -config /usr/local/etc/xray/config.json
sudo systemctl restart xray升级后立即检查版本、服务状态和连接:
/usr/local/bin/xray version
sudo systemctl status xray --no-pager -l
sudo journalctl -u xray -n 100 --no-pager控制暴露面
- SSH 优先限制来源 IP,并使用密钥登录;
- 公网只开放实际需要的 TCP 端口;
- 不要开放 Xray 本地管理接口;
- 定期查看云服务器流量和账单告警;
- REALITY 会把未通过认证的流量转发给
target,应关注异常出站流量; - 不要在同一个 443 端口上同时启动 Nginx、Caddy 和 Xray,除非已经设计好端口复用或前置转发。