在 AWS EC2 上搭建 Xray + VLESS + REALITY:个人节点部署记录

在 AWS EC2 上搭建个人代理节点,最容易踩坑的地方并不是安装 Xray-core,而是几个参数之间的对应关系:

  • 服务端使用 privateKey,客户端使用 publicKey
  • 服务端 serverNames 要和客户端 SNI/serverName 一致
  • UUIDflowshortId 两端都要对应
  • AWS Security Group 要真正放行 443/tcp

这篇文章记录一套相对简单的部署方式:在 Ubuntu Server 上安装 Xray-core,使用 VLESS + REALITY + Vision 监听 443/tcp,客户端通过 REALITY 参数连接。

本文面向个人学习、远程访问自有资源、保护公共网络下连接安全等合法场景。部署和使用前,请确认符合所在地法律法规、AWS 服务条款以及相关网络服务条款。


一、为什么选择 Xray + VLESS + REALITY

如果只是访问家里的 NAS、开发机或内网服务,Tailscale、WireGuard 这类组网方案通常更省心,也更适合长期维护。

但如果目标是在一台云服务器上搭建个人代理出口,并希望连接入口尽量收敛在标准 HTTPS 端口,Xray-core + VLESS + REALITY + Vision 是一个常见组合。

整体链路可以这样理解:

客户端 App
  -> VLESS + REALITY + Vision
  -> AWS EC2 公网 443/TCP
  -> Xray-core
  -> freedom outbound
  -> Internet

几个关键词先简单说明:

名称 作用
Xray-core 服务端和客户端都可使用的代理核心
VLESS 轻量代理协议,使用 UUID 做用户身份识别
REALITY Xray 的传输安全方案,用于处理连接握手和目标站点伪装参数
Vision 常见 flow 参数为 xtls-rprx-vision,经常和 VLESS + REALITY 搭配
AWS EC2 本文使用的云服务器平台

这套方案的优势是组件少、配置清晰、只需要开放一个对外端口。缺点也很明确:你需要自己维护服务器、安全组、系统更新和客户端参数。

二、准备工作

开始前需要准备:

项目 说明
AWS 账号 用于创建 EC2 实例
SSH key pair 登录服务器使用
本地 SSH 环境 macOS / Linux 终端,或 Windows Terminal + OpenSSH
客户端 App 需要支持 VLESS + REALITY,例如 v2rayN、NekoBox、Shadowrocket、Stash、Mihomo 兼容客户端等
时间 第一次配置建议预留 60 到 90 分钟

本文以 Ubuntu Server 24.04 LTS 为例。Ubuntu 22.04 LTS 的步骤基本一致。

三、创建 AWS EC2 实例

进入 AWS 控制台,打开 EC2,选择 Launch instance

推荐配置如下:

配置项 建议
Region 优先选择离你网络更近、线路质量更好的区域,例如东京、新加坡、俄勒冈等
AMI Ubuntu Server 24.04 LTS
Instance type 个人轻量使用可选 t3.microt4g.micro
Storage 8GB 到 20GB gp3 通常够用
Key pair 新建或选择已有 SSH key

如果选择 ARM 架构的 t4g.micro,后续安装软件时要注意架构兼容性。Xray-core 本身支持多架构,但排查问题时需要知道实例是 x86_64 还是 arm64

安全组入站规则建议只保留必要端口:

TCP 22   仅允许你的当前公网 IP
TCP 443  允许 0.0.0.0/0 和 ::/0

这里有两个原则:

  • SSH 不要对全网开放,至少限制到自己的公网 IP。
  • 不要开放面板端口。个人节点越少暴露管理入口,越容易维护。

如果希望 EC2 重启后公网 IP 不变,可以分配并绑定 Elastic IP。否则实例停止再启动后,公网 IP 可能变化。

四、登录服务器并更新系统

假设 key 文件是 your-key.pem,EC2 公网 IP 是 1.2.3.4

