Xray VLESS + REALITY 从源码编译安装:拒绝一键脚本,部署最干净的代理服务

1. 为什么从源码编译?
网上关于 Xray 的教程,90% 以一键脚本开头——bash <(curl -sL xxxx.sh)。脚本方便,但代价是:
| 问题 | 后果 |
|---|---|
| 脚本作者可以随时修改 | 你跑的不是昨天的版本 |
| 依赖链不可控 | 不知道装了什么东西,卸载不干净 |
| 冗余文件堆积 | /usr/local/etc/xray/ 下一堆 geoip.dat、geosite.dat,实际用不上 |
| 二进制来源不明 | 非官方构建,无法验证签名 |
从源码编译三个好处:
- 二进制可控 — 你编译的
xray只有主程序,没有路由规则文件、没有预设模板,总共三个文件跑起来 - 版本锁定 — 编译时指定 commit hash,不会自动更新,需要升级时重新编译
- 编译参数优化 —
-ldflags "-s -w"剥离调试符号,二进制体积减少 60%+,启动更快
协议方面:VLESS + REALITY 是目前跨墙场景中最精简的配置组合。REALITY 直接复用目标站点的 TLS 证书(如 www.bing.com),外部看到的是一条普通 TLS 连接——不需要你买域名、不需要申请证书、不需要配置 WebSocket 伪装站。
2. 协议简述:VLESS + REALITY 为什么是当前最优解
| 特性 | VLESS + REALITY | VLESS + XTLS | Trojan | Shadowsocks |
|---|---|---|---|---|
| 需要域名 | 否 | 是 | 是 | 否 |
| 需要 TLS 证书 | 否(偷目标站的) | 是 | 是 | 不需要 TLS |
| 流量伪装 | TLS 1.3 握手,无异于正常站点 | TLS(你的域名) | TLS(你的域名) | 混淆插件 |
| 主动探测抗性 | 高(没私钥 = 探测失败 = 普通 TLS 站点) | 中 | 中 | 取决于插件 |
| 配置复杂度 | 3 个参数 | 需配证书路径 + 域名 | 需配证书路径 | 需配加密 + 混淆 |
REALITY 的核心思路是「偷证书」而非「造证书」。你的服务端持有目标网站(如 www.bing.com)的 TLS 指纹,但没有对应私钥。探测者发起 TLS 握手 → 你的 Xray 没有私钥 → 连接失败 → 从外界看,这就是一台没开 443 端口的普通机器。防的不是识别,是防的「确认」——无法确认你就是代理服务端。
3. 实验环境
| 项目 | 详情 |
|---|---|
| 服务器 | 搬瓦工 USCA_9(洛杉矶 DC9 CN2 GIA) |
| 线路 | 电信 CN2 GIA / 联通 9929 / 移动 CMIN2 — 三网优化回程 |
| 配置 | 2C/1G/20G SSD,1TB @ 2.5Gbps |
| 操作系统 | Debian 12 |
| Golang | 1.26.5 |
| Xray-core | 主线最新(编译时指定) |
4. 第一步:安装基础依赖
sudo apt update -y && sudo apt upgrade -y
sudo apt install git vim curl -y5. 第二步:安装 Go 1.26.5
cd /opt
curl -LO https://go.dev/dl/go1.26.5.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.26.5.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc验证:
go version
# go version go1.26.5 linux/amd64go1.26.5.linux-arm64.tar.gz,其余步骤完全一致。6. 第三步:编译 Xray-core
git clone https://github.com/XTLS/Xray-core.git
cd Xray-core && go mod download编译(CGO 禁用 + 符号剥离,约 12MB → 约 5MB):
CGO_ENABLED=0 go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
sudo mv xray /usr/local/bin/CGO_ENABLED=0:纯静态链接,不依赖 glibc,跨发行版通用-trimpath:去除编译路径信息-ldflags "-s -w":剥离符号表和调试信息,缩小二进制体积-buildid=:清空 Go 构建 ID,避免泄露编译环境信息
7. 第四步:生成配置参数
# UUID(客户端身份标识)
xray uuid
# REALITY 密钥对
xray x25519
# ShortID(8 位十六进制)
openssl rand -hex 8三个值的用途:
- UUID — 客户端凭证,填入客户端
id字段 - PrivateKey — 服务端 REALITY 私钥,只在服务端配置中出现
- ShortID — 附加认证标识,增加识别难度
8. 第五步:编写服务端配置
sudo mkdir -p /etc/xray
sudo nano /etc/xray/config.json{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"port": <你的端口,建议 443>,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "<你的UUID>",
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"dest": "www.bing.com:443",
"serverNames": ["www.bing.com", "bing.com"],
"privateKey": "<你的PrivateKey>",
"shortIds": ["<你的ShortID>"]
}
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls", "quic"]
}
}
],
"outbounds": [
{
"protocol": "freedom",
"tag": "direct"
},
{
"protocol": "blackhole",
"tag": "block"
}
]
}dest 和 serverNames 填入的是伪装目标——外部看到的 TLS 连接域名。选择标准:
- 中国大陆未被墙、直连可达
- 支持 TLS 1.3 + X25519 密钥交换(REALITY 的硬性要求)
- 流量大、访问人数多(你的连接混在正常流量中)
www.bing.com 和 www.microsoft.com 是已验证的高可用选择。
9. 第六步:创建 systemd 服务
sudo nano /etc/systemd/system/xray.service[Unit]
Description=Xray Service
Documentation=https://github.com/xtls
After=network.target nss-lookup.target
[Service]
User=root
NoNewPrivileges=true
ExecStart=/usr/local/bin/xray run -config /etc/xray/config.json
Restart=on-failure
RestartPreventExitStatus=23
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable xray --now
sudo systemctl status xray --no-pager若启动失败,查看日志定位:
sudo journalctl -u xray -n 80 --no-pager10. 防火墙放行
只需要放行一个端口(你配置的 port):
sudo firewall-cmd --permanent --add-port=<你的端口>/tcp
sudo firewall-cmd --reload搬瓦工面板的安全组 / 防火墙也需要同步放行。如果系统还没装 firewalld,参考 Firewalld 教程 中的安装步骤。
11. 常用命令速查
| 动作 | 命令 |
|---|---|
| 启动 | sudo systemctl start xray |
| 停止 | sudo systemctl stop xray |
| 重启 | sudo systemctl restart xray |
| 状态 | sudo systemctl status xray --no-pager |
| 日志 | sudo journalctl -u xray -n 80 --no-pager |
| 实时日志 | sudo journalctl -u xray -f |
12. 部署成果
三个文件、零冗余依赖:
/usr/local/bin/xray— 自编译主程序/etc/xray/config.json— 配置文件/etc/systemd/system/xray.service— systemd 守护
对比一键脚本部署后 /usr/local/etc/xray/ 下七八个文件、各种 route/outbound 预设——你只装了需要的三个文件,清楚每个文件的作用,卸载也只是一条 rm。
13. FAQ
Q: Xray 更新后怎么升级?
源码编译的优势之一:更新机制就是重新编译。
cd Xray-core && git pull && go mod download
CGO_ENABLED=0 go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
sudo mv xray /usr/local/bin/xray
sudo systemctl restart xray配置文件不需要改动——Xray 向下兼容。
Q: REALITY 的 dest 换成自己的域名可以吗?
可以,但没必要。REALITY 的设计原意就是不需要你自己有域名/证书。手动配置自有域名的 TLS 证书,相当于退回 VLESS + XTLS 模式——失去了 REALITY 的「无证书 + 零配置」优势。
Q: 为什么选择 VLESS 而不是 VMess?
VMess 的加密层在 VLESS 中被剥离——VLESS 本身不加密数据,加密由底层传输层(TLS/REALITY)负责。省去了协议层加密的二重开销,同时减少了特征指纹。2024 年后 Xray-core 社区的重心已经完全移向 VLESS,VMess 的改进趋于停滞。
Q: 如果端口被封了怎么办?
REALITY 走的是标准 TLS 1.3,GFW 的 DPI 看到的是 www.bing.com 的正常 TLS 握手。封锁端口的手段通常是 QoS 限速而非完全阻断——因为真实访问 www.bing.com 的人也会受影响。如果端口被 QoS,更换端口即可,不需要换 dest。
14. 推荐阅读
- WireGuard 安装与组网完整教程 — 组网加密,不适合跨境但适合内网穿透
- Realm 端口转发教程:跨网段双栈中转 — 中转/落地分离架构中的端口转发层
- Firewalld 端口转发完全指南 — 基础防火墙配置
- 搬瓦工 USCA_9 DC9 CN2 GIA 详细测评 — 本文实验机器的完整线路数据
- 国外便宜 VPS 推荐:稳定适合建站含测评
- DMIT 洛杉矶 Pro 深度测评
- RackNerd 洛杉矶 DC02 测评
- HostDare 洛杉矶 CN2 GIA 测评