云服务器自建 VLESS + REALITY 代理完整记录

云服务器自建 VLESS + REALITY 代理完整记录

从 Sing-Box 到 X-UI,一次完整的踩坑与成功实践


📋 前言

最近参考了一篇云服务器搭建教程,尝试了 Sing-Box 和 X-UI 两种方案,最终在 X-UI (3x-ui) 上成功搭建了 VLESS + REALITY 代理。

这篇不是那种”一键脚本完事”的教程,而是真实记录整个过程中遇到的问题和解决方案,尤其是网上资料比较少的 Loon 客户端配置部分。


🛠️ 环境信息

项目 配置
云服务器 阿里云轻量应用服务器(IPv4)
系统 Alibaba Cloud Linux
面板 3x-ui
协议 VLESS + REALITY
传输 TCP + XTLS
客户端 Shadowrocket / Loon (iOS)

🚀 第一步:选择部署方案

我尝试了两种方案:

方案 优点 缺点
Sing-Box 资源占用极低,纯净 无 Web 后台,配置靠手写 JSON
3x-ui 图形界面,管理方便 资源占用稍高

最终选择 3x-ui,因为:

  • 可视化配置,参数一目了然
  • 可以随时修改节点配置
  • 自动生成订阅链接

安装命令:

1
bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)

🔐 第二步:配置 VLESS + REALITY 入站

2.1 面板设置

进入 3x-ui 后台,添加入站:

1
2
3
4
协议:VLESS
端口:自定义(确保防火墙已开放)
传输协议:TCP
Flow:xtls-rprx-vision

2.2 REALITY 设置

1
2
3
4
启用 REALITY:是
目标网站(SNI):www.intel.com(或其他可信域名)
ShortId:自动生成
私钥/公钥:点击「生成」按钮

⚠️ 踩坑 1:私钥为空导致 Xray 启动失败

第一次配置时,我忘记生成密钥,日志一直报错:

1
ERROR - XRAY: Failed to build REALITY config. > empty "privateKey"

解决: 在面板编辑入站,点击 REALITY 设置里的「生成」按钮,然后重启 Xray。

2.3 端口监听确认

配置完成后务必确认端口监听:

1
ss -lntp | grep <节点端口>

正常输出:

1
LISTEN 0 4096 0.0.0.0:<端口> users:(("xray",pid=xxx))

⚠️ 踩坑 2:面板显示端口 ≠ 实际监听端口

我在面板看到端口是 55861,但 ss 命令显示实际监听的是 4443(另一个入站的端口)。

解决: 在面板入站列表确认实际启用的端口,客户端连接端口必须与服务端监听端口一致。


📱 第三步:客户端配置

3.1 Shadowrocket(iOS)

最简单,直接扫描面板二维码或导入订阅链接。

3.2 Loon(iOS)

这里坑比较多,网上资料也少。

方式一:一键导入订阅链接

将 X-UI 的订阅链接 URL 编码后,使用以下格式:

1
https://www.nsloon.com/openloon/import?nodelist=<URL 编码后的订阅链接>

在 Safari 打开这个链接,会自动跳转到 Loon 导入。

方式二:手动配置节点格式

1
my-reality = VLESS,<服务器 IP>,<端口>,"<UUID>",transport=tcp,flow=xtls-rprx-vision,public-key="<REALITY 公钥>",short-id=<ShortId>,udp=true,over-tls=true,sni=www.intel.com,skip-cert-verify=true

⚠️ 踩坑 3:UUID 格式错误

从面板复制的 UUID 前面有 none: 前缀:

1
2
❌ 错误:none:d51ed55c-d6dd-400b-aaf6-017c33969bfe
✅ 正确:d51ed55c-d6dd-400b-aaf6-017c33969bfe

⚠️ 踩坑 4:XTLS Flow 设置错误

Loon 里 XTLS 流量不能选 none,必须和服务端一致:

1
2
❌ 错误:flow=none
✅ 正确:flow=xtls-rprx-vision

⚠️ 踩坑 5:IP Mode 设置

