Files
XTLS_Xray-docs-next/docs/document/level-0/ch07-xray-server.md
T

481 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 【第 7 章】Xray 服务器篇
## 7.1 博观而约取,厚积而薄发
本文撰写过程中,大佬开玩笑的吐槽到:你这教程,居然连载了 6 章都还没到 Xray,不知道的还以为你是“手把手教你建网站”教程呢。(我竟无法反驳.jpg!)
其实这样的结构是我多番思考之后的决定,毕竟只有打好基础,才能在后面事半功倍快速反超。我在群里看到许多新人连`nano`都无法正确使用,也不会用`WinSCP`,远程手写编辑出来的`config.json`自然错误百出,连查错也变得举步维艰。
::: warning
经过了前 6 章的准备,各位已经跟我一起翻越了 Linux 基本操作、VPS 远程管理、网页搭建、域名管理、证书申请等等几座大山。是不是回头看看,觉得其实非常简单呢?现在我们有了如此扎实的准备,接下来安装和配置 Xray
时会有一种【水到渠成】的轻快感觉。
:::
后面要做的事情非常简单:
1. 安装
2. 配置(如安装 TLS 证书、`config.json`)
3. 运行
4. 优化(如更新内核、开启`bbr`、网站`http`访问自动跳转`https`等)
## 7.2 安装 Xray
首先,Xray 的官方载体,就是 [xray-core](https://github.com/XTLS/Xray-core) 开源项目(基于 `MPL 2.0`
开源协议)生成的二进制程序。你把这个二进制放在服务器运行,它就是服务器端;你把它下载到本地电脑运行,它就是客户端。主要区别来源于【配置】。
安装时,直接使用官方安装脚本就很简单直接。它提供了多种安装选项,有兴趣的可以去官方的[安装脚本仓库](https://github.com/XTLS/Xray-install)中看看脚本的说明,**本文使用的是【非 root
用户】安装模式**。
写本文时,安装脚本在使用非 root 账户时有一些小 bug,所以我决定正好把这几步分开操作,可以顺便说明一下 Linux 下的删除命令。
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
| :------: | :------: | :------: |
| `cmd-14` | `rm` | 删除命令 |
2. 将安装脚本下载至本地:
```shell
wget https://github.com/XTLS/Xray-install/raw/main/install-release.sh
```
3. 执行安装命令
```shell
sudo bash install-release.sh
```
4. 使用完成之后可以删除该脚本
```shell
rm ~/install-release.sh
```
::: warning
使用 `rm` 命令删除文件的时候,默认其实就是删除现在所在的文件夹下的文件。但是,**我依然写了完整的路径**: `~/install-release.sh`,这是我使用 `rm` 时的一个安全习惯、也是我把安装分成几步之后想强调一下的内容。如果你听过一些“程序员从删库到跑路”之类的段子,大概就知道为什么了。
:::
5. 完整流程演示如下:
![Xray服务器端安装流程演示](./ch07-img01-xray-install.gif)
## 7.3 给 Xray 配置 TLS 证书
虽然我们前面已经申请好了 TLS
证书,但是按照 [`acme.sh`的官方说明](https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E#3-copy%E5%AE%89%E8%A3%85-%E8%AF%81%E4%B9%A6),申请后的证书不建议直接使用。正确的方法是使用 `--install-cert`
命令安装给需要的程序。我们现在就来把证书安装给 `xray-core` 使用。
1. 为了规避非 root 账户的各种潜在的权限困扰,我们在 vpsadmin 账户下建立一个证书文件夹
```shell
mkdir ~/xray_cert
```
2. 使用`acme.sh`的`--install-cert`正确安装(拷贝)证书文件
```shell
acme.sh --install-cert -d 二级域名.你的域名.com --ecc \
--fullchain-file ~/xray_cert/xray.crt \
--key-file ~/xray_cert/xray.key
```
3. `xray.key`文件默认对其他用户不可读,所以需要赋予其可读性权限
```shell
chmod +r ~/xray_cert/xray.key
```
4. 过程比较简单就不放动图了:
![Xray服务器端安装流程演示](./ch07-img02-xray-cert-install.png)
5. `acme.sh` 会每天检查一次并自动更新有效期短于 30 天的证书,Xray 默认会自动热重载证书,无需担心后续证书更新的问题。
## 7.4 配置 Xray
首先,各种配置都可以参考[官方 VLESS 配置示例](https://github.com/XTLS/Xray-examples)。本文会基于官方示例,配置一个最精简的方式:【单 `VLESS` 协议入站 + `80`
端口回落】,满足大多数场景的最大速度及必要安全。
1. 生成一个合法的 `UUID` 并保存备用(`UUID`可以简单粗暴的理解为像指纹一样几乎不会重复的 ID)
```shell
xray uuid
```
2. 建立日志文件及文件夹备用
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:|
| `cmd-15` | `touch` | 建立空白文件 |
2. 在`vpsadmin`的文件夹内建立一个【日志专用文件夹】
```shell
mkdir ~/xray_log
```
3. 生成所需的两个日志文件(访问日志、错误日志)
```shell
touch ~/xray_log/access.log && touch ~/xray_log/error.log
```
::: warning
这个位置不是`Xray`标准的日志文件位置,放在这里是避免权限问题对新人的操作带来困扰。当你熟悉之后,建议回归默认位置: `/var/log/xray/access.log`
和 `/var/log/xray/error.log` 。
:::
4. 因为 Xray 默认是 nobody 用户使用,所以我们需要让其他用户也有“写”的权限(`*.log` 就是所有文件后缀是`log`的文件,此时`CLI`界面的效率优势就逐渐出现了)
```shell
chmod a+w ~/xray_log/*.log
```
3. 使用`nano`创建`Xray`的配置文件
```shell
sudo nano /usr/local/etc/xray/config.json
```
4. 将下面的文件全部复制进去,并将之前生成的`UUID`填入第 61 行 `"id": "",` 之中。(填好之后的样子是 `"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid"`
),本文的这个配置文件中增加了我的各种啰嗦注解,以方便你理解每一个配置模块的功能是什么。
```json
// REFERENCE:
// https://github.com/XTLS/Xray-examples
// https://xtls.github.io/config/
// 常用的 config 文件,不论服务器端还是客户端,都有 5 个部分。外加小小白解读:
// ┌─ 1*log 日志设置 - 日志写什么,写哪里(出错时有据可查)
// ├─ 2_dns DNS-设置 - DNS 怎么查(防 DNS 污染、防偷窥、避免国内外站匹配到国外服务器等)
// ├─ 3_routing 分流设置 - 流量怎么分类处理(是否过滤广告、是否国内外分流)
// ├─ 4_inbounds 入站设置 - 什么流量可以流入 Xray
// └─ 5_outbounds 出站设置 - 流出 Xray 的流量往哪里去
{
// 1\_日志设置
"log": {
"loglevel": "warning", // 内容从少到多: "none", "error", "warning", "info", "debug"
"access": "/home/vpsadmin/xray_log/access.log", // 访问记录
"error": "/home/vpsadmin/xray_log/error.log" // 错误记录
},
// 2_DNS 设置
"dns": {
"servers": [
"https+local://1.1.1.1/dns-query", // 首选 1.1.1.1 的 DoH 查询,牺牲速度但可防止 ISP 偷窥
"localhost"
]
},
// 3*分流设置
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
// 3.1 防止服务器本地流转问题:如内网被攻击或滥用、错误的本地回环等
{
"ip": [
"geoip:private" // 分流条件:geoip 文件内,名为"private"的规则(本地)
],
"outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
},
{
// 3.2 防止服务器直连国内
"ip": ["geoip:cn"],
"outboundTag": "block"
},
// 3.3 屏蔽广告
{
"domain": [
"geosite:category-ads-all" // 分流条件:geosite 文件内,名为"category-ads-all"的规则(各种广告域名)
],
"outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
}
]
},
// 4*入站设置
// 4.1 这里只写了一个最简单的 vless+xtls 的入站,因为这是 Xray 最强大的模式。如有其他需要,请根据模版自行添加。
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"users": [
{
"id": "", // 填写你的 UUID
"flow": "xtls-rprx-vision",
"level": 0,
"email": "vpsadmin@yourdomain.com"
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 80 // 默认回落到防探测的代理
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"alpn": "http/1.1",
"certificates": [
{
"certificateFile": "/home/vpsadmin/xray_cert/xray.crt",
"keyFile": "/home/vpsadmin/xray_cert/xray.key"
}
]
}
}
}
],
// 5*出站设置
"outbounds": [
// 5.1 第一个出站是默认规则,freedom 就是对外直连(vps 已经是外网,所以直连)
{
"tag": "direct",
"protocol": "freedom"
},
// 5.2 屏蔽规则,blackhole 协议就是把流量导入到黑洞里(屏蔽)
{
"tag": "block",
"protocol": "blackhole"
}
]
}
```
5) 完整流程演示如下:
![创建日志文件及`config.json`配置文件](./ch07-img04-xray-log-and-config.gif)
## 7.5 启动 Xray 服务!!(并查看服务状态)
如果你是跟随本文一步步设置过来,其实就已经避开了最常见**日志文件权限不足**、**证书文件权限不足** 这两个大坑。那么现在运行`Xray`自然应该无比顺利。
1. 输入下面的命令,享受启动`Xray`的历史性时刻吧!!!
```shell
sudo systemctl start xray
```
2. 仅仅`start`我们并不能确定是否成功的开启了 Xray 的服务,要确定它的状态,就要用到下面的命令。
```shell
sudo systemctl status xray
```
看到那个绿色的、令人愉悦的 `active (running)` 了吗?它就是说 `Xray` 已经在正确的运行了
3. 完整流程演示如下:
![启动并查看Xray运行状态](./ch07-img05-xray-start-and-status.gif)
## 7.6 回顾 `systemd` 进行基本的服务管理
到现在为止,我们已经使用过了`systemctl`相关的`start`, `status`, `reload` 等命令,这些都是基于`systemd`管理模块对 Linux
系统中各种服务进行管理的通用命令。现在正好熟悉一下相关的其他几个命令。
1. 若你需要暂时关闭 `Xray` 的服务,那就用`stop`命令
```shell
sudo systemctl stop xray
```
2. 若你需要重启`Xray`的服务,那就用`restart`命令
```shell
sudo systemctl restart xray
```
3. 若你需要禁用`Xray`的服务(电脑重启后禁止 Xray 自动运行),那就用`disable`命令
```shell
sudo systemctl disable xray
```
4. 若你需要启用`Xray`的服务(电脑重启后确保 Xray 自动运行),那就用`enable`命令
```shell
sudo systemctl enable xray
```
## 7.7 服务器优化之一:开启 BBR
1. 传说中的`BBR`
我相信,你在搜索各种科学上网技术的时候,肯定不止一次的听过`bbr`这个东西,在各种博客添油加醋之下,让人觉得它神乎其神。更有`bbrplus`, `bbr2`, `魔改bbr` 等一大堆衍生品。仿佛神油一般,用了就能野鸡线路变专线。
那么,这东西究竟是什么?它有没有用?又该用哪一个版本呢?
2. 实际的`BBR`
**BBR** = **B**ottleneck **B**andwidth and **R**ound-trip propagation time,是一种 TCP 的**拥塞控制算法**。简单粗暴的理解就是**数据流量的交通管理**
:当公路不再塞车的时候,每辆车自然就能保持较快的车速了。
那么它有没有用呢?一般而言,`有BBR` 和 `没有BBR` 会有可以感知的差别(速度、稳定性、延迟方面都会有一些改善),所以 **【非常建议开启 `BBR`】**。
但开启之后,`BBR` 在 `4.x` 和 `5.x` 之间的差异往往比较微妙、见仁见智,造成体验差别的决定性因素仍然是线路质量。所以 **【不必纠结版本、不必盲目追新、跟随你的发行版更新内核即可】**
3. `bbrplus`, `bbr2`, `魔改bbr` 和其他各种听起来就酷炫的版本是不是更好?
一句话:**不是!不要用这些!这些都为了吸引眼球乱起的名字!**
BBR 是内核自带跟随内核发布并更新的,而这些名字看起来很酷炫的东西,说白了就是作者自行调整 `BBR` 参数以及使用这些参数构建出的内核,这些脚本也仅仅就是下载安装这些魔改内核。
内核的稳定是一台服务器稳定运行的基石。**【BBR 魔改版带来的细微性能差异绝对不值得更换不稳定的内核。】** 请选择你所在的 Linux 发行版所支持的最新内核,这样可以最大限度的保持服务器的长期稳定和兼容。
::: warning
所谓魔改`bbr`的【领先】是有非常强的时效性的。比如很多 `bbrplus` 脚本,因为几年来都没有更新,到现在还会把你的内核换成很老的版本,导致你的系统失去安全性甚至无法启动。
:::
4. `fq`, `fq_codel`, `fq_pie`, `cake`和其他算法哪个好?
一句话:**看不懂的话,请保持`fq`,足够、且不会劣化你的线路**
5. 锐速、Finalspeed、LotServer 和其他“加速工具”
一句话:**不要用这些!把他们丢进历史的垃圾桶吧!**
它能解决的也只有丢包率的问题。不太准确的比喻,就是本来你用一辆车送你的货,有时候车半路就坏了(丢包),用了这些以后,你直接派出 3
份一样的货,让三辆车同时送,只要有一辆没坏就能送到。马路上都是你的车,自然就能把别人挤下去。但可想而知,你挤别人的时候,别人也会来挤你,而整个机房的出口道路一共就那么宽,最终势必就变成集体大堵车了。
::: warning 说明
它们的原理不是算法优化、不是提速、大多数是简单粗暴的**多倍发包**。对于【丢包率非常高】的差线路可能有一点作用,但【对丢包率低的好线路没有任何优化作用,反而会成倍的消耗你的流量】,进而造成服务器和你的邻居不必要的压力。
如果你的线路真的丢包率奇高,真正靠谱的解决方案是【换线路】。
:::
6. 啰嗦了这么多,就是因为围绕 `BBR` 忽悠小白的错误概念和坑人脚本实在是太多了。我希望你们现在对 `BBR` 有了相对清晰的理解。接下来,我们就动手开启`BBR` 吧!
7. 添加参数配置文件并指定开启 `BBR`
```shell
sudo nano /etc/sysctl.d/99-bbr.conf
```
8. 把下面的内容添加进去
```
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
```
9. 读取配置,使 `BBR` 设置生效
```shell
sudo sysctl --system
```
10. 确认`BBR`开启
如果你想确认 `BBR` 是否正确开启,可以使用下面的命令:
```shell
sysctl net.ipv4.tcp_congestion_control
```
此时应该返回这样的结果:
```
net.ipv4.tcp_congestion_control = bbr
```
如果你在疑惑这个 `ipv4`,无需在意,只是历史命名遗留,实际上对 `ipv6` 也是生效的。
如果你想确认 `fq` 算法是否正确开启,可以使用下面的命令:
```shell
sysctl net.core.default_qdisc
```
此时应该返回这样的结果:
```
net.core.default_qdisc = fq
```
## 7.8 服务器优化之二:开启 HTTP 自动跳转 HTTPS
1. 之前我们已经搭建了 `80` 端口的 `http` 网页,并以此申请了 TLS 证书。
但如果你尝试过用浏览器访问我们的这个界面,就会发现 `http` 访问并不会像大多数网站一样自动升级为 `https` 访问。换言之,我们现在的设置下,`http(80)` 和 `https(443)`
之间完全是独立的。如果要解决这个问题,就需要做一些修改。
2. 编辑 Nginx 的配置文件
```shell
sudo nano /etc/nginx/nginx.conf
```
3. 在我们设置过的 80 端口 Server 中加入下面的语句,并保存退出(可同时删除`root`和`index`两行)
```
return 301 https://$http_host$request_uri;
```
4. 在与 `80` 端口同级的位置增加一个本地端口监听来提供网页展示。本文以 `8080` 端口做演示。(可以是任意端口)
```
server {
listen 127.0.0.1:8080;
root /home/vpsadmin/www/webpage;
index index.html;
add_header Strict-Transport-Security "max-age=63072000" always;
}
```
5. 重启 Nginx 服务
```shell
sudo systemctl restart nginx
```
6. 修改 Xray 的回落设置,将回落从 `80` 端口改为 `8080` 端口。(找到 `"dest": 80`, 并改成 `"dest": 8080`)
```shell
sudo nano /usr/local/etc/xray/config.json
```
7. 重启 `Xray` 服务,即完成了设置
```shell
sudo systemctl restart xray
```
8. 完整流程演示如下:
![http自动跳转https](./ch07-img07-http-to-https.gif)
9. 当你输入 `http://a-name.yourdomain.com`的时候,它应该已经会自动跳转 https 了
![http自动跳转https生效](./ch07-img08-http-to-https-check.png)
## 7.9 服务器优化之三:更丰富的回落
如果你需要更丰富的回落功能,可以参考 [《回落 (fallbacks) 功能简析》](../level-1/fallbacks-lv1.md)
## 7.10 你的进度
恭喜!!到这一步,你已经拥有了可以正常科学上网的服务器、同时也有了可以防止主动探测攻击的伪装网站。接下来,只要给你的客户端装上合适的软件,就可以享受顺畅的网络了!
> ⬛⬛⬛⬛⬛⬛⬛⬜ 87.5%
## 7.11 重要勘误
1. 初版中`Xray`配置文件`config.json`文件夹位置错误。若你已经根据之前的位置进行了操作,`Xray`会无法正确启动。故勘误说明于此,请自查,造成不便十分抱歉!
- 正确位置:`/usr/local/etc/xray/config.json`
- 错误位置:`/usr/local/etc/config.json`
受影响章节:
- 7.4 配置`Xray` - 3. 使用`nano`创建`Xray`的配置文件
- 7.8 服务器优化之二 - 6. 修改`Xray`的回落设置
2. 初版中修改`Nginx`配置文件`nginx.conf`时内容错误(网页文件夹位置错误),若你已经根据之前的位置进行了操作,`Nginx`会无法找到正确的网站。请自查,造成不便十分抱歉!
- 正确文件夹位置:`root /home/vpsadmin/www/webpage;`
- 错误文件夹位置:`root /var/www/website/html`
受影响章节:
- 7.8 服务器优化之二 - 4. 在与 `80` 端口同级的位置增加一个本地端口监听来提供网页展示