🌊 第02章 · Xray 安装与配置

安装/配置/服务

Xray 安装与配置

这一章把 Xray 从"零"装起来,写出那份跑通 VLESS + WebSocket 的配置文件,并用 systemd 把它做成开机自启、崩溃自愈的服务。我们直接用本机的真实安装现场做例子——它是 Xray 26.3.27,配置文件在 /usr/local/etc/xray/config.json,监听 127.0.0.1:10086。

如果你只是想快速跑通,可以照抄本章的安装脚本与配置结构,记得把 uuid 和 path 换成你自己的(用命令生成即可)。

第一步:安装 Xray

官方提供了自动安装脚本,它会把二进制放到 /usr/local/bin/xray,配置模板放到 /usr/local/etc/xray/,并生成一个 systemd 服务。

# 方式 A:官方安装脚本(推荐)
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

# 方式 B:确认版本
xray version
# Xray 26.3.27 (Xray, Penetrates Everything.) d2758a0 (go1.26.1 linux/amd64)

# 二进制与配置路径
ls -l /usr/local/bin/xray
# -rwxr-xr-x 1 root root 36577406 Sep  7 21:09 /usr/local/bin/xray

安装脚本默认生成的服务会在 /etc/systemd/system/xray.service。它用 nobody 用户运行,并给了 CAP_NET_ADMIN 与 CAP_NET_BIND_SERVICE 两个能力(后者允许它绑定 443 等低端口,虽然本章里我们绑的是 10086,留着无害)。

第二步:生成身份凭据

装好之后,先准备两把"钥匙":UUID 和 WebSocket 路径。它们随机生成一次,之后写进配置、客户端和 Nginx,三处必须完全一致。

# 生成 UUID(身份口令)
xray uuid
# 72f6b462-da16-41cb-8370-d737f34d1710

# 生成一个隐蔽的 WebSocket 路径(建议带随机后缀,别用 /ws 这种一眼能猜到的)
echo "/ws-$(head -c 16 /dev/urandom | xxd -p | tr -d '\n')"
# /ws-f033eda368eb1b99f9d79a4f

把生成好的两串值存到一个只有自己能看的地方(权限 600),这也是本机的做法:

mkdir -p /root/.deploy
echo "72f6b462-da16-41cb-8370-d737f34d1710"  > /root/.deploy/xray_uuid
echo "/ws-f033eda368eb1b99f9d79a4f"          > /root/.deploy/xray_wspath
chmod 600 /root/.deploy/xray_uuid /root/.deploy/xray_wspath

安全提示:50% 的安全靠这两把钥匙保密。UUID 泄露 = 别人能借用你的通道;ws 路径泄露 = 别人能定位到你的后端。你验证部署时可以把这两个文件重新 cat 出来用,但千万不要截图、贴到群里或提交到代码仓库。

第三步:写配置文件

配置文件就在 /usr/local/etc/xray/config.json。下面是本机正在运行的真实配置,一个极简、干净的"VLESS + WS"服务端:

{
  "log": {
    "loglevel": "warning",
    "access": "/var/log/xray/access.log",
    "error": "/var/log/xray/error.log"
  },
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 10086,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "72f6b462-da16-41cb-8370-d737f34d1710",
            "flow": ""
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "ws",
        "security": "none",
        "wsSettings": {
          "path": "/ws-f033eda368eb1b99f9d79a4f",
          "headers": {
            "Host": "bangdream.xyz"
          }
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls", "quic"]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    }
  ]
}

一块一块解释每个字段:

字段 值 含义
log.loglevel warning 只记录警告以上,避免日志刷屏
log.access /var/log/xray/access.log 访问日志(告警级别时才写)
log.error /var/log/xray/error.log 错误日志
inbounds[0].listen 127.0.0.1 只监听本机,不暴露公网——这是关键
inbounds[0].port 10086 本机端口,由外层 Nginx 反代进来
inbounds[0].protocol vless 传输协议
clients[0].id 72f6b462-... 客户端握手用的 UUID
clients[0].flow "" 空 = 不启用额外流控(XTLS 等)
decryption none VLESS 不负责解密(TLS 在 Nginx 层)
network ws 用 WebSocket 传输
security none Xray 层不加密,加密交给 TLS
wsSettings.path /ws-f033eda368eb1b99f9d79a4f 只有请求这个路径才被识别为代理
wsSettings.headers.Host bangdream.xyz 握手时带的 Host 头,用来伪装
sniffing.enabled true 嗅探真实目标域名,方便日志分流
outbounds[0].protocol freedom 出站直连,把流量直接发出去

为什么 listen 必须是 127.0.0.1? 因为本章里 Xray 刻意"藏"在内网地址。若写 0.0.0.0 或直接开 10086 到公网,就等于把代理裸奔在人人都能扫到的地方。正确姿势是:Xray 只听本机,由外层 Nginx 决定谁能进来。

第四步:启动并接管 systemd

官方脚本已生成好 xray.service,确认一下再把服务启动、设为开机自启:

# 查看官方生成的服务内容
systemctl cat xray | grep ExecStart
# ExecStart=/usr/local/bin/xray run -config /usr/local/etc/xray/config.json

# 启动 + 设置开机自启
systemctl enable --now xray

# 查看状态(应看到 active (running))
systemctl status xray --no-pager | head -15

官方服务里带了几个加固参数,看一眼就好:

参数 作用
User=nobody 以无特权用户运行,降低被攻破后的影响面
NoNewPrivileges=true 禁止进程再提升权限
CapabilityBoundingSet=... 只给"绑定低端口 + 网络管理"两个能力
LimitNOFILE=1000000 放大文件描述符上限,扛并发
RuntimeDirectory=xray 运行时目录,保证日志目录存在

第五步:验证

配置写没写对、服务起没起来,用下面几条确认。验证这一步永远不能跳过——配置一个语法错误,Xray 就会默默拒绝启动,客户端连不上还找不到原因。

# 1. 用 xray 自带校验工具做一次语法检查(不改配置,只报错)
xray run -test -config /usr/local/etc/xray/config.json
# 若无输出或输出 "configuration OK",代表语法正确

# 2. 看服务起来没有
systemctl is-active xray
# active

# 3. 确认在监听 10086,而且是 127.0.0.1
ss -tlnup | grep 10086
# tcp LISTEN 0 4096 127.0.0.1:10086 ... users:(("xray",pid=...))

# 4. 看日志有没有报错(日志级别 warning,正常时基本无声)
tail -n 20 /var/log/xray/error.log

连不上时先看这:xray run -test 是第一个排查点。若它报 JSON 解析错误,十有八九是配置里多了个逗号、或者引号成对写错了。JSON 对逗号非常严格,} 后面多一个 , 就会判语法错误。

本章小结

步骤 命令/动作 产出
安装 官方脚本 install-release.sh /usr/local/bin/xray + systemd 服务
生成凭据 xray uuid + 随机路径 UUID 与 ws 路径
写配置 编辑 /usr/local/etc/xray/config.json VLESS+WS 服务端
启动接管 systemctl enable --now xray 开机自启、崩溃自愈
验证 xray run -test + ss + 日志 确认监听与无报错

装好并跑通之后,Xray 只在本机的 127.0.0.1:10086 接客。它还需要一个"外部门卫"把用户从公网 443 引进来——这就是第 3 章 Nginx 反向代理要做的事。

安全提示(再强调):配置里的 UUID 和 path 都贴在本章示例里了,这是教学用真实值。你部署到自己的机器时务必换成自己生成的(xray uuid),并把 /root/.deploy/ 下的两个钥匙文件用 chmod 600 锁好。