如果服务器是 IPv4,建议改成:

1
IP Mode: ipv4

不要用 ipv4 & ipv6,排查阶段简单点好。

3.3 uTLS / Fingerprint 设置

推荐配置: chrome

作用:让客户端 TLS 握手特征伪装成 Chrome 浏览器。

其他选项:firefoxsafariiosandroidrandomnone

测试阶段建议固定使用 chrome,不要选 random


🔍 第四步:验证与测试

服务端检查清单

1
2
3
4
5
6
7
8
9
10
11
# 1. 确认 Xray 监听端口
ss -lntp | grep <端口>

# 2. 确认防火墙放行
firewall-cmd --list-ports

# 3. 查看 Xray 日志
x-ui log

# 4. 重启 Xray(配置变更后)
x-ui restart

客户端连通性测试

Windows PowerShell:

1
Test-NetConnection <服务器 IP> -Port <端口>

如果 TcpTestSucceeded: True 说明网络层通了。

浏览器验证

连接后访问:

如果显示的是服务器 IP,说明代理生效。


🐛 常见问题排查

问题 1:Xray 启动失败,日志显示 empty "privateKey"

原因: REALITY 入站的私钥未生成

解决:

1
2
3
# 方法 1:在 3x-ui 面板点击「生成」按钮
# 方法 2:命令行生成
/usr/local/x-ui/bin/xray-linux-amd64 x25519

问题 2:客户端连接超时

排查顺序:

  1. 服务器确认监听:ss -lntp | grep 端口
  2. 系统防火墙:firewall-cmd --list-ports
  3. 云服务商控制台防火墙:确认端口已放行 TCP
  4. 本地测试:Test-NetConnection IP -Port 端口

问题 3:面板能打开但节点连不上

可能原因:

  • 面板端口 ≠ 节点端口
  • 节点未启用或配置未保存
  • REALITY 参数不一致(公钥、Short ID、SNI)

解决: 在面板入站列表确认实际启用的端口,复制分享链接导入客户端(不要手填)。

问题 4:SSL 证书申请失败,提示 port 80 is already used by nginx

原因: nginx 占用了 80 端口,Let’s Encrypt 无法做 HTTP-01 验证

解决:

1
2
3
4
5
6
7
8
# 临时停止 nginx
systemctl stop nginx

# 重新申请证书
x-ui → 19. SSL Certificate Management

# 申请成功后重启 nginx
systemctl start nginx

建议: 测试阶段先用 HTTP 访问面板,跑通后再配置 HTTPS。

问题 5:REALITY handshake failed

原因: 客户端和服务端 REALITY 参数不一致

检查项:

  • publicKey(客户端用公钥,不是私钥)
  • shortId(必须匹配)
  • sni(必须一致)
  • flow(必须一致)

解决: 直接从面板复制完整分享链接重新导入,不要手填。


📝 总结与建议

为什么选择 X-UI 而不是 Sing-Box?

  1. 可视化配置 - 不用手动编辑 JSON,参数一目了然
  2. 多用户管理 - 可以轻松创建多个节点给不同设备使用
  3. 订阅链接 - 自动生成各客户端兼容的订阅格式
  4. 日志查看 - 面板内直接查看连接日志,排查问题方便

安全建议

  1. 定期更换订阅 Token - 如果担心泄露,在 X-UI 面板重置订阅链接
  2. 修改默认面板端口 - 不要用默认的 54321,降低被扫描风险
  3. 开启面板 HTTPS - 使用 Nginx 反代 + Let’s Encrypt 证书
  4. 设置强密码 - 面板登录密码和 UUID 都要足够复杂

性能优化

  • 选择离你地理位置近的机房
  • 使用 TCP + REALITY 组合,兼容性和安全性最佳
  • 低配服务器建议关闭不必要的协议,只保留 VLESS

🔗 参考资源


免责声明: 本文仅供技术交流学习,请遵守当地法律法规,切勿用于非法用途。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2026 北山念我心
  • 访问人数: | 浏览次数: