[arguments]
生成 UUID。
使用方法:
+
```
xray uuid
```
::: tip
当`-config`没有指定时,Xray 将先后尝试从以下路径加载`config.json`:
+
- 工作目录(Working Directory)
- [环境变量](../config/features/env.md#资源文件路径)中`Xray.location.asset`所指定的路径
-:::
-
+ :::
diff --git a/docs/document/config.md b/docs/document/config.md
index 9e35207..222f0d7 100644
--- a/docs/document/config.md
+++ b/docs/document/config.md
@@ -90,11 +90,10 @@
## 运行
-
- 在 Windows 和 macOS 中,配置文件通常是 Xray 同目录下的 `config.json` 文件。
- - 直接运行 `Xray` 或 `Xray.exe` 即可。
+ - 直接运行 `Xray` 或 `Xray.exe` 即可。
- 在 Linux 中,配置文件通常位于 `/etc/xray/` 或 `/usr/local/etc/xray/` 目录下。
- - 运行 `xray run -c /etc/xray/config.json`
- - 或使用 systemd 等工具将 Xray 作为服务在后台运行。
+ - 运行 `xray run -c /etc/xray/config.json`
+ - 或使用 systemd 等工具将 Xray 作为服务在后台运行。
更多详细的说明可以参考 [配置文档](../config/) 和 [使用心得](../documents/)。
diff --git a/docs/document/install.md b/docs/document/install.md
index 2257741..380cf54 100644
--- a/docs/document/install.md
+++ b/docs/document/install.md
@@ -2,7 +2,6 @@
## 平台支持
-
Xray 在以下平台中可用:
- Windows 7 及之后版本(x86 / amd64 / arm32);
@@ -15,14 +14,12 @@ Xray 在以下平台中可用:
## 下载 Xray
-
预编译的二进制 ZIP 格式压缩包可在 [Github Releases](https://github.com/xtls/Xray-core/releases) 中找到。
下载对应平台的压缩包,解压后即可使用。
## 验证安装包
-
Xray 提供两种验证方式:
- ZIP 压缩包的 SHA1 / SHA256 摘要
@@ -44,10 +41,12 @@ Xray 提供两种验证方式:
### 安装脚本
- Linux Script
+
- [Xray-install](https://github.com/XTLS/Xray-install)
- [Xray-script](https://github.com/kirin10000/Xray-script)
- One Click
+
- [ProxySU](https://github.com/proxysu/ProxySU)
- [Xray-agent](https://github.com/mack-a/Xray-agent)
@@ -55,10 +54,8 @@ Xray 提供两种验证方式:
- [Xray4Magisk](https://github.com/CerteKim/Xray4Magisk)
- [Xray_For_Magisk](https://github.com/E7KMbb/Xray_For_Magisk)
-
### Linux 发行版包管理器
-
Linux 发行版 Xray 包(可通过发行版相应的包管理器安装):
- Debian
@@ -73,7 +70,6 @@ Linux 发行版 Xray 包(可通过发行版相应的包管理器安装):
### Docker image 的文件结构
-
- `/etc/xray/config.json`:配置文件
- `/usr/bin/xray`:Xray 主程序
- `/usr/local/share/xray/geoip.dat`:IP 数据文件
diff --git a/docs/document/level-0/README.md b/docs/document/level-0/README.md
index e4d097f..e5bce1c 100644
--- a/docs/document/level-0/README.md
+++ b/docs/document/level-0/README.md
@@ -6,21 +6,20 @@
Made with ❤️ by [@ricuhkaen](https://github.com/ricuhkaen)
:::
-[【第1章】 前言罗嗦篇](./ch01-preface.md) - 机场还是自建?这是个问题
+[【第 1 章】 前言罗嗦篇](./ch01-preface.md) - 机场还是自建?这是个问题
-[【第2章】 原料准备篇](./ch02-preparation.md) - 工欲善其事,必先利其器
+[【第 2 章】 原料准备篇](./ch02-preparation.md) - 工欲善其事,必先利其器
-[【第3章】 远程登录篇](./ch03-ssh.md) - 一桥飞架南北,天堑变通途
+[【第 3 章】 远程登录篇](./ch03-ssh.md) - 一桥飞架南北,天堑变通途
-[【第4章】 安全防护篇](./ch04-security.md) - 安全不注意,亲人两行泪
+[【第 4 章】 安全防护篇](./ch04-security.md) - 安全不注意,亲人两行泪
-[【第5章】 网站建设篇](./ch05-webpage.md) - 秀出你的美
+[【第 5 章】 网站建设篇](./ch05-webpage.md) - 秀出你的美
-[【第6章】 证书管理篇](./ch06-certificates.md) - 领证的才是合法的
+[【第 6 章】 证书管理篇](./ch06-certificates.md) - 领证的才是合法的
-[【第7章】 Xray服务器篇](./ch07-xray-server.md) - 终于等到你
+[【第 7 章】 Xray 服务器篇](./ch07-xray-server.md) - 终于等到你
-[【第8章】 Xray客户端篇](./ch08-xray-clients.md) - 新的开始
-
-[【第9章】 附录](./ch09-appendix.md) - 考点都在这里
+[【第 8 章】 Xray 客户端篇](./ch08-xray-clients.md) - 新的开始
+[【第 9 章】 附录](./ch09-appendix.md) - 考点都在这里
diff --git a/docs/document/level-0/ch01-preface.md b/docs/document/level-0/ch01-preface.md
index 5301498..bf5b132 100644
--- a/docs/document/level-0/ch01-preface.md
+++ b/docs/document/level-0/ch01-preface.md
@@ -1,15 +1,13 @@
-# 【第1章】 小小白白话文
+# 【第 1 章】 小小白白话文
## 1.1 这篇文档是写给谁的?
-一句话:写给 **①零基础** **②希望学习自建VPS** 的新人。
+一句话:写给 **① 零基础** **② 希望学习自建 VPS** 的新人。
## 1.2 这篇文档不是写给谁的?
包括但不限于:各路大神大能、懒得自己折腾的小白、已经会折腾的高手、确定要用机场的土豪、确定要用一键脚本的逍遥派...... 总之只要有技术基础、或不愿不想自建的同学,您直接关闭本文即可,因为这篇文章大概是入不了您的法眼的,更可能会让您生一肚子闲气,那多划不来。
-
-
## 1.3 郑重声明及其他声明
郑重声明:
@@ -18,22 +16,21 @@
免责声明:
-本文内容请您自行判断是否可信可靠可用,若您根据本文内容建立和使用VPS服务器时出了任何问题和不良结果,鄙人概不负责。
+本文内容请您自行判断是否可信可靠可用,若您根据本文内容建立和使用 VPS 服务器时出了任何问题和不良结果,鄙人概不负责。
啰嗦声明:
基于本文【零基础用户】的目标受众,许多内容会尽力详尽说明,所以语言偏啰嗦,请做好心理准备。
-
## 1.4 为什么自建是个难题?
要回答这个问题,就需要稍微多说一点背景信息了。
一、科学上网这件事
-科学上网这件事情,说来已经发展了近二十年(震惊!!!.jpg)。最初,自己稍微动动手即可(改改host、连一下ssh)、后来需要找一个网页代理,再后来需要写一个私有协议(比如Shadowsocks)等等。
-
-随着GFW技术这十几年来不断的迭代升级,若要完成【自己动手科学上网】这个目标,需要做的事情已经包括但不限于:
+科学上网这件事情,说来已经发展了近二十年(震惊!!!.jpg)。最初,自己稍微动动手即可(改改 host、连一下 ssh)、后来需要找一个网页代理,再后来需要写一个私有协议(比如 Shadowsocks)等等。
+
+随着 GFW 技术这十几年来不断的迭代升级,若要完成【自己动手科学上网】这个目标,需要做的事情已经包括但不限于:
1. 了解Linux系统基本命令
2. 了解网络传输协议
@@ -41,13 +38,13 @@
4. 有技术和经济能力完成域名购买及管理
5. 有技术能力完成TLS证书申请 等等。
-这就让【自建VPS科学上网】这个曾经简单的行为逐渐变成了令新人望而生畏的挑战。
+这就让【自建 VPS 科学上网】这个曾经简单的行为逐渐变成了令新人望而生畏的挑战。
二、零基础用户的无奈
零基础的非技术用户,如果完成上面这一连串的操作,势必要学习大量的知识,但稍微搜索之后,新人只怕会更加迷茫:大量的信息散布在互联网的各个角落:博客、问答网站、群组、论坛、GitHub、Telegram、YouTube 等等等等)。这些信息纷乱复杂、水平良莠不齐、甚至可能互相矛盾。基本上就是不把新人彻底弄晕誓不罢休。
-面对这些杂乱无章的信息,新人突然就从【信息匮乏】变成了【信息过剩】。若是几番连蒙带猜的折腾以失败告终(大概率如此)的话,他的积极性势必大受挫折。在这个过程中,若他又恰好去了一些不太友好的地方去求助,恐怕还要雪上加霜的被嘲讽一番:“这么菜,用机场不就行了,瞎折腾什么啊!”、“先去学会Linux再回来问吧”。
+面对这些杂乱无章的信息,新人突然就从【信息匮乏】变成了【信息过剩】。若是几番连蒙带猜的折腾以失败告终(大概率如此)的话,他的积极性势必大受挫折。在这个过程中,若他又恰好去了一些不太友好的地方去求助,恐怕还要雪上加霜的被嘲讽一番:“这么菜,用机场不就行了,瞎折腾什么啊!”、“先去学会 Linux 再回来问吧”。
这时候,大概也只有一声“呵呵”可以表达心情了。
@@ -59,10 +56,10 @@
一、“机场“的优势
-所谓“机场”,就是“线路提供商”。他负责完成1.4提到的那一串技术操作和管理,用户则付费获得使用权。所以,它的优点至少有:
+所谓“机场”,就是“线路提供商”。他负责完成 1.4 提到的那一串技术操作和管理,用户则付费获得使用权。所以,它的优点至少有:
1. **用户操作简单**:扫码操作、一键添加规则等
-2. **线路选择多**:可解锁不同国家、地区的网络服务;比如iplc等专线服务、游戏加速服务等
+2. **线路选择多**:可解锁不同国家、地区的网络服务;比如 iplc 等专线服务、游戏加速服务等
3. **接入节点多**:所以抵抗节点封锁的能力强一些,封了一个就换下一个
二、“机场”的风险
@@ -71,23 +68,20 @@
1. **“机场”可完全获得用户信息**:用户在网上的所有痕迹,都【必然】经过且【非常可能】长期存储在其服务器上,这些记录无法受到任何具备法律效力的用户隐私协议的约束(**窥视、记录你的一举一动**)
2. **“机场”缺乏市场管理**:不可避免存在着以欺诈为目标的恶意商家(**主动跑路**)
-3. **“机场”面临监管压力**:大机场相对有保障的同时,也无法避免树大招风。2020年间,已经有几个大机场停运、跑路的事件发生,用户的正常使用受到严重干扰(**被动跑路**)
+3. **“机场”面临监管压力**:大机场相对有保障的同时,也无法避免树大招风。2020 年间,已经有几个大机场停运、跑路的事件发生,用户的正常使用受到严重干扰(**被动跑路**)
4. **“机场”技术水平难以确定**:线路质量良莠不齐,挂羊头卖狗肉的现象屡见不鲜(**速度慢、掉线多、连不上**)
-
-
## 1.6 那么你到底要不要自建呢?
现在,你已经看到了机场的优势和风险,要用什么,就请各位充分思考并自行决定。毕竟,最适合你的方案才是最好的方案。
-
1. 如果决定使用机场的话,现在,你可以关闭本文了。
2. 如果你决定自建,那就请继续阅读后面的章节吧!!
-总之,本文的目标就是成为零基础用户的知识起点,提供对每一步充分的讲解和演示,清清楚楚(甚至**婆婆妈妈、絮絮叨叨、啰啰嗦嗦**)的协助新人完成【**从输入第一条命令开始,完成VPS服务器部署,并成功在客户端完成科学上网**】的全程。并在这个过程中帮助新人逐步接触和熟悉Linux的基础操作,为之后的进一步自学打下基础。
+总之,本文的目标就是成为零基础用户的知识起点,提供对每一步充分的讲解和演示,清清楚楚(甚至**婆婆妈妈、絮絮叨叨、啰啰嗦嗦**)的协助新人完成【**从输入第一条命令开始,完成 VPS 服务器部署,并成功在客户端完成科学上网**】的全程。并在这个过程中帮助新人逐步接触和熟悉 Linux 的基础操作,为之后的进一步自学打下基础。
## 1.7 题外啰嗦几句
@@ -95,8 +89,7 @@
2. 衷心希望大家获得更顺畅的网络后,可以获取更新鲜的知识、更丰富的娱乐、接触更美好的世界、结交更多志同道合的朋友,但不要成为任何有不可告人目的之人的替罪羊。
-3. 你的互联网身份依然是你的身份,绝对的匿名化是极为困难的,所以请务必遵守你个人所在地区和IP所在地区的相关法律法规。无论何时,自我保护都是最基本的底线。
-
+3. 你的互联网身份依然是你的身份,绝对的匿名化是极为困难的,所以请务必遵守你个人所在地区和 IP 所在地区的相关法律法规。无论何时,自我保护都是最基本的底线。
## 1.8 你的进度
diff --git a/docs/document/level-0/ch02-preparation.md b/docs/document/level-0/ch02-preparation.md
index af9be96..6895802 100644
--- a/docs/document/level-0/ch02-preparation.md
+++ b/docs/document/level-0/ch02-preparation.md
@@ -1,54 +1,52 @@
-# 【第2章】原料准备篇
+# 【第 2 章】原料准备篇
这一章比较特殊,因为涉及到金钱交易行为,本文基于项目的中立立场,不做具体的推荐。我能做的,是告诉你需要准备哪些东西。
-## 2.1 获取一台VPS
+## 2.1 获取一台 VPS
-你需要获取一台健康的、IP没有被墙的VPS,并在管理后台做下面这些基础准备:
-
-1. 在VPS的后台安装 Debian 10 64bit 系统
-2. 小本本记下VPS的IP地址(本文会用 `"100.200.300.400"` 来表示)
-::: tip
-**注意:** 这是一个故意写错的非法IP,请替换成你的真实IP)
-:::
-3. 小本本记下VPS的SSH远程登陆端口(Port)
-4. 小本本记下SSH远程登录的用户名和密码
+你需要获取一台健康的、IP 没有被墙的 VPS,并在管理后台做下面这些基础准备:
-购买VPS是一个比较复杂的事情,建议先去学习一下相关知识,选择适合自己的经济能力和线路需求的即可。另外可以选择薅一些国际大厂的羊毛(比如甲骨文和谷歌提供的永久免费或限时免费的套餐)。总之,务必量力而行。
+1. 在 VPS 的后台安装 Debian 10 64bit 系统
+2. 小本本记下 VPS 的 IP 地址(本文会用 `"100.200.300.400"` 来表示)
+ ::: tip
+ **注意:** 这是一个故意写错的非法 IP,请替换成你的真实 IP)
+ :::
+3. 小本本记下 VPS 的 SSH 远程登陆端口(Port)
+4. 小本本记下 SSH 远程登录的用户名和密码
+
+购买 VPS 是一个比较复杂的事情,建议先去学习一下相关知识,选择适合自己的经济能力和线路需求的即可。另外可以选择薅一些国际大厂的羊毛(比如甲骨文和谷歌提供的永久免费或限时免费的套餐)。总之,务必量力而行。
::: tip
-**说明:** 关于选择 Debian 10 作为操作系统,这里稍微多说一句:不管你在网上听说了什么,不管哪个大神告诉你XXX版的Linux更好、XXX版的Linux更牛,这些Linux的派系之争**跟现在的你半毛钱关系也没有**!使用 Debian 10 足以让你的VPS服务器在安全、稳健运行的同时得到足够的优化(如cloud专用内核、及时的bbr支持等)。等你对Linux熟悉之后,再回头去尝试其他的Linux发行版也不迟
+**说明:** 关于选择 Debian 10 作为操作系统,这里稍微多说一句:不管你在网上听说了什么,不管哪个大神告诉你 XXX 版的 Linux 更好、XXX 版的 Linux 更牛,这些 Linux 的派系之争**跟现在的你半毛钱关系也没有**!使用 Debian 10 足以让你的 VPS 服务器在安全、稳健运行的同时得到足够的优化(如 cloud 专用内核、及时的 bbr 支持等)。等你对 Linux 熟悉之后,再回头去尝试其他的 Linux 发行版也不迟
:::
## 2.2 获取一个心仪的域名
-你需要获取一个域名、并在DNS设置中添加一条A记录,指向你VPS的IP地址
+你需要获取一个域名、并在 DNS 设置中添加一条 A 记录,指向你 VPS 的 IP 地址
1. 请选择靠谱的国际域名服务商。选择一些常见的域名后缀就行,注意不要用 `.cn` 后缀。
-2. 在DNS设置中,添加一条指向你VPS的IP地址的A记录(A记录的名字可以随便起,本文会用 `"a-name"` 来表示。完整的域名则会用 `"二级域名.你的域名.com"` 或者 `"a-name.yourdomain.com"` 来表示)。效果如下图:
-
+2. 在 DNS 设置中,添加一条指向你 VPS 的 IP 地址的 A 记录(A 记录的名字可以随便起,本文会用 `"a-name"` 来表示。完整的域名则会用 `"二级域名.你的域名.com"` 或者 `"a-name.yourdomain.com"` 来表示)。效果如下图:
+
::: tip
**注意:** 这**不是**一个真实可用的网址,请替换成你的真实网址
:::
-
-
## 2.3 你本地电脑上需要安装的软件
-1. SSH远程登录工具
- - Windows: [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
- - macOS/Linux: Terminal
+1. SSH 远程登录工具
+
+ - Windows: [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
+ - macOS/Linux: Terminal
2. 远程文件拷贝工具
- - Windows: [WinSCP](https://winscp.net/eng/index.php)
- - macOS/Linux: Terminal
-
-3. 靠谱的文本编辑器
- - Windows/macOS/Linux: [VSCode](https://code.visualstudio.com)
+ - Windows: [WinSCP](https://winscp.net/eng/index.php)
+ - macOS/Linux: Terminal
+3. 靠谱的文本编辑器
+ - Windows/macOS/Linux: [VSCode](https://code.visualstudio.com)
## 2.4 你的进度
diff --git a/docs/document/level-0/ch03-ssh.md b/docs/document/level-0/ch03-ssh.md
index b60e5c7..e85b2c1 100644
--- a/docs/document/level-0/ch03-ssh.md
+++ b/docs/document/level-0/ch03-ssh.md
@@ -1,89 +1,85 @@
-# 【第3章】远程登录篇
+# 【第 3 章】远程登录篇
-## 3.1 远程登录VPS (PuTTY)
+## 3.1 远程登录 VPS (PuTTY)
-首先,鉴于零基础人群中Windows的用户基数最大,所以本文以Windows为例进行展示。
+首先,鉴于零基础人群中 Windows 的用户基数最大,所以本文以 Windows 为例进行展示。
-其次,虽然Windows 10之后的PowerShell和WSL也可以达到很好的SSH操作体验。但是因为并非所有版本的Windows都有最新的组件,故本文还是以老牌的PuTTY为例,进行SSH远程登录的操作详解。(使用其他工具的话、在SSH登陆之后的操作都是一样的)
+其次,虽然 Windows 10 之后的 PowerShell 和 WSL 也可以达到很好的 SSH 操作体验。但是因为并非所有版本的 Windows 都有最新的组件,故本文还是以老牌的 PuTTY 为例,进行 SSH 远程登录的操作详解。(使用其他工具的话、在 SSH 登陆之后的操作都是一样的)
下面就跟我一步步操作吧。
-1. 进入PuTTY的[官网](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html),选择适合你操作系统的版本下载。(本文以64位版本为例)
+1. 进入 PuTTY 的[官网](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html),选择适合你操作系统的版本下载。(本文以 64 位版本为例)
-
+
-2. 安装运行后,将会看到PuTTY的主界面。现在请拿出你上一章记东西的[小本本](../ch02-preparation/#21-%E8%8E%B7%E5%8F%96%E4%B8%80%E5%8F%B0vps),在下图的对应位置填入你VPS的**IP地址(VPS IP)**和**端口(VPS PORT)**。为了方便以后使用时不用重复输入,我们可以保存会话 (Saved Sessions),未来使用时只要按Load即可一键载入设置。
+2. 安装运行后,将会看到 PuTTY 的主界面。现在请拿出你上一章记东西的[小本本](../ch02-preparation/#21-%E8%8E%B7%E5%8F%96%E4%B8%80%E5%8F%B0vps),在下图的对应位置填入你 VPS 的**IP 地址(VPS IP)**和**端口(VPS PORT)**。为了方便以后使用时不用重复输入,我们可以保存会话 (Saved Sessions),未来使用时只要按 Load 即可一键载入设置。
-
+
-3. 我建议将 `Connection` 中的 `keepalive` 设置为 `60` 秒,防止你一段时间没有操作之后SSH自动断线。另外务必再次保存设置。
+3. 我建议将 `Connection` 中的 `keepalive` 设置为 `60` 秒,防止你一段时间没有操作之后 SSH 自动断线。另外务必再次保存设置。
-
+
::: warning 注意
-对PuTTY的任何设置更新都要再次手动保存Session,不然关闭后就会丢失
-:::
+对 PuTTY 的任何设置更新都要再次手动保存 Session,不然关闭后就会丢失
+:::
-4. 点击 Open 就会进入SSH连接窗口,对应下图输入用户名与密码,与你的VPS远程主机建立连接。(本文假设默认用户名是 `root`,另外,在Linux系统输入密码的时候,是不会出现 `******` 这种提示符的,这样可以避免密码长度泄漏,不是你的键盘坏掉了哦!)
+4. 点击 Open 就会进入 SSH 连接窗口,对应下图输入用户名与密码,与你的 VPS 远程主机建立连接。(本文假设默认用户名是 `root`,另外,在 Linux 系统输入密码的时候,是不会出现 `******` 这种提示符的,这样可以避免密码长度泄漏,不是你的键盘坏掉了哦!)
-
+
-
-## 3.2 成功登录SSH!初识命令行界面!
+## 3.2 成功登录 SSH!初识命令行界面!
1. 如果你的信息都填写正确,你将会看到类似下图的界面,说明已登录成功:
-
+
- 这个界面,就等于远程服务器的【桌面】,但它没有你熟悉的图标和鼠标,没有绚丽的色彩,有的只是简单文字,这就是【**命令行界面**】- `Command Line Interface`,或者缩写为 `CLI`。
-
- 接下来的所有操作,都需要你像电影里的黑客一样,在这个命令行界面中完成。也许你会觉得陌生,但请相信我,使用命令行既不可怕,也不神秘。说到底,它只不过是把你习惯的鼠标操作变成了文字指令而已,**你说一句,它做一句**。
+ 这个界面,就等于远程服务器的【桌面】,但它没有你熟悉的图标和鼠标,没有绚丽的色彩,有的只是简单文字,这就是【**命令行界面**】- `Command Line Interface`,或者缩写为 `CLI`。
-2. 现在,你可以稍微观察并熟悉一下命令行环境,这个界面其实已经告诉了你一些有用的信息了,比如系统内核版本(比如图内是 `4.19.37-5`)、上次登录时间及IP等。当然根据VPS的不同,你看到的界面可能会略有不同。
+ 接下来的所有操作,都需要你像电影里的黑客一样,在这个命令行界面中完成。也许你会觉得陌生,但请相信我,使用命令行既不可怕,也不神秘。说到底,它只不过是把你习惯的鼠标操作变成了文字指令而已,**你说一句,它做一句**。
+
+2. 现在,你可以稍微观察并熟悉一下命令行环境,这个界面其实已经告诉了你一些有用的信息了,比如系统内核版本(比如图内是 `4.19.37-5`)、上次登录时间及 IP 等。当然根据 VPS 的不同,你看到的界面可能会略有不同。
3. 请注意命令行最下面一行,闪动的光标左边,有一串字符。图中显示的是`root@vps-server:~#`,这一串要怎么理解呢?很简单:
- - 现在的用户是 `root`
- - `root` 所在的服务器是 `vps-server`
- - `root` 现在所在的文件夹是 `~`
- - `#` 之后是你可以输入命令的地方
+ - 现在的用户是 `root`
+ - `root` 所在的服务器是 `vps-server`
+ - `root` 现在所在的文件夹是 `~`
+ - `#` 之后是你可以输入命令的地方
- 前两个很直观,无需多说。第三个是关于Linux的文件夹系统,现在也不需要过于深入,你只需要知道,"`~`"就是【当前用户的大本营】。第四个,提示符`#`,你也不用管,只需要知道,未来文章中会写一些需要你输入的命令,都会以 "`#`" 或者 "`$`" 开头,提示你**后面**是你输入命令的地方。(所以你复制命令的时候,**只需要复制后面的内容**,不要复制提示符)
+ 前两个很直观,无需多说。第三个是关于 Linux 的文件夹系统,现在也不需要过于深入,你只需要知道,"`~`"就是【当前用户的大本营】。第四个,提示符`#`,你也不用管,只需要知道,未来文章中会写一些需要你输入的命令,都会以 "`#`" 或者 "`$`" 开头,提示你**后面**是你输入命令的地方。(所以你复制命令的时候,**只需要复制后面的内容**,不要复制提示符)
+## 3.3 第一次更新 Linux 的软件!
+1. 正如你的手机,无论安卓还是 iPhone,为了 APP 及时更新(获取安全补丁和新功能),都会时不时从应用商店获得更新信息,并且提示你有多少个 APP 可更新。Linux 系统也有逻辑十分类似的更新机制。所以只要你会更新手机 APP,就能学会更新 Linux 软件!
-## 3.3 第一次更新Linux的软件!
+2. Linux 下,每个 APP 都叫做一个“包” (package)。管理 APP 的程序自然就叫做“包管理器”(Package Manager)。你可以通过它安装、更新、卸载各种软件、甚至更新 Linux 系统本身。Linux 下的包管理器非常强大,此处按下不表,现在你只需要知道 Debian 系统的包管理器叫做 `apt` 即可。接下来,我们就先使用 `apt` 做一次软件的全面更新,让你熟悉它的基本操作。
-1. 正如你的手机,无论安卓还是iPhone,为了APP及时更新(获取安全补丁和新功能),都会时不时从应用商店获得更新信息,并且提示你有多少个APP可更新。Linux系统也有逻辑十分类似的更新机制。所以只要你会更新手机APP,就能学会更新Linux软件!
+3. 小小白白 Linux 基础命令:
-2. Linux下,每个APP都叫做一个“包” (package)。管理APP的程序自然就叫做“包管理器”(Package Manager)。你可以通过它安装、更新、卸载各种软件、甚至更新Linux系统本身。Linux下的包管理器非常强大,此处按下不表,现在你只需要知道Debian系统的包管理器叫做 `apt` 即可。接下来,我们就先使用 `apt` 做一次软件的全面更新,让你熟悉它的基本操作。
-
-3. 小小白白Linux基础命令:
-
- | 编号 | 命令名称 | 命令说明 |
- |:--:|:--:|:--:|
- | `cmd-01` | `apt update` | 查询软件更新 |
- | `cmd-02` | `apt upgrade` | 执行软件更新 |
+ | 编号 | 命令名称 | 命令说明 |
+ | :------: | :-----------: | :----------: |
+ | `cmd-01` | `apt update` | 查询软件更新 |
+ | `cmd-02` | `apt upgrade` | 执行软件更新 |
4. 现在请输入第一条命令,获取更新信息
- ```
- # apt update
- ```
+
+ ```
+ # apt update
+ ```
5. 然后请输入第二条命令,并在询问是否继续安装 `(Y/n)` 时输入 `y` 并回车确认,开始安装
- ```
- # apt upgrade
- ```
+
+ ```
+ # apt upgrade
+ ```
6. 完整流程演示如下:
-
-
-
+
## 3.4 你的进度
-**恭喜你又迈出了坚实的一步!** 现在,你已经可以通过SSH来登录你的远程服务器了!那登录进去之后,除了升级软件之外,应该再做点什么呢?敬请进入下一章一探究竟吧!
-
+**恭喜你又迈出了坚实的一步!** 现在,你已经可以通过 SSH 来登录你的远程服务器了!那登录进去之后,除了升级软件之外,应该再做点什么呢?敬请进入下一章一探究竟吧!
> ⬛⬛⬛⬜⬜⬜⬜⬜ 37.5%
diff --git a/docs/document/level-0/ch04-security.md b/docs/document/level-0/ch04-security.md
index 7c82a17..74afe95 100644
--- a/docs/document/level-0/ch04-security.md
+++ b/docs/document/level-0/ch04-security.md
@@ -1,10 +1,10 @@
-# 【第4章】安全防护篇
+# 【第 4 章】安全防护篇
## 4.1 为什么要做安全防护
-Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网站、APP、服务、甚至线下基础设施都建立在Linux的基石之上,这背后牵涉到巨大的经济利益和商业价值,当然也就就意味着黑灰产有巨大的攻击动力。但是这些服务是如此重要、根本不允许出现重大的安全漏洞。于是无数的运维专业人员都在安全攻防的战场上拼搏努力,这才让大家能享受到基本稳定的现代化数字生活。
+Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的网站、APP、服务、甚至线下基础设施都建立在 Linux 的基石之上,这背后牵涉到巨大的经济利益和商业价值,当然也就就意味着黑灰产有巨大的攻击动力。但是这些服务是如此重要、根本不允许出现重大的安全漏洞。于是无数的运维专业人员都在安全攻防的战场上拼搏努力,这才让大家能享受到基本稳定的现代化数字生活。
-现在,你拥有了一台VPS,并且将会敞开他的数据访问渠道来达到流量转发的目标,那就相当于你已经置身于安全攻防战场的第一线、直面所有风险。但与此同时,新人由于知识和信息的不足,看待安全问题是总是难免两极分化:要么觉得轻如鸿毛和自己没有半点关系,要么觉得重于泰山甚至惶惶不可终日。
+现在,你拥有了一台 VPS,并且将会敞开他的数据访问渠道来达到流量转发的目标,那就相当于你已经置身于安全攻防战场的第一线、直面所有风险。但与此同时,新人由于知识和信息的不足,看待安全问题是总是难免两极分化:要么觉得轻如鸿毛和自己没有半点关系,要么觉得重于泰山甚至惶惶不可终日。
- 对于前者,我的建议是:安全无小事,尽量多查一些安全方面的信息,免得自己真的受了损失才后悔莫及
@@ -12,117 +12,114 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
## 4.2 具体的风险到底是什么
-就像我们在《远程登录篇》配置的一样,任何人只需要知道【IP地址】+【端口】+【用户名】+【密码】这四个要素,就能登录你的VPS服务器。那很显然,这四要素的安全就是我们要防护的底线。我们来逐一分析:
+就像我们在《远程登录篇》配置的一样,任何人只需要知道【IP 地址】+【端口】+【用户名】+【密码】这四个要素,就能登录你的 VPS 服务器。那很显然,这四要素的安全就是我们要防护的底线。我们来逐一分析:
-1. 【IP地址】:恶意脚本会随机尝试和扫描IP段,可以简单认为是公开信息、无法隐藏
+1. 【IP 地址】:恶意脚本会随机尝试和扫描 IP 段,可以简单认为是公开信息、无法隐藏
2. 【端口】:如果使用默认端口,那么【端口 = `22`】
3. 【用户名】:如果使用默认用户,那么【用户名 = `root`】
-4. 【密码】:密码不存在默认值,一定是由VPS后台随机生成或由你自行设置的。也就是说,如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了。这时有几种情况:
+4. 【密码】:密码不存在默认值,一定是由 VPS 后台随机生成或由你自行设置的。也就是说,如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了。这时有几种情况:
- - 如果你用了VPS管理后台随机生成密码,它一般包含随机的十几个大小写混杂的字母和符号,相对比较安全
+ - 如果你用了 VPS 管理后台随机生成密码,它一般包含随机的十几个大小写混杂的字母和符号,相对比较安全
- - 如果你为了好记、把密码改成了类似`123456`这种超弱的密码,破解你的VPS服务器可谓不费吹灰之力
+ - 如果你为了好记、把密码改成了类似`123456`这种超弱的密码,破解你的 VPS 服务器可谓不费吹灰之力
- - 如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说`密码表`,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码)
+ - 如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说`密码表`,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码)
-5. 但你要明白,没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码,全部的攻击尝试都是恶意脚本自动进行的,它会24小时不眠不休的工作。也许每天你酣睡之时,你的服务器都在经受着一轮又一轮的冲击。
+5. 但你要明白,没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码,全部的攻击尝试都是恶意脚本自动进行的,它会 24 小时不眠不休的工作。也许每天你酣睡之时,你的服务器都在经受着一轮又一轮的冲击。
- 一旦密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 `root` 控制权、安装部署它的恶意服务,然后就可以用你的服务器来24小时做各种坏事(比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做BT中继、甚至暗网公众节点等等等等)。如果恶意脚本比较克制,其实可以做到相当的隐蔽性。而新人一般也不会去观察留意VPS的登录记录、进程变化、CPU占用变化、流量变化等指标,你其实就很难发现自己被黑了。直到你的VPS服务商封禁你的账号、或者收到律师函为止。
+ 一旦密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 `root` 控制权、安装部署它的恶意服务,然后就可以用你的服务器来 24 小时做各种坏事(比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做 BT 中继、甚至暗网公众节点等等等等)。如果恶意脚本比较克制,其实可以做到相当的隐蔽性。而新人一般也不会去观察留意 VPS 的登录记录、进程变化、CPU 占用变化、流量变化等指标,你其实就很难发现自己被黑了。直到你的 VPS 服务商封禁你的账号、或者收到律师函为止。
-6. 别忘了,你获得VPS时大概率需要使用真实的支付信息,你登录各种网站、社交平台时也会留下你的IP地址,这些都与你的身份有直接或者间接的关系。于是,**一旦这些坏事发生,它们就不可避免的与你产生了关联。**
+6. 别忘了,你获得 VPS 时大概率需要使用真实的支付信息,你登录各种网站、社交平台时也会留下你的 IP 地址,这些都与你的身份有直接或者间接的关系。于是,**一旦这些坏事发生,它们就不可避免的与你产生了关联。**
## 4.3 我们要做的安全防护有哪些
基于上述分析,我们要做的,自然就是对【端口】、【用户名】、【密码】这三要素进行加强,来降低被攻破的风险:
-1. 【端口】:将SSH远程登录端口修改为【非22端口】 (4.4)
-2. 【用户名】:建立【非root】的新用户、并禁用root用户SSH远程登录 (4.5、4.6)
-3. 【密码】:SSH启用RSA密钥验证登录、同时禁用密码验证登录 (4.7)
+1. 【端口】:将 SSH 远程登录端口修改为【非 22 端口】 (4.4)
+2. 【用户名】:建立【非 root】的新用户、并禁用 root 用户 SSH 远程登录 (4.5、4.6)
+3. 【密码】:SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录 (4.7)
记得按顺序来,别把自己锁在门外了。
-## 4.4 将SSH远程登录端口修改为非22端口
+## 4.4 将 SSH 远程登录端口修改为非 22 端口
-现在,我们来解决【端口 = `22`】的问题。(注意:有些VPS服务商,默认的端口已经是非22端口,那么你可以忽略这一步,当然也可以跟着本文改成别的端口)
+现在,我们来解决【端口 = `22`】的问题。(注意:有些 VPS 服务商,默认的端口已经是非 22 端口,那么你可以忽略这一步,当然也可以跟着本文改成别的端口)
-1. 小小白白Linux基础命令:
+1. 小小白白 Linux 基础命令:
- | 编号 | 命令名称 | 命令说明 |
- |:--:|:--:|:--:|
- | `cmd-03` | `nano` | 文本编辑器 |
- | `cmd-04` | `systemctl restart` | 重启某个服务 |
+ | 编号 | 命令名称 | 命令说明 |
+ | :------: | :-----------------: | :----------: |
+ | `cmd-03` | `nano` | 文本编辑器 |
+ | `cmd-04` | `systemctl restart` | 重启某个服务 |
-2. 小小白白Linux基础配置文件
+2. 小小白白 Linux 基础配置文件
- | 编号 | 配置文件位置 | 文件说明 |
- |:--:|:--:|:--:|
- | `conf-01` | `/etc/ssh/sshd_config` | SSH远程登录程序设置 |
+ | 编号 | 配置文件位置 | 文件说明 |
+ | :-------: | :--------------------: | :------------------: |
+ | `conf-01` | `/etc/ssh/sshd_config` | SSH 远程登录程序设置 |
-3. 我们要做的第一件事,当然就是【用`nano`这个文本编辑器打开`SSH远程登录程序设置`】,在Windows下,你会【找到文件并双击】,在Linux下该怎么办呢?仔细看看上面的命令说明,是不是就很简单了?没错,就是:
+3. 我们要做的第一件事,当然就是【用`nano`这个文本编辑器打开`SSH远程登录程序设置`】,在 Windows 下,你会【找到文件并双击】,在 Linux 下该怎么办呢?仔细看看上面的命令说明,是不是就很简单了?没错,就是:
- ```
- # nano /etc/ssh/sshd_config
- ```
+ ```
+ # nano /etc/ssh/sshd_config
+ ```
4. 文件打开后,你就进入了`nano`的界面,稍微观察一下,你会发现,它把重要的快捷键都显示在屏幕下方了(下图红框内),直接开卷考试、不用死记硬背,是不是很贴心呢?
-
+
+5) 我们要做的第二件事,是【在打开的文件中找到`Port`这一项,并修改它的端口】。Port 后面的数字就是 SSH 的端口,一般建议把它改成一个大于`1024`小于`65535`的整数(本文以`9753`为例)。请结合`nano`的快捷键,想一下该怎么操作呢?果然,你又说对了!就是:
-5. 我们要做的第二件事,是【在打开的文件中找到`Port`这一项,并修改它的端口】。Port后面的数字就是SSH的端口,一般建议把它改成一个大于`1024`小于`65535`的整数(本文以`9753`为例)。请结合`nano`的快捷键,想一下该怎么操作呢?果然,你又说对了!就是:
-
- - 使用 `ctrl+w` 进入搜索模式,然后输入 `Port 22` 并回车
- - 删除 `22` 并改成 `9753`
- - 说明:如果这一行开头有个`#`,证明这一行【不生效】(被注释掉了),你可像我一样在文件最后写一个不带`#`的,或者把`#`删掉就好。
+ - 使用 `ctrl+w` 进入搜索模式,然后输入 `Port 22` 并回车
+ - 删除 `22` 并改成 `9753`
+ - 说明:如果这一行开头有个`#`,证明这一行【不生效】(被注释掉了),你可像我一样在文件最后写一个不带`#`的,或者把`#`删掉就好。
::: warning 注意
本文以`9753`为例,就意味着随着本文的发布,这个端口会变成一个不大不小的特征,也许会被攻击者优先尝试、也许被GFW干扰、阻断。所以我强烈建议你用一个自己想到的其他端口,毕竟,你有6万多个端口可以自由选择。
:::
-
6. 我们要做的第三件事,是【保存文件并退出】
- - 如果第3步你有仔细观察,就会发现保存并不是常见的 `ctrl+s`。
- - 正确的快捷键:保存是 `ctrl+o` + `回车`,退出是 `ctrl+x`
+ - 如果第 3 步你有仔细观察,就会发现保存并不是常见的 `ctrl+s`。
+ - 正确的快捷键:保存是 `ctrl+o` + `回车`,退出是 `ctrl+x`
-7. 我们最后要做的事,是【重启ssh服务,使变更生效】
- ```
- # systemctl restart ssh
- ```
+7. 我们最后要做的事,是【重启 ssh 服务,使变更生效】
+
+ ```
+ # systemctl restart ssh
+ ```
8. 完整流程演示如下:
-
+
9. 修改 PuTTY 配置
- 现在新的端口已经生效,下次使用PuTTY登录时就要用`9753`了。所以现在请到PuTTY的设置中修改端口号码,然后保存Session。嗯,你应该知道去哪里改了吧?(如果不知道的话,要重读前面的内容了哦!)
+ 现在新的端口已经生效,下次使用 PuTTY 登录时就要用`9753`了。所以现在请到 PuTTY 的设置中修改端口号码,然后保存 Session。嗯,你应该知道去哪里改了吧?(如果不知道的话,要重读前面的内容了哦!)
-
-
-## 4.5 建立非root的新用户
+## 4.5 建立非 root 的新用户
第二步,我们来解决【用户名 = `root`】的问题。
-首先你要理解, Linux系统中的`root`,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦`root`账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。那么就跟随我进行操作吧:
+首先你要理解, Linux 系统中的`root`,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦`root`账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。那么就跟随我进行操作吧:
-1. 小小白白Linux基础命令:
+1. 小小白白 Linux 基础命令:
- | 编号 | 命令名称 | 命令说明 |
- |:--:|:--:|:--:|
- | `cmd-05` | `adduser` | 给系统新增用户 |
- | `cmd-06` | `apt install` | 安装某个软件 |
- | `cmd-07` | `visudo` | 修改sudo权限设置专用编辑器 |
+ | 编号 | 命令名称 | 命令说明 |
+ | :------: | :-----------: | :--------------------------: |
+ | `cmd-05` | `adduser` | 给系统新增用户 |
+ | `cmd-06` | `apt install` | 安装某个软件 |
+ | `cmd-07` | `visudo` | 修改 sudo 权限设置专用编辑器 |
2. 我们要做的第一件事,是【新增一个用户并设定登录密码】,名字你可以随便起,我这里以`vpsadmin`为例:
- ```
- # adduser vpsadmin
- ```
+ ```
+ # adduser vpsadmin
+ ```
执行命令后,根据提示操作即可。请务必设置一个用户密码(别忘记设置密码时你时看不到 `******` 的)。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。
@@ -135,23 +132,24 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
4. 完整流程演示如下:
-
+
5. 我们要做的第二件事,是【安装`sudo`功能】(`sudo` 就是在关键时刻,让普通账户临时获得 `root` 的神力,战力全开拯救世界)
- ```
- # apt update && apt install sudo
- ```
- 聪明的你大概已经发现,这一行命令其实是两个命令。前一半 `apt update` 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 `apt install` 就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的`sudo`程序】。 `&&` 则是把两个命令连起来执行的意思。
+ ```
+ # apt update && apt install sudo
+ ```
+
+ 聪明的你大概已经发现,这一行命令其实是两个命令。前一半 `apt update` 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 `apt install` 就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的`sudo`程序】。 `&&` 则是把两个命令连起来执行的意思。
6. 我们要做的第三件事,是【把`vpsadmin`用户加入`sudo`名单里,让他有资格借用`root`的神力】
- ```
- # visudo
- ```
+ ```
+ # visudo
+ ```
+
+ 在 `User Privilege Specification` 下加入一行 `vpsadmin ALL=(ALL) NOPASSWD: ALL` 即可。
- 在 `User Privilege Specification` 下加入一行 `vpsadmin ALL=(ALL) NOPASSWD: ALL` 即可。
-
::: warning 注意
我要特别说明的是`NOPASSWD`这个设置,它的意思是`vpsadmin`用户临时使用`root`权限时,不用额外输入密码。**这与一般的安全建议相反**。我之所以如此推荐,是因为很多新人不顾危险坚持使用`root`账号就是因为用`root`时不用重复输入密码、觉得轻松。“两害相权取其轻”,我认为【直接用`root`用户的风险】大于【使用`sudo`时不用输密码的风险】,所以做了以上的建议。
@@ -161,49 +159,49 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
7. 完整流程演示如下:
-
+
+## 4.6 禁用 root 用户 SSH 远程登录
+1. 现在你已经逐渐熟悉 Linux 了,所以这次换你思考,我们要做的第一件事是什么呢?没错,还是【用`nano`编辑器打开`SSH远程登录程序设置`】,什么,你想不起来怎么操作了?那去复习一下上面的内容再回来吧!............ 正确答案:
-## 4.6 禁用root用户SSH远程登录
-
-1. 现在你已经逐渐熟悉Linux了,所以这次换你思考,我们要做的第一件事是什么呢?没错,还是【用`nano`编辑器打开`SSH远程登录程序设置`】,什么,你想不起来怎么操作了?那去复习一下上面的内容再回来吧!............ 正确答案:
- ```
- # nano /etc/ssh/sshd_config
- ```
+ ```
+ # nano /etc/ssh/sshd_config
+ ```
2. 找到`PermitRootLogin Yes`这一项,然后把它后面的设定值改为`no`即可。还记得怎么操作吗?............ 正确答案:
- - 使用 `ctrl+w` 进入搜索模式,然后输入 `PermitRootLogin` 并回车
- - 删除 `yes` 并改成 `no`
+
+ - 使用 `ctrl+w` 进入搜索模式,然后输入 `PermitRootLogin` 并回车
+ - 删除 `yes` 并改成 `no`
3. 保存文件并退出。还记得怎么操作吗?............ 正确答案:
- - 保存是 `ctrl+o`,然后 `回车` 确认
- - 退出是 `ctrl+x`
-4. 重启ssh服务,让变更生效。还记得............ 算了直接公布正确答案:
- ```
- # systemctl restart ssh
- ```
+ - 保存是 `ctrl+o`,然后 `回车` 确认
+ - 退出是 `ctrl+x`
+
+4. 重启 ssh 服务,让变更生效。还记得............ 算了直接公布正确答案:
+
+ ```
+ # systemctl restart ssh
+ ```
5. 完整流程演示如下:
-
+
-6. 下次通过PuTTY远程SSH登录的时候,`root`用户已无法连接,用户名就要换成`vpsadmin`了!方便起见,我们可以在PuTTY中把`vpsadmin`设置成默认登录用户名。(啰嗦君:别忘了保存Session)
+6. 下次通过 PuTTY 远程 SSH 登录的时候,`root`用户已无法连接,用户名就要换成`vpsadmin`了!方便起见,我们可以在 PuTTY 中把`vpsadmin`设置成默认登录用户名。(啰嗦君:别忘了保存 Session)
-
+
-
-
-## 4.7 使用RSA密钥登录并禁用密码登录
+## 4.7 使用 RSA 密钥登录并禁用密码登录
第三步,我们来解决【密码】可能被撞破的问题。
-前面我说过,黑客并不是很蠢的用穷举法破解你的密码,而是会用一些比如“密码表”的作弊手段。除非你用的是随机生成的超长密码(比如借助1Password,或者macOS的keychain等密码管理工具),否则很容易中招。
+前面我说过,黑客并不是很蠢的用穷举法破解你的密码,而是会用一些比如“密码表”的作弊手段。除非你用的是随机生成的超长密码(比如借助 1Password,或者 macOS 的 keychain 等密码管理工具),否则很容易中招。
超长随机密码虽然安全性有所提高,但是基本上无法记忆,手动输入也十分麻烦易错。为了解决这个困境,我们可以直接弃用【密码验证】方式,改用更安全的【密钥验证】。
-所谓的【密钥验证】,就是生成【一对】相关联的密钥文件(公钥和私钥),然后把【公钥】上传到VPS备用。每次登录时,SSH会将【公钥】和【私钥】进行匹配,若验证是正确的【密钥对】,则验证通过。(换言之,你无需记忆和输入复杂的密码,只要保护好【私钥】这个文件不外泄即可)
+所谓的【密钥验证】,就是生成【一对】相关联的密钥文件(公钥和私钥),然后把【公钥】上传到 VPS 备用。每次登录时,SSH 会将【公钥】和【私钥】进行匹配,若验证是正确的【密钥对】,则验证通过。(换言之,你无需记忆和输入复杂的密码,只要保护好【私钥】这个文件不外泄即可)
::: warning 注意
本文以 `RSA` 密钥举例,是因为 `RSA` 密钥在各种设备、各种 `SSH` 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择。
@@ -211,7 +209,7 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
其他的常见密钥还有:
- `DSA` - 已经从数学层面被证明不安全,所以永远不要用它
-- `ECDSA` - 密钥小安全性高,但其算法被指留有NSA的后门,如果你的VPS上有值得NSA关注的东西就不要用它
+- `ECDSA` - 密钥小安全性高,但其算法被指留有 NSA 的后门,如果你的 VPS 上有值得 NSA 关注的东西就不要用它
- `Ed25519` - 这是一个与 `ECDSA` 十分类似的算法,故具有相似的性能优势。同时其文档全部公开,所以普遍认为无后门
所以,如果你的设备和软件都支持的话,我建议优先选择 `Ed25519` 密钥。
@@ -219,102 +217,106 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
那我们现在就来配置【密钥验证】吧!
-1. 运行`PuTTYgen` (PuTTY密钥生成器)。位置是 `开始菜单` --> `所有程序` --> `PuTTY (64-bit)` --> `PuTTYgen`
- 1. 点击`Generate`开始生成(在界面空白处乱晃鼠标增加随机数)
-
-
- ::: warning 注意
- 本图中是以 `2048` 位的 `RSA` 密钥为例的。但实际上,如果要获得与 `EDCSA/Ed25519` 的 `256` 位密钥相同的安全性,你需要使用 `3072` 位的 `RSA` 密钥。(即右下角的数字改成 `3072`)
- :::
+1. 运行`PuTTYgen` (PuTTY 密钥生成器)。位置是 `开始菜单` --> `所有程序` --> `PuTTY (64-bit)` --> `PuTTYgen`
- 2. 你可以给私钥设置密码,增加一层安全性
- 3. 点击 `Save public key` 保存公钥,文件名为 `id_rsa.pub`
- 4. 点击 `Save private key` 保存私钥,文件名为 `id_rsa` (PuTTY私钥自带`.ppk`后缀)
- 5. 最重要的,将上方红框内的内容,向下滚动全部复制出来并保存,文件名为 `authorized_keys`。(用vscode保存,默认会变成带`txt`后缀的文本文件,这没关系,之后上传VPS时我们会把后缀名去掉)
-
-
-2. 将公钥上传至VPS的`vpsadmin`用户下
- 1. 这一步就需要用到之前准备的`WinSCP`了。
- 2. 去[官网](https://winscp.net/eng/index.php)下载并安装,会提示你导入PuTTY的设置,当然一键导入啦!
-
-
- 3. 如果没有提示导入或者你已经提前安装好了,那按照下图进行配置即可
-
-
- 4. WinSCP左边的目录就是本地电脑上的文件夹和文件,请定位到密钥所在的文件夹
-
- 5. WinSCP右边的目录则是VPS服务器上的文件夹和文件,默认就在 `/home/vpsadmin/` 文件夹,此时在请点击右下角 `X hidden` 来显示隐藏文件
-
-
- 6. 在右边(VPS中)点击右键并新建文件夹,起名`.ssh` (注意有一个`.`)
-
+ 1. 点击`Generate`开始生成(在界面空白处乱晃鼠标增加随机数)
+
- 7. 将【公钥】`authorized_keys`上传到`.ssh`文件夹内
-
+ ::: warning 注意
+ 本图中是以 `2048` 位的 `RSA` 密钥为例的。但实际上,如果要获得与 `EDCSA/Ed25519` 的 `256` 位密钥相同的安全性,你需要使用 `3072` 位的 `RSA` 密钥。(即右下角的数字改成 `3072`)
+ :::
- 8. 在上传时,将【公钥】从 `authorized_keys.txt` 改名为 `authorized_keys`(去掉`.txt`这个后缀名)
-
+ 2. 你可以给私钥设置密码,增加一层安全性
+ 3. 点击 `Save public key` 保存公钥,文件名为 `id_rsa.pub`
+ 4. 点击 `Save private key` 保存私钥,文件名为 `id_rsa` (PuTTY 私钥自带`.ppk`后缀)
+ 5. 最重要的,将上方红框内的内容,向下滚动全部复制出来并保存,文件名为 `authorized_keys`。(用 vscode 保存,默认会变成带`txt`后缀的文本文件,这没关系,之后上传 VPS 时我们会把后缀名去掉)
+
- 9. 完整流程演示如下:
-
+2. 将公钥上传至 VPS 的`vpsadmin`用户下
-3. 在VPS端设置SSH启用RSA密钥验证登录、同时禁用密码验证登录
+ 1. 这一步就需要用到之前准备的`WinSCP`了。
+ 2. 去[官网](https://winscp.net/eng/index.php)下载并安装,会提示你导入 PuTTY 的设置,当然一键导入啦!
+
- 1. 小小白白Linux基础命令:
- | 编号 | 命令名称 | 命令说明 |
- |:--:|:--:|:--:|
- | `cmd-08` | `sudo` | 用`root`权限运行某个命令 |
- | `cmd-09` | `chmod` | 修改目标文件/文件夹的权限 |
+ 3. 如果没有提示导入或者你已经提前安装好了,那按照下图进行配置即可
+
- 2. SSH远程连接到VPS上(PuTTY)
+ 4. WinSCP 左边的目录就是本地电脑上的文件夹和文件,请定位到密钥所在的文件夹
- 3. 修改 `authorized_keys` 文件权限为 `600` (仅所有者可读可写)
- ```
- $ chmod 600 ~/.ssh/authorized_keys
- ```
-
- 4. 修改 SSH 配置。这个我们已经用了很多次,但现在我们已经从无所不能的`root`变成了普通用户`vpsadmin`,此时的我们是没有权限直接编辑SSH配置的。这时候就需要使用`sudo`命令了:
- ```
- $ sudo nano /etc/ssh/sshd_config
- ```
-
- 5. 找到(`ctrl+w`) `PasswordAuthentication` 改成 `no`
-
- 6. 找到(`ctrl+w`) `PubkeyAuthentication` 改成 `yes`,然后保存(`ctrl+o`)退出(`ctrl+x`)
-
- 7. 重启SSH服务。(啰嗦君:别忘了现在需要使用`sudo`来获得权限)
- ```
- $ sudo systemctl restart ssh
- ```
-
- 8. 完整流程如下:
+ 5. WinSCP 右边的目录则是 VPS 服务器上的文件夹和文件,默认就在 `/home/vpsadmin/` 文件夹,此时在请点击右下角 `X hidden` 来显示隐藏文件
+
-
+ 6. 在右边(VPS 中)点击右键并新建文件夹,起名`.ssh` (注意有一个`.`)
+
-4. VPS端已经设置好了公钥,现在要给PuTTY指定私钥位置供登录时使用(啰嗦君:别忘了保存Session)
+ 7. 将【公钥】`authorized_keys`上传到`.ssh`文件夹内
+
-
-
-5. 至此,【密钥登录】已成功开启、【密码验证】已成功关闭、并且还给PuTTY保存了默认的登录用户名和私钥。未来使用PuTTY登录时,载入`VPS-SERVER`配置后,点击`Open`就可以一键登录了。
+ 8. 在上传时,将【公钥】从 `authorized_keys.txt` 改名为 `authorized_keys`(去掉`.txt`这个后缀名)
+
- 如果你给私钥设置了密码保护,登录时当然还需要输入这个密码才能使用密钥,如下图:
+ 9. 完整流程演示如下:
+
-
+3. 在 VPS 端设置 SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录
+
+ 1. 小小白白 Linux 基础命令:
+ | 编号 | 命令名称 | 命令说明 |
+ |:--:|:--:|:--:|
+ | `cmd-08` | `sudo` | 用`root`权限运行某个命令 |
+ | `cmd-09` | `chmod` | 修改目标文件/文件夹的权限 |
+
+ 2. SSH 远程连接到 VPS 上(PuTTY)
+
+ 3. 修改 `authorized_keys` 文件权限为 `600` (仅所有者可读可写)
+
+ ```
+ $ chmod 600 ~/.ssh/authorized_keys
+ ```
+
+ 4. 修改 SSH 配置。这个我们已经用了很多次,但现在我们已经从无所不能的`root`变成了普通用户`vpsadmin`,此时的我们是没有权限直接编辑 SSH 配置的。这时候就需要使用`sudo`命令了:
+
+ ```
+ $ sudo nano /etc/ssh/sshd_config
+ ```
+
+ 5. 找到(`ctrl+w`) `PasswordAuthentication` 改成 `no`
+
+ 6. 找到(`ctrl+w`) `PubkeyAuthentication` 改成 `yes`,然后保存(`ctrl+o`)退出(`ctrl+x`)
+
+ 7. 重启 SSH 服务。(啰嗦君:别忘了现在需要使用`sudo`来获得权限)
+
+ ```
+ $ sudo systemctl restart ssh
+ ```
+
+ 8. 完整流程如下:
+
+
+
+4. VPS 端已经设置好了公钥,现在要给 PuTTY 指定私钥位置供登录时使用(啰嗦君:别忘了保存 Session)
+
+
+
+
+5. 至此,【密钥登录】已成功开启、【密码验证】已成功关闭、并且还给 PuTTY 保存了默认的登录用户名和私钥。未来使用 PuTTY 登录时,载入`VPS-SERVER`配置后,点击`Open`就可以一键登录了。
+
+ 如果你给私钥设置了密码保护,登录时当然还需要输入这个密码才能使用密钥,如下图:
+
+
6. 别忘了给`WinSCP`也做对应的密钥设置,否则之后想要传输文件时就无法登录了:
-
+
::: warning 注意
-任何需要借助SSH进行登录的软件都需要密钥验证了,软件过多,无法逐一展示,请根据你的需要自行设置好哦
+任何需要借助 SSH 进行登录的软件都需要密钥验证了,软件过多,无法逐一展示,请根据你的需要自行设置好哦
:::
-
-
## 4.8 你的进度
-到这里为止,你的VPS已经完成了【端口】、【用户名】、【密码】这三要素的基本安全保障,虽然远称不上固若金汤,但一般的恶意脚本应该已经无法对你造成伤害了!
+到这里为止,你的 VPS 已经完成了【端口】、【用户名】、【密码】这三要素的基本安全保障,虽然远称不上固若金汤,但一般的恶意脚本应该已经无法对你造成伤害了!
-现在我们终于有了一个安全的系统基础,下一章,我们就可以开始逐步安装配置Xray需要的基础设施了!(什么基础设施呢?一个网页,一张证书)
+现在我们终于有了一个安全的系统基础,下一章,我们就可以开始逐步安装配置 Xray 需要的基础设施了!(什么基础设施呢?一个网页,一张证书)
> ⬛⬛⬛⬛⬜⬜⬜⬜ 50%
diff --git a/docs/document/level-0/ch05-webpage.md b/docs/document/level-0/ch05-webpage.md
index 11d4ebd..9186571 100644
--- a/docs/document/level-0/ch05-webpage.md
+++ b/docs/document/level-0/ch05-webpage.md
@@ -1,4 +1,4 @@
-# 【第5章】网站建设篇
+# 【第 5 章】网站建设篇
## 5.1 为什么要做一个网站?
@@ -6,119 +6,123 @@
先回答第一个问题,建网站的原因有:
-1. 申请合法的TLS证书(非常重要)
+1. 申请合法的 TLS 证书(非常重要)
2. 提供合理的回落,防止主动探测攻击,提高安全性
3. 建设一个伪装站(如博客、私人网盘、多媒体网站、游戏网站等),直接访问时有合理的前台,使流量使用看上去更合理。
再回答第二个问题:
-1. 本文作为演示,仅仅使用了一个最简单的【单文件html页面 + Nginx】来搭建,以此完成上面的目标,所以【非常简单】
+
+1. 本文作为演示,仅仅使用了一个最简单的【单文件 html 页面 + Nginx】来搭建,以此完成上面的目标,所以【非常简单】
2. 这个网站完全可以不仅仅是伪装,而是真的做大做强,这个复杂性就完全取决于你了
3. 对于“伪装”和“网站运营”这个目标,需要的就是各不相同、秀出真我,需要的同学可以自行搜索学习。这个内容已经完全偏离了科学上网,本文就不深入解析了。
-## 5.2 登录VPS、安装运行Nginx
+## 5.2 登录 VPS、安装运行 Nginx
1. 这里用到的,都是之前已经详解过的命令,所以就不重复讲解了。看不懂的同学可以看看前面的章节哦。
- ```
- $ sudo apt update && sudo apt install nginx
- ```
-2. 完成后,Nginx已经自动运行。此时打开Windows上的浏览器并输入 `http://100.200.300.400:80`,若看到下图的界面就说明Nginx已经正常在运行了。
+ ```
+ $ sudo apt update && sudo apt install nginx
+ ```
-
+2. 完成后,Nginx 已经自动运行。此时打开 Windows 上的浏览器并输入 `http://100.200.300.400:80`,若看到下图的界面就说明 Nginx 已经正常在运行了。
+
## 5.3 创建一个最简单的网页
-1. 小小白白Linux基础命令:
- | 编号 | 命令名称 | 命令说明 |
- |:--:|:--:|:--:|
- | `cmd-10` | `mkdir` | 新建文件夹 |
- | `cmd-11` | `systemctl reload` | 重新加载某个服务 |
+1. 小小白白 Linux 基础命令:
+ | 编号 | 命令名称 | 命令说明 |
+ |:--:|:--:|:--:|
+ | `cmd-10` | `mkdir` | 新建文件夹 |
+ | `cmd-11` | `systemctl reload` | 重新加载某个服务 |
-2. 小小白白Linux基础配置文件:
- | 编号 | 配置文件位置 | 文件说明 |
- |:--:|:--:|:--:|
- | `conf-02` | `/etc/nginx/nginx.conf` | Nginx程序设置 |
+2. 小小白白 Linux 基础配置文件:
+ | 编号 | 配置文件位置 | 文件说明 |
+ |:--:|:--:|:--:|
+ | `conf-02` | `/etc/nginx/nginx.conf` | Nginx 程序设置 |
3. 创建一个网站专用的文件夹`/home/vpsadmin/www/webpage/`并建立网页文件`index.html`
- ```
- $ mkdir -p ~/www/webpage/ && nano ~/www/webpage/index.html
- ```
+ ```
+ $ mkdir -p ~/www/webpage/ && nano ~/www/webpage/index.html
+ ```
::: warning 注意
-如果你用的不是 `vpsadmin` 这个用户名,请务必理解这条命令中 `“~”` 符号的意义(这关系到【第5步】你要写的内容):
+如果你用的不是 `vpsadmin` 这个用户名,请务必理解这条命令中 `“~”` 符号的意义(这关系到【第 5 步】你要写的内容):
- 如果是 【非 `root` 用户】,`“~”` 就等价于 `/home/用户名`
- 如果是 【 `root` 用户】,`“~”` 就等价于 `/root`
-:::
+ :::
4. 把下面的内容完整的复制进去,然后保存(`ctrl+o`)退出(`ctrl+x`)
- ```
-
-
-
- Enter a title, displayed at the top of the window.
-
-
-
- Enter the main heading, usually the same as the title.
- Be bold in stating your key points. Put them in a list:
-
- - The first item in your list
- - The second item; italicize key words
-
- Improve your image by including an image.
- 
- Add a link to your favorite Web site.
- Break up your page with a horizontal rule or two.
-
-
- Finally, link to another page in your own Web site.
-
- © Wiley Publishing, 2011
-
-
- ```
-5. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的http访问定位到刚才建立的 `html` 页面上
- 1. 修改 `nginx.conf` 。
- ```
- $ sudo nano /etc/nginx/nginx.conf
- ```
-
- 2. 将下面一段,添加在 `http{}` 内,然后保存(`ctrl+o`)退出(`ctrl+x`)。(记得将域名替换为之前准备好的、包含二级域名的真实域名)
- ```
- server {
- listen 80;
- server_name 二级域名.你的域名.com;
- root /home/vpsadmin/www/webpage;
- index index.html;
- }
- ```
+ ```
+
+
+
+ Enter a title, displayed at the top of the window.
+
+
+
+ Enter the main heading, usually the same as the title.
+ Be bold in stating your key points. Put them in a list:
+
+ - The first item in your list
+ - The second item; italicize key words
+
+ Improve your image by including an image.
+ 
+ Add a link to your favorite Web site.
+ Break up your page with a horizontal rule or two.
+
+
+ Finally, link to another page in your own Web site.
+
+ © Wiley Publishing, 2011
+
+
+ ```
- ::: warning 特别注意!
- 如我在【第3步】中的提示所说,请务必确保 `/home/vpsadmin/www/webpage` 改成你的实际文件路径。
- :::
+5. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的 http 访问定位到刚才建立的 `html` 页面上
- 3. 让 `nginx` 重新载入配置使其生效
- ```
- $ sudo systemctl reload nginx
- ```
+ 1. 修改 `nginx.conf` 。
- 4. 完整的设置流程如下:
+ ```
+ $ sudo nano /etc/nginx/nginx.conf
+ ```
-
+ 2. 将下面一段,添加在 `http{}` 内,然后保存(`ctrl+o`)退出(`ctrl+x`)。(记得将域名替换为之前准备好的、包含二级域名的真实域名)
- 5. 此时如果你访问 `http://二级域名.你的域名.com`,你看到这样的页面则说明成功:
+ ```
+ server {
+ listen 80;
+ server_name 二级域名.你的域名.com;
+ root /home/vpsadmin/www/webpage;
+ index index.html;
+ }
+ ```
-
+ ::: warning 特别注意!
+ 如我在【第 3 步】中的提示所说,请务必确保 `/home/vpsadmin/www/webpage` 改成你的实际文件路径。
+ :::
+ 3. 让 `nginx` 重新载入配置使其生效
+ ```
+ $ sudo systemctl reload nginx
+ ```
+
+ 4. 完整的设置流程如下:
+
+
+
+ 5. 此时如果你访问 `http://二级域名.你的域名.com`,你看到这样的页面则说明成功:
+
+
## 5.4 常见错误的说明
@@ -136,7 +140,7 @@
- 使用了【非 `root` 用户】,但仍然直接拷贝文中的命令不加修改。(这基本就等于抄答案时把同学的名字一起抄过去了)
- 坚持使用【 `root` 用户】
-碰到错误的同学,就回过头仔细看一下【5.3】中【第3步】和【第5-2步】的说明吧。
+碰到错误的同学,就回过头仔细看一下【5.3】中【第 3 步】和【第 5-2 步】的说明吧。
::: warning
本文前期已经用了大量篇幅说明了使用【非 `root` 用户】对安全的重要性,全文也是基于此而写。所以,因使用【 `root` 用户】而导致的问题并不在本文的设计范围里。
@@ -144,10 +148,8 @@
但我相信,坚持使用【 `root` 用户】的同学应该是有主见、动手能力强、或者有一定 Linux 基础的同学。问题的症结我已经全部说明了,我相信你一定可以自行解决。
:::
-
-
## 5.5 你的进度
-至此,Xray的第一个基础设施【网页】已经就位,我们马上就进入第二个基础设施【证书】吧!
+至此,Xray 的第一个基础设施【网页】已经就位,我们马上就进入第二个基础设施【证书】吧!
> ⬛⬛⬛⬛⬛⬜⬜⬜ 62.5%
diff --git a/docs/document/level-0/ch06-certificates.md b/docs/document/level-0/ch06-certificates.md
index 8ec5585..9cac829 100644
--- a/docs/document/level-0/ch06-certificates.md
+++ b/docs/document/level-0/ch06-certificates.md
@@ -1,8 +1,8 @@
-# 【第6章】证书管理篇
+# 【第 6 章】证书管理篇
-## 6.1 申请TLS证书
+## 6.1 申请 TLS 证书
-接下来我们要做的,是为我们的域名申请一个真实的TLS证书,使网站具备标准TLS加密的能力及HTTPS访问的能力。这就是Xray等现阶段安全代理工具确保流量充分加密最重要的工具。
+接下来我们要做的,是为我们的域名申请一个真实的 TLS 证书,使网站具备标准 TLS 加密的能力及 HTTPS 访问的能力。这就是 Xray 等现阶段安全代理工具确保流量充分加密最重要的工具。
::: warning 注意
请不要轻易使用自签证书。它并没有让操作简单太多,但增加了无谓的风险(如中间人攻击)。
@@ -10,186 +10,188 @@
这里我会使用一个叫做 [`acme.sh`](https://github.com/acmesh-official/acme.sh) 的证书管理工具,它简单、轻量、高效,并可完成证书自动更新。
-另外,我相信,现在你已经逐渐熟悉了Linux的基础操作,所以已经多次出现的命令从本章开始不再重复截图、只做简单的描述。如果实在想不起来怎么用的话,就稍微复习一下前面的章节吧。
+另外,我相信,现在你已经逐渐熟悉了 Linux 的基础操作,所以已经多次出现的命令从本章开始不再重复截图、只做简单的描述。如果实在想不起来怎么用的话,就稍微复习一下前面的章节吧。
## 6.2 安装 `acme.sh`
-1. 小小白白Linux基础命令:
- | 编号 | 命令名称 | 命令说明 |
- |:--:|:--:|:--:|
- | `cmd-12` | `wget` | 访问(或下载)某个网页文件 |
- | `cmd-13` | `acme.sh` | acme.sh证书管理相关的命令 |
+1. 小小白白 Linux 基础命令:
+ | 编号 | 命令名称 | 命令说明 |
+ |:--:|:--:|:--:|
+ | `cmd-12` | `wget` | 访问(或下载)某个网页文件 |
+ | `cmd-13` | `acme.sh` | acme.sh 证书管理相关的命令 |
2. 运行安装脚本
- ```
- $ wget -O - https://get.acme.sh | sh
- ```
+
+ ```
+ $ wget -O - https://get.acme.sh | sh
+ ```
3. 让 `acme.sh` 命令生效
- ```
- $ . .bashrc
- ```
+
+ ```
+ $ . .bashrc
+ ```
4. 开启 `acme.sh` 的自动升级
- ```
- $ acme.sh --upgrade --auto-upgrade
- ```
+
+ ```
+ $ acme.sh --upgrade --auto-upgrade
+ ```
5. 到这一步的完整流程如下图:
-
+
## 6.3 测试证书申请
-在正式申请证书之前,我们先用测试命令(`--issue --test`)来验证是否可以成功申请,这样可以避免在本地配置有误时,反复申请证书失败,超过 Let's Encrypt 的频率上限(比如,每小时、每个域名、每个用户失败最多5次),导致后面的步骤无法进行。
+在正式申请证书之前,我们先用测试命令(`--issue --test`)来验证是否可以成功申请,这样可以避免在本地配置有误时,反复申请证书失败,超过 Let's Encrypt 的频率上限(比如,每小时、每个域名、每个用户失败最多 5 次),导致后面的步骤无法进行。
1. 测试证书申请的命令如下(本文均以 `ECC` 证书为例,因为时至今日,实在没什么理由不用它):
- ```
- $ acme.sh --issue --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
- ```
- ::: warning 说明
- `ECC`证书的主要优势在于它的Keysize更小,意味着同等大小下安全性的提升和加密解密速度的加快。如 ECC-256bit 的强度大约相当于 RSA-3072bit,何乐而不为呢?当然,有人说ECC证书握手会明显更快,这我觉得就有些夸张了,因为RSA握手也没有太慢,就算有差别应该也是毫秒级,很难直接感知。
+ ```
+ $ acme.sh --issue --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
+ ```
- 另外,如果有些网站确实需要兼容某些古老设备的,那也还是请按需选择`RSA`证书。
- :::
+ ::: warning 说明
+ `ECC`证书的主要优势在于它的 Keysize 更小,意味着同等大小下安全性的提升和加密解密速度的加快。如 ECC-256bit 的强度大约相当于 RSA-3072bit,何乐而不为呢?当然,有人说 ECC 证书握手会明显更快,这我觉得就有些夸张了,因为 RSA 握手也没有太慢,就算有差别应该也是毫秒级,很难直接感知。
+
+ 另外,如果有些网站确实需要兼容某些古老设备的,那也还是请按需选择`RSA`证书。
+ :::
2. 你最终应该看到类似这样的提示:
- ``` log
- [Wed 30 Dec 2022 04:25:12 AM EST] Using ACME_DIRECTORY: https://acme-staging-v02.api.letsencrypt.org/directory
- [Wed 30 Dec 2022 04:25:13 AM EST] Using CA: https://acme-staging-v02.api.letsencrypt.org/directory
- [Wed 30 Dec 2022 04:25:13 AM EST] Create account key ok.
- [Wed 30 Dec 2022 04:25:13 AM EST] Registering account: https://acme-staging-v02.api.letsencrypt.org/directory
- [Wed 30 Dec 2022 04:25:13 AM EST] Registered
- [Wed 30 Dec 2022 04:25:13 AM EST] ACCOUNT_THUMBPRINT='CU6qmPKuRqhyTAIrF4swosR375194z_1ddUlWef8xDc'
- [Wed 30 Dec 2022 04:25:13 AM EST] Creating domain key
- [Wed 30 Dec 2022 04:25:13 AM EST] The domain key is here: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
- [Wed 30 Dec 2022 04:25:13 AM EST] Single domain='二级域名.你的域名.com'
- [Wed 30 Dec 2022 04:25:13 AM EST] Getting domain auth token for each domain
- [Wed 30 Dec 2022 04:25:14 AM EST] Getting webroot for domain='二级域名.你的域名.com'
- [Wed 30 Dec 2022 04:25:14 AM EST] Verifying: 二级域名.你的域名.com
- [Wed 30 Dec 2022 04:25:23 AM EST] Pending
- [Wed 30 Dec 2022 04:25:25 AM EST] Success
- [Wed 30 Dec 2022 04:25:25 AM EST] Verify finished, start to sign.
- [Wed 30 Dec 2022 04:25:25 AM EST] Lets finalize the order.
- [Wed 30 Dec 2022 04:25:25 AM EST] Le_OrderFinalize='https://acme-staging-v02.api.letsencrypt.org/acme/finalize/490205995/7730242871'
- [Wed 30 Dec 2022 04:25:25 AM EST] Downloading cert.
- [Wed 30 Dec 2022 04:25:25 AM EST] Le_LinkCert='https://acme-staging-v02.api.letsencrypt.org/acme/cert/xujss5xt8i38waubafz2xujss5xt8i38waubz2'
- [Wed 30 Dec 2022 15:21:52 AM EST] Cert success.
- --BEGIN CERTIFICAT--
- sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtN
- cTFK4LGOfjqi8Ks87EVJdK9IaSAu7ZC6h5to0eqpJ5PLhaM3e6yJBbHmYA8w1Smp
- wAb3tdoHZ9ttUIm9CrSzvDBt6BBT6GqYdDamMyCYBLooMyDEM4CUFsOzCRrEqqvC
- 2mTTEmhvpojo5rhdTSJxibozyNWTGwoTj0v9pTUeQcGqLIzqi4DowjBHD5guwRid
- SjAFnm6JT2xUQgWFm58A1gv1OhbH1TRPUUmtE1nFEN7YiSjI4xgxqAXT3CLD2EUb
- wXlUrO6c75zSsQP4bRMzgOjJUqHtSb6IEqELzt4M7KzL5iCOruCChCo2DZxUwvVX
- tOoaAyQJzCbTqE6aUqwiKi3gVyoxvDP9mI5JdRYzsDL6GVud7EHPnYeMl9ubLZAK
- 0vg84mbMP3f6mYM4KRa1cqiyOIcQPT4AzGFYVv4sm049bZQg7sd0Bz9CaFvE7yDA
- 1y17XlgCDnsjxl66bqI1vkENN9XT5xeFHONqc18b5fZEKSIvdX7iWPFWp1PyMPpG
- 0pMCP1EymZNFxIMJLgbWqExwLWfPc5Ib3PjBaIqhXPnw6sT2MQSxXwDupq1UJVhV
- 7E3hQRVlwI4CXi6WLHJMNvNRyyK87gCrLH1bKYsPeRVaz77poWBq49zwBCts6hPY
- IeF4ltGXyANNIOPEi8vy138fRU4LYh81d8FjOtFfJZogMjwhfNvapqxPMsioPlmX
- TnZu0n7setrVNUEfTMHWqPpDgk5MPrWLA4LapqaDfEX4pwnQJLMwMi6s94z165c0
- iMRSKA1yU5zqv8aNsDfPoY4OkSPWs4MaXgRRSLBsUfZ15DwQXPk76kegHIyxWvwF
- tYw9HKR5QCMK66fa0z4aJoFVFLK0IIOGEZOanRFUCnkLUDd3QZ3YU8lEcrj7Uxos
- haiRNICyC6UfsCJ94a8vcNyMosPv3xBLMp19WXgiFYqEFQkntkv1FLRI35fjeJmg
- 0fmD9VG9bkzGPHihJgQLRlCHasGf6XrdfkSsODAyCUHUHJ0RzqF4YEZMcxDxzuQ2
- YO7bFwj7S3mUdVPZ6MPasjxdyBjJgEBMch2uy4AhmudXfEBQBye8W6ZI4ztZjLVV
- FmP4SIuaNUmMe20TjR8b9NVC96AhxOanWT3mRROsdokpKQGTJvl27EHH8KuAbUOc
- G6KtPy4wslNZNXWcBy9n63RcWak12r7kAIFn38tZxmlw2WUKoRSMAH64GcDTjRQd
- Am65hBHzvGrj93wEuVNIebvNIsJOlng3HFjpIxVqKGMCIfWIKGDE3YzK3p4LbGZ6
- NZFQWYJLNVf2M9CCJfbEImPYgvctrxl39H6KVYPCw1SAdaj9NneUqmREOQkKoEB0
- x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIp
- yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPIjw9AKH=
- --END CERTIFICAT--
- [Wed 30 Dec 2022 15:21:52 AM EST] Your cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer
- [Wed 30 Dec 2022 15:21:52 AM EST] Your cert key is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
- [Wed 30 Dec 2022 15:21:52 AM EST] The intermediate CA cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/ca.cer
- [Wed 30 Dec 2022 15:21:52 AM EST] And the full chain certs is there: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer
- ```
+
+ ```log
+ [Wed 30 Dec 2022 04:25:12 AM EST] Using ACME_DIRECTORY: https://acme-staging-v02.api.letsencrypt.org/directory
+ [Wed 30 Dec 2022 04:25:13 AM EST] Using CA: https://acme-staging-v02.api.letsencrypt.org/directory
+ [Wed 30 Dec 2022 04:25:13 AM EST] Create account key ok.
+ [Wed 30 Dec 2022 04:25:13 AM EST] Registering account: https://acme-staging-v02.api.letsencrypt.org/directory
+ [Wed 30 Dec 2022 04:25:13 AM EST] Registered
+ [Wed 30 Dec 2022 04:25:13 AM EST] ACCOUNT_THUMBPRINT='CU6qmPKuRqhyTAIrF4swosR375194z_1ddUlWef8xDc'
+ [Wed 30 Dec 2022 04:25:13 AM EST] Creating domain key
+ [Wed 30 Dec 2022 04:25:13 AM EST] The domain key is here: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
+ [Wed 30 Dec 2022 04:25:13 AM EST] Single domain='二级域名.你的域名.com'
+ [Wed 30 Dec 2022 04:25:13 AM EST] Getting domain auth token for each domain
+ [Wed 30 Dec 2022 04:25:14 AM EST] Getting webroot for domain='二级域名.你的域名.com'
+ [Wed 30 Dec 2022 04:25:14 AM EST] Verifying: 二级域名.你的域名.com
+ [Wed 30 Dec 2022 04:25:23 AM EST] Pending
+ [Wed 30 Dec 2022 04:25:25 AM EST] Success
+ [Wed 30 Dec 2022 04:25:25 AM EST] Verify finished, start to sign.
+ [Wed 30 Dec 2022 04:25:25 AM EST] Lets finalize the order.
+ [Wed 30 Dec 2022 04:25:25 AM EST] Le_OrderFinalize='https://acme-staging-v02.api.letsencrypt.org/acme/finalize/490205995/7730242871'
+ [Wed 30 Dec 2022 04:25:25 AM EST] Downloading cert.
+ [Wed 30 Dec 2022 04:25:25 AM EST] Le_LinkCert='https://acme-staging-v02.api.letsencrypt.org/acme/cert/xujss5xt8i38waubafz2xujss5xt8i38waubz2'
+ [Wed 30 Dec 2022 15:21:52 AM EST] Cert success.
+ --BEGIN CERTIFICAT--
+ sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtN
+ cTFK4LGOfjqi8Ks87EVJdK9IaSAu7ZC6h5to0eqpJ5PLhaM3e6yJBbHmYA8w1Smp
+ wAb3tdoHZ9ttUIm9CrSzvDBt6BBT6GqYdDamMyCYBLooMyDEM4CUFsOzCRrEqqvC
+ 2mTTEmhvpojo5rhdTSJxibozyNWTGwoTj0v9pTUeQcGqLIzqi4DowjBHD5guwRid
+ SjAFnm6JT2xUQgWFm58A1gv1OhbH1TRPUUmtE1nFEN7YiSjI4xgxqAXT3CLD2EUb
+ wXlUrO6c75zSsQP4bRMzgOjJUqHtSb6IEqELzt4M7KzL5iCOruCChCo2DZxUwvVX
+ tOoaAyQJzCbTqE6aUqwiKi3gVyoxvDP9mI5JdRYzsDL6GVud7EHPnYeMl9ubLZAK
+ 0vg84mbMP3f6mYM4KRa1cqiyOIcQPT4AzGFYVv4sm049bZQg7sd0Bz9CaFvE7yDA
+ 1y17XlgCDnsjxl66bqI1vkENN9XT5xeFHONqc18b5fZEKSIvdX7iWPFWp1PyMPpG
+ 0pMCP1EymZNFxIMJLgbWqExwLWfPc5Ib3PjBaIqhXPnw6sT2MQSxXwDupq1UJVhV
+ 7E3hQRVlwI4CXi6WLHJMNvNRyyK87gCrLH1bKYsPeRVaz77poWBq49zwBCts6hPY
+ IeF4ltGXyANNIOPEi8vy138fRU4LYh81d8FjOtFfJZogMjwhfNvapqxPMsioPlmX
+ TnZu0n7setrVNUEfTMHWqPpDgk5MPrWLA4LapqaDfEX4pwnQJLMwMi6s94z165c0
+ iMRSKA1yU5zqv8aNsDfPoY4OkSPWs4MaXgRRSLBsUfZ15DwQXPk76kegHIyxWvwF
+ tYw9HKR5QCMK66fa0z4aJoFVFLK0IIOGEZOanRFUCnkLUDd3QZ3YU8lEcrj7Uxos
+ haiRNICyC6UfsCJ94a8vcNyMosPv3xBLMp19WXgiFYqEFQkntkv1FLRI35fjeJmg
+ 0fmD9VG9bkzGPHihJgQLRlCHasGf6XrdfkSsODAyCUHUHJ0RzqF4YEZMcxDxzuQ2
+ YO7bFwj7S3mUdVPZ6MPasjxdyBjJgEBMch2uy4AhmudXfEBQBye8W6ZI4ztZjLVV
+ FmP4SIuaNUmMe20TjR8b9NVC96AhxOanWT3mRROsdokpKQGTJvl27EHH8KuAbUOc
+ G6KtPy4wslNZNXWcBy9n63RcWak12r7kAIFn38tZxmlw2WUKoRSMAH64GcDTjRQd
+ Am65hBHzvGrj93wEuVNIebvNIsJOlng3HFjpIxVqKGMCIfWIKGDE3YzK3p4LbGZ6
+ NZFQWYJLNVf2M9CCJfbEImPYgvctrxl39H6KVYPCw1SAdaj9NneUqmREOQkKoEB0
+ x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIp
+ yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPIjw9AKH=
+ --END CERTIFICAT--
+ [Wed 30 Dec 2022 15:21:52 AM EST] Your cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer
+ [Wed 30 Dec 2022 15:21:52 AM EST] Your cert key is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
+ [Wed 30 Dec 2022 15:21:52 AM EST] The intermediate CA cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/ca.cer
+ [Wed 30 Dec 2022 15:21:52 AM EST] And the full chain certs is there: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer
+ ```
3. 注意:这里申请的是测试证书,没办法直接用的,只是用来证明你的域名、配置全都正确。仔细观察,你会发现给你发证书的域名是 `https://acme-staging-v02.api.letsencrypt.org`,这个 `staging` 你就理解成【测试服】吧!
-4. 如果这一步出错的话,你可以运行下面的命令,来查看详细的申请过程和具体的错误。(看不懂就隐藏掉敏感信息后,去Xray群里问吧)
+4. 如果这一步出错的话,你可以运行下面的命令,来查看详细的申请过程和具体的错误。(看不懂就隐藏掉敏感信息后,去 Xray 群里问吧)
- ```
- $ acme.sh --issue --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --debug
- ```
+ ```
+ $ acme.sh --issue --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --debug
+ ```
- 嗯没错,就是在命令的最后加了一个 `--debug` 参数
+ 嗯没错,就是在命令的最后加了一个 `--debug` 参数
5. 这一步确定成功之后,就可以申请正式的证书了。(测试证书不需要删除,它会自动被正式证书覆盖)
-
-
## 6.4 正式证书申请
1. 申请正式证书的命令如下(即删掉 `--test` 参数,并在最后加入 `--force`参数):
- ```
- $ acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --force
- ```
- ::: warning 说明
- `--force` 参数的意思就是,在现有证书到期前,手动(强行)更新证书。上一步我们从“测试服”申请的证书虽然不能直接用,但是它本身是尚未过期的,所以需要用到这个参数。
- :::
+ ```
+ $ acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --force
+ ```
+
+ ::: warning 说明
+ `--force` 参数的意思就是,在现有证书到期前,手动(强行)更新证书。上一步我们从“测试服”申请的证书虽然不能直接用,但是它本身是尚未过期的,所以需要用到这个参数。
+ :::
2. 你最终应该看到跟上面很像的提示:
- ``` log
- vpsadmin@vps-server:~$ acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
- [Wed 30 Dec 2022 15:22:51 AM EST] Using CA: https://acme-v02.api.letsencrypt.org/directory
- [Wed 30 Dec 2022 15:22:51 AM EST] Creating domain key
- [Wed 30 Dec 2022 15:22:51 AM EST] The domain key is here: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
- [Wed 30 Dec 2022 15:22:51 AM EST] Single domain='二级域名.你的域名.com'
- [Wed 30 Dec 2022 15:22:51 AM EST] Getting domain auth token for each domain
- [Wed 30 Dec 2022 15:22:51 AM EST] Getting webroot for domain='二级域名.你的域名.com'
- [Wed 30 Dec 2022 15:22:51 AM EST] Verifying: 二级域名.你的域名.com
- [Wed 30 Dec 2022 15:22:51 AM EST] Pending
- [Wed 30 Dec 2022 15:22:51 AM EST] Success
- [Wed 30 Dec 2022 15:22:51 AM EST] Verify finished, start to sign.
- [Wed 30 Dec 2022 15:22:51 AM EST] Lets finalize the order.
- [Wed 30 Dec 2022 15:22:51 AM EST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/490205996/7730242872'
- [Wed 30 Dec 2022 15:22:51 AM EST] Downloading cert.
- [Wed 30 Dec 2022 15:22:51 AM EST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/vsxvk0oldnuobe51ayxz4dms62sk2dwmw9zhuw'
- [Wed 30 Dec 2022 15:22:51 AM EST] Cert success.
- --BEGIN CERTIFICAT--
- sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtN
- cTFK4LGOfjqi8Ks87EVJdK9IaSAu7ZC6h5to0eqpJ5PLhaM3e6yJBbHmYA8w1Smp
- wAb3tdoHZ9ttUIm9CrSzvDBt6BBT6GqYdDamMyCYBLooMyDEM4CUFsOzCRrEqqvC
- 2mTTEmhvpojo5rhdTSJxibozyNWTGwoTj0v9pTUeQcGqLIzqi4DowjBHD5guwRid
- SjAFnm6JT2xUQgWFm58A1gv1OhbH1TRPUUmtE1nFEN7YiSjI4xgxqAXT3CLD2EUb
- wXlUrO6c75zSsQP4bRMzgOjJUqHtSb6IEqELzt4M7KzL5iCOruCChCo2DZxUwvVX
- tOoaAyQJzCbTqE6aUqwiKi3gVyoxvDP9mI5JdRYzsDL6GVud7EHPnYeMl9ubLZAK
- 0vg84mbMP3f6mYM4KRa1cqiyOIcQPT4AzGFYVv4sm049bZQg7sd0Bz9CaFvE7yDA
- 1y17XlgCDnsjxl66bqI1vkENN9XT5xeFHONqc18b5fZEKSIvdX7iWPFWp1PyMPpG
- 0pMCP1EymZNFxIMJLgbWqExwLWfPc5Ib3PjBaIqhXPnw6sT2MQSxXwDupq1UJVhV
- 7E3hQRVlwI4CXi6WLHJMNvNRyyK87gCrLH1bKYsPeRVaz77poWBq49zwBCts6hPY
- IeF4ltGXyANNIOPEi8vy138fRU4LYh81d8FjOtFfJZogMjwhfNvapqxPMsioPlmX
- TnZu0n7setrVNUEfTMHWqPpDgk5MPrWLA4LapqaDfEX4pwnQJLMwMi6s94z165c0
- iMRSKA1yU5zqv8aNsDfPoY4OkSPWs4MaXgRRSLBsUfZ15DwQXPk76kegHIyxWvwF
- tYw9HKR5QCMK66fa0z4aJoFVFLK0IIOGEZOanRFUCnkLUDd3QZ3YU8lEcrj7Uxos
- haiRNICyC6UfsCJ94a8vcNyMosPv3xBLMp19WXgiFYqEFQkntkv1FLRI35fjeJmg
- 0fmD9VG9bkzGPHihJgQLRlCHasGf6XrdfkSsODAyCUHUHJ0RzqF4YEZMcxDxzuQ2
- YO7bFwj7S3mUdVPZ6MPasjxdyBjJgEBMch2uy4AhmudXfEBQBye8W6ZI4ztZjLVV
- FmP4SIuaNUmMe20TjR8b9NVC96AhxOanWT3mRROsdokpKQGTJvl27EHH8KuAbUOc
- G6KtPy4wslNZNXWcBy9n63RcWak12r7kAIFn38tZxmlw2WUKoRSMAH64GcDTjRQd
- Am65hBHzvGrj93wEuVNIebvNIsJOlng3HFjpIxVqKGMCIfWIKGDE3YzK3p4LbGZ6
- NZFQWYJLNVf2M9CCJfbEImPYgvctrxl39H6KVYPCw1SAdaj9NneUqmREOQkKoEB0
- x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIp
- yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPM=
- --END CERTIFICAT--
- [Wed 30 Dec 2022 15:22:52 AM EST] Your cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer
- [Wed 30 Dec 2022 15:22:52 AM EST] Your cert key is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
- [Wed 30 Dec 2022 15:22:52 AM EST] The intermediate CA cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/ca.cer
- [Wed 30 Dec 2022 15:22:52 AM EST] And the full chain certs is there: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer
- ```
+
+ ```log
+ vpsadmin@vps-server:~$ acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
+ [Wed 30 Dec 2022 15:22:51 AM EST] Using CA: https://acme-v02.api.letsencrypt.org/directory
+ [Wed 30 Dec 2022 15:22:51 AM EST] Creating domain key
+ [Wed 30 Dec 2022 15:22:51 AM EST] The domain key is here: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
+ [Wed 30 Dec 2022 15:22:51 AM EST] Single domain='二级域名.你的域名.com'
+ [Wed 30 Dec 2022 15:22:51 AM EST] Getting domain auth token for each domain
+ [Wed 30 Dec 2022 15:22:51 AM EST] Getting webroot for domain='二级域名.你的域名.com'
+ [Wed 30 Dec 2022 15:22:51 AM EST] Verifying: 二级域名.你的域名.com
+ [Wed 30 Dec 2022 15:22:51 AM EST] Pending
+ [Wed 30 Dec 2022 15:22:51 AM EST] Success
+ [Wed 30 Dec 2022 15:22:51 AM EST] Verify finished, start to sign.
+ [Wed 30 Dec 2022 15:22:51 AM EST] Lets finalize the order.
+ [Wed 30 Dec 2022 15:22:51 AM EST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/490205996/7730242872'
+ [Wed 30 Dec 2022 15:22:51 AM EST] Downloading cert.
+ [Wed 30 Dec 2022 15:22:51 AM EST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/vsxvk0oldnuobe51ayxz4dms62sk2dwmw9zhuw'
+ [Wed 30 Dec 2022 15:22:51 AM EST] Cert success.
+ --BEGIN CERTIFICAT--
+ sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtN
+ cTFK4LGOfjqi8Ks87EVJdK9IaSAu7ZC6h5to0eqpJ5PLhaM3e6yJBbHmYA8w1Smp
+ wAb3tdoHZ9ttUIm9CrSzvDBt6BBT6GqYdDamMyCYBLooMyDEM4CUFsOzCRrEqqvC
+ 2mTTEmhvpojo5rhdTSJxibozyNWTGwoTj0v9pTUeQcGqLIzqi4DowjBHD5guwRid
+ SjAFnm6JT2xUQgWFm58A1gv1OhbH1TRPUUmtE1nFEN7YiSjI4xgxqAXT3CLD2EUb
+ wXlUrO6c75zSsQP4bRMzgOjJUqHtSb6IEqELzt4M7KzL5iCOruCChCo2DZxUwvVX
+ tOoaAyQJzCbTqE6aUqwiKi3gVyoxvDP9mI5JdRYzsDL6GVud7EHPnYeMl9ubLZAK
+ 0vg84mbMP3f6mYM4KRa1cqiyOIcQPT4AzGFYVv4sm049bZQg7sd0Bz9CaFvE7yDA
+ 1y17XlgCDnsjxl66bqI1vkENN9XT5xeFHONqc18b5fZEKSIvdX7iWPFWp1PyMPpG
+ 0pMCP1EymZNFxIMJLgbWqExwLWfPc5Ib3PjBaIqhXPnw6sT2MQSxXwDupq1UJVhV
+ 7E3hQRVlwI4CXi6WLHJMNvNRyyK87gCrLH1bKYsPeRVaz77poWBq49zwBCts6hPY
+ IeF4ltGXyANNIOPEi8vy138fRU4LYh81d8FjOtFfJZogMjwhfNvapqxPMsioPlmX
+ TnZu0n7setrVNUEfTMHWqPpDgk5MPrWLA4LapqaDfEX4pwnQJLMwMi6s94z165c0
+ iMRSKA1yU5zqv8aNsDfPoY4OkSPWs4MaXgRRSLBsUfZ15DwQXPk76kegHIyxWvwF
+ tYw9HKR5QCMK66fa0z4aJoFVFLK0IIOGEZOanRFUCnkLUDd3QZ3YU8lEcrj7Uxos
+ haiRNICyC6UfsCJ94a8vcNyMosPv3xBLMp19WXgiFYqEFQkntkv1FLRI35fjeJmg
+ 0fmD9VG9bkzGPHihJgQLRlCHasGf6XrdfkSsODAyCUHUHJ0RzqF4YEZMcxDxzuQ2
+ YO7bFwj7S3mUdVPZ6MPasjxdyBjJgEBMch2uy4AhmudXfEBQBye8W6ZI4ztZjLVV
+ FmP4SIuaNUmMe20TjR8b9NVC96AhxOanWT3mRROsdokpKQGTJvl27EHH8KuAbUOc
+ G6KtPy4wslNZNXWcBy9n63RcWak12r7kAIFn38tZxmlw2WUKoRSMAH64GcDTjRQd
+ Am65hBHzvGrj93wEuVNIebvNIsJOlng3HFjpIxVqKGMCIfWIKGDE3YzK3p4LbGZ6
+ NZFQWYJLNVf2M9CCJfbEImPYgvctrxl39H6KVYPCw1SAdaj9NneUqmREOQkKoEB0
+ x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIp
+ yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPM=
+ --END CERTIFICAT--
+ [Wed 30 Dec 2022 15:22:52 AM EST] Your cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer
+ [Wed 30 Dec 2022 15:22:52 AM EST] Your cert key is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
+ [Wed 30 Dec 2022 15:22:52 AM EST] The intermediate CA cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/ca.cer
+ [Wed 30 Dec 2022 15:22:52 AM EST] And the full chain certs is there: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer
+ ```
3. 仔细观察,你会发现这次给你发证书的域名是 `https://acme-v02.api.letsencrypt.org`,少了 `staging`,自然就是【正式服】了!
-
-
## 6.5 你的进度
-至此,Xray所需要的两个基础设施终于全部就位!千呼万唤始出来的Xray马上就要揭开面纱,我们终于要进入最激动人心章节啦!
+至此,Xray 所需要的两个基础设施终于全部就位!千呼万唤始出来的 Xray 马上就要揭开面纱,我们终于要进入最激动人心章节啦!
-
-> ⬛⬛⬛⬛⬛⬛⬜⬜ 75%
+> ⬛⬛⬛⬛⬛⬛⬜⬜ 75%
diff --git a/docs/document/level-0/ch07-xray-server.md b/docs/document/level-0/ch07-xray-server.md
index 99f6a0c..7b6ef27 100644
--- a/docs/document/level-0/ch07-xray-server.md
+++ b/docs/document/level-0/ch07-xray-server.md
@@ -1,425 +1,444 @@
-# 【第7章】Xray服务器篇
+# 【第 7 章】Xray 服务器篇
## 7.1 博观而约取,厚积而薄发
-本文撰写过程中,大佬开玩笑的吐槽到:你这教程,居然连载了6章都还没到Xray,不知道的还以为你是“手把手教你建网站”教程呢。(我竟无法反驳.jpg!)
+本文撰写过程中,大佬开玩笑的吐槽到:你这教程,居然连载了 6 章都还没到 Xray,不知道的还以为你是“手把手教你建网站”教程呢。(我竟无法反驳.jpg!)
其实这样的结构是我多番思考之后的决定,毕竟只有打好基础,才能在后面事半功倍快速反超。我在群里看到许多新人连`nano`都无法正确使用,也不会用`WinSCP`,远程手写编辑出来的`config.json`自然错误百出,连查错也变得举步维艰。
::: warning
-经过了前6章的准备,各位已经跟我一起翻越了Linux基本操作、VPS远程管理、网页搭建、域名管理、证书申请等等几座大山。是不是回头看看,觉得其实非常简单呢?现在我们有了如此扎实的准备,接下来安装和配置Xray时会有一种【水到渠成】的轻快感觉。
+经过了前 6 章的准备,各位已经跟我一起翻越了 Linux 基本操作、VPS 远程管理、网页搭建、域名管理、证书申请等等几座大山。是不是回头看看,觉得其实非常简单呢?现在我们有了如此扎实的准备,接下来安装和配置 Xray 时会有一种【水到渠成】的轻快感觉。
:::
后面要做的事情非常简单:
+
1. 安装
-2. 配置(如安装TLS证书、`config.json`)
+2. 配置(如安装 TLS 证书、`config.json`)
3. 运行
4. 优化(如更新内核、开启`bbr`、网站`http`访问自动跳转`https`等)
-## 7.2 安装Xray
+## 7.2 安装 Xray
-首先,Xray的官方载体,就是 [xray-core](https://github.com/XTLS/Xray-core) 开源项目(基于 `MPL 2.0` 开源协议)生成的二进制程序。你把这个二进制放在服务器运行,它就是服务器端;你把它下载到本地电脑运行,它就是客户端。主要区别来源于【配置】。
+首先,Xray 的官方载体,就是 [xray-core](https://github.com/XTLS/Xray-core) 开源项目(基于 `MPL 2.0` 开源协议)生成的二进制程序。你把这个二进制放在服务器运行,它就是服务器端;你把它下载到本地电脑运行,它就是客户端。主要区别来源于【配置】。
-安装时,直接使用官方安装脚本就很简单直接。它提供了多种安装选项,有兴趣的可以去官方的[安装脚本仓库](https://github.com/XTLS/Xray-install)中看看脚本的说明,**本文使用的是【非root用户】安装模式**。
+安装时,直接使用官方安装脚本就很简单直接。它提供了多种安装选项,有兴趣的可以去官方的[安装脚本仓库](https://github.com/XTLS/Xray-install)中看看脚本的说明,**本文使用的是【非 root 用户】安装模式**。
-写本文时,安装脚本在使用非root账户时有一些小bug,所以我决定正好把这几步分开操作,可以顺便说明一下Linux下的删除命令。
+写本文时,安装脚本在使用非 root 账户时有一些小 bug,所以我决定正好把这几步分开操作,可以顺便说明一下 Linux 下的删除命令。
-1. 小小白白Linux基础命令:
- | 编号 | 命令名称 | 命令说明 |
- |:--:|:--:|:--:|
- | `cmd-14` | `rm` | 删除命令 |
+1. 小小白白 Linux 基础命令:
+ | 编号 | 命令名称 | 命令说明 |
+ |:--:|:--:|:--:|
+ | `cmd-14` | `rm` | 删除命令 |
2. 将安装脚本下载至本地:
- ```
- $ wget https://github.com/XTLS/Xray-install/raw/main/install-release.sh
- ```
+
+ ```
+ $ wget https://github.com/XTLS/Xray-install/raw/main/install-release.sh
+ ```
3. 执行安装命令
- ```
- $ sudo bash install-release.sh
- ```
+
+ ```
+ $ sudo bash install-release.sh
+ ```
4. 使用完成之后可以删除该脚本
- ```
- $ rm ~/install-release.sh
- ```
- ::: warning 注意
- 使用 `rm` 命令删除文件的时候,默认其实就是删除现在所在的文件夹下的文件。但是,**我依然写了完整的路径**: `~/install-release.sh`,这是我使用 `rm` 时的一个安全习惯、也是我把安装分成几步之后想强调一下的内容。如果你听过一些“程序员从删库到跑路”之类的段子,大概就知道为什么了。
- :::
+ ```
+ $ rm ~/install-release.sh
+ ```
+
+ ::: warning 注意
+ 使用 `rm` 命令删除文件的时候,默认其实就是删除现在所在的文件夹下的文件。但是,**我依然写了完整的路径**: `~/install-release.sh`,这是我使用 `rm` 时的一个安全习惯、也是我把安装分成几步之后想强调一下的内容。如果你听过一些“程序员从删库到跑路”之类的段子,大概就知道为什么了。
+ :::
5. 完整流程演示如下:
-
+
-## 7.3 给Xray配置TLS证书
+## 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` 使用。
+虽然我们前面已经申请好了 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账户下建立一个证书文件夹
- ```
- $ mkdir ~/xray_cert
- ```
+1. 为了规避非 root 账户的各种潜在的权限困扰,我们在 vpsadmin 账户下建立一个证书文件夹
+
+ ```
+ $ mkdir ~/xray_cert
+ ```
2. 使用`acme.sh`的`--install-cert`正确安装(拷贝)证书文件
- ```
- $ acme.sh --install-cert -d 二级域名.你的域名.com --ecc \
- --fullchain-file ~/xray_cert/xray.crt \
- --key-file ~/xray_cert/xray.key
- ```
+
+ ```
+ $ acme.sh --install-cert -d 二级域名.你的域名.com --ecc \
+ --fullchain-file ~/xray_cert/xray.crt \
+ --key-file ~/xray_cert/xray.key
+ ```
3. `xray.key`文件默认对其他用户不可读,所以需要赋予其可读性权限
- ```
- $ chmod +r ~/xray_cert/xray.key
- ```
+
+ ```
+ $ chmod +r ~/xray_cert/xray.key
+ ```
4. 过程比较简单就不放动图了:
-
+
-5. `acme.sh` 会每60天检查一次证书并自动更新临期证书。但据我所知是它并不会自动将新证书安装给 `xray-core`,所以我们需要新增一个系统的自动周期任务来完成这一步。
- 1. 小小白白Linux基础命令:
- | 编号 | 命令名称 | 命令说明 |
- |:--:|:--:|:--:|
- | `cmd-15` | `crontab -e` | 编辑当前用户的定时任务 |
+5. `acme.sh` 会每 60 天检查一次证书并自动更新临期证书。但据我所知是它并不会自动将新证书安装给 `xray-core`,所以我们需要新增一个系统的自动周期任务来完成这一步。
- 2. 建立一个脚本文件(`xray-cert-renew.sh`)
- ```
- $ nano ~/xray_cert/xray-cert-renew.sh
- ```
-
- 3. 把下面的内容复制进去,记得替换你的真实域名,然后保存退出
- ```
- #!/bin/bash
-
- /home/vpsadmin/.acme.sh/acme.sh --install-cert -d a-name.yourdomain.com --ecc --fullchain-file /home/vpsadmin/xray_cert/xray.crt --key-file /home/vpsadmin/xray_cert/xray.key
- echo "Xray Certificates Renewed"
-
- chmod +r /home/vpsadmin/xray_cert/xray.key
- echo "Read Permission Granted for Private Key"
+ 1. 小小白白 Linux 基础命令:
+ | 编号 | 命令名称 | 命令说明 |
+ |:--:|:--:|:--:|
+ | `cmd-15` | `crontab -e` | 编辑当前用户的定时任务 |
- sudo systemctl restart xray
- echo "Xray Restarted"
- ```
-
- ::: warning 注意
- 经大家提醒,`acme.sh` 有一个 `reloadcmd` 命令,可以在证书更新时自动执行特定命令,那么就可以指定自动给 `Xray` 安装证书,但因为 `crontab` 是 Linux 系统中一个非常有用、非常常用的功能,所以本文保留 `crontab` 的方式来更新 `Xray` 证书。(对 `reloadcmd` 感兴趣的同学可以查看 `acme.sh` 的[官方文档](https://github.com/acmesh-official/acme.sh))
+ 2. 建立一个脚本文件(`xray-cert-renew.sh`)
- 另外,录制动图时,脚本中没有加入重启 `Xray` 的命令,是因为 `Xray` 计划支持【证书热更新】功能,即 `Xray` 会自动识别证书更新并重载证书、无需手动重启。待功能加入后,我将适当修改 `config.json` 开启此设置,并删除脚本中的重启命令。
- :::
-
- 4. 给这个文件增加【可执行】权限
- ```
- $ chmod +x ~/xray_cert/xray-cert-renew.sh
- ```
-
- 54. 运行 `crontab -e`,添加一个自动任务【每月自动运行一次`xray-cert-renew.sh`】 (注意不要加`sudo`,因为我们增加的是`vpsadmin`账户的自动任务。初次运行时会让你选择编辑器,当然是选择熟悉的`nano`啦!)
- ```
- $ crontab -e
- ```
-
- 5. 把下面的内容增加在文件最后,保存退出即可。
- ```
- # 1:00am, 1st day each month, run `xray-cert-renew.sh`
- 0 1 1 * * bash /home/vpsadmin/xray_cert/xray-cert-renew.sh
- ```
+ ```
+ $ nano ~/xray_cert/xray-cert-renew.sh
+ ```
- 6. 完整流程演示如下:
+ 3. 把下面的内容复制进去,记得替换你的真实域名,然后保存退出
-
+ ```
+ #!/bin/bash
+ /home/vpsadmin/.acme.sh/acme.sh --install-cert -d a-name.yourdomain.com --ecc --fullchain-file /home/vpsadmin/xray_cert/xray.crt --key-file /home/vpsadmin/xray_cert/xray.key
+ echo "Xray Certificates Renewed"
+ chmod +r /home/vpsadmin/xray_cert/xray.key
+ echo "Read Permission Granted for Private Key"
-## 7.4 配置Xray
+ sudo systemctl restart xray
+ echo "Xray Restarted"
+ ```
-首先,各种配置都可以参考[官方VLESS配置示例](https://github.com/XTLS/Xray-examples)。本文会基于官方示例,配置一个最精简的方式:【单 `VLESS` 协议入站 + `80` 端口回落】,满足大多数场景的最大速度及必要安全。
+ ::: warning 注意
+ 经大家提醒,`acme.sh` 有一个 `reloadcmd` 命令,可以在证书更新时自动执行特定命令,那么就可以指定自动给 `Xray` 安装证书,但因为 `crontab` 是 Linux 系统中一个非常有用、非常常用的功能,所以本文保留 `crontab` 的方式来更新 `Xray` 证书。(对 `reloadcmd` 感兴趣的同学可以查看 `acme.sh` 的[官方文档](https://github.com/acmesh-official/acme.sh))
-1. 生成一个合法的 `UUID` 并保存备用(`UUID`可以简单粗暴的理解为像指纹一样几乎不会重复的ID)
- ```
- $ xray uuid
- ```
+ 另外,录制动图时,脚本中没有加入重启 `Xray` 的命令,是因为 `Xray` 计划支持【证书热更新】功能,即 `Xray` 会自动识别证书更新并重载证书、无需手动重启。待功能加入后,我将适当修改 `config.json` 开启此设置,并删除脚本中的重启命令。
+ :::
+
+ 4. 给这个文件增加【可执行】权限
+
+ ```
+ $ chmod +x ~/xray_cert/xray-cert-renew.sh
+ ```
+
+ 5. 运行 `crontab -e`,添加一个自动任务【每月自动运行一次`xray-cert-renew.sh`】 (注意不要加`sudo`,因为我们增加的是`vpsadmin`账户的自动任务。初次运行时会让你选择编辑器,当然是选择熟悉的`nano`啦!)
+
+ ```
+ $ crontab -e
+ ```
+
+ 6. 把下面的内容增加在文件最后,保存退出即可。
+
+ ```
+ # 1:00am, 1st day each month, run `xray-cert-renew.sh`
+ 0 1 1 * * bash /home/vpsadmin/xray_cert/xray-cert-renew.sh
+ ```
+
+ 7. 完整流程演示如下:
+
+
+
+## 7.4 配置 Xray
+
+首先,各种配置都可以参考[官方 VLESS 配置示例](https://github.com/XTLS/Xray-examples)。本文会基于官方示例,配置一个最精简的方式:【单 `VLESS` 协议入站 + `80` 端口回落】,满足大多数场景的最大速度及必要安全。
+
+1. 生成一个合法的 `UUID` 并保存备用(`UUID`可以简单粗暴的理解为像指纹一样几乎不会重复的 ID)
+
+ ```
+ $ xray uuid
+ ```
2. 建立日志文件及文件夹备用
- 1. 小小白白Linux基础命令:
- | 编号 | 命令名称 | 命令说明 |
- |:--:|:--:|:--:|
- | `cmd-16` | `touch` | 建立空白文件 |
-
- 2. 在`vpsadmin`的文件夹内建立一个【日志专用文件夹】
- ```
- $ mkdir ~/xray_log
- ```
- 2. 生成所需的两个日志文件(访问日志、错误日志)
- ```
- $ touch ~/xray_log/access.log && touch ~/xray_log/error.log
- ```
-
- ::: warning 注意
- 这个位置不是`Xray`标准的日志文件位置,放在这里是避免权限问题对新人的操作带来困扰。当你熟悉之后,建议回归默认位置: `/var/log/xray/access.log` 和 `/var/log/xray/error.log` 。
- :::
+ 1. 小小白白 Linux 基础命令:
+ | 编号 | 命令名称 | 命令说明 |
+ |:--:|:--:|:--:|
+ | `cmd-16` | `touch` | 建立空白文件 |
- 3. 因为Xray默认是nobody用户使用,所以我们需要让其他用户也有“写”的权限(`*.log` 就是所有文件后缀是`log`的文件,此时`CLI`界面的效率优势就逐渐出现了)
- ```
- $ chmod a+w ~/xray_log/*.log
- ```
+ 2. 在`vpsadmin`的文件夹内建立一个【日志专用文件夹】
+
+ ```
+ $ mkdir ~/xray_log
+ ```
+
+ 3. 生成所需的两个日志文件(访问日志、错误日志)
+
+ ```
+ $ 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`界面的效率优势就逐渐出现了)
+ ```
+ $ chmod a+w ~/xray_log/*.log
+ ```
3. 使用`nano`创建`Xray`的配置文件
- ```
- $ sudo nano /usr/local/etc/xray/config.json
- ```
-4. 将下面的文件全部复制进去,并将之前生成的`UUID`填入第61行 `"id": "",` 之中。(填好之后的样子是 `"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid"`),本文的这个配置文件中增加了我的各种啰嗦注解,以方便你理解每一个配置模块的功能是什么。
+ ```
+ $ sudo nano /usr/local/etc/xray/config.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": "AsIs",
- "rules": [
- // 3.1 防止服务器本地流转问题:如内网被攻击或滥用、错误的本地回环等
- {
- "type": "field",
- "ip": [
- "geoip:private" // 分流条件:geoip文件内,名为"private"的规则(本地)
- ],
- "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
- },
- // 3.2 屏蔽广告
- {
- "type": "field",
- "domain": [
- "geosite:category-ads-all" // 分流条件:geosite文件内,名为"category-ads-all"的规则(各种广告域名)
- ],
- "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
- }
- ]
- },
-
- // 4_入站设置
- // 4.1 这里只写了一个最简单的vless+xtls的入站,因为这是Xray最强大的模式。如有其他需要,请根据模版自行添加。
- "inbounds": [
- {
- "port": 443,
- "protocol": "vless",
- "settings": {
- "clients": [
- {
- "id": "", // 填写你的 UUID
- "flow": "xtls-rprx-direct",
- "level": 0,
- "email": "vpsadmin@yourdomain.com"
- }
- ],
- "decryption": "none",
- "fallbacks": [
- {
- "dest": 80 // 默认回落到防探测的代理
- }
- ]
- },
- "streamSettings": {
- "network": "tcp",
- "security": "xtls",
- "xtlsSettings": {
- "allowInsecure": false, // 正常使用应确保关闭
- "minVersion": "1.2", // TLS最低版本设置
- "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"
- }
- ]
- }
- ```
+4. 将下面的文件全部复制进去,并将之前生成的`UUID`填入第 61 行 `"id": "",` 之中。(填好之后的样子是 `"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid"`),本文的这个配置文件中增加了我的各种啰嗦注解,以方便你理解每一个配置模块的功能是什么。
+
+ ```
+ // 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": "AsIs",
+ "rules": [
+ // 3.1 防止服务器本地流转问题:如内网被攻击或滥用、错误的本地回环等
+ {
+ "type": "field",
+ "ip": [
+ "geoip:private" // 分流条件:geoip文件内,名为"private"的规则(本地)
+ ],
+ "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
+ },
+ // 3.2 屏蔽广告
+ {
+ "type": "field",
+ "domain": [
+ "geosite:category-ads-all" // 分流条件:geosite文件内,名为"category-ads-all"的规则(各种广告域名)
+ ],
+ "outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
+ }
+ ]
+ },
+
+ // 4_入站设置
+ // 4.1 这里只写了一个最简单的vless+xtls的入站,因为这是Xray最强大的模式。如有其他需要,请根据模版自行添加。
+ "inbounds": [
+ {
+ "port": 443,
+ "protocol": "vless",
+ "settings": {
+ "clients": [
+ {
+ "id": "", // 填写你的 UUID
+ "flow": "xtls-rprx-direct",
+ "level": 0,
+ "email": "vpsadmin@yourdomain.com"
+ }
+ ],
+ "decryption": "none",
+ "fallbacks": [
+ {
+ "dest": 80 // 默认回落到防探测的代理
+ }
+ ]
+ },
+ "streamSettings": {
+ "network": "tcp",
+ "security": "xtls",
+ "xtlsSettings": {
+ "allowInsecure": false, // 正常使用应确保关闭
+ "minVersion": "1.2", // TLS最低版本设置
+ "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. 完整流程演示如下:
-
+
-
-
-## 7.5 启动Xray服务!!(并查看服务状态)
+## 7.5 启动 Xray 服务!!(并查看服务状态)
如果你是跟随本文一步步设置过来,其实就已经避开了最常见**日志文件权限不足**、**证书文件权限不足** 这两个大坑。那么现在运行`Xray`自然应该无比顺利。
1. 输入下面的命令,享受启动`Xray`的历史性时刻吧!!!
- ```
- $ sudo systemctl start xray
- ```
-2. 仅仅`start`我们并不能确定是否成功的开启了Xray的服务,要确定它的状态,就要用到下面的命令。
- ```
- $ sudo systemctl status xray
- ```
+ ```
+ $ sudo systemctl start xray
+ ```
- 看到那个绿色的、令人愉悦的 `active (running)` 了吗?它就是说 `Xray` 已经在正确的运行了
+2. 仅仅`start`我们并不能确定是否成功的开启了 Xray 的服务,要确定它的状态,就要用到下面的命令。
+
+ ```
+ $ sudo systemctl status xray
+ ```
+
+ 看到那个绿色的、令人愉悦的 `active (running)` 了吗?它就是说 `Xray` 已经在正确的运行了
3. 完整流程演示如下:
-
-
-
+
## 7.6 回顾 `systemd` 进行基本的服务管理
-到现在为止,我们已经使用过了`systemctl`相关的`start`, `status`, `reload` 等命令,这些都是基于`systmed`管理模块对Linux系统中各种服务进行管理的通用命令。现在正好熟悉一下相关的其他几个命令。
+到现在为止,我们已经使用过了`systemctl`相关的`start`, `status`, `reload` 等命令,这些都是基于`systmed`管理模块对 Linux 系统中各种服务进行管理的通用命令。现在正好熟悉一下相关的其他几个命令。
1. 若你需要暂时关闭 `Xray` 的服务,那就用`stop`命令
- ```
- $ sudo systemctl stop xray
- ```
+
+ ```
+ $ sudo systemctl stop xray
+ ```
2. 若你需要重启`Xray`的服务,那就用`restart`命令
- ```
- $ sudo systemctl restart xray
- ```
-3. 若你需要禁用`Xray`的服务(电脑重启后禁止Xray自动运行),那就用`disable`命令
- ```
- $ sudo systemctl disable xray
- ```
+ ```
+ $ sudo systemctl restart xray
+ ```
-4. 若你需要启用`Xray`的服务(电脑重启后确保Xray自动运行),那就用`enable`命令
- ```
- $ sudo systemctl enable xray
- ```
+3. 若你需要禁用`Xray`的服务(电脑重启后禁止 Xray 自动运行),那就用`disable`命令
+ ```
+ $ sudo systemctl disable xray
+ ```
+4. 若你需要启用`Xray`的服务(电脑重启后确保 Xray 自动运行),那就用`enable`命令
+ ```
+ $ sudo systemctl enable xray
+ ```
-## 7.7 服务器优化之一:开启BBR
+## 7.7 服务器优化之一:开启 BBR
1. 传说中的`BBR`
-
- 我相信,你在搜索各种科学上网技术的时候,肯定不止一次的听过`bbr`这个东西,在各种博客添油加醋之下,让人觉得它神乎其神。更有`bbrplus`, `bbr2`, `魔改bbr` 等一大堆衍生品。仿佛神油一般,用了就能野鸡线路变专线。
-
- 那么,这东西究竟是什么?它有没有用?又该用哪一个版本呢?
+
+ 我相信,你在搜索各种科学上网技术的时候,肯定不止一次的听过`bbr`这个东西,在各种博客添油加醋之下,让人觉得它神乎其神。更有`bbrplus`, `bbr2`, `魔改bbr` 等一大堆衍生品。仿佛神油一般,用了就能野鸡线路变专线。
+
+ 那么,这东西究竟是什么?它有没有用?又该用哪一个版本呢?
2. 实际的`BBR`
- **BBR** = **B**ottleneck **B**andwidth and **R**ound-trip propagation time,是一种TCP的**拥塞控制算法**。简单粗暴的理解就是**数据流量的交通管理**:当公路不再塞车的时候,每辆车自然就能保持较快的车速了。
+ **BBR** = **B**ottleneck **B**andwidth and **R**ound-trip propagation time,是一种 TCP 的**拥塞控制算法**。简单粗暴的理解就是**数据流量的交通管理**:当公路不再塞车的时候,每辆车自然就能保持较快的车速了。
- 那么它有没有用呢?一般而言,`有BBR` 和 `没有BBR` 会有可以感知的差别(速度、稳定性、延迟方面都会有一些改善),所以 **【非常建议开启 `BBR`】**。
-
- 但开启之后,`BBR` 在 `4.x` 和 `5.x` 之间的差异往往比较微妙、见仁见智,造成体验差别的决定性因素仍然是线路质量。所以 **【不必纠结版本、不必盲目追新、跟随你的发行版更新内核即可】**
+ 那么它有没有用呢?一般而言,`有BBR` 和 `没有BBR` 会有可以感知的差别(速度、稳定性、延迟方面都会有一些改善),所以 **【非常建议开启 `BBR`】**。
+
+ 但开启之后,`BBR` 在 `4.x` 和 `5.x` 之间的差异往往比较微妙、见仁见智,造成体验差别的决定性因素仍然是线路质量。所以 **【不必纠结版本、不必盲目追新、跟随你的发行版更新内核即可】**
3. `bbrplus`, `bbr2`, `魔改bbr` 和其他各种听起来就酷炫的版本是不是更好?
- 一句话:**不是!不要用这些!这些都为了吸引眼球乱起的名字!**
+ 一句话:**不是!不要用这些!这些都为了吸引眼球乱起的名字!**
- `BBR` 的更新和发布,都是跟随Linux的内核(`Kernel`)进行的。换言之,只要你用的是比较新的内核,就自然会使用到新版`BBR`。
+ `BBR` 的更新和发布,都是跟随 Linux 的内核(`Kernel`)进行的。换言之,只要你用的是比较新的内核,就自然会使用到新版`BBR`。
- 而这些名字看起来很酷炫的东西,说白了就是仍未正式发布的、尚在测试阶段的内核及其对应的`BBR`版本。这些脚本也仅仅就是通过下载预览版的内核(甚至第三方魔改内核)来率先开启而已。
+ 而这些名字看起来很酷炫的东西,说白了就是仍未正式发布的、尚在测试阶段的内核及其对应的`BBR`版本。这些脚本也仅仅就是通过下载预览版的内核(甚至第三方魔改内核)来率先开启而已。
- 内核的稳定是一台服务器稳定运行的基石。**【BBR测试版带来的细微性能差异绝对不值得更换不稳定的内核。】** 请选择你所在的Linux发行版所支持的最新内核,这样可以最大限度的保持服务器的长期稳定和兼容。
+ 内核的稳定是一台服务器稳定运行的基石。**【BBR 测试版带来的细微性能差异绝对不值得更换不稳定的内核。】** 请选择你所在的 Linux 发行版所支持的最新内核,这样可以最大限度的保持服务器的长期稳定和兼容。
::: warning 注意
所谓魔改`bbr`的【领先】是有非常强的时效性的。比如很多 `bbrplus` 脚本,因为几年来都没有更新,到现在还会把你的内核换成 `4.19`,要知道现在稳定如 Debian 已经是 `5.9` 的时代了,那么这个脚本放在2018年1月也许领先了一点,到2018年10月4.19正发布时就已经失去了意义,放在现在甚至可以说是完完全全的【降级】和【劣化】
:::
-
4. `fq`, `fq_codel`, `fq_pie`, `cake`和其他算法哪个好?
- 一句话:**看不懂的话,请保持`fq`,足够、且不会劣化你的线路**
+ 一句话:**看不懂的话,请保持`fq`,足够、且不会劣化你的线路**
-5. 锐速、Finalspeed、LotServer和其他“加速工具”
+5. 锐速、Finalspeed、LotServer 和其他“加速工具”
- 一句话:**不要用这些!把他们丢进历史的垃圾桶吧!**
+ 一句话:**不要用这些!把他们丢进历史的垃圾桶吧!**
- 它能解决的也只有丢包率的问题。不太准确的比喻,就是本来你用一辆车送你的货,有时候车半路就坏了(丢包),用了这些以后,你直接派出3份一样的货,让三辆车同时送,只要有一辆没坏就能送到。马路上都是你的车,自然就能把别人挤下去。但可想而知,你挤别人的时候,别人也会来挤你,而整个机房的出口道路一共就那么宽,最终势必就变成集体大堵车了。
+ 它能解决的也只有丢包率的问题。不太准确的比喻,就是本来你用一辆车送你的货,有时候车半路就坏了(丢包),用了这些以后,你直接派出 3 份一样的货,让三辆车同时送,只要有一辆没坏就能送到。马路上都是你的车,自然就能把别人挤下去。但可想而知,你挤别人的时候,别人也会来挤你,而整个机房的出口道路一共就那么宽,最终势必就变成集体大堵车了。
- ::: warning 说明
- 它们的原理不是算法优化、不是提速、大多数是简单粗暴的**多倍发包**。对于【丢包率非常高】的差线路可能有一点作用,但【对丢包率低的好线路没有任何优化作用,反而会成倍的消耗你的流量】,进而造成服务器和你的邻居不必要的压力。
+ ::: warning 说明
+ 它们的原理不是算法优化、不是提速、大多数是简单粗暴的**多倍发包**。对于【丢包率非常高】的差线路可能有一点作用,但【对丢包率低的好线路没有任何优化作用,反而会成倍的消耗你的流量】,进而造成服务器和你的邻居不必要的压力。
- 如果你的线路真的丢包率奇高,真正靠谱的解决方案是【换线路】。
- :::
+ 如果你的线路真的丢包率奇高,真正靠谱的解决方案是【换线路】。
+ :::
-6. 啰嗦了这么多,就是因为围绕 `BBR` 忽悠小白的错误概念和坑人脚本实在是太多了。我希望你们现在对 `BBR` 有了相对清晰的理解。接下来,我们就动手安装最新的Debian内核并开启`BBR` 吧!(真的很简单)
- 1. 给 Debian 10 添加官方 `backports` 源,获取更新的软件库
- ```
- $ sudo nano /etc/apt/sources.list
- ```
-
- ::: warning 说明
- 本文以 Debian 10 为例,所以使用 `/etc/apt/sources.list` 仍无问题,但如果你并不是根据本文从头开始,或者使用了其他Linux发行版,那么建议你建立 `/etc/apt/sources.list.d/` 文件夹,并在这个文件夹内建立自己的配置文件,形如 `/etc/apt/sources.list.d/vpsadmin.list`,以此保证兼容性,也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。
- :::
-
-
- 2. 然后把下面这一条加在最后,并保存退出。
- ```
- deb http://deb.debian.org/debian buster-backports main
- ```
-
- 3. 刷新软件库并查询 Debian 官方的最新版内核并安装。请务必安装你的VPS对应的版本(本文以比较常见的【amd64】为例)。
- ```
- $ sudo apt update && sudo apt -t buster-backports install linux-image-amd64
- ```
-
- ::: warning 注意
- 如果你的VPS支持,可以尝试【云服务器专用内核】`linux-image-cloud-amd64`,优点就是精简、资源占用低,缺点嘛是有同学反馈不支持的系统强行安装会导致无法开机(Kernel无法识别)。
+6. 啰嗦了这么多,就是因为围绕 `BBR` 忽悠小白的错误概念和坑人脚本实在是太多了。我希望你们现在对 `BBR` 有了相对清晰的理解。接下来,我们就动手安装最新的 Debian 内核并开启`BBR` 吧!(真的很简单)
- 为了避免无法识别的悲剧,请确保:
- - 尝试前做一个系统快照,或者
- - 你有 `vnc` 可以救场(并且你知道怎么用)
+ 1. 给 Debian 10 添加官方 `backports` 源,获取更新的软件库
+
+ ```
+ $ sudo nano /etc/apt/sources.list
+ ```
+
+ ::: warning 说明
+ 本文以 Debian 10 为例,所以使用 `/etc/apt/sources.list` 仍无问题,但如果你并不是根据本文从头开始,或者使用了其他 Linux 发行版,那么建议你建立 `/etc/apt/sources.list.d/` 文件夹,并在这个文件夹内建立自己的配置文件,形如 `/etc/apt/sources.list.d/vpsadmin.list`,以此保证兼容性,也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。
+ :::
+
+ 2) 然后把下面这一条加在最后,并保存退出。
+
+ ```
+ deb http://deb.debian.org/debian buster-backports main
+ ```
+
+ 3) 刷新软件库并查询 Debian 官方的最新版内核并安装。请务必安装你的 VPS 对应的版本(本文以比较常见的【amd64】为例)。
+
+ ```
+ $ sudo apt update && sudo apt -t buster-backports install linux-image-amd64
+ ```
+
+ ::: warning 注意
+ 如果你的 VPS 支持,可以尝试【云服务器专用内核】`linux-image-cloud-amd64`,优点就是精简、资源占用低,缺点嘛是有同学反馈不支持的系统强行安装会导致无法开机(Kernel 无法识别)。
+
+ 为了避免无法识别的悲剧,请确保:
+
+ - 尝试前做一个系统快照,或者
+ - 你有 `vnc` 可以救场(并且你知道怎么用)
:::
- 4. 修改 `kernel` 参数配置文件 `sysctl.conf` 并指定开启 `BBR`
- ```
- $ sudo nano /etc/sysctl.conf
- ```
+ 4) 修改 `kernel` 参数配置文件 `sysctl.conf` 并指定开启 `BBR`
- ::: warning 说明
- 本文以 Debian 10 为例,所以使用 `/etc/sysctl.conf` 仍无问题,但如果你并不是跟着本文从头开始,或者使用了其他Linux发行版,那么建议你建立 `/etc/sysctl.d/` 文件夹,并在这个文件夹内建立自己的配置文件,形如 `/etc/sysctl.d/vpsadmin.conf`,以此保证兼容性,因为部分发行版在 `systemd` 207 版本之后便不再从 `/etc/sysctl.conf` 读取参数。使用自定义配置文件也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。
- :::
+ ```
+ $ sudo nano /etc/sysctl.conf
+ ```
+
+ ::: warning 说明
+ 本文以 Debian 10 为例,所以使用 `/etc/sysctl.conf` 仍无问题,但如果你并不是跟着本文从头开始,或者使用了其他 Linux 发行版,那么建议你建立 `/etc/sysctl.d/` 文件夹,并在这个文件夹内建立自己的配置文件,形如 `/etc/sysctl.d/vpsadmin.conf`,以此保证兼容性,因为部分发行版在 `systemd` 207 版本之后便不再从 `/etc/sysctl.conf` 读取参数。使用自定义配置文件也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。
+ :::
5. 把下面的内容添加进去
@@ -435,7 +454,7 @@
7. 完整流程演示如下:
- ::: tip 啰嗦君
+ ::: tip 啰嗦君
因为我做展示的VPS支持云服务器专用内核,所以动图中我用了 `linux-image-cloud-amd64` 。如果你不确定你的VPS是否支持,那请务必按照第3步的命令,使用常规内核 `linux-image-amd64`。
:::
@@ -468,65 +487,65 @@
sch_fq
```
+## 7.8 服务器优化之二:开启 HTTP 自动跳转 HTTPS
+1. 之前我们已经搭建了 `80` 端口的 `http` 网页,并以此申请了 TLS 证书。
-## 7.8 服务器优化之二:开启HTTP自动跳转HTTPS
+ 但如果你尝试过用浏览器访问我们的这个界面,就会发现 `http` 访问并不会像大多数网站一样自动升级为 `https` 访问。换言之,我们现在的设置下,`http(80)` 和 `https(443)`之间完全是独立的。如果要解决这个问题,就需要做一些修改。
-1. 之前我们已经搭建了 `80` 端口的 `http` 网页,并以此申请了TLS证书。
+2. 编辑 Nginx 的配置文件
- 但如果你尝试过用浏览器访问我们的这个界面,就会发现 `http` 访问并不会像大多数网站一样自动升级为 `https` 访问。换言之,我们现在的设置下,`http(80)` 和 `https(443)`之间完全是独立的。如果要解决这个问题,就需要做一些修改。
+ ```
+ $ sudo nano /etc/nginx/nginx.conf
+ ```
-2. 编辑Nginx的配置文件
- ```
- $ sudo nano /etc/nginx/nginx.conf
- ```
+3. 在我们设置过的 80 端口 Server 中加入下面的语句,并保存退出(可同时删除`root`和`index`两行)
-3. 在我们设置过的80端口Server中加入下面的语句,并保存退出(可同时删除`root`和`index`两行)
- ```
- return 301 https://$http_host$request_uri;
- ```
+ ```
+ 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 服务
- ```
- $ sudo systemctl restart nginx
- ```
-6. 修改Xray的回落设置,将回落从 `80` 端口改为 `8080` 端口。(找到 `"dest": 80`, 并改成 `"dest": 8080`)
- ```
- $ sudo nano /usr/local/etc/xray/config.json
- ```
+ ```
+ 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 服务
+
+ ```
+ $ sudo systemctl restart nginx
+ ```
+
+6. 修改 Xray 的回落设置,将回落从 `80` 端口改为 `8080` 端口。(找到 `"dest": 80`, 并改成 `"dest": 8080`)
+
+ ```
+ $ sudo nano /usr/local/etc/xray/config.json
+ ```
7. 重启 `Xray` 服务,即完成了设置
- ```
- $ sudo systemctl restart xray
- ```
+
+ ```
+ $ sudo systemctl restart xray
+ ```
8. 完整流程演示如下:
-
-
-9. 当你输入 `http://a-name.yourdomain.com`的时候,它应该已经会自动跳转https了
-
-
+
+9. 当你输入 `http://a-name.yourdomain.com`的时候,它应该已经会自动跳转 https 了
+
## 7.9 服务器优化之三:更丰富的回落
如果你需要更丰富的回落功能,可以参考 [《回落 (fallbacks) 功能简析》](../../level-1/fallbacks-lv1/)
-
-
## 7.10 你的进度
恭喜!!到这一步,你已经拥有了可以正常科学上网的服务器、同时也有了可以防止主动探测攻击的伪装网站。接下来,只要给你的客户端装上合适的软件,就可以享受顺畅的网络了!
@@ -537,20 +556,19 @@
1. 初版中`Xray`配置文件`config.json`文件夹位置错误。若你已经根据之前的位置进行了操作,`Xray`会无法正确启动。故勘误说明于此,请自查,造成不便十分抱歉!
- - 正确位置:`/usr/local/etc/xray/config.json`
- - 错误位置:`/usr/local/etc/config.json`
+ - 正确位置:`/usr/local/etc/xray/config.json`
+ - 错误位置:`/usr/local/etc/config.json`
- 受影响章节:
+ 受影响章节:
- - 7.4 配置`Xray` - 3. 使用`nano`创建`Xray`的配置文件
- - 7.8 服务器优化之二 - 6. 修改`Xray`的回落设置
+ - 7.4 配置`Xray` - 3. 使用`nano`创建`Xray`的配置文件
+ - 7.8 服务器优化之二 - 6. 修改`Xray`的回落设置
+2) 初版中修改`Nginx`配置文件`nginx.conf`时内容错误(网页文件夹位置错误),若你已经根据之前的位置进行了操作,`Nginx`会无法找到正确的网站。请自查,造成不便十分抱歉!
-2. 初版中修改`Nginx`配置文件`nginx.conf`时内容错误(网页文件夹位置错误),若你已经根据之前的位置进行了操作,`Nginx`会无法找到正确的网站。请自查,造成不便十分抱歉!
+ - 正确文件夹位置:`root /home/vpsadmin/www/webpage;`
+ - 错误文件夹位置:`root /var/www/website/html`
- - 正确文件夹位置:`root /home/vpsadmin/www/webpage;`
- - 错误文件夹位置:`root /var/www/website/html`
+ 受影响章节:
- 受影响章节:
-
- - 7.8 服务器优化之二 - 4. 在与 `80` 端口同级的位置增加一个本地端口监听来提供网页展示
+ - 7.8 服务器优化之二 - 4. 在与 `80` 端口同级的位置增加一个本地端口监听来提供网页展示
diff --git a/docs/document/level-0/ch08-xray-clients.md b/docs/document/level-0/ch08-xray-clients.md
index 1e9d5c8..8b3ec33 100644
--- a/docs/document/level-0/ch08-xray-clients.md
+++ b/docs/document/level-0/ch08-xray-clients.md
@@ -1,6 +1,6 @@
-# 【第8章】Xray客户端篇
+# 【第 8 章】Xray 客户端篇
-## 8.1 Xray的工作原理简述
+## 8.1 Xray 的工作原理简述
要正确的配置和使用`Xray`,就需要正确的理解其工作原理,对于新人,可以先看看下面简化的示意图(省略了许多复杂的设置):
@@ -8,115 +8,118 @@
这其中的关键点是:
-1. APP要主动或借助转发工具,将数据【流入(`inbounds`)】`Xray` 客户端
+1. APP 要主动或借助转发工具,将数据【流入(`inbounds`)】`Xray` 客户端
2. 流量进入客户端后,会被【客户端路由(`routing`)】按规则处理后,向不同方向【流出`(outbounds)`】`Xray` 客户端。比如:
- 1. 国内流量直连(`direct`)
- 2. 国外流量转发VPS(`proxy`)
- 3. 广告流量屏蔽(`block`)
+ 1. 国内流量直连(`direct`)
+ 2. 国外流量转发 VPS(`proxy`)
+ 3. 广告流量屏蔽(`block`)
-3. 向VPS转发的国外流量,会跨过防火墙,【流入(`inbounds`)】 `Xray` 服务器端
+3. 向 VPS 转发的国外流量,会跨过防火墙,【流入(`inbounds`)】 `Xray` 服务器端
4. 流量进入服务器端后,与客户端一样,会被【服务器端路由(`routing`)】按规则处理后,向不同方向【流出`(outbounds)`】:
- 1. 因为已经在防火墙之外,所以流量默认直连,你就可以访问到不存在网站们了(`direct`)
- 2. 如果需要在不同的VPS之间做链式转发,就可以继续配置转发规则(`proxy`)
- 3. 你可以在服务器端继续禁用各种你想禁用的流量,如广告、BT下载等(`block`)
+ 1. 因为已经在防火墙之外,所以流量默认直连,你就可以访问到不存在网站们了(`direct`)
+ 2. 如果需要在不同的 VPS 之间做链式转发,就可以继续配置转发规则(`proxy`)
+ 3. 你可以在服务器端继续禁用各种你想禁用的流量,如广告、BT 下载等(`block`)
:::warning 注意
**注意:** 请务必记得,`Xray` 的路由配置非常灵活,上面的说明只是无限可能性中的一种。
-借助 `geosite.dat` 和 `geoip.dat` 这两个文件,可以很灵活的从【域名】和【IP】这两个角度、不留死角的控制流量流出的方向。这比曾经单一笼统的 `GFWList` 强大很多很多,可以做到非常细致的微调:比如可以指定Apple域名直连或转发、指定亚马逊域名代理或转发,百度的域名屏蔽等等。。。)
+借助 `geosite.dat` 和 `geoip.dat` 这两个文件,可以很灵活的从【域名】和【IP】这两个角度、不留死角的控制流量流出的方向。这比曾经单一笼统的 `GFWList` 强大很多很多,可以做到非常细致的微调:比如可以指定 Apple 域名直连或转发、指定亚马逊域名代理或转发,百度的域名屏蔽等等。。。)
现在,[《路由 (routing) 功能简析》](../../level-1/routing-lv1-part1) 已经上线,我建议对路由功能有兴趣的同学,先继续跟着本文完成客户端的基础配置,之后再去这里详细学习。
:::
## 8.2 客户端与服务器端正确连接
-现在你已经理解了 `Xray` 的工作原理,那么接下来的配置,其实就是【告诉你的客户端如何连接VPS服务器】。这和你已经很熟悉的、告诉`PuTTY`如何远程连接服务器是一样的。只不过Xray连接时的要素不止是【IP地址】+【端口】+【用户名】+【密码】这四要素了。
+现在你已经理解了 `Xray` 的工作原理,那么接下来的配置,其实就是【告诉你的客户端如何连接 VPS 服务器】。这和你已经很熟悉的、告诉`PuTTY`如何远程连接服务器是一样的。只不过 Xray 连接时的要素不止是【IP 地址】+【端口】+【用户名】+【密码】这四要素了。
-实际上,`Xray`的连接要素是由不同的[协议](../../../config/inbound-protocols/)决定的。本文在第7章的配置文件 `config.json` 里,我们使用 `Xray` 下独特而强大的 `VLESS` 协议 + `XTLS` 流控。所以看看那个配置文件的内容就能知道,这个协议组合的连接要素有:
+实际上,`Xray`的连接要素是由不同的[协议](../../../config/inbound-protocols/)决定的。本文在第 7 章的配置文件 `config.json` 里,我们使用 `Xray` 下独特而强大的 `VLESS` 协议 + `XTLS` 流控。所以看看那个配置文件的内容就能知道,这个协议组合的连接要素有:
- 服务器【地址】: `a-name.yourdomain.com`
- 服务器【端口】: `443`
- 连接的【协议】: `vless`
-- 连接的【流控】: `xtls-rprx-direct` (direct模式适合全平台,若是Linux/安卓用户,可改成 `xtls-rprx-splice` 性能全开)
+- 连接的【流控】: `xtls-rprx-direct` (direct 模式适合全平台,若是 Linux/安卓用户,可改成 `xtls-rprx-splice` 性能全开)
- 连接的【验证】: `uuiduuid-uuid-uuid-uuiduuiduuid`
- 连接的【安全】: `"allowInsecure": false`
-鉴于新人一般都会使用手机APP或者电脑的GUI客户端,我就把常用的客户端罗列在下面。每个客户端都有自己独特的配置界面,逐一截图展示并不现实,所以请你务必仔细阅读这些客户端的说明、然后把上述要素填入合适的地方即可。
+鉴于新人一般都会使用手机 APP 或者电脑的 GUI 客户端,我就把常用的客户端罗列在下面。每个客户端都有自己独特的配置界面,逐一截图展示并不现实,所以请你务必仔细阅读这些客户端的说明、然后把上述要素填入合适的地方即可。
:::warning 注意
许多工具其实是同时支持 `xray-core` 和 `v2fly-core` 的,但默认内置的不一定是哪个,所以别忘记检查一下是否是你想要的那个在工作哦!
:::
-- **v2rayN - 适用于Windows平台**
- - 请从它的[GitHub仓库Release页面](https://github.com/2dust/v2rayN/releases)获取最新版
- - 请根据该客户端的说明进行设置
+- **v2rayN - 适用于 Windows 平台**
-- **v2rayNG - 适用于Android平台**
- - 请从它的[GitHub仓库Release页面](https://github.com/2dust/v2rayNG/releases)获取最新版
- - 请根据该客户端的说明进行设置
+ - 请从它的[GitHub 仓库 Release 页面](https://github.com/2dust/v2rayN/releases)获取最新版
+ - 请根据该客户端的说明进行设置
-- **Shadowrocket - 适用于iOS, 基于苹果M芯片的macOS**
- - 你需要注册一个【非中国区】的iCloud账户
- - 你需要通过 App Store 搜索并购买
- - 请根据该客户端的说明进行设置
+- **v2rayNG - 适用于 Android 平台**
-- **Qv2ray - 跨平台图形界面,适用于Linux, Windows, macOS**
- - 请从它的[GitHub仓库Release页面](https://github.com/Qv2ray/Qv2ray/releases)获取最新版(还可以从它的[GitHub自动构建仓库](https://github.com/Qv2ray/Qv2ray/actions)寻找更新的版本)
- - 请从它的[项目主页](https://qv2ray.net/)学习文档
- - 请根据该客户端的说明进行设置
+ - 请从它的[GitHub 仓库 Release 页面](https://github.com/2dust/v2rayNG/releases)获取最新版
+ - 请根据该客户端的说明进行设置
+
+- **Shadowrocket - 适用于 iOS, 基于苹果 M 芯片的 macOS**
+
+ - 你需要注册一个【非中国区】的 iCloud 账户
+ - 你需要通过 App Store 搜索并购买
+ - 请根据该客户端的说明进行设置
+
+- **Qv2ray - 跨平台图形界面,适用于 Linux, Windows, macOS**
+ - 请从它的[GitHub 仓库 Release 页面](https://github.com/Qv2ray/Qv2ray/releases)获取最新版(还可以从它的[GitHub 自动构建仓库](https://github.com/Qv2ray/Qv2ray/actions)寻找更新的版本)
+ - 请从它的[项目主页](https://qv2ray.net/)学习文档
+ - 请根据该客户端的说明进行设置
到这一步,你的全套配置就已经可以正常使用啦!
-## 8.3 附加题 1:在PC端手工配置 `xray-core`
+## 8.3 附加题 1:在 PC 端手工配置 `xray-core`
虽然到上面一步已经可以结束了,但是如果你是个好奇心强、记忆力好的的同学,一定会想起来我在上一章说过,你把`xray-core` 的二进制文件“放在服务器运行,它就是服务器端;你把它下载到本地电脑运行,它就是客户端。” 那究竟要怎样直接使用 `xray-core` 做客户端呢?
为了回答这个问题,我加入了附加题章节,有一点点超纲,有一点点麻烦,但费这个笔墨是因为这个方式有它的优势:
-- 第一时间获得最新版而无需等待APP升级适配
+- 第一时间获得最新版而无需等待 APP 升级适配
-- 灵活自由的路由配置能力(当然GUI客户端中Qv2ray的高级路由编辑器非常强大,也可以完整实现xray-core的路由配置功能)
+- 灵活自由的路由配置能力(当然 GUI 客户端中 Qv2ray 的高级路由编辑器非常强大,也可以完整实现 xray-core 的路由配置功能)
-- 节约系统资源 (GUI界面一定会有资源消耗,消耗的多少则取决于客户端的实现)
+- 节约系统资源 (GUI 界面一定会有资源消耗,消耗的多少则取决于客户端的实现)
它的劣势应该就是【需要手写配置文件】有点麻烦了。但其实,你想想,服务器上你已经成功的写过一次了,现在又有什么区别呢?接下来,还是老样子,我们分解一下步骤:
-1. 首先请从Xray官方的 [GitHub仓库Release页面](https://github.com/XTLS/Xray-core/releases) 获取对应平台的版本,并解压缩到合适的文件夹
+1. 首先请从 Xray 官方的 [GitHub 仓库 Release 页面](https://github.com/XTLS/Xray-core/releases) 获取对应平台的版本,并解压缩到合适的文件夹
2. 在合适的文件夹建立空白配置文件:`config.json` (自己常用平台下新建文件大家肯定都会,这就真不用啰嗦了)
3. 至于什么是“合适的文件夹”?这就取决于具体的平台了~
4. 填写客户端配置
- - 我就以 `8.1` 原理说明里展示的基本三类分流(国内流量直连、国际流量转发VPS、广告流量屏蔽),结合 `8.2` 的连接要素,写成一个配置文件
- - 请将 `uuid` 替换成与你服务器一致的 `uuid`
- - 请将 `address` 替换成你的真实域名
- - 请将 `serverName` 替换成你的真实域名
- - 各个配置模块的说明我都已经(很啰嗦的)放在对应的配置点上了
+ - 我就以 `8.1` 原理说明里展示的基本三类分流(国内流量直连、国际流量转发 VPS、广告流量屏蔽),结合 `8.2` 的连接要素,写成一个配置文件
+ - 请将 `uuid` 替换成与你服务器一致的 `uuid`
+ - 请将 `address` 替换成你的真实域名
+ - 请将 `serverName` 替换成你的真实域名
+ - 各个配置模块的说明我都已经(很啰嗦的)放在对应的配置点上了
```
// 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_日志设置
// 注意,本例中我默认注释掉了日志文件,因为windows, macOS, Linux 需要写不同的路径,请自行配置
"log": {
// "access": "/home/local/xray_log/access.log", // 访问记录
// "error": "/home/local/xray_log/error.log", // 错误记录
- "loglevel": "warning" // 内容从少到多: "none", "error", "warning", "info", "debug"
+ "loglevel": "warning" // 内容从少到多: "none", "error", "warning", "info", "debug"
},
-
+
// 2_DNS设置
"dns": {
"servers": [
@@ -148,7 +151,7 @@
"localhost"
]
},
-
+
// 3_分流设置
// 所谓分流,就是将符合否个条件的流量,用指定`tag`的出站协议去处理(对应配置的5.x内容)
"routing": {
@@ -212,7 +215,7 @@
"port": 10801 // 这个是通过http协议做本地转发的端口
}
],
-
+
// 5_出站设置
"outbounds": [
// 5.1 默认转发VPS
@@ -256,44 +259,42 @@
"tag": "block",
"protocol": "blackhole"
}
- ]
+ ]
}
```
-## 8.4 附加题 2:在PC端手工运行 `xray-core`
+## 8.4 附加题 2:在 PC 端手工运行 `xray-core`
写好了配置文件该,要怎么让 `xray-core` 运行起来呢?双击好像并没有反应啊?
首先,你要找到电脑上的【命令行界面】。
-1. Linux桌面、macOS系统的同学肯定已经比较熟悉了,搜索 `Console` 或者 `Terminal` 就可以
-2. Windows就可以搜索使用 `Cmd` 或者 `Powershell` 等程序(WSL的同学你坐下,你的 `Console` 当然也可以)
+1. Linux 桌面、macOS 系统的同学肯定已经比较熟悉了,搜索 `Console` 或者 `Terminal` 就可以
+2. Windows 就可以搜索使用 `Cmd` 或者 `Powershell` 等程序(WSL 的同学你坐下,你的 `Console` 当然也可以)
其次,我们要做的事情是【让 `xray` 找到并读取配置文件 `config.json`,然后运行】,所以:
-1. 在Windows下,假设你的 `Xray` 程序位置是 `C:\Xray-windows-64\xray.exe`,配置文件位置是`C:\Xray-windows-64\config.json`,那么正确的启动命令就是:
+1. 在 Windows 下,假设你的 `Xray` 程序位置是 `C:\Xray-windows-64\xray.exe`,配置文件位置是`C:\Xray-windows-64\config.json`,那么正确的启动命令就是:
- ```
- C:\Xray-windows-64\xray.exe -c C:\Xray-windows-64\config.json
- ```
+ ```
+ C:\Xray-windows-64\xray.exe -c C:\Xray-windows-64\config.json
+ ```
- :::tip 说明
- 这里的 `-c` 就是指定配置文件路径的参数,告诉 `xray` 去后面的位置找配置文件
- :::
+ :::tip 说明
+ 这里的 `-c` 就是指定配置文件路径的参数,告诉 `xray` 去后面的位置找配置文件
+ :::
-2. 相似的,在Linux和macOS下,假设你的 `Xray` 程序位置是 `/usr/local/bin/xray`,配置文件位置是`/usr/local/etc/xray/config.json`,那么正确的启动命令就是
+2. 相似的,在 Linux 和 macOS 下,假设你的 `Xray` 程序位置是 `/usr/local/bin/xray`,配置文件位置是`/usr/local/etc/xray/config.json`,那么正确的启动命令就是
- ```
- $ /usr/local/bin/xray -c /usr/local/etc/xray/config.json
- ```
+ ```
+ $ /usr/local/bin/xray -c /usr/local/etc/xray/config.json
+ ```
- :::tip 说明
- 每个系统都有系统路径变量,所以写 `Xray` 程序时不一定要写绝对路径。但是写了肯定没错,所以我就如此演示了。
- :::
+ :::tip 说明
+ 每个系统都有系统路径变量,所以写 `Xray` 程序时不一定要写绝对路径。但是写了肯定没错,所以我就如此演示了。
+ :::
-
-
-## 8.5 附加题 3:在PC端开机自动运行 `xray-core`
+## 8.5 附加题 3:在 PC 端开机自动运行 `xray-core`
如果你真的尝试了手动运行 `xray-core`,你一定会发现这个方式还有点小问题:
@@ -302,34 +303,31 @@
我可以肯定的告诉你:**完全可以解决**。但是具体的解决方式,就当作课外作业留给大家吧!(友情提示,文档站的问答区有线索哦)
-
-
## 8.6 圆满完成!
-我相信,有耐心看到这里的同学,都是兼具好奇心和行动力的学习派!我现在要郑重的恭喜你,因为到了这里,你已经完完整整的【**从第一条命令开始,完成了VPS服务器部署,并成功的在客户端配置使用Xray**】了!这毫无疑问是一个巨大的胜利!
+我相信,有耐心看到这里的同学,都是兼具好奇心和行动力的学习派!我现在要郑重的恭喜你,因为到了这里,你已经完完整整的【**从第一条命令开始,完成了 VPS 服务器部署,并成功的在客户端配置使用 Xray**】了!这毫无疑问是一个巨大的胜利!
我相信,你现在一定对`Linux`不再恐惧,对`Xray`不再陌生了吧!
-**至此,小小白白话文圆满结束!**
+**至此,小小白白话文圆满结束!**
+
> ⬛⬛⬛⬛⬛⬛⬛⬛ 100%
-
-
## 8.7 TO INFINITY AND BEYOND!
-**但现在你看到的,远远不是Xray的全貌。**
+**但现在你看到的,远远不是 Xray 的全貌。**
`Xray`是一个强大而丰富的网络工具集合,平台化的提供了众多模块,可以像瑞士军刀一样,通过灵活的配置组合解决各种不同的问题。而本文,仅仅蜻蜓点水的用了**最简单**、**最直观**的配置来做**基础演示**。
如果你觉得现在已经完全够用了,那就好好的享受它给你带来的信息自由。但如果你的好奇心依然不能停歇,那就去继续挖掘它无限的可能性吧!
需要更多信息,可以到这里寻找:
+
1. [xtls.github.io](https://xtls.github.io/) - 官方文档站
-2. [官方Telegram群组](https://t.me/projectXray) - 活跃而友善的官方讨论社区
+2. [官方 Telegram 群组](https://t.me/projectXray) - 活跃而友善的官方讨论社区
-
:::tip 不算后记的后记
希望我陪你走过的这一段小小的旅程,可以成为你网络生活中的一份小小助力。
diff --git a/docs/document/level-0/ch09-appendix.md b/docs/document/level-0/ch09-appendix.md
index ea74e22..1967239 100644
--- a/docs/document/level-0/ch09-appendix.md
+++ b/docs/document/level-0/ch09-appendix.md
@@ -1,50 +1,46 @@
-# 【第9章】附录
+# 【第 9 章】附录
-## 1. 小小白白Linux基础命令索引
+## 1. 小小白白 Linux 基础命令索引
-| 编号 | 命令名称 | 命令说明 | 出现篇章 |
-|:--:|:--|:--|:--:|
-| `cmd-01` | `apt update` | 查询软件更新 | [《远程登录篇》](./ch03-ssh.md) |
-| `cmd-02` | `apt upgrade` | 执行软件更新 | [《远程登录篇》](./ch03-ssh.md) |
-| `cmd-03` | `nano` | 文本编辑器 | [《安全防护篇》](./ch04-security.md) |
-| `cmd-04` | `systemctl restart` | 重启某个服务 | [《安全防护篇》](./ch04-security.md) |
-| `cmd-05` | `adduser` | 给系统新增用户 | [《安全防护篇》](./ch04-security.md) |
-| `cmd-06` | `apt install` | 安装某个软件 | [《安全防护篇》](./ch04-security.md) |
-| `cmd-07` | `visudo` | 修改sudo权限设置专用编辑器 | [《安全防护篇》](./ch04-security.md) |
-| `cmd-08` | `sudo` | 用`root`权限运行某个命令 | [《安全防护篇》](./ch04-security.md) |
-| `cmd-09` | `chmod` | 修改目标文件/文件夹的权限 | [《安全防护篇》](./ch04-security.md) |
-| `cmd-10` | `mkdir` | 新建文件夹 | [《网站建设篇》](./ch05-webpage.md) |
-| `cmd-11` | `systemctl reload` | 重新加载某个服务 | [《网站建设篇》](./ch05-webpage.md) |
-| `cmd-12` | `wget` | 访问(或下载)某个网页文件 | [《证书管理篇》](./ch06-certificates.md) |
-| `cmd-13` | `acme.sh` | acme.sh证书管理相关的命令 | [《证书管理篇》](./ch06-certificates.md) |
-| `cmd-14` | `rm` | 删除命令 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `cmd-15` | `crontab -e` | 编辑当前用户的定时任务 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `cmd-16` | `touch` | 建立空白文件 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `cmd-17` | `systemctl` | `systemd`基本服务管理命令 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `cmd-18` | `reboot` | 重启Linux系统 | [《Xray服务器篇》](./ch07-xray-server.md) |
+| 编号 | 命令名称 | 命令说明 | 出现篇章 |
+| :------: | :------------------ | :--------------------------- | :----------------------------------------: |
+| `cmd-01` | `apt update` | 查询软件更新 | [《远程登录篇》](./ch03-ssh.md) |
+| `cmd-02` | `apt upgrade` | 执行软件更新 | [《远程登录篇》](./ch03-ssh.md) |
+| `cmd-03` | `nano` | 文本编辑器 | [《安全防护篇》](./ch04-security.md) |
+| `cmd-04` | `systemctl restart` | 重启某个服务 | [《安全防护篇》](./ch04-security.md) |
+| `cmd-05` | `adduser` | 给系统新增用户 | [《安全防护篇》](./ch04-security.md) |
+| `cmd-06` | `apt install` | 安装某个软件 | [《安全防护篇》](./ch04-security.md) |
+| `cmd-07` | `visudo` | 修改 sudo 权限设置专用编辑器 | [《安全防护篇》](./ch04-security.md) |
+| `cmd-08` | `sudo` | 用`root`权限运行某个命令 | [《安全防护篇》](./ch04-security.md) |
+| `cmd-09` | `chmod` | 修改目标文件/文件夹的权限 | [《安全防护篇》](./ch04-security.md) |
+| `cmd-10` | `mkdir` | 新建文件夹 | [《网站建设篇》](./ch05-webpage.md) |
+| `cmd-11` | `systemctl reload` | 重新加载某个服务 | [《网站建设篇》](./ch05-webpage.md) |
+| `cmd-12` | `wget` | 访问(或下载)某个网页文件 | [《证书管理篇》](./ch06-certificates.md) |
+| `cmd-13` | `acme.sh` | acme.sh 证书管理相关的命令 | [《证书管理篇》](./ch06-certificates.md) |
+| `cmd-14` | `rm` | 删除命令 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `cmd-15` | `crontab -e` | 编辑当前用户的定时任务 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `cmd-16` | `touch` | 建立空白文件 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `cmd-17` | `systemctl` | `systemd`基本服务管理命令 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `cmd-18` | `reboot` | 重启 Linux 系统 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+## 2. 小小白白 Linux 重要配置文件索引
-## 2. 小小白白Linux重要配置文件索引
+| 编号 | 配置文件位置 | 文件说明 | 出现篇章 |
+| :-------: | :-------------------------------------- | :----------------------------- | :----------------------------------------: |
+| `conf-01` | `/etc/ssh/sshd_config` | SSH 远程登录程序设置 | [《远程登录篇》](./ch03-ssh.md) |
+| `conf-02` | `/etc/nginx/nginx.conf` | Nginx 程序设置 | [《网站建设篇》](./ch05-webpage.md) |
+| `conf-03` | `/etc/apt/sources.list` | apt 软件源列表 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `conf-04` | `/etc/apt/sources.list.d/vpsadmin.list` | 用户自定义软件源列表列表 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `conf-05` | `crontab -e` | 当前用户的定时任务 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `conf-06` | `/etc/sysctl.conf` | 手动设置 kernel 参数 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `conf-07` | `/etc/sysctl.d/vpsadmin.conf` | 用户自定义 kernel 参数配置文件 | [《Xray 服务器篇》](./ch07-xray-server.md) |
-| 编号 | 配置文件位置 | 文件说明 | 出现篇章 |
-|:--:|:--|:--|:--:|
-| `conf-01` | `/etc/ssh/sshd_config` | SSH远程登录程序设置 | [《远程登录篇》](./ch03-ssh.md) |
-| `conf-02` | `/etc/nginx/nginx.conf` | Nginx程序设置 | [《网站建设篇》](./ch05-webpage.md) |
-| `conf-03` | `/etc/apt/sources.list` | apt软件源列表 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `conf-04` | `/etc/apt/sources.list.d/vpsadmin.list` | 用户自定义软件源列表列表 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `conf-05` | `crontab -e` | 当前用户的定时任务 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `conf-06` | `/etc/sysctl.conf` | 手动设置kernel参数 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `conf-07` | `/etc/sysctl.d/vpsadmin.conf` | 用户自定义kernel参数配置文件 | [《Xray服务器篇》](./ch07-xray-server.md) |
+## 3. 小小白白 Xray 重要文件索引
-
-
-## 3. 小小白白Xray重要文件索引
-
-
-| 编号 | 配置文件位置 | 文件说明 | 出现篇章 |
-|:--:|:--|:--|:--:|
-| `xray-01` | `/usr/local/etc/xray/config.json` | Xray程序设置 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `xray-02` | `/home/vpsadmin/xray_cert/xray.cert` | TLS证书 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `xray-03` | `/home/vpsadmin/xray_cert/xray.key` | TLS私钥 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `xray-04` | `/home/vpsadmin/xray_log/access.log` | Xray访问日志 | [《Xray服务器篇》](./ch07-xray-server.md) |
-| `xray-05` | `/home/vpsadmin/xray_log/error.log` | Xray错误日志 | [《Xray服务器篇》](./ch07-xray-server.md) |
+| 编号 | 配置文件位置 | 文件说明 | 出现篇章 |
+| :-------: | :----------------------------------- | :------------ | :----------------------------------------: |
+| `xray-01` | `/usr/local/etc/xray/config.json` | Xray 程序设置 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `xray-02` | `/home/vpsadmin/xray_cert/xray.cert` | TLS 证书 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `xray-03` | `/home/vpsadmin/xray_cert/xray.key` | TLS 私钥 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `xray-04` | `/home/vpsadmin/xray_log/access.log` | Xray 访问日志 | [《Xray 服务器篇》](./ch07-xray-server.md) |
+| `xray-05` | `/home/vpsadmin/xray_log/error.log` | Xray 错误日志 | [《Xray 服务器篇》](./ch07-xray-server.md) |
diff --git a/docs/document/level-1/README.md b/docs/document/level-1/README.md
index acdcc09..b9041d8 100644
--- a/docs/document/level-1/README.md
+++ b/docs/document/level-1/README.md
@@ -1,18 +1,13 @@
# 入门技巧
-**这个章节是入门级的Xray使用心得分享,主要分享一些Xray常用功能模块的原理说明。**
+**这个章节是入门级的 Xray 使用心得分享,主要分享一些 Xray 常用功能模块的原理说明。**
[回落 (fallbacks) 功能简析](./fallbacks-lv1.md)
-
[路由 (routing) 功能简析(上)](./routing-lv1-part1.md)
-
[路由 (routing) 功能简析(下)](./routing-lv1-part2.md)
-
-[Xray的工作模式简析](./work.md)
-
+[Xray 的工作模式简析](./work.md)
[通过 SNI 回落功能实现伪装与按域名分流](./fallbacks-with-sni.md)
-
diff --git a/docs/document/level-1/fallbacks-lv1.md b/docs/document/level-1/fallbacks-lv1.md
index fc6e44a..2b6bfe8 100644
--- a/docs/document/level-1/fallbacks-lv1.md
+++ b/docs/document/level-1/fallbacks-lv1.md
@@ -1,11 +1,10 @@
# 回落 (fallbacks) 功能简析
-在使用Xray的过程中,你一定无数次的听说了【回落】这个功能。本文就稍微说明一下这个功能的逻辑以及使用方式。
+在使用 Xray 的过程中,你一定无数次的听说了【回落】这个功能。本文就稍微说明一下这个功能的逻辑以及使用方式。
## 1. 回顾《小小白白话文》中的回落
-如果你用了《小小白白话文》中的[Xray配置](../level-0/ch07-xray-server#_7-4-配置xray),并完成了[HTTP自动跳转HTTPS优化](../level-0/ch07-xray-server#_7-8-服务器优化之二-开启http自动跳转https),那么你已经有了基于 `VLESS` 协议的简易回落:
-
+如果你用了《小小白白话文》中的[Xray 配置](../level-0/ch07-xray-server#_7-4-配置xray),并完成了[HTTP 自动跳转 HTTPS 优化](../level-0/ch07-xray-server#_7-8-服务器优化之二-开启http自动跳转https),那么你已经有了基于 `VLESS` 协议的简易回落:
```
"inbounds": [
@@ -33,55 +32,54 @@
这一段配置用人话要怎么解释呢?
1. **`Xray` 的入站端口 `[inbound port]` 是 `443`**
-
- 即由 `Xray` 负责监听 `443` 端口的 `HTTPS` 流量
+
+ 即由 `Xray` 负责监听 `443` 端口的 `HTTPS` 流量
2. **`Xray` 的入站协议 `[inbound protocol]` 是 `vless`**
-
- 只有 `vless` 协议的流量才会流入 `Xray` 中做后续处理。
- ::: warning
- **注:** `VLESS` 这个轻量协议开发的初衷就是给 `xray` 及 `v2fly` 等核心引入回落功能、并同时减少冗余校验/加密。(当然,到目前为止,`xray` 中的 `trojan` 协议也已完整支持回落功能。)
- :::
+ 只有 `vless` 协议的流量才会流入 `Xray` 中做后续处理。
+
+ ::: warning
+ **注:** `VLESS` 这个轻量协议开发的初衷就是给 `xray` 及 `v2fly` 等核心引入回落功能、并同时减少冗余校验/加密。(当然,到目前为止,`xray` 中的 `trojan` 协议也已完整支持回落功能。)
+ :::
3. **回落目标端口 `[fallback dest]` 是 `8080`**
- `Xray` 接受 `443` 端口的访问流量后,属于 `vless` 协议的流量、由 `Xray` 进行内部处理并转发至出站模块。而其他非 `vless` 协议的流量,则转发至 `8080` 端口。
+ `Xray` 接受 `443` 端口的访问流量后,属于 `vless` 协议的流量、由 `Xray` 进行内部处理并转发至出站模块。而其他非 `vless` 协议的流量,则转发至 `8080` 端口。
- ::: warning
- **问:到底是单数还是复数?**
+ ::: warning
+ **问:到底是单数还是复数?**
- 答:一定有聪明的同学发现,配置文件中,明明是复数 `inbounds`, `fallbacks`,为什么我解释的时候都是单数:`inbound`, `fallback` 呢?
+ 答:一定有聪明的同学发现,配置文件中,明明是复数 `inbounds`, `fallbacks`,为什么我解释的时候都是单数:`inbound`, `fallback` 呢?
- 因为,配置文件中用复数,说明 `xray` 支持 N 个同等级的元素(即N个入站,M个回落等等),上面的示例解析中仅仅是其中一个,所以我用了单数。
- :::
+ 因为,配置文件中用复数,说明 `xray` 支持 N 个同等级的元素(即 N 个入站,M 个回落等等),上面的示例解析中仅仅是其中一个,所以我用了单数。
+ :::
4. **回落给 `8080` 端口的流量,由后续程序处理**
- 小小白白话文中的示例,就是 `8080` 端口由 `Nginx` 处理,根据配置找到并展示小熊猫的网页。
+ 小小白白话文中的示例,就是 `8080` 端口由 `Nginx` 处理,根据配置找到并展示小熊猫的网页。
5. **总结,小小白白话文示例中的最简单回落,完整数据路线如下:**
- ``` mermaid
- graph LR;
+ ```mermaid
+ graph LR;
- W(外部 HTTP:80 请求) --> N80(HTTP:80)
+ W(外部 HTTP:80 请求) --> N80(HTTP:80)
- subgraph Nginx 外部监听
- N80 -.- N301(301转写) -.- N443(HTTPS:443)
- end
+ subgraph Nginx 外部监听
+ N80 -.- N301(301转写) -.- N443(HTTPS:443)
+ end
- N443 --> X(Xray 监听 443) .- X1{入站判断}
- X1 --> |接收 VLESS 流量| X2(Xray内部规则)
- X2 --> O(Xray Outbounds 出站)
- X1 ==> |回落 非VLESS 流量| N8080(Nginx:8080)
- N8080:::nginxclass ==> H(index.html)
+ N443 --> X(Xray 监听 443) .- X1{入站判断}
+ X1 --> |接收 VLESS 流量| X2(Xray内部规则)
+ X2 --> O(Xray Outbounds 出站)
+ X1 ==> |回落 非VLESS 流量| N8080(Nginx:8080)
+ N8080:::nginxclass ==> H(index.html)
- H:::nginxclass
- classDef nginxclass fill:#FFFFDE
-
- ```
+ H:::nginxclass
+ classDef nginxclass fill:#FFFFDE
+ ```
## 2. 重新认识回落 (WHAT, HOW `v1`)
@@ -92,46 +90,42 @@
3. 回落的目标是某个 `端口`
4. 被回落的流量由监听 `回落端口` 的后续程序接手
-
-
## 3. 为什么要回落 (WHY `v1`)
+
最初,是为了防御 **【主动探测】** (Active Probing)
**主动探测:** 简单粗暴的理解,就是指外部通过发送特定的网络请求,并解读服务器的回应内容,来推测服务器端是否运行了 `xray`, `v2fly`, `shadowsocks` 等代理工具。一旦可以准确认定,则服务器可能受到干扰或阻断。
之所以可以根据服务器回应内容进行解读,就是因为一次完整的数据请求,其实有很多数据交换的步骤,每一个步骤,都会产生一些软件特征。用大白话说就是:
-- 正常的网站的回应,一定【会有】类似 `Nginx`, `Apache`, `MySQL` 的Web服务、数据库等工具的特征
+- 正常的网站的回应,一定【会有】类似 `Nginx`, `Apache`, `MySQL` 的 Web 服务、数据库等工具的特征
- 正常的网站的回应,一定【不会有】类似 `xray`, `v2fly`, `shadowsocks` 等代理工具的特征
于是,当我们给 `Xray` 提供了【回落】功能后(如上例,回落给 `Nginx`),面对任何用来探测的请求,产生的结果是:
- 探测流量无法掌握你的 `VLESS` 要素,故都会被回落至 `Nginx`
-- 探测流量全都回落进入 `Nginx` ,故VPS服务器的回应一定【会有】 `Nginx` 的特征
-- 因为 `Xray` 本身不对探测流量做任何回应 ,所以VPS的回应一定【不会有】 `Xray` 的特征
+- 探测流量全都回落进入 `Nginx` ,故 VPS 服务器的回应一定【会有】 `Nginx` 的特征
+- 因为 `Xray` 本身不对探测流量做任何回应 ,所以 VPS 的回应一定【不会有】 `Xray` 的特征
至此,【回落】功能就从数据交互逻辑上解决了服务器被 **【主动探测】** 的安全隐患。
-
-
## 4. 重新认识【回落の完全体】 (WHAT, WHY, HOW `v2`)
为什么又要再次认识回落呢? 因为,上面仅仅说清楚了基于“协议”的、抵抗【主动探测】的初版回落。
在 [rprx](https://github.com/rprx) 不断开发迭代 `VLESS` 协议及 `fallback` 功能的过程种,逐渐发现,回落完全可以更加灵活强大,只要在保证抵抗【主动探测】的前提下,充分利用数据首包中的信息,其实可以做到多元素、多层次的回落。(如 `path`, `alpn` 等)
-基于这个开发理念,【回落】功能才逐渐成长为现在的完全体,即完成了 `纯伪装 --> ws分流 --> 多协议多特征分流` 的进化。最终版甚至完全替代了以前要用Web服务器、其他工具才能完成的分流的功能。且由于上述的【回落/分流】处理都在首包判断阶段以毫秒级的速度完成、不涉及任何数据操作,所以几乎没有任何过程损耗。
+基于这个开发理念,【回落】功能才逐渐成长为现在的完全体,即完成了 `纯伪装 --> ws分流 --> 多协议多特征分流` 的进化。最终版甚至完全替代了以前要用 Web 服务器、其他工具才能完成的分流的功能。且由于上述的【回落/分流】处理都在首包判断阶段以毫秒级的速度完成、不涉及任何数据操作,所以几乎没有任何过程损耗。
**因此,现在 `Xray` 中【完整体的回落功能】,同时具备下述属性:**
- **安全:** 充分抵御主动探测攻击
- **高效:** 几乎毫无性能损失
-- **灵活:** 数据灵活分流、常用端口复用(如443)
+- **灵活:** 数据灵活分流、常用端口复用(如 443)
::: tip 啰嗦君
这样多轮介绍虽然略显繁琐,但只有这样层层深入展开,才能充分的说明【回落の完全体】独有的强大!
-:::
-
+:::
## 5. 多层回落示例及解读
@@ -196,180 +190,182 @@
这一段配置用人话要怎么解释呢?
1. **`Xray` 的入站端口 (`inbound port`) 是 `443`**
-
- 即由 `Xray` 负责监听 `443` 端口的 `HTTPS` 流量,并使用 `certificates` 项下设定的 `TLS` 证书来进行验证
+
+ 即由 `Xray` 负责监听 `443` 端口的 `HTTPS` 流量,并使用 `certificates` 项下设定的 `TLS` 证书来进行验证
2. **`Xray` 的入站协议 (`inbound protocol`) 是 `vless`**
-
- `vless` 协议流量直接流入 `Xray` 中做后续处理
-3. **非 `VLESS` 协议流量有4个不同的回落目标:**
+ `vless` 协议流量直接流入 `Xray` 中做后续处理
- 1. `path` 为 `websocket` 的流量,回落给端口 `1234` 后续处理
- 2. `path` 为 `vmesstcp` 的流量,回落给端口 `2345` 后续处理
- 3. `path` 为 `vmessws` 的流量,回落给端口 `3456` 后续处理
- 4. 其它所有流量,回落给端口 `1310` 后续处理
+3. **非 `VLESS` 协议流量有 4 个不同的回落目标:**
-4. **`xver` 为 `1` 表示开启 `proxy protocol` 功能,向后传递来源真实IP**
+ 1. `path` 为 `websocket` 的流量,回落给端口 `1234` 后续处理
+ 2. `path` 为 `vmesstcp` 的流量,回落给端口 `2345` 后续处理
+ 3. `path` 为 `vmessws` 的流量,回落给端口 `3456` 后续处理
+ 4. 其它所有流量,回落给端口 `1310` 后续处理
+
+4. **`xver` 为 `1` 表示开启 `proxy protocol` 功能,向后传递来源真实 IP**
5. **上述回落结构如下图所示:**
- ``` mermaid
- graph LR;
+ ```mermaid
+ graph LR;
- W443(外部 HTTP:443 请求) --> X443(Xray-inbound: 443) .- X1{入站判断}
- X1 --> |协议 = VLESS 的流量| X2(Xray内部规则)
- X2 --> O(Xray Outbounds 出站)
-
- X1 --> |path = /websocket 的流量| X1234(Xray-inbound:1234)
- X1 --> |path = /vmesstcp 的流量| X2345(Xray-inbound:2345)
- X1 --> |path = /vmessws 的流量| X3456(Xray-inbound:3456)
- X1 --> |其它所有流量| X1310(Xray-inbound:1310)
+ W443(外部 HTTP:443 请求) --> X443(Xray-inbound: 443) .- X1{入站判断}
+ X1 --> |协议 = VLESS 的流量| X2(Xray内部规则)
+ X2 --> O(Xray Outbounds 出站)
- ```
+ X1 --> |path = /websocket 的流量| X1234(Xray-inbound:1234)
+ X1 --> |path = /vmesstcp 的流量| X2345(Xray-inbound:2345)
+ X1 --> |path = /vmessws 的流量| X3456(Xray-inbound:3456)
+ X1 --> |其它所有流量| X1310(Xray-inbound:1310)
+
+ ```
6. **网页回落不见了!**
- 没错,聪明的同学应该发现了,防御【主动探测】的 `nginx回落` 不见了!!!这是为什么呢?会不会不安全?别急,我们继续分析:
-
+ 没错,聪明的同学应该发现了,防御【主动探测】的 `nginx回落` 不见了!!!这是为什么呢?会不会不安全?别急,我们继续分析:
### 5.2 后续监听处理的配置段摘抄如下:
1. 后续处理回落至 `1310` 端口的流量,按照下面的配置验证、处理:
- ```
- {
- "port": 1310,
- "listen": "127.0.0.1",
- "protocol": "trojan",
- "settings": {
- "clients": [
- {
- "password": "", // 填写你的密码
- "level": 0,
- "email": "love@example.com"
- }
- ],
- "fallbacks": [
- {
- "dest": 80 // 或者回落到其它也防探测的代理
- }
- ]
- },
- "streamSettings": {
- "network": "tcp",
- "security": "none",
- "tcpSettings": {
- "acceptProxyProtocol": true
- }
- }
- },
- ```
- 看,神奇的事情发生了, `trojan` 协议这里又出现了一个新的 `fallbacks`。前面已经说过,`xray` 中的 `trojan` 协议也具有完整的回落能力,所以,此时 `trojan` 协议可以再次做判断和回落(这也就是传说中的套娃回落了):
-
- - 所有 `trojan` 协议的流量,流入 `Xray` 中做后续处理
- - 所有非 `trojan` 协议的流量,转发至 `80` 端口,【主动探测】的防御,完成!
+ ```
+ {
+ "port": 1310,
+ "listen": "127.0.0.1",
+ "protocol": "trojan",
+ "settings": {
+ "clients": [
+ {
+ "password": "", // 填写你的密码
+ "level": 0,
+ "email": "love@example.com"
+ }
+ ],
+ "fallbacks": [
+ {
+ "dest": 80 // 或者回落到其它也防探测的代理
+ }
+ ]
+ },
+ "streamSettings": {
+ "network": "tcp",
+ "security": "none",
+ "tcpSettings": {
+ "acceptProxyProtocol": true
+ }
+ }
+ },
+ ```
+
+ 看,神奇的事情发生了, `trojan` 协议这里又出现了一个新的 `fallbacks`。前面已经说过,`xray` 中的 `trojan` 协议也具有完整的回落能力,所以,此时 `trojan` 协议可以再次做判断和回落(这也就是传说中的套娃回落了):
+
+ - 所有 `trojan` 协议的流量,流入 `Xray` 中做后续处理
+ - 所有非 `trojan` 协议的流量,转发至 `80` 端口,【主动探测】的防御,完成!
2. 后续处理回落至 `1234` 端口的流量,仔细看!它其实是 `vless+ws`:
- ```
- {
- "port": 1234,
- "listen": "127.0.0.1",
- "protocol": "vless",
- "settings": {
- "clients": [
- {
- "id": "", // 填写你的 UUID
- "level": 0,
- "email": "love@example.com"
- }
- ],
- "decryption": "none"
- },
- "streamSettings": {
- "network": "ws",
- "security": "none",
- "wsSettings": {
- "acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS,需要删掉这行
- "path": "/websocket" // 必须换成自定义的 PATH,需要和分流的一致
- }
- }
- },
- ```
+
+ ```
+ {
+ "port": 1234,
+ "listen": "127.0.0.1",
+ "protocol": "vless",
+ "settings": {
+ "clients": [
+ {
+ "id": "", // 填写你的 UUID
+ "level": 0,
+ "email": "love@example.com"
+ }
+ ],
+ "decryption": "none"
+ },
+ "streamSettings": {
+ "network": "ws",
+ "security": "none",
+ "wsSettings": {
+ "acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS,需要删掉这行
+ "path": "/websocket" // 必须换成自定义的 PATH,需要和分流的一致
+ }
+ }
+ },
+ ```
3. 后续处理回落至 `2345` 端口的流量,仔细看!它其实是 `vmess直连`:
- ```
- {
- "port": 2345,
- "listen": "127.0.0.1",
- "protocol": "vmess",
- "settings": {
- "clients": [
- {
- "id": "", // 填写你的 UUID
- "level": 0,
- "email": "love@example.com"
- }
- ]
- },
- "streamSettings": {
- "network": "tcp",
- "security": "none",
- "tcpSettings": {
- "acceptProxyProtocol": true,
- "header": {
- "type": "http",
- "request": {
- "path": [
- "/vmesstcp" // 必须换成自定义的 PATH,需要和分流的一致
- ]
- }
- }
- }
- }
- },
- ```
+
+ ```
+ {
+ "port": 2345,
+ "listen": "127.0.0.1",
+ "protocol": "vmess",
+ "settings": {
+ "clients": [
+ {
+ "id": "", // 填写你的 UUID
+ "level": 0,
+ "email": "love@example.com"
+ }
+ ]
+ },
+ "streamSettings": {
+ "network": "tcp",
+ "security": "none",
+ "tcpSettings": {
+ "acceptProxyProtocol": true,
+ "header": {
+ "type": "http",
+ "request": {
+ "path": [
+ "/vmesstcp" // 必须换成自定义的 PATH,需要和分流的一致
+ ]
+ }
+ }
+ }
+ }
+ },
+ ```
4. 后续处理回落至 `3456` 端口的流量,再仔细看!它其实是是 `vmess+ws(+cdn)`。
- ::: warning
- **说明:** 你没看错,这就是 v2fly 曾经的推荐组合之一,并可完整支持 `CDN`。现已加入完美回落套餐哦!
- :::
+ ::: warning
+ **说明:** 你没看错,这就是 v2fly 曾经的推荐组合之一,并可完整支持 `CDN`。现已加入完美回落套餐哦!
+ :::
- ```
- {
- "port": 3456,
- "listen": "127.0.0.1",
- "protocol": "vmess",
- "settings": {
- "clients": [
- {
- "id": "", // 填写你的 UUID
- "level": 0,
- "email": "love@example.com"
- }
- ]
- },
- "streamSettings": {
- "network": "ws",
- "security": "none",
- "wsSettings": {
- "acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS,需要删掉这行
- "path": "/vmessws" // 必须换成自定义的 PATH,需要和分流的一致
- }
- }
- }
- ```
+ ```
+ {
+ "port": 3456,
+ "listen": "127.0.0.1",
+ "protocol": "vmess",
+ "settings": {
+ "clients": [
+ {
+ "id": "", // 填写你的 UUID
+ "level": 0,
+ "email": "love@example.com"
+ }
+ ]
+ },
+ "streamSettings": {
+ "network": "ws",
+ "security": "none",
+ "wsSettings": {
+ "acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS,需要删掉这行
+ "path": "/vmessws" // 必须换成自定义的 PATH,需要和分流的一致
+ }
+ }
+ }
+ ```
5. 至此,我们就能够完整的画出模板的回落路线了:
-``` mermaid
+```mermaid
graph LR;
- W443(外部 HTTP:443 请求) --> X443(Xray-inbound: 443) .- X1{入站判断}
+ W443(外部 HTTP:443 请求) --> X443(Xray-inbound: 443) .- X1{入站判断}
X1 --> |协议 = VLESS 的流量| X2(Xray内部规则)
X2 --> XO(Xray Outbounds 出站)
-
+
X1 --> |path = /websocket 的流量| X1234(Xray-inbound:1234)
X1 --> |path = /vmesstcp 的流量| X2345(Xray-inbound:2345)
X1 --> |path = /vmessws 的流量| X3456(Xray-inbound:3456)
@@ -388,14 +384,12 @@
classDef nginxclass fill:#FFFFDE
```
-
## 6. 结语
至此,`Xray` 的【回落】功能就介绍完了。希望本文能够对你理解 `Xray` 的强大有所帮助。
-
## 7. 附加题
我再无耻的留一个附加题:本文详解的 [VLESS-TCP-XTLS-WHATEVER](https://github.com/XTLS/Xray-examples/blob/main/VLESS-TCP-XTLS-WHATEVER/) 模板?是否有可以优化的地方?
-提示:HTTP自动跳转HTTPS
+提示:HTTP 自动跳转 HTTPS
diff --git a/docs/document/level-1/fallbacks-with-sni.md b/docs/document/level-1/fallbacks-with-sni.md
index 1d41070..df8f6c0 100644
--- a/docs/document/level-1/fallbacks-with-sni.md
+++ b/docs/document/level-1/fallbacks-with-sni.md
@@ -72,92 +72,89 @@ acme.sh --install-cert -d example.com --fullchain-file /etc/ssl/xray/cert.pem --
```json
{
- "log": {
- "loglevel": "warning"
+ "log": {
+ "loglevel": "warning"
+ },
+ "inbounds": [
+ {
+ "port": 443,
+ "protocol": "vless",
+ "settings": {
+ "clients": [
+ {
+ "id": "UUID",
+ "flow": "xtls-rprx-direct"
+ }
+ ],
+ "decryption": "none",
+ "fallbacks": [
+ {
+ "name": "example.com",
+ "path": "/vmessws",
+ "dest": 5000,
+ "xver": 1
+ },
+ {
+ "dest": 5001,
+ "xver": 1
+ },
+ {
+ "alpn": "h2",
+ "dest": 5002,
+ "xver": 1
+ },
+ {
+ "name": "blog.example.com",
+ "dest": 5003,
+ "xver": 1
+ },
+ {
+ "name": "blog.example.com",
+ "alpn": "h2",
+ "dest": 5004,
+ "xver": 1
+ }
+ ]
+ },
+ "streamSettings": {
+ "network": "tcp",
+ "security": "xtls",
+ "xtlsSettings": {
+ "alpn": ["h2", "http/1.1"],
+ "certificates": [
+ {
+ "certificateFile": "/etc/ssl/xray/cert.pem",
+ "keyFile": "/etc/ssl/xray/privkey.key"
+ }
+ ]
+ }
+ }
},
- "inbounds": [
- {
- "port": 443,
- "protocol": "vless",
- "settings": {
- "clients": [
- {
- "id": "UUID",
- "flow": "xtls-rprx-direct"
- }
- ],
- "decryption": "none",
- "fallbacks": [
- {
- "name": "example.com",
- "path": "/vmessws",
- "dest": 5000,
- "xver": 1
- },
- {
- "dest": 5001,
- "xver": 1
- },
- {
- "alpn": "h2",
- "dest": 5002,
- "xver": 1
- },
- {
- "name": "blog.example.com",
- "dest": 5003,
- "xver": 1
- },
- {
- "name": "blog.example.com",
- "alpn": "h2",
- "dest": 5004,
- "xver": 1
- }
- ]
- },
- "streamSettings": {
- "network": "tcp",
- "security": "xtls",
- "xtlsSettings": {
- "alpn": [
- "h2",
- "http/1.1"
- ],
- "certificates": [
- {
- "certificateFile": "/etc/ssl/xray/cert.pem",
- "keyFile": "/etc/ssl/xray/privkey.key"
- }
- ]
- }
- }
- },
- {
- "listen": "127.0.0.1",
- "port": 5000,
- "protocol": "vmess",
- "settings": {
- "clients": [
- {
- "id": "UUID"
- }
- ]
- },
- "streamSettings": {
- "network": "ws",
- "wsSettings": {
- "acceptProxyProtocol": true,
- "path": "/vmessws"
- }
- }
+ {
+ "listen": "127.0.0.1",
+ "port": 5000,
+ "protocol": "vmess",
+ "settings": {
+ "clients": [
+ {
+ "id": "UUID"
+ }
+ ]
+ },
+ "streamSettings": {
+ "network": "ws",
+ "wsSettings": {
+ "acceptProxyProtocol": true,
+ "path": "/vmessws"
}
- ],
- "outbounds": [
- {
- "protocol": "freedom"
- }
- ]
+ }
+ }
+ ],
+ "outbounds": [
+ {
+ "protocol": "freedom"
+ }
+ ]
}
```
@@ -223,6 +220,7 @@ curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
sudo apt update
sudo apt install nginx
```
+
删除 `/etc/nginx/conf.d/default.conf` 并创建 `/etc/nginx/conf.d/fallbacks.conf`,内容如下:
```nginx
@@ -297,7 +295,7 @@ sudo chmod +x /usr/bin/caddy
:5001 {
root * /srv/http/default
file_server
- log
+ log
bind 127.0.0.1
}
@@ -321,10 +319,7 @@ http://blog.example.com:5002 {
## 引用
-[^1]: [常见问题 - Let's Encrypt - 免费的SSL/TLS证书](https://letsencrypt.org/zh-cn/docs/faq/)
-
+[^1]: [常见问题 - Let's Encrypt - 免费的 SSL/TLS 证书](https://letsencrypt.org/zh-cn/docs/faq/)
[^2]: [Proxy Protocol - HAProxy Technologies](https://www.haproxy.com/blog/haproxy/proxy-protocol/)
-
-[^3]: [proxy protocol介绍及nginx配置 - 简书](https://www.jianshu.com/p/cc8d592582c9)
-
+[^3]: [proxy protocol 介绍及 nginx 配置 - 简书](https://www.jianshu.com/p/cc8d592582c9)
[^4]: [v2fly-github-io/vless.md at master · rprx/v2fly-github-io](https://github.com/rprx/v2fly-github-io/blob/master/docs/config/protocols/vless.md)
diff --git a/docs/document/level-1/routing-lv1-part1.md b/docs/document/level-1/routing-lv1-part1.md
index e0d55d3..5dc36fa 100644
--- a/docs/document/level-1/routing-lv1-part1.md
+++ b/docs/document/level-1/routing-lv1-part1.md
@@ -1,6 +1,6 @@
# 路由 (routing) 功能简析(上)
-如果说Xray的【强大】主要体现在它极致的速度和广泛的兼容性。那么Xray的【灵活】,则主要应该归功于它巧妙的【路由】功能。本文就稍微说明一下这个功能的逻辑以及使用方式。
+如果说 Xray 的【强大】主要体现在它极致的速度和广泛的兼容性。那么 Xray 的【灵活】,则主要应该归功于它巧妙的【路由】功能。本文就稍微说明一下这个功能的逻辑以及使用方式。
## 1. 初识【路由】三兄弟
@@ -16,21 +16,19 @@
::: warning 啰嗦君
路由功能实在过于灵活,所以本文的示例,都是为了讲解对应的概念,实际使用时请根据自己的需求进行调整。
-:::
-
+:::
## 2. 基本功: “兄弟一条心”
-下图的示例,就是在客户端的 `Xray` 入站接收APP数据、在路由100%转发给出站,并从出站流向VPS。
+下图的示例,就是在客户端的 `Xray` 入站接收 APP 数据、在路由 100%转发给出站,并从出站流向 VPS。
-
-``` mermaid
+```mermaid
graph LR;
S(APP数据) .-> I[入站]
subgraph Xray
- I --> R[路由] --> O[出站]
+ I --> R[路由] --> O[出站]
end
O .-> V(VPS)
@@ -48,8 +46,8 @@
### 2.1 入站
::: tip
-**入站:** 就是流量如何流入 `Xray`
-:::
+**入站:** 就是流量如何流入 `Xray`
+:::
下面的入站配置示例,用大白话说就是:数据按照 `socks` 协议,通过 `10808` 端口,从本机 `127.0.0.1` 流入`Xray`。同时,`Xray` 将这个入站用 `[tag]` 命名为 `inbound-10808`。
@@ -70,10 +68,10 @@
**2.2 出站**
::: tip
-**出站:** 就是流量如何流出 `Xray`
-:::
+**出站:** 就是流量如何流出 `Xray`
+:::
-下面的出站配置示例,用大白话说就是:数据按照 `VLESS` 协议,以 `tcp + xtls (direct)` 的方式、及其他相关设置,把流量发送给对应的VPS。同时,`Xray` 将这个出站用 `[tag]` 命名为 `proxy-out-vless`:
+下面的出站配置示例,用大白话说就是:数据按照 `VLESS` 协议,以 `tcp + xtls (direct)` 的方式、及其他相关设置,把流量发送给对应的 VPS。同时,`Xray` 将这个出站用 `[tag]` 命名为 `proxy-out-vless`:
```
"outbounds": [
@@ -107,13 +105,11 @@
]
```
-
-
### 2.3 路由
::: tip
**路由:** 就是把【入站】和【出站】之间的通道,用某种【条件】串联起来
-:::
+:::
下面的路由配置示例,用大白话说就是:把所有通过 `[tag]="inbound-10808"` 入站流入 `Xray` 的流量,`100%` 全部流转导入 `[tag]="proxy-out-vless"` 的出站,没有任何分流或其他操作。
@@ -132,10 +128,7 @@
}
```
-至此,我们最开始设计的极简规则【客户端的 `Xray` 入站接收APP数据、在路由100%转发给出站,并从出站流向VPS】已经完成。
-
-
-
+至此,我们最开始设计的极简规则【客户端的 `Xray` 入站接收 APP 数据、在路由 100%转发给出站,并从出站流向 VPS】已经完成。
### 2.4 路由配置项解析之一:流量筛选的依据
@@ -143,32 +136,28 @@
1. `"domainStrategy": "AsIs"`
2. `“rules”`
-3. `"type": "field"`
+3. `"type": "field"`
4. `"inboundTag": ["inbound-10808"]`
5. `"outboundTag": "proxy-out-vless"`
其中 `domainStrategy` 我们暂且按下不表,先简单说明后面几个:
-| 配置名称 | 配置值 | 配置说明 |
-|:--:|:--:|:--|
-| `“rules”` | | 它的内层就是【路由规则】的明细设置 |
-| `"type"` | `"field"` | 该项暂时没有特别定义,但是不能省略,所以记得写上就好 |
-| `"inboundTag"` | `["inbound-10808"]` | 筛选流量的 **【依据】** 是【入站Tag】,具体 **【条件】** 现在只有一个:【入站来源是 `inbound-10808`】 |
-| `"outboundTag"` | `"proxy-out-vless"` | 当上面的筛选条件成立时(即入站`[tag]="inbound-10808"`时 ),`Xray` 会将流量导入 `[tag]="proxy-out-vless"` 的出站 |
+| 配置名称 | 配置值 | 配置说明 |
+| :-------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------- |
+| `“rules”` | | 它的内层就是【路由规则】的明细设置 |
+| `"type"` | `"field"` | 该项暂时没有特别定义,但是不能省略,所以记得写上就好 |
+| `"inboundTag"` | `["inbound-10808"]` | 筛选流量的 **【依据】** 是【入站 Tag】,具体 **【条件】** 现在只有一个:【入站来源是 `inbound-10808`】 |
+| `"outboundTag"` | `"proxy-out-vless"` | 当上面的筛选条件成立时(即入站`[tag]="inbound-10808"`时 ),`Xray` 会将流量导入 `[tag]="proxy-out-vless"` 的出站 |
本例中,我们只有一个入站,它的`"inboundTag" = "inbound-10808"` 。我们也只有一个出站,它的 `[tag]="proxy-out-vless"`。所以根据上面这个路由规则,从唯一入站端口 `10808` 流入`Xray`的流量,`100%` 符合筛选条件、会被路由模块选中,然后转发给唯一的出站。
-至此,**入站**、**路由**、**出站** 三兄弟就已经可以携手工作了。当然,现在这个100%转发的工作并没有什么特别的意义。那么接下来,我们就看看这种分工合作的机制可以带来什么好处。
+至此,**入站**、**路由**、**出站** 三兄弟就已经可以携手工作了。当然,现在这个 100%转发的工作并没有什么特别的意义。那么接下来,我们就看看这种分工合作的机制可以带来什么好处。
-
-
-
-## 3. 小试牛刀: “三分天下” 之 “域名分流”
+## 3. 小试牛刀: “三分天下” 之 “域名分流”
> `[geosite.dat]`
-
-``` mermaid
+```mermaid
graph LR;
S(APP数据) .-> I[入站]
@@ -194,23 +183,20 @@
```
-
-
这个配置逻辑,其实就是最简单、最常用的(《小小白白话文》中也在用的)路由配置三件套:
-
+
1. 广告流量屏蔽 `[block]`
2. 国内流量直连 `[direct]`
-3. 国外流量转发VPS `[proxy]`
+3. 国外流量转发 VPS `[proxy]`
::: warning 注意
-小小白白话文中的直连配置是包括【国内域名】、【国内IP】、【本机内部IP】的。这里先讲解【国内域名】。
-:::
+小小白白话文中的直连配置是包括【国内域名】、【国内 IP】、【本机内部 IP】的。这里先讲解【国内域名】。
+:::
### 3.1 入站
保持上例的 `inbound-10808` 不变。
-
### 3.2 出站
在上例的基础上,我们已经有了 `[proxy]` 的出站 `"proxy-out-vless"`,所以它保持不变。显而易见,我们需要加入两个新的出站方式:`[block]` 和 `[direct]`,如下:
@@ -233,11 +219,11 @@
```
上面的配置用大白话翻译如下:
+
1. 上例中的 `[proxy-out-vless]` 出站配置保持不变
2. 加入 **`blackhole` 黑洞协议**,通过这个协议出站的流量,其实都被发送到了 `Xray` 内部的黑洞里,再也无法逃脱,于是效果就是屏蔽 `[block]`
3. 加入 **`freedom` 自由协议**,通过这个协议出站的流量,是自由的离开`Xray`去寻找原定的服务器,就像从没有来过,于是效果就是直连 `[direct]` (我这里起名叫做 `[direct-out]` 是为了强调它是一个出站)
-
### 3.3 路由
接下来就是见证奇迹的时刻了,我们可以用【路由】的配置把这些连接起来!
@@ -277,29 +263,24 @@
- `"domain": ["geosite:cn"]`
- `"domain": ["geosite:geolocation-!cn"]`
-
-
### 3.4 简析域名文件: `geosite.dat`
其实,聪明的你大概可以通过这些配置项的名称猜出来个大概:
-- `"domain"`:就是这次筛选流量的 **【依据】** 是 **【域名】** (而不再是入站tag)
+- `"domain"`:就是这次筛选流量的 **【依据】** 是 **【域名】** (而不再是入站 tag)
- `"geosite"`:就是 `Xray` 会去 `geosite.dat` 文件中寻找 **【符合条件的域名】**
- `"category-ads-all"`:就是该文件中的 **【所有广告类域名】**
- `"cn"`:就是该文件中的 **【中国域名】**
- `"geolocation-!cn"`:就是该文件中的 **【非中国域名】**
-
结合这些说明,3.3 中的配置用大白话翻译就是:
-1. APP试图访问国外域名 `"domain": "geolocation-!cn"` 的流量,通过 `[proxy-out-vless]` 出站,转发至VPS
-2. APP试图访问国外域名广告域名 `"domain": "geosite:category-ads-all"` 的流量,通过 `[block]` 出站,转发至黑洞进行屏蔽
-3. APP试图访问国内域名 `"domain": "geosite:cn"` 的流量,通过 `[direct-out]` 出站,自由离开完成直连
+1. APP 试图访问国外域名 `"domain": "geolocation-!cn"` 的流量,通过 `[proxy-out-vless]` 出站,转发至 VPS
+2. APP 试图访问国外域名广告域名 `"domain": "geosite:category-ads-all"` 的流量,通过 `[block]` 出站,转发至黑洞进行屏蔽
+3. APP 试图访问国内域名 `"domain": "geosite:cn"` 的流量,通过 `[direct-out]` 出站,自由离开完成直连
这时,才让【路由功能】的好处稍微得到了一些展现。
-
-
### 3.5 所以 `geosite.dat` 到底是什么?不是有个 `GFWList` 吗?
你想,这世界上的域名何止千万,如果我们每写一个基于【域名】匹配的路由规则,都要自己收集、手动输入域名,那效率将会何其低下!
@@ -308,14 +289,14 @@
就如关羽需要他的青龙偃月刀,`geosite.dat` 文件便作为【路由功能】驱使的神兵利器横空出世了,它致力于为用户提供成熟完善的【域名分类表】。让用户可以简单的通过 `geosite:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则。
-这种模块化结构提供的灵活性,其实远超传统的一揽子防火墙域名列表 [`GFWList`](https://github.com/gfwlist/gfwlist)。为什么这么说呢?比如,你可以指定苹果的域名 `geosite:apple` 和icloud相关域名 `geosite:icloud` 通过代理 `[proxy]`,但是苹果的软件域名 `geosite:apple-update` 保持直连 `[direct]` 来保持最大下载速度。
+这种模块化结构提供的灵活性,其实远超传统的一揽子防火墙域名列表 [`GFWList`](https://github.com/gfwlist/gfwlist)。为什么这么说呢?比如,你可以指定苹果的域名 `geosite:apple` 和 icloud 相关域名 `geosite:icloud` 通过代理 `[proxy]`,但是苹果的软件域名 `geosite:apple-update` 保持直连 `[direct]` 来保持最大下载速度。
::: warning
**注意:** 现在,`geosite.dat` 文件其实有多种选择:
最初,从 `Victoria Raymond` 主力维护 `Project V` 项目时期,便提供了最初的配套项目:[`domain-list-community`](https://github.com/v2ray/domain-list-community),用来收集、沉淀、分类各种常用的域名类型;
-之后,随着V姐突然消失导致 `Project V` 的原项目开发陷入停滞,`v2fly` 社区维护并持续更新了社区版本的 [`domain-list-community`](https://github.com/v2fly/domain-list-community);
+之后,随着 V 姐突然消失导致 `Project V` 的原项目开发陷入停滞,`v2fly` 社区维护并持续更新了社区版本的 [`domain-list-community`](https://github.com/v2fly/domain-list-community);
同时,[@Loyalsoldier](Loyalsoldier) 维护了其个人修改增强的路由规则文件 [v2ray-rules-dat](https://github.com/Loyalsoldier/v2ray-rules-dat),提供了诸多不同的选择和分类逻辑;
@@ -325,9 +306,7 @@
如果你发现有些你遇到的域名没有被合理分类,请向上面的项目们提出 `issue` 甚至提交 `Pull Request` 吧!社区列表社区维护,人人为我我为人人!
-:::
-
-
+:::
### 3.6 军师锦囊藏奇兵:一条隐藏的路由规则
@@ -335,19 +314,17 @@
::: warning 注意
如果你认为【不符合条件当然就无法连接啦!】的话,你可要重新思考一下哦。因为只有指定了 `[block]` 规则,才会被导入到 `blackhole` 黑洞协议从而阻断连接
-:::
+:::
事实上,`Xray` 为了避免路由规则不完全导致的规则混乱,已经贴心的提供了一条隐藏的路由规则:【**当入站流量不符合任何条件时,转发给第一个出站** 】
这样,就不会有任何流量被漏掉了。所以,你一定要把你最信赖的心腹大将放在【第一条出站】,让它为你守城护池。
-
-
### 3.7 再看“三分天下”的大地图
-因为我们在前面的示例中把 `[proxy-out-vless]` 放在了出站的第一位,所以隐藏规则生效时,流量会通过 `VLESS` 协议被转发至远端的VPS。因此,`Xray` 此时的完整工作逻辑如下:
+因为我们在前面的示例中把 `[proxy-out-vless]` 放在了出站的第一位,所以隐藏规则生效时,流量会通过 `VLESS` 协议被转发至远端的 VPS。因此,`Xray` 此时的完整工作逻辑如下:
-``` mermaid
+```mermaid
graph LR;
S(APP数据) .-> I[入站]
@@ -375,10 +352,8 @@
```
-
事实上,这就是传统所谓的 **【默认科学上网、国内网站白名单直连】** 的配置。
-
## 4. “三分天下” 之 “蜀魏争雄”
现在,你已经知道了隐藏的默认路由规则:【**当入站流量不符合任何条件时,转发给第一个出站** 】。这时候,你应该能看出来,究竟是【科学上网】为王,还是【直连】称霸,全看你的第一条出站是什么!
@@ -406,7 +381,7 @@
此时,路由规则其实变成了:
-``` mermaid
+```mermaid
graph LR;
S(APP数据) .-> I[入站]
@@ -435,8 +410,7 @@
这就是路由功能的灵活之处了,你可以自由的改变它的顺序来实现不同的设计。
-至此,我们已经解释完了 **【如何利用 `geosite.dat` 文件,通过路由规则,根据【域名】来分流网络流量】。**
-
+至此,我们已经解释完了 **【如何利用 `geosite.dat` 文件,通过路由规则,根据【域名】来分流网络流量】。**
## 5. 攻城略池 - 多种路由匹配条件
diff --git a/docs/document/level-1/routing-lv1-part2.md b/docs/document/level-1/routing-lv1-part2.md
index 4094e08..03ae1f0 100644
--- a/docs/document/level-1/routing-lv1-part2.md
+++ b/docs/document/level-1/routing-lv1-part2.md
@@ -6,30 +6,29 @@
如前面所说,域名分流仅仅是【路由】功能的牛刀小试而已。下面就让我们来看看除了域名之外,还什么可以用做分流依据的东西吧!
-
## 5. 攻城略池 - 多种路由匹配条件
-> `[域名], [IP], [协议], etc.`
+> `[域名], [IP], [协议], etc.`
基于域名的分流,已经可以让我们对网络流量进行基本合理的分流。为什么说【基本合理】呢?
因为【三分天下】虽然是正确的战略方向,但如果只用【域名】来实现这个战略,其实漏洞百出,比如:
-1. 我读了《小小白白话文》后,给VPS新申请了一个 `proxy.yourdomain.com` 的域名, 我希望它无论如何都代理,`geosite.dat` 里面有吗?
+1. 我读了《小小白白话文》后,给 VPS 新申请了一个 `proxy.yourdomain.com` 的域名, 我希望它无论如何都代理,`geosite.dat` 里面有吗?
2. 如果我还有个 `direct.yourdomain.com` 的域名,我希望它无论如何都直连, `geosite.dat` 里面有吗?
3. 本机 `127.0.0.1` 的内部流量,是否正确直连了?(比如 `docker` 等)
4. 路由器、本地局域网 `192.168.*.*` 的流量,是否正确直连了?(比如路由器、群晖等)
-5. 我的国内DNS查询(如 `223.5.5.5`)是否正确直连了?
-6. 我的国外DNS查询(如 `1.1.1.1`)是否正确代理了?
-7. 其他类似国内公共DNS一样没有域名、只有IP地址的国内网站,是否正确直连了?
-8. 其他类似国外公共DNS一样没有域名、只有IP地址的国外网站,是否正确代理了?
-9. BT下载的流量,虽然来源是国外,但如果通过VPS下载很可能导致违规使用被封,这该如何强制直连?
+5. 我的国内 DNS 查询(如 `223.5.5.5`)是否正确直连了?
+6. 我的国外 DNS 查询(如 `1.1.1.1`)是否正确代理了?
+7. 其他类似国内公共 DNS 一样没有域名、只有 IP 地址的国内网站,是否正确直连了?
+8. 其他类似国外公共 DNS 一样没有域名、只有 IP 地址的国外网站,是否正确代理了?
+9. BT 下载的流量,虽然来源是国外,但如果通过 VPS 下载很可能导致违规使用被封,这该如何强制直连?
10. ......
我之所以说只用【域名分流】会漏洞百出,是因为 `geosite.dat` 文件内只包含了一部分常用的域名。换言之,仅仅依赖它,则会:
- 无法匹配文件里没有的新域名
-- 无法匹配基于IP地址的规则
+- 无法匹配基于 IP 地址的规则
- 无法匹配基于网络协议的规则
::: warning 啰嗦君
@@ -37,12 +36,10 @@
- 当你的第一个出站是 `[direct-out]` 时:**需要直连的都正确了,但需要代理的则都错误**
- 当你的第一个出站是 `[proxy-out-vless]` 时:**需要代理的都正确了,但需要直连的则都错误**
-:::
-
+ :::
所以,我们需要一个办法,让我们鱼与熊掌兼得。这样的办法是否存在呢?**当然存在!** 我们需要的只是【域名】之外更多的【**分流判断依据**】而已。
-
### 5.1 基于指定域名分流:`[domain], [full]` 等
1. 如果需要匹配某个子域名,如 `a-name.yourdomain.com`,我们使用 `full: "a-name.yourdomain.com"`
@@ -85,18 +82,16 @@
}
```
+### 5.2 基于 IP 文件分流:`geoip.dat`
-
-### 5.2 基于IP文件分流:`geoip.dat`
-
-与 `geosite.dat` 规则文件十分类似的,我们还有 `geoip.dat` 这个规则文件,它致力于为用户提供成熟完善的【IP分类表】。让用户可以简单的通过 `geoip:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则 。
+与 `geosite.dat` 规则文件十分类似的,我们还有 `geoip.dat` 这个规则文件,它致力于为用户提供成熟完善的【IP 分类表】。让用户可以简单的通过 `geoip:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则 。
1. 解决前面的 `[问题3], [问题4]`,我们使用 `geoip:private` 类别来指定 `[direct-out]`
2. 解决前面的 `[问题7]`,我们使用 `geoip:cn` 类别来指定 `[direct-out]`
-3. 解决前面的 `[问题8]`,由于 `geoip` 中没有【非中国IP】这个分类(因为这等于要收集全世界的IP段),所以我们用隐藏规则代替,也就是将 `[proxy-out-vless]` 放在第一个出站
+3. 解决前面的 `[问题8]`,由于 `geoip` 中没有【非中国 IP】这个分类(因为这等于要收集全世界的 IP 段),所以我们用隐藏规则代替,也就是将 `[proxy-out-vless]` 放在第一个出站
上述配置如下:
-
+
```
"routing": {
"domainStrategy": "AsIs",
@@ -121,17 +116,15 @@
}
```
+### 5.3 基于指定 IP 地址分流
-
-### 5.3 基于指定IP地址分流
-
-与 `geosite.dat` 规则文件十分类似的,我们还有 `geoip.dat` 这个规则文件,它是供【路由功能】驱使的**第二个神兵利器**,它致力于为用户提供成熟完善的【IP分类表】。让用户可以简单的通过 `geoip:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则 。
+与 `geosite.dat` 规则文件十分类似的,我们还有 `geoip.dat` 这个规则文件,它是供【路由功能】驱使的**第二个神兵利器**,它致力于为用户提供成熟完善的【IP 分类表】。让用户可以简单的通过 `geoip:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则 。
1. 解决前面的 `[问题5]`,我们使用 `ip: "223.5.5.5"` 来指定 `[direct-out]`
2. 解决前面的 `[问题6]`,我们使用 `ip: "1.1.1.1"` 来指定 `[proxy-out-vless]`
上述配置如下:
-
+
```
"routing": {
"domainStrategy": "AsIs",
@@ -156,13 +149,11 @@
}
```
-
-
### 5.4 基于协议类型分流:`[protocol]` 等
1. 解决前面的 `[问题9]`,我们使用 `"protocol": ["bittorrent"]` 类别来指定 `[direct-out]`
-::: tip
+::: tip
你需要打开入站代理中的 `sniffing` 才能使用此种方式分流。
:::
@@ -182,19 +173,19 @@
}
```
-
-
### 5.5 基于更多条件的分流
到目前位置,我们仍然只讲了【路由功能】分流能力的冰山一角!因为它还支持很多其他的判断条件!我在此简单罗列如下:
本文已经讲过的:
+
- `inboundTag`
- `domain`
- `ip`
- `protocol`
本文尚未讲到的:
+
- `port`
- `sourcePort`
- `network`
@@ -204,9 +195,6 @@
但这些内容实在是过多,全部展开就远远不是 `level-1` 的内容了,所以,需要这些复杂条件的朋友,请仔细阅读 [《基础配置模块 - 路由》文档](../../config/base/routing/) 自学哦!有问题就去 TG 群里面问问吧!
-
-
-
## 6. “霸业初定”:路由规则整体回顾
到现在为止,我们已经累积出了一套战略雄伟、战术精准的路由规则,为了避免混乱,现在就对它进行一次完整的整理和回顾。
@@ -215,8 +203,7 @@
路由生效的顺序是:【从上往下,依次判断】,所以我一般推荐的规则顺序是:
`[1-block] --> [2-direct] --> [3-proxy] --> [4-first-outbound]`
-:::
-
+:::
```
"routing": {
@@ -284,10 +271,9 @@
}
```
-
此时,路由规则其实变成了:
-``` mermaid
+```mermaid
graph LR;
S(APP数据) .-> I[入站]
@@ -326,18 +312,14 @@
至于第一条出站是 `[direct-out]` 还是 `[proxy-out-vless]`,这就全看你的需求了。
-
-
-
## 7. 路由配置常见错误
请大家注意看,我上面每一条路由规则,都是一个独立的匹配依据,只有这样才能确保生效。而新人在自定义路由规则时常犯的一个错误就是:**在一条规则内同时匹配了多种不同的匹配依据,造成匹配无效。**
比如,他希望实现的配置是:
+
1. 自己的 `direct.yourdomain.com` 直连
-2. 国内DNS查询(如 `223.5.5.5`)直连
-
-
+2. 国内 DNS 查询(如 `223.5.5.5`)直连
### 7.1 错误示范
@@ -365,14 +347,12 @@
::: warning 注意
**同一个规则之内,各个依据需要同时成立,才会匹配成功**,逻辑关系是 `和`,而不是 `或`。
-:::
+:::
-换言之,这条规则的意思是:【当你访问的 ` 目标 = direct.yourdomain.com`, **并且** 同时还满足 ` 目标 = 223.5.5.5` 时,`Xray` 才会将流量转发给 `[direct-out]` 直连出站】
+换言之,这条规则的意思是:【当你访问的 `目标 = direct.yourdomain.com`, **并且** 同时还满足 `目标 = 223.5.5.5` 时,`Xray` 才会将流量转发给 `[direct-out]` 直连出站】
很显然,一个目标不可能同时等于两个不同的值,所以这不但是一个永远不可能实现的无效规则,更与原本的目标风马牛不相及。
-
-
### 7.2 正确示范
正确示范,自然就是将不同的匹配依据独立出来:
@@ -399,17 +379,15 @@
}
```
-其实,第6点已经是我整理过的规则了,原则就是【相同的匹配依据可以合并,不同的匹配依据保持独立】。
-
-
-
+其实,第 6 点已经是我整理过的规则了,原则就是【相同的匹配依据可以合并,不同的匹配依据保持独立】。
## 8. 明修栈道、暗渡陈仓
+
> `[domain]` 转化 `[ip]` 的密道:`domainStrategy`
我们在 5.4 中提交了多种流量判断的【依据】,其中一种是域名 `[domain]`、一种是 `[IP]`。
-如果你初步了解过DNS的运作过程,就会知道,我们对一个域名 `[domain]` 发起访问请求时,其实需要先向 `DNS` 发起请求来解析域名 `[domain]` 对应的 `[IP]`,在得到 `[IP]` 后再向它发起实际请求。
+如果你初步了解过 DNS 的运作过程,就会知道,我们对一个域名 `[domain]` 发起访问请求时,其实需要先向 `DNS` 发起请求来解析域名 `[domain]` 对应的 `[IP]`,在得到 `[IP]` 后再向它发起实际请求。
所以,面对入站的一次域名请求,`Xray` 其实有两次机会去判断它的类型。那么,究竟是否要用这两次机会呢?这就是由 `domainStrategy` 这个配置来决定的。它有三个选项:
@@ -419,8 +397,6 @@
按么我们逐个来解释一下:
-
-
### 8.1 域名策略: `"AsIs"`
就是 "As Domain Is",也就是说 【域名什么样,就什么样,不多折腾】。
@@ -428,13 +404,11 @@
简单粗暴理解就是说【仅用 `[domain]` 来匹配】。
::: tip
-`AsIs` 的实际意义为 【如原先所示,不加修改】,🍉老师这里描述的不是很恰当。
+`AsIs` 的实际意义为 【如原先所示,不加修改】,🍉 老师这里描述的不是很恰当。
:::
这个方式的处理都在 `Xray` 内部完成,没有与外界的数据往来,所以速度最快。它的兜底策略也很清晰:即前面所说的、无法匹配的域名自动转入第一条出站处理。所以,对于常规使用路由功能这最推荐的策略。
-
-
### 8.2 域名策略: `"IPIfNonMatch"`
就是 "lookup IP if (there's) no matching rule",也就是说【如果其他所有规则都匹配不上,那就转化成 `IP` 去匹配 `IP` 规则】。
@@ -443,7 +417,6 @@
该策略下没有命中任何规则的这一部分域名,会需要再经历 `DNS` 查询过程、以及第二轮规则匹配的过程,其耗时会多于 `AsIs` 策略,所以并不是首选推荐的策略。
-
### 8.3 域名策略: `"IPOnDemand"`
这里其实说 `Demand IP` 更准确些,也就是说【当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配】。
@@ -454,9 +427,7 @@
::: warning 啰嗦君
`domainStrategy` 仅对域名生效,不要搞混了哦~
-:::
-
-
+:::
## 9. 思考题
@@ -464,10 +435,10 @@
但是,如你所知,`Xray` 本身是支持多端口,多协议的。那么,如果我问你:
-1. 我希望 `VLESS` 协议将我日常的网页浏览和APP流量转发给美国的大流量服务器
-2. 我希望 `trojan` 协议将我的所有Netflix流量转发给日本的服务器解锁各种二次元
+1. 我希望 `VLESS` 协议将我日常的网页浏览和 APP 流量转发给美国的大流量服务器
+2. 我希望 `trojan` 协议将我的所有 Netflix 流量转发给日本的服务器解锁各种二次元
3. 我希望 `shadowsocks` 协议将我所有的游戏流量转发给香港的服务器达到最低的延迟
-4. 我希望有一个独立的端口,能够把 `telegram` 的流量全都转发给VPS
+4. 我希望有一个独立的端口,能够把 `telegram` 的流量全都转发给 VPS
5. 我希望有一个独立的端口,能够把 `bittorrent` 下载流量全都转发给欧洲大盘鸡
6. 我希望......
@@ -475,7 +446,6 @@
答案当然是 **【完全可以】** 啦! 但是这些对于 `level-1` 来说已经超纲了,就留给各位自由的探索吧!
-
## 10. 结语
至此,`Xray` 的【路由】功能就介绍完了。希望本文能够对你理解 `Xray` 的灵活有所帮助。
@@ -483,4 +453,4 @@
## 11. 尾注
- 现在你可以重新阅读一遍 [路由](../../config/routing.md),看看是否有更加深刻的理解。
-- 🍉🍉🍉🍉🍉 :D
\ No newline at end of file
+- 🍉🍉🍉🍉🍉 :D
diff --git a/docs/document/level-1/work.md b/docs/document/level-1/work.md
index 1d2e4d9..fce778e 100644
--- a/docs/document/level-1/work.md
+++ b/docs/document/level-1/work.md
@@ -1,11 +1,10 @@
-# Xray的工作模式
+# Xray 的工作模式
## 单服务器模式
-
与其它的网络代理工具一样,你需要一台配置了 Xray 的服务器,然后在自己的设备上安装并配置 Xray 客户端,然后即可流畅地访问互联网。
-``` mermaid
+```mermaid
graph LR;
A(PC) -.- B(防火墙);
B -.-> C(墙外网站);
@@ -16,13 +15,11 @@ A --> E(墙内网站);
一个 Xray 服务器可同时支持多台设备使用不同的代理协议访问。同时,经过合理的配置,Xray 可以识别并区分需要代理以及不需要代理的流量,直连的流量不需要绕路。
-
## 桥接模式
-
如果你不想在每一台设备上都配置路由,你也可以设置一台中转服务器,用于接收客户端发来的所有流量,然后在服务器中进行转发判断。
-``` mermaid
+```mermaid
graph LR;
A(PC) -.-> B(防火墙);
B -.-> C(墙外网站);
@@ -32,12 +29,11 @@ E --> C;
D --> F(墙内网站);
```
-
## 工作原理
在配置 Xray 之前,不妨先来看一下 Xray 的工作原理,以下是单个 Xray 进程的内部结构示意图。多个 Xray 之间相互独立,互不影响。
-``` mermaid
+```mermaid
graph LR;
A1(inbound) --> D(Dispatcher / Router / DNS);
A2(inbound) --> D;
diff --git a/docs/document/level-2/tproxy.md b/docs/document/level-2/tproxy.md
index 2a7363f..323596a 100644
--- a/docs/document/level-2/tproxy.md
+++ b/docs/document/level-2/tproxy.md
@@ -23,170 +23,148 @@ sudo curl -oL /usr/local/share/xray/geosite.dat https://github.com/Loyalsoldier/
```json
{
- "log": {
- "loglevel": "warning",
- "error": "/var/log/xray/error.log",
- "access": "/var/log/xray/access.log"
- },
- "inbounds": [
- {
- "tag": "all-in",
- "port": 12345,
- "protocol": "dokodemo-door",
- "settings": {
- "network": "tcp,udp",
- "followRedirect": true
- },
- "sniffing": {
- "enabled": true,
- "destOverride": [
- "http",
- "tls"
- ]
- },
- "streamSettings": {
- "sockopt": {
- "tproxy": "tproxy"
- }
- }
+ "log": {
+ "loglevel": "warning",
+ "error": "/var/log/xray/error.log",
+ "access": "/var/log/xray/access.log"
+ },
+ "inbounds": [
+ {
+ "tag": "all-in",
+ "port": 12345,
+ "protocol": "dokodemo-door",
+ "settings": {
+ "network": "tcp,udp",
+ "followRedirect": true
+ },
+ "sniffing": {
+ "enabled": true,
+ "destOverride": ["http", "tls"]
+ },
+ "streamSettings": {
+ "sockopt": {
+ "tproxy": "tproxy"
}
- ],
- "outbounds": [
- {
- "tag": "direct",
- "protocol": "freedom",
- "settings": {
- "domainStrategy": "UseIPv4"
- },
- "streamSettings": {
- "sockopt": {
- "mark": 2
- }
- }
- },
- {
- "tag": "proxy",
- "protocol": "vless",
- "settings": {
- "vnext": [
- {
- "address": "服务端域名",
- "port": 443,
- "users": [
- {
- "id": "UUID",
- "flow": "xtls-rprx-splice",
- "encryption": "none"
- }
- ]
- }
- ]
- },
- "streamSettings": {
- "network": "tcp",
- "security": "xtls",
- "sockopt": {
- "mark": 2
- }
- }
- },
- {
- "tag": "block",
- "protocol": "blackhole",
- "settings": {
- "response": {
- "type": "http"
- }
- }
- },
- {
- "tag": "dns-out",
- "protocol": "dns",
- "settings": {
- "address": "8.8.8.8"
- },
- "proxySettings": {
- "tag": "proxy"
- },
- "streamSettings": {
- "sockopt": {
- "mark": 2
- }
- }
- }
- ],
- "dns": {
- "hosts": {
- "服务端域名": "服务端 IP"
- },
- "servers": [
- {
- "address": "119.29.29.29",
- "port": 53,
- "domains": [
- "geosite:cn"
- ],
- "expectIPs": [
- "geoip:cn"
- ]
- },
- {
- "address": "223.5.5.5",
- "port": 53,
- "domains": [
- "geosite:cn"
- ],
- "expectIPs": [
- "geoip:cn"
- ]
- },
- "8.8.8.8",
- "1.1.1.1",
- "https+local://doh.dns.sb/dns-query"
- ]
- },
- "routing": {
- "domainStrategy": "IPIfNonMatch",
- "rules": [
- {
- "type": "field",
- "inboundTag": [
- "all-in"
- ],
- "port": 53,
- "outboundTag": "dns-out"
- },
- {
- "type": "field",
- "ip": [
- "8.8.8.8",
- "1.1.1.1"
- ],
- "outboundTag": "proxy"
- },
- {
- "type": "field",
- "domain": [
- "geosite:category-ads-all"
- ],
- "outboundTag": "block"
- },
- {
- "type": "field",
- "domain": [
- "geosite:geolocation-!cn"
- ],
- "outboundTag": "proxy"
- },
- {
- "type": "field",
- "ip": [
- "geoip:telegram"
- ],
- "outboundTag": "proxy"
- }
- ]
+ }
}
+ ],
+ "outbounds": [
+ {
+ "tag": "direct",
+ "protocol": "freedom",
+ "settings": {
+ "domainStrategy": "UseIPv4"
+ },
+ "streamSettings": {
+ "sockopt": {
+ "mark": 2
+ }
+ }
+ },
+ {
+ "tag": "proxy",
+ "protocol": "vless",
+ "settings": {
+ "vnext": [
+ {
+ "address": "服务端域名",
+ "port": 443,
+ "users": [
+ {
+ "id": "UUID",
+ "flow": "xtls-rprx-splice",
+ "encryption": "none"
+ }
+ ]
+ }
+ ]
+ },
+ "streamSettings": {
+ "network": "tcp",
+ "security": "xtls",
+ "sockopt": {
+ "mark": 2
+ }
+ }
+ },
+ {
+ "tag": "block",
+ "protocol": "blackhole",
+ "settings": {
+ "response": {
+ "type": "http"
+ }
+ }
+ },
+ {
+ "tag": "dns-out",
+ "protocol": "dns",
+ "settings": {
+ "address": "8.8.8.8"
+ },
+ "proxySettings": {
+ "tag": "proxy"
+ },
+ "streamSettings": {
+ "sockopt": {
+ "mark": 2
+ }
+ }
+ }
+ ],
+ "dns": {
+ "hosts": {
+ "服务端域名": "服务端 IP"
+ },
+ "servers": [
+ {
+ "address": "119.29.29.29",
+ "port": 53,
+ "domains": ["geosite:cn"],
+ "expectIPs": ["geoip:cn"]
+ },
+ {
+ "address": "223.5.5.5",
+ "port": 53,
+ "domains": ["geosite:cn"],
+ "expectIPs": ["geoip:cn"]
+ },
+ "8.8.8.8",
+ "1.1.1.1",
+ "https+local://doh.dns.sb/dns-query"
+ ]
+ },
+ "routing": {
+ "domainStrategy": "IPIfNonMatch",
+ "rules": [
+ {
+ "type": "field",
+ "inboundTag": ["all-in"],
+ "port": 53,
+ "outboundTag": "dns-out"
+ },
+ {
+ "type": "field",
+ "ip": ["8.8.8.8", "1.1.1.1"],
+ "outboundTag": "proxy"
+ },
+ {
+ "type": "field",
+ "domain": ["geosite:category-ads-all"],
+ "outboundTag": "block"
+ },
+ {
+ "type": "field",
+ "domain": ["geosite:geolocation-!cn"],
+ "outboundTag": "proxy"
+ },
+ {
+ "type": "field",
+ "ip": ["geoip:telegram"],
+ "outboundTag": "proxy"
+ }
+ ]
+ }
}
```
@@ -248,6 +226,7 @@ table ip xray {
}
}
```
+
::: tip
**使用方法**
@@ -297,7 +276,6 @@ iptables -t mangle -A OUTPUT -j XRAY_SELF
-
配置完成后,将局域网内其它设备的默认网关改为该设备 IP,就可以直接翻墙了。在其它主机和本机皆测试成功后,可进行下一步配置。
## 配置永久化与开机自启
@@ -308,10 +286,9 @@ iptables -t mangle -A OUTPUT -j XRAY_SELF
-
首先将已经编辑好的 nftables 配置文件移动到 `/etc` 目录下,并重命名为 `nftables.conf`。然后编辑 `/lib/systemd/system/nftables.service`。
-``` ini
+```ini
[Unit]
Description=nftables
Documentation=man:nft(8) http://wiki.nftables.org
@@ -346,7 +323,7 @@ WantedBy=sysinit.target
之后编辑 `/lib/systemd/system/netfilter-persistent.service`。
-``` ini
+```ini
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no
diff --git a/docs/links.md b/docs/links.md
index 6f4f3b5..0da0474 100644
--- a/docs/links.md
+++ b/docs/links.md
@@ -4,27 +4,26 @@
- Linux Script
- [Xray-install](https://github.com/XTLS/Xray-install)
- - [Xray-script](https://github.com/kirin10000/Xray-script) 感谢[@kirin](https://github.com/kirin10000)
+ - [Xray-script](https://github.com/kirin10000/Xray-script) 感谢[@kirin](https://github.com/kirin10000)
- Docker
- - [teddysun/xray](https://hub.docker.com/r/teddysun/xray) 感谢[@秋水逸冰](https://hub.docker.com/u/teddysun)
+ - [teddysun/xray](https://hub.docker.com/r/teddysun/xray) 感谢[@秋水逸冰](https://hub.docker.com/u/teddysun)
- Xray-docker
- One Click
- - [ProxySU](https://github.com/proxysu/ProxySU) 感谢[@ProxySu](https://github.com/proxysu)
- - [Xray-agent](https://github.com/mack-a/Xray-agent) 感谢[@mack-a](https://github.com/mack-a)
+ - [ProxySU](https://github.com/proxysu/ProxySU) 感谢[@ProxySu](https://github.com/proxysu)
+ - [Xray-agent](https://github.com/mack-a/Xray-agent) 感谢[@mack-a](https://github.com/mack-a)
- Magisk
- - [Xray4Magisk](https://github.com/CerteKim/Xray4Magisk) 感谢[@子曦曦](https://github.com/CerteKim)
- - [Xray_For_Magisk](https://github.com/E7KMbb/Xray_For_Magisk) 感谢[@E7KMbb](https://github.com/E7KMbb)
+ - [Xray4Magisk](https://github.com/CerteKim/Xray4Magisk) 感谢[@子曦曦](https://github.com/CerteKim)
+ - [Xray_For_Magisk](https://github.com/E7KMbb/Xray_For_Magisk) 感谢[@E7KMbb](https://github.com/E7KMbb)
- Homebrew
- - [Repository 0](https://github.com/N4FA/homebrew-xray) 感谢[@N4FA](https://github.com/N4FA)
- - [Repository 1](https://github.com/xiruizhao/homebrew-xray) 感谢[@Xirui Zhao](https://github.com/xiruizhao)
+ - [Repository 0](https://github.com/N4FA/homebrew-xray) 感谢[@N4FA](https://github.com/N4FA)
+ - [Repository 1](https://github.com/xiruizhao/homebrew-xray) 感谢[@Xirui Zhao](https://github.com/xiruizhao)
## 配置模板
-所有的模板请传送至: [Xray-examples](https://github.com/XTLS/Xray-examples)
+所有的模板请传送至: [Xray-examples](https://github.com/XTLS/Xray-examples)
包含了各种用法示范的**终极配置**: [VLESS-TCP-XTLS-WHATEVER](https://github.com/XTLS/Xray-examples/tree/main/VLESS-TCP-XTLS-WHATEVER)
-
## 图形化客户端
- OpenWrt
@@ -44,4 +43,3 @@
## UUID 生成器
第三方的 UUID 生成器 [uuidgenerator.net](https://www.uuidgenerator.net)
-