Contents

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

1. 为什么从源码编译?

网上关于 Xray 的教程,90% 以一键脚本开头——bash <(curl -sL xxxx.sh)。脚本方便,但代价是:

问题 后果
脚本作者可以随时修改 你跑的不是昨天的版本
依赖链不可控 不知道装了什么东西,卸载不干净
冗余文件堆积 /usr/local/etc/xray/ 下一堆 geoip.dat、geosite.dat,实际用不上
二进制来源不明 非官方构建,无法验证签名

从源码编译三个好处:

  1. 二进制可控 — 你编译的 xray 只有主程序,没有路由规则文件、没有预设模板,总共三个文件跑起来
  2. 版本锁定 — 编译时指定 commit hash,不会自动更新,需要升级时重新编译
  3. 编译参数优化-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 主线最新(编译时指定)
服务器选型建议
VLESS + REALITY 的性能瓶颈在服务端 CPU(TLS 加密)。搬瓦工 DC9 CN2 GIA 的 2C 节点对 500Mbps 以下的需求足够。如果需要更高吞吐,搬瓦工限量套餐汇总页 列出了当前可用的所有方案。备选 RackNerd 高性价比方案 适合预算敏感场景。

4. 第一步:安装基础依赖

sudo apt update -y && sudo apt upgrade -y
sudo apt install git vim curl -y

5. 第二步:安装 Go 1.26.5

golang official latest release download

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/amd64
ARM 架构
Oracle Cloud ARM 机器或树莓派用户用 go1.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"
    }
  ]
}
target 站点的选择

destserverNames 填入的是伪装目标——外部看到的 TLS 连接域名。选择标准:

  1. 中国大陆未被墙、直连可达
  2. 支持 TLS 1.3 + X25519 密钥交换(REALITY 的硬性要求)
  3. 流量大、访问人数多(你的连接混在正常流量中)

www.bing.comwww.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.target
sudo systemctl daemon-reload
sudo systemctl enable xray --now
sudo systemctl status xray --no-pager

若启动失败,查看日志定位:

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

10. 防火墙放行

只需要放行一个端口(你配置的 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. 推荐阅读