在 AWS EC2 上搭建 Xray + VLESS + REALITY:个人节点部署记录
在 AWS EC2 上搭建个人代理节点,最容易踩坑的地方并不是安装 Xray-core,而是几个参数之间的对应关系:
- 服务端使用
privateKey,客户端使用publicKey - 服务端
serverNames要和客户端SNI/serverName一致 UUID、flow、shortId两端都要对应- 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.micro 或 t4g.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 |
服务端和客户端 | 两端必须一致 |
这一步最常见的问题是把 privateKey 和 publicKey 放反。服务端配置里只能放 privateKey,客户端参数里使用 publicKey。
七、写入 Xray 服务端配置
编辑配置文件:
sudo nano /usr/local/etc/xray/config.json
写入下面配置,并替换三个占位符:
UUID_HEREPRIVATE_KEY_HERESHORT_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"
}
]
}
关于 dest 和 serverNames 需要单独说明:
- 它们需要指向一个真实可访问的 HTTPS 站点。
- 客户端的
SNI/serverName必须和服务端serverNames中的值一致。 - 很多教程会使用大型网站作为 REALITY 目标,但这不等于对方授权你这样使用。
- 更稳妥的方式是使用你自己控制、且符合服务条款的 HTTPS 域名。
如果后续把 www.microsoft.com 改成自己的域名,服务端 dest、serverNames 和客户端 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 | tcp 或 raw,按客户端实际选项填写 |
| 安全 / 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_HEREEC2_IP_OR_DOMAINPUBLIC_KEY_HERESHORT_ID_HEREsni,如果服务端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填成了publicKeyshortIds没有写成数组
3. REALITY 握手失败
重点检查这几项:
- 服务端使用的是
privateKey。 - 客户端使用的是
publicKey。 shortId两端一致。- 客户端
serverName/SNI和服务端serverNames一致。 - 客户端
flow是xtls-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 UUID、shortId、serverName两端一致
只要这几项对应正确,大多数连接问题都能很快定位。
参考资料
- Xray Transport / REALITY 文档:https://xtls.github.io/en/config/transport.html
- Xray VLESS 文档:https://xtls.github.io/en/config/inbounds/vless.html
- Xray-core Releases:https://github.com/XTLS/Xray-core/releases
- AWS EC2 入门文档:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html
- AWS Elastic IP 文档:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html