🌊 第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锁好。