ssh -i your-key.pem ubuntu@1.2.3.4

登录后更新系统,并安装基础工具:

sudo apt update
sudo apt upgrade -y
sudo apt install -y curl unzip jq openssl chrony

启用时间同步:

sudo systemctl enable --now chrony
timedatectl

VLESS 不像 VMess 那样强依赖系统时间,但服务器时间正确仍然是基础要求。时间漂移过大时,排查 TLS、日志和证书相关问题都会更麻烦。

五、安装 Xray-core

使用 XTLS 官方安装脚本:

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

检查安装结果:

xray version
systemctl status xray --no-pager

如果 xray version 能输出版本号,说明核心已经安装完成。

六、生成 UUID、REALITY 密钥和 shortId

服务端和客户端需要共用一组身份和握手参数。建议先生成并保存好,后面配置时逐个替换。

生成 UUID:

xray uuid

生成 REALITY 使用的 X25519 密钥对:

xray x25519

输出类似这样:

Private key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Public key:  yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

生成 shortId

openssl rand -hex 8

这些值的使用位置如下:

参数 放在哪里 说明
UUID 服务端和客户端 用户身份标识
Private key 只放服务端 REALITY 私钥,不要暴露给客户端之外的地方
Public key 只放客户端 由客户端连接时使用
shortId 服务端和客户端 两端必须一致

这一步最常见的问题是把 privateKeypublicKey 放反。服务端配置里只能放 privateKey,客户端参数里使用 publicKey

七、写入 Xray 服务端配置

编辑配置文件:

sudo nano /usr/local/etc/xray/config.json

