本Xray VLESS Reality 服务器设置指南将引导您在 VPS 上部署现代代理。目前,使用 Reality 传输安全层的 VLESS 是最受欢迎的自托管代理设置:与传统 VPN 不同,它不会生成独特的握手或固定的数据包签名。Reality 会克隆一个真实、热门网站(目标网站)的 TLS 1.3 握手,因此对于监控网络的深度包检测 (DPI) 系统来说,连接到您服务器的行为与访问该网站的行为完全相同——因为您的服务器会在握手期间短暂转发目标网站的实际证书,所以不存在伪造或自签名证书可供识别。
协议栈包括:VLESS(一种轻量级、无状态的代理协议,用于处理身份验证)、运行在XTLS Vision(一种流控制模式,通过在原始套接字级别复制已加密的 TLS 记录来加速连接)之上,并由Reality(上文所述的伪装层)提供安全保护。这三者均来自同一个项目 Xray-core,它是原始 V2Ray/V2Fly 项目的积极维护的后续项目。
本指南将指导您如何手动设置 Xray 服务器,完全通过命令行操作,无需 Web 控制面板,也无需 Docker——最大限度地减少 VPS 上的资源占用。无需域名,也无需购买 TLS 证书:Reality 会借用目标网站的证书进行握手,而不会提供自己的证书。接下来,在“your_IP”处,您需要输入您分配的 IP 地址。
你需要:一台运行 Ubuntu 22.04/24.04 或 Debian 11/12 的 VPS、root 权限、你的 VPS 的 IP 地址,以及空闲的 TCP 端口 443(没有 web 服务器、面板或其他代理正在监听该端口)。
还没有服务器?请参阅“如何订购服务器并支付费用”。
想先将它与其他自托管方案进行比较吗?请参阅AmneziaWG 服务器部署指南,了解基于 WireGuard 的替代方案;或者参阅Hysteria2 和 TUIC 设置,了解另外两种现代的、抗审查的协议。
正在连接服务器
Windows(PuTTY)
打开 PuTTY,在主机名字段中输入您的 VPS IP 地址,将端口设置为 22,然后使用您的 VPS 提供商通过电子邮件发送给您的密码以 root 用户身份登录。
服务器 IP 地址:您的 IP 地址
以 root 用户身份登录
密码:您的密码
- 打开 PuTTY,在主机名字段中输入您的 VPS IP 地址。
- 将端口设置为 22。
- 输入以root用户身份登录。
- 使用您的VPS提供商通过电子邮件发送给您的密码。然后您应该会进入服务器的shell提示符。
有关通过 PuTTY/SSH 连接的详细步骤,请参阅如何通过 SSH 连接到 Linux 服务器。
Linux / macOS(终端)
ssh root@your_IP
以下所有命令均在服务器上的同一 SSH 会话中运行——这涵盖了第 2 节到第 6 节,以及第 10 节中的服务器端检查。第 7 节到第 9 节(安装和配置 VPN 客户端)则在您自己的 Windows/Android/iOS 设备上进行,因为代理需要在该设备上运行;这些章节中明确说明了哪些行(如果有)仍然需要与服务器交互。
准备服务器
更新系统
安装任何软件之前,请刷新软件包列表并升级已安装的软件包:
apt update -y && apt upgrade -y
如果在 apt 升级后会话中断,这是预期的(dbus/polkit 已重启) - 只需通过 SSH 重新连接即可。
如果此操作升级了内核,建议重启系统后再继续。(如需复习 apt 以及 Linux 软件包管理器的工作原理,请参阅Linux 软件包管理器。)检查:
cat /var/run/reboot-required
如果文件存在,请先使用“reboot”命令重启,等待约 30 秒,然后重新连接。
安装本指南使用的工具
apt install -y curl wget unzip openssl ufw qrencode
Xray 安装程序本身需要 Curl 和 unzip;openssl 在第 4 节中生成短 ID;ufw 是下面配置的防火墙;qrencode 在第 7 节中将完成的客户端链接转换为可扫描的二维码。
检查系统时钟
Reality 的握手过程包含时间戳检查(maxTimeDiff 字段,默认禁用但值得了解),如果时钟出现明显偏差,也可能导致服务器上其他地方的普通 TLS 证书验证出现异常。请确认时钟已同步:
timedatectl status
如果“系统时钟同步”显示为“否”,请启用它:
timedatectl set-ntp true
配置防火墙(UFW)
有关 UFW 规则的更多信息,请参阅在 Linux 上配置防火墙。
打开你需要的两个端口:22/tcp 用于 SSH(跳过此规则,你可能会失去对服务器的访问权限)和 443/tcp,Xray 将监听该端口,也是普通 HTTPS 流量使用的端口——这正是它成为 Reality 正确选择的原因。
ufw allow 22/tcp
ufw allow 443/tcp
ufw --force enable
ufw status
ufw 状态输出中这两条规则都应该显示为 ALLOW。
为 VLESS Reality Server 安装 Xray-core
Xray-core 项目 (XTLS) 发布了一个官方的安装和升级脚本,该脚本会将二进制文件安装为 systemd 服务。在将任何第三方脚本通过管道传递给 bash 之前,请务必先进行审查——此脚本直接来自项目自身的代码库。
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
确认二进制文件已安装到位并检查已安装的版本:
/usr/local/bin/xray version
如果命令输出分页且似乎卡住,请按 Q 退出。Xray 二进制文件已安装到 /usr/local/bin/xray其配置文件存储在 /usr/local/etc/xray/.
您还可以使用相同的安装脚本来升级现有安装。要查看完整的选项列表(包括卸载、仅更新地理数据和日志轮换),请运行:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" --help
生成密钥和凭证
真实性认证依赖于四项数据。请立即生成所有数据;您将在第 5 节中将它们粘贴到服务器配置中。
为客户端生成 UUID
/usr/local/bin/xray uuid
这是 VLESS 用户 ID——请将其视为凭证,因为它用于验证客户端与服务器之间的连接。对于您要授予访问权限的每个其他设备或用户,请再次运行此命令。
生成 Reality X25519 密钥对
/usr/local/bin/xray x25519
这会打印三行:PrivateKey、Password和Hash32。PrivateKey仅用于服务器配置,绝对不能共享。Password 是对应的公钥——尽管名称如此,但这是每个客户端都需要输入的值;Xray 特意将该字段从 PublicKey 重命名为 Password,以防止用户随意发布。Hash32 仅用于独立的 VLESS 加密功能,Reality 设置中不需要它。
生成一个短 ID
openssl rand -hex 8
这将生成一个 16 个字符的十六进制字符串,用于区分不同的客户端或客户端组。服务器和客户端必须使用相同的值。
选择并测试一个现实目标
目标是真实网站,您的服务器需要模仿其 TLS 握手过程。目标网站应支持 TLS 1.3 和 HTTP/2,不能位于 Cloudflare 等 CDN 服务之后(Xray 会将所有 Reality 身份验证失败的流量直接转发到目标网站,因此,如果目标网站位于 CDN 服务之后,您的服务器可能会变成该 CDN 服务的开放中继)。理想情况下,目标网站应与您的 VPS 托管在同一网络区域,以获得合理的延迟情况。直接从服务器测试候选目标网站:
/usr/local/bin/xray tls ping www.microsoft.com:443
使用主机名,不要使用 URL。以下几个域名常被用作 Reality 测试目标,因为它们稳定、支持 TLS 1.3 且未使用 CDN:www.microsoft.com、addons.mozilla.org、dl.google.com。测试几个域名,选择一个从您的 VPS 服务器位置可以稳定响应的域名;您需要在目标域名和第 5 部分中的 serverNames 条目中使用相同的主机名。
编写服务器配置
备份安装程序自带的配置文件,然后打开该文件进行编辑:
cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.orig
nano /usr/local/etc/xray/config.json
打开配置文件进行编辑:
nano /usr/local/etc/xray/config.json
请将整个文件替换为以下模板,并将第 4 部分中的 UUID、私钥、短 ID 和目标主机名替换为您自己的 UUID、私钥、短 ID 和目标主机名(如果您在第 2 部分中将其从 443 端口更改为其他端口,则还需要替换为该端口):
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {
"users": [
{
"id": "YOUR-UUID-HERE",
"flow": "xtls-rprx-vision",
"email": "client1"
}
],
"decryption": "none"
},
"streamSettings": {
"method": "raw",
"security": "reality",
"realitySettings": {
"show": false,
"target": "www.microsoft.com:443",
"serverNames": ["www.microsoft.com"],
"privateKey": "YOUR-SERVER-PRIVATE-KEY",
"shortIds": ["YOUR-SHORT-ID"]
}
}
}
],
"outbounds": [
{ "protocol": "freedom", "tag": "direct" },
{ "protocol": "blackhole", "tag": "blocked" }
]
}
按 Ctrl+O(WriteOut)保存文件。
按回车键确认文件名。
按Ctrl+X退出nano。
重要字段:users[].id 是第 4 节中的 UUID;users[].flow 启用 XTLS Vision;method(以前称为 network)选择 RAW 传输方式,即 Reality 所需的纯 TCP 传输方式;target 和 serverNames 是您在第 4 节中测试的站点;privateKey 是服务器端的 X25519 密钥,切勿使用 Password 值;shortIds 列出了客户端允许使用的所有短 ID。要稍后添加更多用户,请将其他对象追加到 users 数组中,每个对象都应具有自己的 UUID 和电子邮件标签,然后重启服务。
自 Xray 26.3.27 版本起,如果 Reality 入站请求中没有显式指定 minClientVer 字段,则会强制使用服务器自身的核心版本——旧版本的客户端应用(例如,使用过时的 v2rayN、v2rayNG 或 Streisand 构建并捆绑了旧版 Xray 核心的版本)会被静默重定向到目标服务器的备用页面,而不会建立连接。客户端不会报错,服务器日志中也不会出现明显的异常。如果某个客户端在更新后突然超时,请首先尝试更新客户端应用本身;如果无法更新,请在 realitySettings 中添加 "minClientVer": "25.9.11"(或其他更早的版本),但这样做会导致旧客户端的 TLS 指纹与现代浏览器的兼容性略有下降。
验证并重启
在重启线上服务之前测试配置——这样可以避免因 JSON 拼写错误和不支持的字段导致代理服务器宕机:
/usr/local/bin/xray run -test -c /usr/local/etc/xray/config.json
启动服务并启用自动启动
使用新配置重启 Xray,并启用开机自动启动功能:
systemctl enable --now xray
systemctl restart xray
systemctl status xray --no-pager
状态应显示为活动(正在运行)。请确认确实有程序在监听 443 端口:
ss -lntp | grep ':443'
如果 Xray 启动失败,最快的查看原因是查看 systemd 日志(有关阅读 Linux 日志的一般背景知识,请参阅如何阅读 Linux 日志以及在哪里可以找到它):
journalctl -u xray -n 50 --no-pager
建立客户端连接链接
Xray 客户端导入的是单个 vless:// 共享链接,而不是配置文件。根据第 4 节中生成的值构建该链接(客户端应用程序的共享链接格式仍然使用旧的传输类型 type=tcp,即使 JSON 字段本身现在称为 method):
YOUR-UUID — 来自 xray uuid(例如,a1b2c3d4-e5f6-7890-abcd-ef1234567890)
YOUR-PASSWORD-PUBLIC-KEY — 是来自 xray x25519 的密码(不是私钥!)
YOUR-SHORT-ID — 来自 openssl rand -hex 8(例如,a1b2c3d4e5f67890)
您的IP地址 — (您的服务器IP地址)
SNI — www.microsoft.com(或您的目标网站)
vless://YOUR-UUID-HERE@your_IP:443?encryption=none&security=reality&sni=www.microsoft.com&fp=chrome&pbk=YOUR-PASSWORD-PUBLIC-KEY&sid=YOUR-SHORT-ID&type=tcp&flow=xtls-rprx-vision#My-Xray-Server
示例链接:
vless://a1b2c3d4-e5f6-7890-abcd-ef1234567890@your_IP:443?encryption=none&security=reality&sni=www.microsoft.com&fp=chrome&pbk=xyz_public_key_here&sid=a1b2c3d4e5f67890&type=tcp&flow=xtls-rprx-vision#My-Xray-Server
pbk 是来自 xray x25519 的密码值(公钥,而不是私钥),sni 与目标主机名匹配,# 后面的文本只是一个显示标签,您可以在任何客户端中自由重命名。
将其转换为二维码,以便移动用户可以直接扫描:
qrencode -o ~/vless-client.png "vless://YOUR-UUID@your_IP:443?encryption=none&security=reality&sni=www.microsoft.com&fp=chrome&pbk=YOUR-PASSWORD-PUBLIC-KEY&sid=YOUR-SHORT-ID&type=tcp&flow=xtls-rprx-vision#My-Xray-Server"
或者直接将其打印到终端,而不保存文件:
qrencode -t ansiutf8 "vless://YOUR-UUID@your_IP:443?encryption=none&security=reality&sni=www.microsoft.com&fp=chrome&pbk=YOUR-PASSWORD-PUBLIC-KEY&sid=YOUR-SHORT-ID&type=tcp&flow=xtls-rprx-vision#My-Xray-Server"
使用 scp 命令将 PNG 文件复制到您自己的计算机上,并在您计算机的终端(或 Windows 上的 PowerShell)中运行该命令,而不是在服务器上运行:
scp root@your_IP:~/vless-client.png .
从 Windows 连接
本节中的所有操作都在您的 Windows PC 上进行,而不是通过 SSH 进行——客户端必须在实际使用代理的设备上运行。
安装 v2rayN
v2rayN 是一款免费且积极维护的 GUI 客户端,它捆绑了 Xray-core,并原生支持 VLESS/Reality。请从项目页面下载最新版本:
获取 Windows 64 位 .zip 资源(自包含版本,从最新的 v2rayN 版本开始,无需单独的 .NET 运行时),将其解压到任意位置,然后运行 v2rayN.exe。
导入服务器
将第 7 部分中内置的 vless:// 链接复制到剪贴板(或者使用 scp 命令复制 QR PNG 文件并打开),然后在 v2rayN 中选择“服务器”,然后选择“从剪贴板批量导入 URL”(或者使用内置扫描器扫描 QR 码)。新的服务器配置文件将出现在列表中,并在 # 后显示您设置的标签。
右键单击配置文件并将其选为活动配置文件,然后从主窗口工具栏启用系统代理(或 TUN 模式,用于路由整个计算机)。
通过 Android 连接
这里的所有操作都在您的安卓设备上进行,而不是通过 SSH。
安装 v2rayNG
v2rayNG 是 v2rayN 的 Android 版本,由同一维护者开发,也是 Android 上使用最广泛的 X 射线客户端。您可以从 Google Play 安装,如果 Play 在您所在的地区不可用,也可以直接从项目的发布页面下载 APK 文件:
导入服务器
打开 v2rayNG,点击右上角的“+”按钮,复制 vless:// 链接后选择“从剪贴板导入配置”,或者扫描二维码并将摄像头对准第 7 部分生成的 PNG 文件。点击导入的配置文件进行选择,然后点击底部的圆形连接按钮。Android 系统首次连接时会提示授予 VPN 权限——请允许以建立连接。
从 iOS 连接
所有操作都在您的 iPhone 或 iPad 上进行,而非通过 SSH。根据苹果 App Store 的准则,iOS 上的 Xray/VLESS 客户端通常是免费的,但偶尔也会有付费的独立应用,而不是系统集成功能。
安装一个支持 Reality 的客户端
Streisand 是一款免费的开源客户端,支持 VLESS with Reality 以及其他几种协议。您可以在 App Store 中搜索它,或者点击此链接。
App Store 的目录因商店/地区而异,并且会随着时间而改变;如果 Streisand 在您的商店中不可见,支持 VLESS+Reality 的替代应用包括 Happ、V2Box 和 V2rayTun — 在 App Store 中搜索适用于您帐户的应用。
导入服务器
将 vless:// 链接复制到剪贴板,打开客户端,然后使用其“从剪贴板添加”(或等效的“导入”)选项,或者使用客户端内置的扫描器扫描第 7 部分中的二维码。启用新配置文件;iOS 系统首次启用时会提示授予 VPN 配置权限,您需要通过面容 ID、触控 ID 或密码进行授权。
验证连接
从第 8、9 或 10 节激活隧道后,回到您自己的设备(而不是 SSH 会话),在浏览器中打开任何“我的 IP 地址是什么”检查器——显示的地址应该与您的 VPS 的 IP 地址匹配。
要从服务器端进行验证,请检查 systemd 日志中的连接活动,并确认端口 443 上已建立 TCP 会话:
journalctl -u xray -n 50 --no-pager
ss -tnp | grep ':443'
在默认的“警告”日志级别下,Xray 不会打印太多关于单个连接的信息;如果您在排查故障时需要查看更多详细信息,请暂时在 config.json 中将“loglevel”设置为“info”并重新启动服务,然后在一切正常后将其切换回“警告”。
文献参考:
|
领域 |
价值 |
|
地址 |
您的VPS的公网IP地址 |
|
港口 |
443(与第 2 部分打开的端口相同) |
|
UUID / id |
您的 UUID 在此处 — 在第 4 节中使用 xray uuid 生成 |
|
自动化流程 |
xtls-rprx-vision — 两侧必须匹配 |
|
安保防护 |
现实 |
|
SNI / 服务器名称 |
第 4 节中测试的目标主机名,例如 www.microsoft.com |
|
指纹(fp) |
chrome — 受支持的 uTLS 指纹;必须在客户端上设置 |
|
公钥 / pbk |
xray x25519 中的密码值——绝非私钥 |
|
短 ID / SID |
使用 openssl rand -hex 8 生成;必须与 shortIds 中的值匹配 |
结语
按照本指南操作,您的 VPS 将运行一个独立的 Xray VLESS+Reality 服务器,该服务器伪装成指向真实网站的普通 HTTPS 流量,无需域名和证书维护。该服务以 systemd 单元 xray 的形式运行,并且在您无需任何操作的情况下,重启后仍然有效。
随时可以通过在 config.json 的 users 数组中添加另一个对象来添加新客户端,该对象具有来自 xray uuid 的新 UUID 和不同的电子邮件标签,然后重启服务 (systemctl restart xray) 并根据第 7 节为该用户构建他们自己的共享链接。每个人或设备使用单独的 UUID 可以撤销某个用户或设备,而不会影响其他人。
服务器运行后,以下几个习惯值得保持:
- 保持 Xray 补丁更新。定期重新运行第 3 节中的安装脚本(它会就地升级现有安装),并根据第 5 节中提到的 minClientVer 行为,保持客户端应用程序更新。
- 将 config.json 文件备份到服务器以外的私密位置。该文件保存着服务器的 Reality 私钥和每个客户端的 UUID;丢失该文件意味着需要为每个设备重新生成凭据。
- 立即撤销丢失的设备。从 config.json 文件中的 users 数组中删除相应的条目,然后重启服务。
如果连接始终无法建立,请按以下顺序检查:
- 服务状态(systemctl status xray --no-pager)和日志(journalctl -u xray -n 50 --no-pager)
- 防火墙规则(ufw 状态 — 端口 443/tcp 必须打开)
- 端口 443 没有被其他服务占用(ss -lntp | grep ':443' 应该只显示 xray)。
- 客户端中的 UUID、公钥、短 ID、SNI 和流程必须与 config.json 完全匹配——哪怕只有一个字符不匹配,握手也会静默失败。
- 现实目标本身,带有X射线TLS ping :443,以防网站更改其 TLS 配置
想将 Xray 与其他方案进行比较?请参阅AmneziaWG 服务器部署指南和如何在服务器上设置 WireGuard VPN,了解基于 WireGuard 的替代方案;或者参阅Hysteria2 和 TUIC 设置,了解另外两种专为丢包或过滤严重的网络设计的抗审查协议。如果您只需要一个简单的代理而不是完整的隧道设置,那么在 CentOS/ArchLinux 上配置 3proxy是一个更轻量级的选择;而 Linux 上的旧版VPN 服务器设置:PPTP 还是 OpenVPN?则涵盖了设置更简单但更容易被深度包检测 (DPI) 检测和屏蔽的协议。代理上线后,如需进行常规服务器加固,请参阅Linux 用户:管理和权限。