写入下面配置,并替换三个占位符:

  • UUID_HERE
  • PRIVATE_KEY_HERE
  • SHORT_ID_HERE
{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "vless-reality",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "UUID_HERE",
            "flow": "xtls-rprx-vision",
            "email": "me"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "raw",
        "security": "reality",
        "realitySettings": {
          "show": false,
          "dest": "www.microsoft.com:443",
          "serverNames": [
            "www.microsoft.com"
          ],
          "privateKey": "PRIVATE_KEY_HERE",
          "shortIds": [
            "SHORT_ID_HERE"
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls",
          "quic"
        ]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}

关于 destserverNames 需要单独说明:

  • 它们需要指向一个真实可访问的 HTTPS 站点。
  • 客户端的 SNI/serverName 必须和服务端 serverNames 中的值一致。
  • 很多教程会使用大型网站作为 REALITY 目标,但这不等于对方授权你这样使用。
  • 更稳妥的方式是使用你自己控制、且符合服务条款的 HTTPS 域名。

如果后续把 www.microsoft.com 改成自己的域名,服务端 destserverNames 和客户端 sni 都要一起改。

八、检查配置并启动服务

先测试配置语法:

sudo xray run -test -config /usr/local/etc/xray/config.json

如果没有报错,重启并启用 Xray:

sudo systemctl restart xray
sudo systemctl enable xray

查看日志:

sudo journalctl -u xray -n 50 --no-pager

确认 443 端口已经监听:

sudo ss -lntp | grep ':443'

如果能看到 Xray 监听 0.0.0.0:443,说明服务端基本就绪。此时如果客户端仍然无法连接,优先检查 AWS Security Group,而不是先改 Xray 配置。

九、配置客户端

客户端参数如下:

参数
协议 VLESS
地址 EC2 公网 IP 或你的域名
端口 443
UUID UUID_HERE
加密 none
流控 / flow xtls-rprx-vision
传输 / network tcpraw,按客户端实际选项填写
安全 / security reality
SNI / serverName www.microsoft.com
Fingerprint chrome
Public Key PUBLIC_KEY_HERE
Short ID SHORT_ID_HERE
SpiderX /

如果客户端支持导入分享链接,可以使用这个模板:

vless://UUID_HERE@EC2_IP_OR_DOMAIN:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.microsoft.com&fp=chrome&pbk=PUBLIC_KEY_HERE&sid=SHORT_ID_HERE&type=tcp&headerType=none#aws-reality

需要替换:

  • UUID_HERE
  • EC2_IP_OR_DOMAIN
  • PUBLIC_KEY_HERE
  • SHORT_ID_HERE
  • sni,如果服务端 serverNames 改了,这里也要一致

不同客户端对字段名称的叫法略有差异。比如有的叫 serverName,有的叫 SNI;有的把 tcp 显示成 raw。重点是参数值要和服务端对应。

十、基础加固

AWS Security Group 是第一道边界,服务器上的防火墙可以作为第二层保护。

启用 UFW:

sudo ufw allow OpenSSH
sudo ufw allow 443/tcp
sudo ufw enable

再次确认安全组策略:

  • 22/tcp 只允许你的公网 IP。
  • 443/tcp 对外开放。
  • 不开放额外管理端口。

启用自动安全更新:

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades

后续可以定期执行:

sudo apt update
sudo apt upgrade -y
xray version

如需升级 Xray-core,可重新运行安装脚本:

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
sudo systemctl restart xray

十一、常见问题排查

1. 客户端完全连不上

优先检查 AWS Security Group:

  • 是否开放了 443/tcp
  • 安全组是否绑定到了正确的 EC2 实例。
  • 客户端填写的是不是当前 EC2 公网 IP 或 Elastic IP。

然后检查服务器端口:

sudo ss -lntp | grep ':443'

如果服务端没有监听 443,继续看 Xray 服务状态:

systemctl status xray --no-pager
sudo journalctl -u xray -n 100 --no-pager

2. Xray 服务启动失败

先测试配置文件:

sudo xray run -test -config /usr/local/etc/xray/config.json

JSON 配置最常见的问题包括:

  • 漏逗号
  • 引号错误
  • 占位符没有替换
  • privateKey 填成了 publicKey
  • shortIds 没有写成数组

3. REALITY 握手失败

重点检查这几项:

  • 服务端使用的是 privateKey
  • 客户端使用的是 publicKey
  • shortId 两端一致。
  • 客户端 serverName/SNI 和服务端 serverNames 一致。
  • 客户端 flowxtls-rprx-vision
  • 客户端 fingerprint 使用了常见值,例如 chrome

如果只改了其中一个端的 SNI、shortId 或 key,连接通常会直接失败。

4. 速度不好

速度问题不一定来自 Xray 配置。个人节点体验很大程度取决于:

  • AWS 区域
  • 本地运营商路由
  • 晚高峰拥塞
  • 实例规格和 CPU credit
  • 目标站点所在地区

更有效的排查方式通常是横向测试不同区域,例如东京、新加坡、首尔、洛杉矶、俄勒冈等,而不是反复调整 Xray 参数。

5. EC2 重启后 IP 变了

如果没有绑定 Elastic IP,EC2 停止再启动后公网 IP 可能变化。

解决方式有两种:

  • 给实例绑定 Elastic IP。
  • 使用域名解析到 Elastic IP。

如果只使用普通公网 IP,每次 IP 变化后都要同步修改客户端地址。

十二、推荐的最终配置策略

个人使用建议从最小方案开始:

单用户
无管理面板
443/TCP
VLESS + REALITY + Vision
AWS Security Group 限制 SSH 来源
Elastic IP 固定地址

不建议一开始部署面板。面板确实方便管理多用户和订阅链接,但它也会引入额外端口、Web 登录面、数据库和权限问题。个人节点越简单,越容易维护,也越容易排查。

这套配置的核心不是追求复杂,而是把暴露面控制住,把参数关系理清楚。真正需要记住的是:

  • AWS 放行 443/tcp
  • Xray 监听 443
  • 服务端放 privateKey
  • 客户端放 publicKey
  • UUIDshortIdserverName 两端一致

只要这几项对应正确,大多数连接问题都能很快定位。

参考资料