Fix documents

- upgrade vuepress: close #27 #28 #29 #30 #31
- tweak homepage
- tweak dark theme
This commit is contained in:
hmol233 2021-05-06 19:27:01 +08:00
parent 2117297f7c
commit f68422788d
No known key found for this signature in database
GPG Key ID: D617A9DAB0C992D5
18 changed files with 714 additions and 747 deletions

View File

@ -47,6 +47,9 @@ export default defineUserConfig<DefaultThemeOptions>({
ToggleText: "切换主题", ToggleText: "切换主题",
repoLabel: "查看源码", repoLabel: "查看源码",
editLinkText: "帮助我们改善此页面!", editLinkText: "帮助我们改善此页面!",
tip: "提示",
warning: "注意",
danger: "警告",
sidebar: { sidebar: {
"/config/": sidebar.getConfigSidebar( "/config/": sidebar.getConfigSidebar(
"特性详解", "特性详解",

View File

@ -36,7 +36,7 @@ $backgroundDarkColor: #25272a;
$kbdBackgroundDarkColor: #3c3c3c; $kbdBackgroundDarkColor: #3c3c3c;
$kbdBorderDarkColor: #666b6f; $kbdBorderDarkColor: #666b6f;
$tableBorderDarkColor: #666b6f; $tableBorderDarkColor: #666b6f;
$tableBackgroundDarkColor: #5b5b5b; $tableBackgroundDarkColor: #313438;
$metaItemDarkColor: #626262; $metaItemDarkColor: #626262;
$dangerBgDarkColor: rgba(72, 56, 57, 0.3); $dangerBgDarkColor: rgba(72, 56, 57, 0.3);
$warningBgDarkColor: rgba(185, 174, 119, 0.3); $warningBgDarkColor: rgba(185, 174, 119, 0.3);

View File

@ -20,7 +20,7 @@
&.secondary { &.secondary {
color: var(--accentColor); color: var(--accentColor);
background-color: #fff; background-color: var(--kbdBackgroundDarkColor);
border-color: var(--accentColor); border-color: var(--accentColor);
&:hover { &:hover {
color: #fff; color: #fff;

View File

@ -7,7 +7,9 @@ actions:
- text: 由此开始 → - text: 由此开始 →
link: /document/ link: /document/
type: primary type: primary
- text: 配置指南 →
link: /config/
type: secondary
features: features:
- title: 极速协议 - title: 极速协议
details: 原创 VLESS 与 XTLS 协议摆脱冗余加密释放CPU算力 details: 原创 VLESS 与 XTLS 协议摆脱冗余加密释放CPU算力

View File

@ -32,11 +32,11 @@
随着 GFW 技术这十几年来不断的迭代升级,若要完成【自己动手科学上网】这个目标,需要做的事情已经包括但不限于: 随着 GFW 技术这十几年来不断的迭代升级,若要完成【自己动手科学上网】这个目标,需要做的事情已经包括但不限于:
1. 了解Linux系统基本命令 - 了解 Linux 系统基本命令
2. 了解网络传输协议 - 了解网络传输协议
3. 有技术和经济能力完成VPS购买及管理 - 有技术和经济能力完成 VPS 购买及管理
4. 有技术和经济能力完成域名购买及管理 - 有技术和经济能力完成域名购买及管理
5. 有技术能力完成TLS证书申请 等等。 - 有技术能力完成 TLS 证书申请 等等。
这就让【自建 VPS 科学上网】这个曾经简单的行为逐渐变成了令新人望而生畏的挑战。 这就让【自建 VPS 科学上网】这个曾经简单的行为逐渐变成了令新人望而生畏的挑战。

View File

@ -9,15 +9,15 @@
1. 在 VPS 的后台安装 Debian 10 64bit 系统 1. 在 VPS 的后台安装 Debian 10 64bit 系统
2. 小本本记下 VPS 的 IP 地址(本文会用 `"100.200.300.400"` 来表示) 2. 小本本记下 VPS 的 IP 地址(本文会用 `"100.200.300.400"` 来表示)
::: tip ::: tip
**注意:** 这是一个故意写错的非法 IP请替换成你的真实 IP 这是一个故意写错的非法 IP请替换成你的真实 IP
::: :::
3. 小本本记下 VPS 的 SSH 远程登陆端口(Port) 3. 小本本记下 VPS 的 SSH 远程登陆端口(Port)
4. 小本本记下 SSH 远程登录的用户名和密码 4. 小本本记下 SSH 远程登录的用户名和密码
购买 VPS 是一个比较复杂的事情,建议先去学习一下相关知识,选择适合自己的经济能力和线路需求的即可。另外可以选择薅一些国际大厂的羊毛(比如甲骨文和谷歌提供的永久免费或限时免费的套餐)。总之,务必量力而行。 购买 VPS 是一个比较复杂的事情,建议先去学习一下相关知识,选择适合自己的经济能力和线路需求的即可。另外可以选择薅一些国际大厂的羊毛(比如甲骨文和谷歌提供的永久免费或限时免费的套餐)。总之,务必量力而行。
::: tip ::: 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 获取一个心仪的域名 ## 2.2 获取一个心仪的域名
@ -30,7 +30,7 @@
![添加A记录](./ch02-img01-a-name.png) ![添加A记录](./ch02-img01-a-name.png)
::: tip ::: tip
**注意:** 这**不是**一个真实可用的网址,请替换成你的真实网址 这**不是**一个真实可用的网址,请替换成你的真实网址
::: :::
## 2.3 你本地电脑上需要安装的软件 ## 2.3 你本地电脑上需要安装的软件

View File

@ -64,14 +64,14 @@
4. 现在请输入第一条命令,获取更新信息 4. 现在请输入第一条命令,获取更新信息
``` ```shell
# apt update apt update
``` ```
5. 然后请输入第二条命令,并在询问是否继续安装 `(Y/n)` 时输入 `y` 并回车确认,开始安装 5. 然后请输入第二条命令,并在询问是否继续安装 `(Y/n)` 时输入 `y` 并回车确认,开始安装
``` ```shell
# apt upgrade apt upgrade
``` ```
6. 完整流程演示如下: 6. 完整流程演示如下:

View File

@ -63,8 +63,8 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
3. 我们要做的第一件事,当然就是【用`nano`这个文本编辑器打开`SSH远程登录程序设置`】,在 Windows 下,你会【找到文件并双击】,在 Linux 下该怎么办呢?仔细看看上面的命令说明,是不是就很简单了?没错,就是: 3. 我们要做的第一件事,当然就是【用`nano`这个文本编辑器打开`SSH远程登录程序设置`】,在 Windows 下,你会【找到文件并双击】,在 Linux 下该怎么办呢?仔细看看上面的命令说明,是不是就很简单了?没错,就是:
``` ```shell
# nano /etc/ssh/sshd_config nano /etc/ssh/sshd_config
``` ```
4. 文件打开后,你就进入了`nano`的界面,稍微观察一下,你会发现,它把重要的快捷键都显示在屏幕下方了(下图红框内),直接开卷考试、不用死记硬背,是不是很贴心呢? 4. 文件打开后,你就进入了`nano`的界面,稍微观察一下,你会发现,它把重要的快捷键都显示在屏幕下方了(下图红框内),直接开卷考试、不用死记硬背,是不是很贴心呢?
@ -78,7 +78,7 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
- 说明:如果这一行开头有个`#`,证明这一行【不生效】(被注释掉了),你可像我一样在文件最后写一个不带`#`的,或者把`#`删掉就好。 - 说明:如果这一行开头有个`#`,证明这一行【不生效】(被注释掉了),你可像我一样在文件最后写一个不带`#`的,或者把`#`删掉就好。
::: warning ::: warning
注意 本文以`9753`为例,就意味着随着本文的发布,这个端口会变成一个不大不小的特征,也许会被攻击者优先尝试、也许被 GFW 干扰、阻断。所以我强烈建议你用一个自己想到的其他端口,毕竟,你有 6 万多个端口可以自由选择。 本文以`9753`为例,就意味着随着本文的发布,这个端口会变成一个不大不小的特征,也许会被攻击者优先尝试、也许被 GFW 干扰、阻断。所以我强烈建议你用一个自己想到的其他端口,毕竟,你有 6 万多个端口可以自由选择。
::: :::
6. 我们要做的第三件事,是【保存文件并退出】 6. 我们要做的第三件事,是【保存文件并退出】
@ -88,8 +88,8 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
7. 我们最后要做的事,是【重启 ssh 服务,使变更生效】 7. 我们最后要做的事,是【重启 ssh 服务,使变更生效】
``` ```shell
# systemctl restart ssh systemctl restart ssh
``` ```
8. 完整流程演示如下: 8. 完整流程演示如下:
@ -116,47 +116,47 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
2. 我们要做的第一件事,是【新增一个用户并设定登录密码】,名字你可以随便起,我这里以`vpsadmin`为例: 2. 我们要做的第一件事,是【新增一个用户并设定登录密码】,名字你可以随便起,我这里以`vpsadmin`为例:
``` ```shell
# adduser vpsadmin adduser vpsadmin
``` ```
执行命令后,根据提示操作即可。请务必设置一个用户密码(别忘记设置密码时你时看不到 `******` 的)。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。 执行命令后,根据提示操作即可。请务必设置一个用户密码(别忘记设置密码时你时看不到 `******` 的)。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。
![建立新用户](./ch04-img03-adduser.png) ![建立新用户](./ch04-img03-adduser.png)
::: warning 注意 ::: warning
本文以`vpsadmin`为例,就意味着随着本文的发布,这个用户名也会变成一个不大不小的特征,也许会被攻击者优先尝试。所以和端口一样,我强烈建议你用一个自己想到的其他用户名。 本文以`vpsadmin`为例,就意味着随着本文的发布,这个用户名也会变成一个不大不小的特征,也许会被攻击者优先尝试。所以和端口一样,我强烈建议你用一个自己想到的其他用户名。
::: :::
4. 完整流程演示如下: 3. 完整流程演示如下:
![建立新用户](./ch04-img04-adduser-full.gif) ![建立新用户](./ch04-img04-adduser-full.gif)
5. 我们要做的第二件事,是【安装`sudo`功能】(`sudo` 就是在关键时刻,让普通账户临时获得 `root` 的神力,战力全开拯救世界) 4. 我们要做的第二件事,是【安装`sudo`功能】(`sudo` 就是在关键时刻,让普通账户临时获得 `root` 的神力,战力全开拯救世界)
``` ```shell
# apt update && apt install sudo apt update && apt install sudo
``` ```
聪明的你大概已经发现,这一行命令其实是两个命令。前一半 `apt update` 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 `apt install` 聪明的你大概已经发现,这一行命令其实是两个命令。前一半 `apt update` 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 `apt install`
就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的`sudo`程序】。 `&&` 则是把两个命令连起来执行的意思。 就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的`sudo`程序】。 `&&` 则是把两个命令连起来执行的意思。
6. 我们要做的第三件事,是【把`vpsadmin`用户加入`sudo`名单里,让他有资格借用`root`的神力】 5. 我们要做的第三件事,是【把`vpsadmin`用户加入`sudo`名单里,让他有资格借用`root`的神力】
``` ```shell
# visudo visudo
``` ```
`User Privilege Specification` 下加入一行 `vpsadmin ALL=(ALL) NOPASSWD: ALL` 即可。 `User Privilege Specification` 下加入一行 `vpsadmin ALL=(ALL) NOPASSWD: ALL` 即可。
::: warning 注意 我要特别说明的是`NOPASSWD`这个设置,它的意思是`vpsadmin`用户临时使用`root`权限时,不用额外输入密码。**这与一般的安全建议相反** ::: warning
。我之所以如此推荐,是因为很多新人不顾危险坚持使用`root`账号就是因为用`root`时不用重复输入密码、觉得轻松。“两害相权取其轻”,我认为【直接用`root`用户的风险】大于【使用`sudo` 我要特别说明的是`NOPASSWD`这个设置,它的意思是`vpsadmin`用户临时使用`root`权限时,不用额外输入密码。**这与一般的安全建议相反**。我之所以如此推荐,是因为很多新人不顾危险坚持使用`root`账号就是因为用`root`时不用重复输入密码、觉得轻松。“两害相权取其轻”,我认为【直接用`root`用户的风险】大于【使用`sudo`
时不用输密码的风险】,所以做了以上的建议。 时不用输密码的风险】,所以做了以上的建议。
如果你希望遵守传统习惯、每次使用`sudo`时需要输入密码,那么这一行改成 `vpsadmin ALL=(ALL:ALL) ALL` 即可。 如果你希望遵守传统习惯、每次使用`sudo`时需要输入密码,那么这一行改成 `vpsadmin ALL=(ALL:ALL) ALL` 即可。
::: :::
7. 完整流程演示如下: 6. 完整流程演示如下:
![建立新用户](./ch04-img05-sudo-full.gif) ![建立新用户](./ch04-img05-sudo-full.gif)
@ -164,8 +164,8 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
1. 现在你已经逐渐熟悉 Linux 了,所以这次换你思考,我们要做的第一件事是什么呢?没错,还是【用`nano`编辑器打开`SSH远程登录程序设置`】,什么,你想不起来怎么操作了?那去复习一下上面的内容再回来吧!............ 正确答案: 1. 现在你已经逐渐熟悉 Linux 了,所以这次换你思考,我们要做的第一件事是什么呢?没错,还是【用`nano`编辑器打开`SSH远程登录程序设置`】,什么,你想不起来怎么操作了?那去复习一下上面的内容再回来吧!............ 正确答案:
``` ```shell
# nano /etc/ssh/sshd_config nano /etc/ssh/sshd_config
``` ```
2. 找到`PermitRootLogin Yes`这一项,然后把它后面的设定值改为`no`即可。还记得怎么操作吗?............ 正确答案: 2. 找到`PermitRootLogin Yes`这一项,然后把它后面的设定值改为`no`即可。还记得怎么操作吗?............ 正确答案:
@ -180,8 +180,8 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
4. 重启 ssh 服务,让变更生效。还记得............ 算了直接公布正确答案: 4. 重启 ssh 服务,让变更生效。还记得............ 算了直接公布正确答案:
``` ```shell
# systemctl restart ssh systemctl restart ssh
``` ```
5. 完整流程演示如下: 5. 完整流程演示如下:
@ -202,7 +202,7 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
所谓的【密钥验证】,就是生成【一对】相关联的密钥文件(公钥和私钥),然后把【公钥】上传到 VPS 备用。每次登录时SSH 会将【公钥】和【私钥】进行匹配,若验证是正确的【密钥对】,则验证通过。(换言之,你无需记忆和输入复杂的密码,只要保护好【私钥】这个文件不外泄即可) 所谓的【密钥验证】,就是生成【一对】相关联的密钥文件(公钥和私钥),然后把【公钥】上传到 VPS 备用。每次登录时SSH 会将【公钥】和【私钥】进行匹配,若验证是正确的【密钥对】,则验证通过。(换言之,你无需记忆和输入复杂的密码,只要保护好【私钥】这个文件不外泄即可)
::: warning 注意 ::: warning
本文以 `RSA` 密钥举例,是因为 `RSA` 密钥在各种设备、各种 `SSH` 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择。 本文以 `RSA` 密钥举例,是因为 `RSA` 密钥在各种设备、各种 `SSH` 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择。
其他的常见密钥还有: 其他的常见密钥还有:
@ -222,7 +222,7 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
![生成密钥](./ch04-img08-puttygen-save.png) ![生成密钥](./ch04-img08-puttygen-save.png)
::: warning 注意 ::: warning
本图中是以 `2048` 位的 `RSA` 密钥为例的。但实际上,如果要获得与 `EDCSA/Ed25519``256` 位密钥相同的安全性,你需要使用 `3072` 位的 `RSA` 密钥。(即右下角的数字改成 `3072` 本图中是以 `2048` 位的 `RSA` 密钥为例的。但实际上,如果要获得与 `EDCSA/Ed25519``256` 位密钥相同的安全性,你需要使用 `3072` 位的 `RSA` 密钥。(即右下角的数字改成 `3072`
::: :::
@ -278,14 +278,14 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
3. 修改 `authorized_keys` 文件权限为 `600` (仅所有者可读可写) 3. 修改 `authorized_keys` 文件权限为 `600` (仅所有者可读可写)
``` ```shell
$ chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
``` ```
4. 修改 SSH 配置。这个我们已经用了很多次,但现在我们已经从无所不能的`root`变成了普通用户`vpsadmin`,此时的我们是没有权限直接编辑 SSH 配置的。这时候就需要使用`sudo`命令了: 4. 修改 SSH 配置。这个我们已经用了很多次,但现在我们已经从无所不能的`root`变成了普通用户`vpsadmin`,此时的我们是没有权限直接编辑 SSH 配置的。这时候就需要使用`sudo`命令了:
``` ```shell
$ sudo nano /etc/ssh/sshd_config sudo nano /etc/ssh/sshd_config
``` ```
5. 找到(`ctrl+w`) `PasswordAuthentication` 改成 `no` 5. 找到(`ctrl+w`) `PasswordAuthentication` 改成 `no`
@ -294,8 +294,8 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
7. 重启 SSH 服务。(啰嗦君:别忘了现在需要使用`sudo`来获得权限) 7. 重启 SSH 服务。(啰嗦君:别忘了现在需要使用`sudo`来获得权限)
``` ```shell
$ sudo systemctl restart ssh sudo systemctl restart ssh
``` ```
8. 完整流程如下: 8. 完整流程如下:
@ -316,7 +316,7 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
![WinSCP指定私钥位置](./ch04-img20-winscp-privatekey-location.png) ![WinSCP指定私钥位置](./ch04-img20-winscp-privatekey-location.png)
::: warning 注意 ::: warning
任何需要借助 SSH 进行登录的软件都需要密钥验证了,软件过多,无法逐一展示,请根据你的需要自行设置好哦 任何需要借助 SSH 进行登录的软件都需要密钥验证了,软件过多,无法逐一展示,请根据你的需要自行设置好哦
::: :::

View File

@ -20,8 +20,8 @@
1. 这里用到的,都是之前已经详解过的命令,所以就不重复讲解了。看不懂的同学可以看看前面的章节哦。 1. 这里用到的,都是之前已经详解过的命令,所以就不重复讲解了。看不懂的同学可以看看前面的章节哦。
``` ```shell
$ sudo apt update && sudo apt install nginx sudo apt update && sudo apt install nginx
``` ```
2. 完成后Nginx 已经自动运行。此时打开 Windows 上的浏览器并输入 `http://100.200.300.400:80`,若看到下图的界面就说明 Nginx 已经正常在运行了。 2. 完成后Nginx 已经自动运行。此时打开 Windows 上的浏览器并输入 `http://100.200.300.400:80`,若看到下图的界面就说明 Nginx 已经正常在运行了。
@ -42,11 +42,11 @@
| `conf-02` | `/etc/nginx/nginx.conf` | Nginx 程序设置 | | `conf-02` | `/etc/nginx/nginx.conf` | Nginx 程序设置 |
3. 创建一个网站专用的文件夹`/home/vpsadmin/www/webpage/`并建立网页文件`index.html` 3. 创建一个网站专用的文件夹`/home/vpsadmin/www/webpage/`并建立网页文件`index.html`
``` ```shell
$ mkdir -p ~/www/webpage/ && nano ~/www/webpage/index.html mkdir -p ~/www/webpage/ && nano ~/www/webpage/index.html
``` ```
::: warning 注意 ::: warning
如果你用的不是 `vpsadmin` 这个用户名,请务必理解这条命令中 `“~”` 符号的意义(这关系到【第 5 步】你要写的内容): 如果你用的不是 `vpsadmin` 这个用户名,请务必理解这条命令中 `“~”` 符号的意义(这关系到【第 5 步】你要写的内容):
- 如果是 【非 `root` 用户】,`“~”` 就等价于 `/home/用户名` - 如果是 【非 `root` 用户】,`“~”` 就等价于 `/home/用户名`
@ -55,8 +55,8 @@
4. 把下面的内容完整的复制进去,然后保存(`ctrl+o`)退出(`ctrl+x`) 4. 把下面的内容完整的复制进去,然后保存(`ctrl+o`)退出(`ctrl+x`)
``` ```html
<html> <html lang="">
<!-- Text between angle brackets is an HTML tag and is not displayed. <!-- Text between angle brackets is an HTML tag and is not displayed.
Most tags, such as the HTML and /HTML tags that surround the contents of Most tags, such as the HTML and /HTML tags that surround the contents of
a page, come in pairs; some tags, like HR, for a horizontal rule, stand a page, come in pairs; some tags, like HR, for a horizontal rule, stand
@ -75,12 +75,19 @@
<li>The second item; <i>italicize</i> key words</li> <li>The second item; <i>italicize</i> key words</li>
</ul> </ul>
<p>Improve your image by including an image.</p> <p>Improve your image by including an image.</p>
<p><img src="https://i.imgur.com/SEBww.jpg" alt="A Great HTML Resource"></p> <p>
<p>Add a link to your favorite <a href="https://www.dummies.com/">Web site</a>. <img src="https://i.imgur.com/SEBww.jpg" alt="A Great HTML Resource" />
Break up your page with a horizontal rule or two. </p>
<p>
Add a link to your favorite
<a href="https://www.dummies.com/">Web site</a>. Break up your page
with a horizontal rule or two.
</p>
<hr />
<p>
Finally, link to <a href="page2.html">another page</a> in your own Web
site.
</p> </p>
<hr>
<p>Finally, link to <a href="page2.html">another page</a> in your own Web site.</p>
<!-- And add a copyright notice.--> <!-- And add a copyright notice.-->
<p>&#169; Wiley Publishing, 2011</p> <p>&#169; Wiley Publishing, 2011</p>
</body> </body>
@ -91,8 +98,8 @@
1. 修改 `nginx.conf` 1. 修改 `nginx.conf`
``` ```shell
$ sudo nano /etc/nginx/nginx.conf sudo nano /etc/nginx/nginx.conf
``` ```
2. 将下面一段,添加在 `http{}` 内,然后保存(`ctrl+o`)退出(`ctrl+x`)。(记得将域名替换为之前准备好的、包含二级域名的真实域名) 2. 将下面一段,添加在 `http{}` 内,然后保存(`ctrl+o`)退出(`ctrl+x`)。(记得将域名替换为之前准备好的、包含二级域名的真实域名)
@ -112,8 +119,8 @@
3. 让 `nginx` 重新载入配置使其生效 3. 让 `nginx` 重新载入配置使其生效
``` ```shell
$ sudo systemctl reload nginx sudo systemctl reload nginx
``` ```
4. 完整的设置流程如下: 4. 完整的设置流程如下:

View File

@ -4,7 +4,7 @@
接下来我们要做的,是为我们的域名申请一个真实的 TLS 证书,使网站具备标准 TLS 加密的能力及 HTTPS 访问的能力。这就是 Xray 等现阶段安全代理工具确保流量充分加密最重要的工具。 接下来我们要做的,是为我们的域名申请一个真实的 TLS 证书,使网站具备标准 TLS 加密的能力及 HTTPS 访问的能力。这就是 Xray 等现阶段安全代理工具确保流量充分加密最重要的工具。
::: warning 注意 ::: warning
请不要轻易使用自签证书。它并没有让操作简单太多,但增加了无谓的风险(如中间人攻击)。 请不要轻易使用自签证书。它并没有让操作简单太多,但增加了无谓的风险(如中间人攻击)。
::: :::
@ -22,20 +22,20 @@
2. 运行安装脚本 2. 运行安装脚本
``` ```shell
$ wget -O - https://get.acme.sh | sh wget -O - https://get.acme.sh | sh
``` ```
3. 让 `acme.sh` 命令生效 3. 让 `acme.sh` 命令生效
``` ```shell
$ . .bashrc . .bashrc
``` ```
4. 开启 `acme.sh` 的自动升级 4. 开启 `acme.sh` 的自动升级
``` ```shell
$ acme.sh --upgrade --auto-upgrade acme.sh --upgrade --auto-upgrade
``` ```
5. 到这一步的完整流程如下图: 5. 到这一步的完整流程如下图:
@ -48,8 +48,8 @@
1. 测试证书申请的命令如下(本文均以 `ECC` 证书为例,因为时至今日,实在没什么理由不用它): 1. 测试证书申请的命令如下(本文均以 `ECC` 证书为例,因为时至今日,实在没什么理由不用它):
``` ```shell
$ acme.sh --issue --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 acme.sh --issue --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
``` ```
::: warning 说明 ::: warning 说明
@ -117,8 +117,8 @@
4. 如果这一步出错的话,你可以运行下面的命令,来查看详细的申请过程和具体的错误。(看不懂就隐藏掉敏感信息后,去 Xray 群里问吧) 4. 如果这一步出错的话,你可以运行下面的命令,来查看详细的申请过程和具体的错误。(看不懂就隐藏掉敏感信息后,去 Xray 群里问吧)
``` ```shell
$ 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` 参数
@ -129,8 +129,8 @@
1. 申请正式证书的命令如下(即删掉 `--test` 参数,并在最后加入 `--force`参数): 1. 申请正式证书的命令如下(即删掉 `--test` 参数,并在最后加入 `--force`参数):
``` ```shell
$ acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --force acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --force
``` ```
::: warning 说明 ::: warning 说明

View File

@ -7,7 +7,6 @@
其实这样的结构是我多番思考之后的决定,毕竟只有打好基础,才能在后面事半功倍快速反超。我在群里看到许多新人连`nano`都无法正确使用,也不会用`WinSCP`,远程手写编辑出来的`config.json`自然错误百出,连查错也变得举步维艰。 其实这样的结构是我多番思考之后的决定,毕竟只有打好基础,才能在后面事半功倍快速反超。我在群里看到许多新人连`nano`都无法正确使用,也不会用`WinSCP`,远程手写编辑出来的`config.json`自然错误百出,连查错也变得举步维艰。
::: warning ::: warning
经过了前 6 章的准备,各位已经跟我一起翻越了 Linux 基本操作、VPS 远程管理、网页搭建、域名管理、证书申请等等几座大山。是不是回头看看,觉得其实非常简单呢?现在我们有了如此扎实的准备,接下来安装和配置 Xray 经过了前 6 章的准备,各位已经跟我一起翻越了 Linux 基本操作、VPS 远程管理、网页搭建、域名管理、证书申请等等几座大山。是不是回头看看,觉得其实非常简单呢?现在我们有了如此扎实的准备,接下来安装和配置 Xray
时会有一种【水到渠成】的轻快感觉。 时会有一种【水到渠成】的轻快感觉。
::: :::
@ -33,26 +32,24 @@
2. 将安装脚本下载至本地: 2. 将安装脚本下载至本地:
``` ```shell
$ 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. 执行安装命令 3. 执行安装命令
``` ```shell
$ sudo bash install-release.sh sudo bash install-release.sh
``` ```
4. 使用完成之后可以删除该脚本 4. 使用完成之后可以删除该脚本
``` ```shell
$ rm ~/install-release.sh rm ~/install-release.sh
``` ```
::: warning 注意 ::: warning
使用 `rm` 命令删除文件的时候,默认其实就是删除现在所在的文件夹下的文件。但是,**我依然写了完整的路径** `~/install-release.sh`,这是我使用 `rm` 时的一个安全习惯、也是我把安装分成几步之后想强调一下的内容。如果你听过一些“程序员从删库到跑路”之类的段子,大概就知道为什么了。
使用 `rm` 命令删除文件的时候,默认其实就是删除现在所在的文件夹下的文件。但是,**我依然写了完整的路径** `~/install-release.sh`,这是我使用 `rm`
时的一个安全习惯、也是我把安装分成几步之后想强调一下的内容。如果你听过一些“程序员从删库到跑路”之类的段子,大概就知道为什么了。
::: :::
5. 完整流程演示如下: 5. 完整流程演示如下:
@ -67,22 +64,22 @@
1. 为了规避非 root 账户的各种潜在的权限困扰,我们在 vpsadmin 账户下建立一个证书文件夹 1. 为了规避非 root 账户的各种潜在的权限困扰,我们在 vpsadmin 账户下建立一个证书文件夹
``` ```shell
$ mkdir ~/xray_cert mkdir ~/xray_cert
``` ```
2. 使用`acme.sh``--install-cert`正确安装(拷贝)证书文件 2. 使用`acme.sh``--install-cert`正确安装(拷贝)证书文件
``` ```shell
$ acme.sh --install-cert -d 二级域名.你的域名.com --ecc \ acme.sh --install-cert -d 二级域名.你的域名.com --ecc \
--fullchain-file ~/xray_cert/xray.crt \ --fullchain-file ~/xray_cert/xray.crt \
--key-file ~/xray_cert/xray.key --key-file ~/xray_cert/xray.key
``` ```
3. `xray.key`文件默认对其他用户不可读,所以需要赋予其可读性权限 3. `xray.key`文件默认对其他用户不可读,所以需要赋予其可读性权限
``` ```shell
$ chmod +r ~/xray_cert/xray.key chmod +r ~/xray_cert/xray.key
``` ```
4. 过程比较简单就不放动图了: 4. 过程比较简单就不放动图了:
@ -95,13 +92,13 @@
2. 建立一个脚本文件(`xray-cert-renew.sh` 2. 建立一个脚本文件(`xray-cert-renew.sh`
``` ```shell
$ nano ~/xray_cert/xray-cert-renew.sh nano ~/xray_cert/xray-cert-renew.sh
``` ```
3. 把下面的内容复制进去,记得替换你的真实域名,然后保存退出 3. 把下面的内容复制进去,记得替换你的真实域名,然后保存退出
``` ```bash
#!/bin/bash #!/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 /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
@ -114,8 +111,7 @@
echo "Xray Restarted" echo "Xray Restarted"
``` ```
::: warning 注意 ::: warning
经大家提醒,`acme.sh` 有一个 `reloadcmd` 命令,可以在证书更新时自动执行特定命令,那么就可以指定自动给 `Xray` 安装证书,但因为 `crontab` 是 Linux 经大家提醒,`acme.sh` 有一个 `reloadcmd` 命令,可以在证书更新时自动执行特定命令,那么就可以指定自动给 `Xray` 安装证书,但因为 `crontab` 是 Linux
系统中一个非常有用、非常常用的功能,所以本文保留 `crontab` 的方式来更新 `Xray` 证书。(对 `reloadcmd` 感兴趣的同学可以查看 `acme.sh` 系统中一个非常有用、非常常用的功能,所以本文保留 `crontab` 的方式来更新 `Xray` 证书。(对 `reloadcmd` 感兴趣的同学可以查看 `acme.sh`
的[官方文档](https://github.com/acmesh-official/acme.sh) 的[官方文档](https://github.com/acmesh-official/acme.sh)
@ -127,14 +123,14 @@
4. 给这个文件增加【可执行】权限 4. 给这个文件增加【可执行】权限
``` ```
$ chmod +x ~/xray_cert/xray-cert-renew.sh chmod +x ~/xray_cert/xray-cert-renew.sh
``` ```
5. 运行 `crontab -e`,添加一个自动任务【每月自动运行一次`xray-cert-renew.sh`】 (注意不要加`sudo`,因为我们增加的是`vpsadmin` 5. 运行 `crontab -e`,添加一个自动任务【每月自动运行一次`xray-cert-renew.sh`】 (注意不要加`sudo`,因为我们增加的是`vpsadmin`
账户的自动任务。初次运行时会让你选择编辑器,当然是选择熟悉的`nano`啦!) 账户的自动任务。初次运行时会让你选择编辑器,当然是选择熟悉的`nano`啦!)
``` ```shell
$ crontab -e crontab -e
``` ```
6. 把下面的内容增加在文件最后,保存退出即可。 6. 把下面的内容增加在文件最后,保存退出即可。
@ -155,8 +151,8 @@
1. 生成一个合法的 `UUID` 并保存备用(`UUID`可以简单粗暴的理解为像指纹一样几乎不会重复的 ID 1. 生成一个合法的 `UUID` 并保存备用(`UUID`可以简单粗暴的理解为像指纹一样几乎不会重复的 ID
``` ```shell
$ xray uuid xray uuid
``` ```
2. 建立日志文件及文件夹备用 2. 建立日志文件及文件夹备用
@ -165,36 +161,36 @@
2. 在`vpsadmin`的文件夹内建立一个【日志专用文件夹】 2. 在`vpsadmin`的文件夹内建立一个【日志专用文件夹】
``` ```shell
$ mkdir ~/xray_log mkdir ~/xray_log
``` ```
3. 生成所需的两个日志文件(访问日志、错误日志) 3. 生成所需的两个日志文件(访问日志、错误日志)
``` ```shell
$ touch ~/xray_log/access.log && touch ~/xray_log/error.log touch ~/xray_log/access.log && touch ~/xray_log/error.log
``` ```
::: warning 注意 ::: warning
这个位置不是`Xray`标准的日志文件位置,放在这里是避免权限问题对新人的操作带来困扰。当你熟悉之后,建议回归默认位置: `/var/log/xray/access.log` 这个位置不是`Xray`标准的日志文件位置,放在这里是避免权限问题对新人的操作带来困扰。当你熟悉之后,建议回归默认位置: `/var/log/xray/access.log`
`/var/log/xray/error.log` `/var/log/xray/error.log`
::: :::
4. 因为 Xray 默认是 nobody 用户使用,所以我们需要让其他用户也有“写”的权限(`*.log` 就是所有文件后缀是`log`的文件,此时`CLI`界面的效率优势就逐渐出现了) 4. 因为 Xray 默认是 nobody 用户使用,所以我们需要让其他用户也有“写”的权限(`*.log` 就是所有文件后缀是`log`的文件,此时`CLI`界面的效率优势就逐渐出现了)
``` ```shell
$ chmod a+w ~/xray_log/*.log chmod a+w ~/xray_log/*.log
``` ```
3. 使用`nano`创建`Xray`的配置文件 3. 使用`nano`创建`Xray`的配置文件
``` ```shell
$ sudo nano /usr/local/etc/xray/config.json sudo nano /usr/local/etc/xray/config.json
``` ```
4. 将下面的文件全部复制进去,并将之前生成的`UUID`填入第 61 行 `"id": "",` 之中。(填好之后的样子是 `"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid"` 4. 将下面的文件全部复制进去,并将之前生成的`UUID`填入第 61 行 `"id": "",` 之中。(填好之后的样子是 `"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid"`
),本文的这个配置文件中增加了我的各种啰嗦注解,以方便你理解每一个配置模块的功能是什么。 ),本文的这个配置文件中增加了我的各种啰嗦注解,以方便你理解每一个配置模块的功能是什么。
```json ```json5
// REFERENCE: // REFERENCE:
// https://github.com/XTLS/Xray-examples // https://github.com/XTLS/Xray-examples
// https://xtls.github.io/config/ // https://xtls.github.io/config/
@ -206,92 +202,92 @@
// └─ 5_outbounds 出站设置 - 流出 Xray 的流量往哪里去 // └─ 5_outbounds 出站设置 - 流出 Xray 的流量往哪里去
{ {
// 1\_日志设置 // 1\_日志设置
"log": { log: {
"loglevel": "warning", // 内容从少到多: "none", "error", "warning", "info", "debug" loglevel: "warning", // 内容从少到多: "none", "error", "warning", "info", "debug"
"access": "/home/vpsadmin/xray_log/access.log", // 访问记录 access: "/home/vpsadmin/xray_log/access.log", // 访问记录
"error": "/home/vpsadmin/xray_log/error.log" // 错误记录 error: "/home/vpsadmin/xray_log/error.log", // 错误记录
}, },
// 2_DNS 设置 // 2_DNS 设置
"dns": { dns: {
"servers": [ servers: [
"https+local://1.1.1.1/dns-query", // 首选 1.1.1.1 的 DoH 查询,牺牲速度但可防止 ISP 偷窥 "https+local://1.1.1.1/dns-query", // 首选 1.1.1.1 的 DoH 查询,牺牲速度但可防止 ISP 偷窥
"localhost" "localhost",
] ],
}, },
// 3*分流设置 // 3*分流设置
"routing": { routing: {
"domainStrategy": "AsIs", domainStrategy: "AsIs",
"rules": [ rules: [
// 3.1 防止服务器本地流转问题:如内网被攻击或滥用、错误的本地回环等 // 3.1 防止服务器本地流转问题:如内网被攻击或滥用、错误的本地回环等
{ {
"type": "field", type: "field",
"ip": [ ip: [
"geoip:private" // 分流条件geoip 文件内,名为"private"的规则(本地) "geoip:private", // 分流条件geoip 文件内,名为"private"的规则(本地)
], ],
"outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽) outboundTag: "block", // 分流策略:交给出站"block"处理(黑洞屏蔽)
}, },
// 3.2 屏蔽广告 // 3.2 屏蔽广告
{ {
"type": "field", type: "field",
"domain": [ domain: [
"geosite:category-ads-all" // 分流条件geosite 文件内,名为"category-ads-all"的规则(各种广告域名) "geosite:category-ads-all", // 分流条件geosite 文件内,名为"category-ads-all"的规则(各种广告域名)
],
outboundTag: "block", // 分流策略:交给出站"block"处理(黑洞屏蔽)
},
], ],
"outboundTag": "block" // 分流策略:交给出站"block"处理(黑洞屏蔽)
}
]
}, },
// 4*入站设置 // 4*入站设置
// 4.1 这里只写了一个最简单的 vless+xtls 的入站,因为这是 Xray 最强大的模式。如有其他需要,请根据模版自行添加。 // 4.1 这里只写了一个最简单的 vless+xtls 的入站,因为这是 Xray 最强大的模式。如有其他需要,请根据模版自行添加。
"inbounds": [ inbounds: [
{ {
"port": 443, port: 443,
"protocol": "vless", protocol: "vless",
"settings": { settings: {
"clients": [ clients: [
{ {
"id": "", // 填写你的 UUID id: "", // 填写你的 UUID
"flow": "xtls-rprx-direct", flow: "xtls-rprx-direct",
"level": 0, level: 0,
"email": "vpsadmin@yourdomain.com" email: "vpsadmin@yourdomain.com",
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 80 // 默认回落到防探测的代理
}
]
}, },
"streamSettings": { ],
"network": "tcp", decryption: "none",
"security": "xtls", fallbacks: [
"xtlsSettings": {
"allowInsecure": false, // 正常使用应确保关闭
"minVersion": "1.2", // TLS 最低版本设置
"alpn": ["http/1.1"],
"certificates": [
{ {
"certificateFile": "/home/vpsadmin/xray_cert/xray.crt", dest: 80, // 默认回落到防探测的代理
"keyFile": "/home/vpsadmin/xray_cert/xray.key" },
} ],
] },
} 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*出站设置 // 5*出站设置
"outbounds": [ outbounds: [
// 5.1 第一个出站是默认规则freedom 就是对外直连vps 已经是外网,所以直连) // 5.1 第一个出站是默认规则freedom 就是对外直连vps 已经是外网,所以直连)
{ {
"tag": "direct", tag: "direct",
"protocol": "freedom" protocol: "freedom",
}, },
// 5.2 屏蔽规则blackhole 协议就是把流量导入到黑洞里(屏蔽) // 5.2 屏蔽规则blackhole 协议就是把流量导入到黑洞里(屏蔽)
{ {
"tag": "block", tag: "block",
"protocol": "blackhole" protocol: "blackhole",
} },
] ],
} }
``` ```
@ -304,17 +300,14 @@
1. 输入下面的命令,享受启动`Xray`的历史性时刻吧!!! 1. 输入下面的命令,享受启动`Xray`的历史性时刻吧!!!
``` ```shell
sudo systemctl start xray
\$ sudo systemctl start xray
``` ```
2. 仅仅`start`我们并不能确定是否成功的开启了 Xray 的服务,要确定它的状态,就要用到下面的命令。 2. 仅仅`start`我们并不能确定是否成功的开启了 Xray 的服务,要确定它的状态,就要用到下面的命令。
``` ```shell
sudo systemctl status xray
\$ sudo systemctl status xray
``` ```
@ -331,34 +324,26 @@
1. 若你需要暂时关闭 `Xray` 的服务,那就用`stop`命令 1. 若你需要暂时关闭 `Xray` 的服务,那就用`stop`命令
``` ```shell
sudo systemctl stop xray
\$ sudo systemctl stop xray
``` ```
2. 若你需要重启`Xray`的服务,那就用`restart`命令 2. 若你需要重启`Xray`的服务,那就用`restart`命令
``` ```shell
sudo systemctl restart xray
\$ sudo systemctl restart xray
``` ```
3. 若你需要禁用`Xray`的服务(电脑重启后禁止 Xray 自动运行),那就用`disable`命令 3. 若你需要禁用`Xray`的服务(电脑重启后禁止 Xray 自动运行),那就用`disable`命令
``` ```shell
sudo systemctl disable xray
\$ sudo systemctl disable xray
``` ```
4. 若你需要启用`Xray`的服务(电脑重启后确保 Xray 自动运行),那就用`enable`命令 4. 若你需要启用`Xray`的服务(电脑重启后确保 Xray 自动运行),那就用`enable`命令
``` ```shell
sudo systemctl enable xray
\$ sudo systemctl enable xray
``` ```
## 7.7 服务器优化之一:开启 BBR ## 7.7 服务器优化之一:开启 BBR
@ -388,7 +373,7 @@
内核的稳定是一台服务器稳定运行的基石。**【BBR 测试版带来的细微性能差异绝对不值得更换不稳定的内核。】** 请选择你所在的 Linux 发行版所支持的最新内核,这样可以最大限度的保持服务器的长期稳定和兼容。 内核的稳定是一台服务器稳定运行的基石。**【BBR 测试版带来的细微性能差异绝对不值得更换不稳定的内核。】** 请选择你所在的 Linux 发行版所支持的最新内核,这样可以最大限度的保持服务器的长期稳定和兼容。
::: warning 注意 ::: warning
所谓魔改`bbr`的【领先】是有非常强的时效性的。比如很多 `bbrplus` 脚本,因为几年来都没有更新,到现在还会把你的内核换成 `4.19`,要知道现在稳定如 Debian 已经是 `5.9` 所谓魔改`bbr`的【领先】是有非常强的时效性的。比如很多 `bbrplus` 脚本,因为几年来都没有更新,到现在还会把你的内核换成 `4.19`,要知道现在稳定如 Debian 已经是 `5.9`
的时代了,那么这个脚本放在 2018 年 1 月也许领先了一点,到 2018 年 10 月 4.19 正发布时就已经失去了意义,放在现在甚至可以说是完完全全的【降级】和【劣化】 的时代了,那么这个脚本放在 2018 年 1 月也许领先了一点,到 2018 年 10 月 4.19 正发布时就已经失去了意义,放在现在甚至可以说是完完全全的【降级】和【劣化】
::: :::
@ -414,10 +399,8 @@
1. 给 Debian 10 添加官方 `backports` 源,获取更新的软件库 1. 给 Debian 10 添加官方 `backports` 源,获取更新的软件库
``` ```shell
sudo nano /etc/apt/sources.list
\$ sudo nano /etc/apt/sources.list
``` ```
::: warning 说明 ::: warning 说明
@ -434,8 +417,8 @@ deb http://deb.debian.org/debian buster-backports main
3. 刷新软件库并查询 Debian 官方的最新版内核并安装。请务必安装你的 VPS 对应的版本本文以比较常见的【amd64】为例 3. 刷新软件库并查询 Debian 官方的最新版内核并安装。请务必安装你的 VPS 对应的版本本文以比较常见的【amd64】为例
``` ```shell
$ sudo apt update && sudo apt -t buster-backports install linux-image-amd64 sudo apt update && sudo apt -t buster-backports install linux-image-amd64
``` ```
::: warning 注意 ::: warning 注意
@ -451,8 +434,8 @@ $ sudo apt update && sudo apt -t buster-backports install linux-image-amd64
4. 修改 `kernel` 参数配置文件 `sysctl.conf` 并指定开启 `BBR` 4. 修改 `kernel` 参数配置文件 `sysctl.conf` 并指定开启 `BBR`
``` ```shell
$ sudo nano /etc/sysctl.conf sudo nano /etc/sysctl.conf
``` ```
::: warning 说明 ::: warning 说明
@ -470,8 +453,8 @@ net.ipv4.tcp_congestion_control=bbr
6. 重启 VPS、使内核更新和`BBR`设置都生效 6. 重启 VPS、使内核更新和`BBR`设置都生效
``` ```shell
$ sudo reboot sudo reboot
``` ```
7. 完整流程演示如下: 7. 完整流程演示如下:
@ -487,8 +470,8 @@ $ sudo reboot
如果你想确认 `BBR` 是否正确开启,可以使用下面的命令: 如果你想确认 `BBR` 是否正确开启,可以使用下面的命令:
``` ```shell
$ lsmod | grep bbr lsmod | grep bbr
``` ```
此时应该返回这样的结果: 此时应该返回这样的结果:
@ -499,8 +482,8 @@ tcp_bbr
如果你想确认 `fq` 算法是否正确开启,可以使用下面的命令: 如果你想确认 `fq` 算法是否正确开启,可以使用下面的命令:
``` ```shell
$ lsmod | grep fq lsmod | grep fq
``` ```
此时应该返回这样的结果: 此时应该返回这样的结果:
@ -518,55 +501,43 @@ sch_fq
2. 编辑 Nginx 的配置文件 2. 编辑 Nginx 的配置文件
``` ```shell
sudo nano /etc/nginx/nginx.conf
\$ 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` 端口做演示。(可以是任意端口) 4. 在与 `80` 端口同级的位置增加一个本地端口监听来提供网页展示。本文以 `8080` 端口做演示。(可以是任意端口)
``` ```
server { server {
listen 127.0.0.1:8080; listen 127.0.0.1:8080;
root /home/vpsadmin/www/webpage; root /home/vpsadmin/www/webpage;
index index.html; index index.html;
add_header Strict-Transport-Security "max-age=63072000" always; add_header Strict-Transport-Security "max-age=63072000" always;
} }
``` ```
5. 重启 Nginx 服务 5. 重启 Nginx 服务
``` ```shell
sudo systemctl restart nginx
\$ sudo systemctl restart nginx
``` ```
6. 修改 Xray 的回落设置,将回落从 `80` 端口改为 `8080` 端口。(找到 `"dest": 80`, 并改成 `"dest": 8080` 6. 修改 Xray 的回落设置,将回落从 `80` 端口改为 `8080` 端口。(找到 `"dest": 80`, 并改成 `"dest": 8080`
``` ```shell
sudo nano /usr/local/etc/xray/config.json
\$ sudo nano /usr/local/etc/xray/config.json
``` ```
7. 重启 `Xray` 服务,即完成了设置 7. 重启 `Xray` 服务,即完成了设置
``` ```shell
sudo systemctl restart xray
\$ sudo systemctl restart xray
``` ```
8. 完整流程演示如下: 8. 完整流程演示如下:

View File

@ -25,7 +25,7 @@
:::warning 注意 :::warning 注意
**注意:** 请务必记得,`Xray` 的路由配置非常灵活,上面的说明只是无限可能性中的一种。 请务必记得,`Xray` 的路由配置非常灵活,上面的说明只是无限可能性中的一种。
借助 `geosite.dat``geoip.dat` 这两个文件可以很灵活的从【域名】和【IP】这两个角度、不留死角的控制流量流出的方向。这比曾经单一笼统的 `GFWList` 强大很多很多,可以做到非常细致的微调:比如可以指定 Apple 域名直连或转发、指定亚马逊域名代理或转发,百度的域名屏蔽等等。。。) 借助 `geosite.dat``geoip.dat` 这两个文件可以很灵活的从【域名】和【IP】这两个角度、不留死角的控制流量流出的方向。这比曾经单一笼统的 `GFWList` 强大很多很多,可以做到非常细致的微调:比如可以指定 Apple 域名直连或转发、指定亚马逊域名代理或转发,百度的域名屏蔽等等。。。)
@ -99,7 +99,7 @@
- 请将 `serverName` 替换成你的真实域名 - 请将 `serverName` 替换成你的真实域名
- 各个配置模块的说明我都已经(很啰嗦的)放在对应的配置点上了 - 各个配置模块的说明我都已经(很啰嗦的)放在对应的配置点上了
``` ```json5
// REFERENCE: // REFERENCE:
// https://github.com/XTLS/Xray-examples // https://github.com/XTLS/Xray-examples
// https://xtls.github.io/config/ // https://xtls.github.io/config/
@ -111,156 +111,138 @@
// ├─ 4_inbounds 入站设置 - 什么流量可以流入Xray // ├─ 4_inbounds 入站设置 - 什么流量可以流入Xray
// └─ 5_outbounds 出站设置 - 流出Xray的流量往哪里去 // └─ 5_outbounds 出站设置 - 流出Xray的流量往哪里去
{ {
// 1_日志设置 // 1_日志设置
// 注意本例中我默认注释掉了日志文件因为windows, macOS, Linux 需要写不同的路径,请自行配置 // 注意本例中我默认注释掉了日志文件因为windows, macOS, Linux 需要写不同的路径,请自行配置
"log": { log: {
// "access": "/home/local/xray_log/access.log", // 访问记录 // "access": "/home/local/xray_log/access.log", // 访问记录
// "error": "/home/local/xray_log/error.log", // 错误记录 // "error": "/home/local/xray_log/error.log", // 错误记录
"loglevel": "warning" // 内容从少到多: "none", "error", "warning", "info", "debug" loglevel: "warning", // 内容从少到多: "none", "error", "warning", "info", "debug"
}, },
// 2_DNS设置 // 2_DNS设置
"dns": { dns: {
"servers": [ servers: [
// 2.1 国外域名使用国外DNS查询 // 2.1 国外域名使用国外DNS查询
{ {
"address": "1.1.1.1", address: "1.1.1.1",
"domains": [ domains: ["geosite:geolocation-!cn"],
"geosite:geolocation-!cn"
]
}, },
// 2.2 国内域名使用国内DNS查询并期待返回国内的IP若不是国内IP则舍弃用下一个查询 // 2.2 国内域名使用国内DNS查询并期待返回国内的IP若不是国内IP则舍弃用下一个查询
{ {
"address": "223.5.5.5", address: "223.5.5.5",
"domains": [ domains: ["geosite:cn"],
"geosite:cn" expectIPs: ["geoip:cn"],
],
"expectIPs": [
"geoip:cn"
]
}, },
// 2.3 作为2.2的备份,对国内网站进行二次查询 // 2.3 作为2.2的备份,对国内网站进行二次查询
{ {
"address": "114.114.114.114", address: "114.114.114.114",
"domains": [ domains: ["geosite:cn"],
"geosite:cn"
]
}, },
// 2.4 最后的备份上面全部失败时用本机DNS查询 // 2.4 最后的备份上面全部失败时用本机DNS查询
"localhost" "localhost",
] ],
}, },
// 3_分流设置 // 3_分流设置
// 所谓分流,就是将符合否个条件的流量,用指定`tag`的出站协议去处理对应配置的5.x内容 // 所谓分流,就是将符合否个条件的流量,用指定`tag`的出站协议去处理对应配置的5.x内容
"routing": { routing: {
"domainStrategy": "AsIs", domainStrategy: "AsIs",
"rules": [ rules: [
// 3.1 广告域名屏蔽 // 3.1 广告域名屏蔽
{ {
"type": "field", type: "field",
"domain": [ domain: ["geosite:category-ads-all"],
"geosite:category-ads-all" outboundTag: "block",
],
"outboundTag": "block"
}, },
// 3.2 国内域名直连 // 3.2 国内域名直连
{ {
"type": "field", type: "field",
"domain": [ domain: ["geosite:cn"],
"geosite:cn" outboundTag: "direct",
],
"outboundTag": "direct"
}, },
// 3.3 国内IP直连 // 3.3 国内IP直连
{ {
"type": "field", type: "field",
"ip": [ ip: ["geoip:cn", "geoip:private"],
"geoip:cn", outboundTag: "direct",
"geoip:private"
],
"outboundTag": "direct"
}, },
// 3.4 国外域名代理 // 3.4 国外域名代理
{ {
"type": "field", type: "field",
"domain": [ domain: ["geosite:geolocation-!cn"],
"geosite:geolocation-!cn" outboundTag: "proxy",
], },
"outboundTag": "proxy"
}
// 3.5 默认规则 // 3.5 默认规则
// 在Xray中任何不符合上述路由规则的流量都会默认使用【第一个outbound5.1】的设置所以一定要把转发VPS的outbound放第一个 // 在Xray中任何不符合上述路由规则的流量都会默认使用【第一个outbound5.1】的设置所以一定要把转发VPS的outbound放第一个
] ],
}, },
// 4_入站设置 // 4_入站设置
"inbounds": [ inbounds: [
// 4.1 一般都默认使用socks5协议作本地转发 // 4.1 一般都默认使用socks5协议作本地转发
{ {
"tag": "socks-in", tag: "socks-in",
"protocol": "socks", protocol: "socks",
"listen": "127.0.0.1", // 这个是通过socks5协议做本地转发的地址 listen: "127.0.0.1", // 这个是通过socks5协议做本地转发的地址
"port": 10800, // 这个是通过socks5协议做本地转发的端口 port: 10800, // 这个是通过socks5协议做本地转发的端口
"settings": { settings: {
"udp": true udp: true,
} },
}, },
// 4.2 有少数APP不兼容socks协议需要用http协议做转发则可以用下面的端口 // 4.2 有少数APP不兼容socks协议需要用http协议做转发则可以用下面的端口
{ {
"tag": "http-in", tag: "http-in",
"protocol": "http", protocol: "http",
"listen": "127.0.0.1", // 这个是通过http协议做本地转发的地址 listen: "127.0.0.1", // 这个是通过http协议做本地转发的地址
"port": 10801 // 这个是通过http协议做本地转发的端口 port: 10801, // 这个是通过http协议做本地转发的端口
} },
], ],
// 5_出站设置 // 5_出站设置
"outbounds": [ outbounds: [
// 5.1 默认转发VPS // 5.1 默认转发VPS
// 一定放在第一个在routing 3.5 里面已经说明了,这等于是默认规则,所有不符合任何规则的流量都走这个 // 一定放在第一个在routing 3.5 里面已经说明了,这等于是默认规则,所有不符合任何规则的流量都走这个
{ {
"tag": "proxy", tag: "proxy",
"protocol": "vless", protocol: "vless",
"settings": { settings: {
"vnext": [ vnext: [
{ {
"address": "a-name.yourdomain.com", // 替换成你的真实域名 address: "a-name.yourdomain.com", // 替换成你的真实域名
"port": 443, port: 443,
"users": [ users: [
{ {
"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid", // 和服务器端的一致 id: "uuiduuid-uuid-uuid-uuid-uuiduuiduuid", // 和服务器端的一致
"flow": "xtls-rprx-direct", // Windows, macOS 同学保持这个不变 flow: "xtls-rprx-direct", // Windows, macOS 同学保持这个不变
// "flow": "xtls-rprx-splice", // Linux和安卓同学请改成Splice性能更强 // "flow": "xtls-rprx-splice", // Linux和安卓同学请改成Splice性能更强
"encryption": "none", encryption: "none",
"level": 0 level: 0,
} },
] ],
} },
] ],
},
streamSettings: {
network: "tcp",
security: "xtls",
xtlsSettings: {
serverName: "a-name.yourdomain.com", // 替换成你的真实域名
allowInsecure: false, // 禁止不安全证书
},
}, },
"streamSettings": {
"network": "tcp",
"security": "xtls",
"xtlsSettings": {
"serverName": "a-name.yourdomain.com", // 替换成你的真实域名
"allowInsecure": false // 禁止不安全证书
}
}
}, },
// 5.2 用`freedom`协议直连出站即当routing中指定'direct'流出时,调用这个协议做处理 // 5.2 用`freedom`协议直连出站即当routing中指定'direct'流出时,调用这个协议做处理
{ {
"tag": "direct", tag: "direct",
"protocol": "freedom" protocol: "freedom",
}, },
// 5.3 用`blackhole`协议屏蔽流量即当routing中指定'block'时,调用这个协议做处理 // 5.3 用`blackhole`协议屏蔽流量即当routing中指定'block'时,调用这个协议做处理
{ {
"tag": "block", tag: "block",
"protocol": "blackhole" protocol: "blackhole",
} },
] ],
} }
``` ```
@ -277,7 +259,7 @@
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`,那么正确的启动命令就是:
``` ```shell
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
``` ```
@ -287,8 +269,8 @@
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`,那么正确的启动命令就是
``` ```shell
$ /usr/local/bin/xray -c /usr/local/etc/xray/config.json /usr/local/bin/xray -c /usr/local/etc/xray/config.json
``` ```
:::tip 说明 :::tip 说明

View File

@ -6,7 +6,7 @@
如果你用了《小小白白话文》中的[Xray 配置](../level-0/ch07-xray-server.md#_7-4-配置xray),并完成了[HTTP 自动跳转 HTTPS 优化](../level-0/ch07-xray-server.md#_7-8-服务器优化之二-开启http自动跳转https),那么你已经有了基于 `VLESS` 协议的简易回落: 如果你用了《小小白白话文》中的[Xray 配置](../level-0/ch07-xray-server.md#_7-4-配置xray),并完成了[HTTP 自动跳转 HTTPS 优化](../level-0/ch07-xray-server.md#_7-8-服务器优化之二-开启http自动跳转https),那么你已经有了基于 `VLESS` 协议的简易回落:
``` ```json5
"inbounds": [ "inbounds": [
{ {
"port": 443, "port": 443,
@ -113,7 +113,7 @@
为什么又要再次认识回落呢? 因为,上面仅仅说清楚了基于“协议”的、抵抗【主动探测】的初版回落。 为什么又要再次认识回落呢? 因为,上面仅仅说清楚了基于“协议”的、抵抗【主动探测】的初版回落。
在 [rprx](https://github.com/rprx) 不断开发迭代 `VLESS` 协议及 `fallback` 功能的过程种,逐渐发现,回落完全可以更加灵活强大,只要在保证抵抗【主动探测】的前提下,充分利用数据首包中的信息,其实可以做到多元素、多层次的回落。(如 `path`, `alpn` 等) 在 [RPRX](https://github.com/rprx) 不断开发迭代 `VLESS` 协议及 `fallback` 功能的过程种,逐渐发现,回落完全可以更加灵活强大,只要在保证抵抗【主动探测】的前提下,充分利用数据首包中的信息,其实可以做到多元素、多层次的回落。(如 `path`, `alpn` 等)
基于这个开发理念,【回落】功能才逐渐成长为现在的完全体,即完成了 `纯伪装 --> ws分流 --> 多协议多特征分流` 的进化。最终版甚至完全替代了以前要用 Web 服务器、其他工具才能完成的分流的功能。且由于上述的【回落/分流】处理都在首包判断阶段以毫秒级的速度完成、不涉及任何数据操作,所以几乎没有任何过程损耗。 基于这个开发理念,【回落】功能才逐渐成长为现在的完全体,即完成了 `纯伪装 --> ws分流 --> 多协议多特征分流` 的进化。最终版甚至完全替代了以前要用 Web 服务器、其他工具才能完成的分流的功能。且由于上述的【回落/分流】处理都在首包判断阶段以毫秒级的速度完成、不涉及任何数据操作,所以几乎没有任何过程损耗。
@ -133,58 +133,56 @@
### 5.1 首先,我将服务器端配置的 443 监听段摘抄如下: ### 5.1 首先,我将服务器端配置的 443 监听段摘抄如下:
``` ```json5
{ {
"port": 443, port: 443,
"protocol": "vless", protocol: "vless",
"settings": { settings: {
"clients": [ clients: [
{ {
"id": "", // 填写你的 UUID id: "", // 填写你的 UUID
"flow": "xtls-rprx-direct", flow: "xtls-rprx-direct",
"level": 0, level: 0,
"email": "love@example.com" email: "love@example.com",
} },
], ],
"decryption": "none", decryption: "none",
"fallbacks": [ fallbacks: [
{ {
"dest": 1310, // 默认回落到 Xray 的 Trojan 协议 dest: 1310, // 默认回落到 Xray 的 Trojan 协议
"xver": 1 xver: 1,
}, },
{ {
"path": "/websocket", // 必须换成自定义的 PATH path: "/websocket", // 必须换成自定义的 PATH
"dest": 1234, dest: 1234,
"xver": 1 xver: 1,
}, },
{ {
"path": "/vmesstcp", // 必须换成自定义的 PATH path: "/vmesstcp", // 必须换成自定义的 PATH
"dest": 2345, dest: 2345,
"xver": 1 xver: 1,
}, },
{ {
"path": "/vmessws", // 必须换成自定义的 PATH path: "/vmessws", // 必须换成自定义的 PATH
"dest": 3456, dest: 3456,
"xver": 1 xver: 1,
}
]
}, },
"streamSettings": {
"network": "tcp",
"security": "xtls",
"xtlsSettings": {
"alpn": [
"http/1.1"
], ],
"certificates": [
{
"certificateFile": "/path/to/fullchain.crt", // 换成你的证书,绝对路径
"keyFile": "/path/to/private.key" // 换成你的私钥,绝对路径
}
]
}
}
}, },
streamSettings: {
network: "tcp",
security: "xtls",
xtlsSettings: {
alpn: ["http/1.1"],
certificates: [
{
certificateFile: "/path/to/fullchain.crt", // 换成你的证书,绝对路径
keyFile: "/path/to/private.key", // 换成你的私钥,绝对路径
},
],
},
},
}
``` ```
这一段配置用人话要怎么解释呢? 这一段配置用人话要怎么解释呢?
@ -230,33 +228,33 @@
1. 后续处理回落至 `1310` 端口的流量,按照下面的配置验证、处理: 1. 后续处理回落至 `1310` 端口的流量,按照下面的配置验证、处理:
``` ```json5
{ {
"port": 1310, port: 1310,
"listen": "127.0.0.1", listen: "127.0.0.1",
"protocol": "trojan", protocol: "trojan",
"settings": { settings: {
"clients": [ clients: [
{ {
"password": "", // 填写你的密码 password: "", // 填写你的密码
"level": 0, level: 0,
"email": "love@example.com" email: "love@example.com",
} },
], ],
"fallbacks": [ fallbacks: [
{ {
"dest": 80 // 或者回落到其它也防探测的代理 dest: 80, // 或者回落到其它也防探测的代理
}
]
}, },
"streamSettings": { ],
"network": "tcp",
"security": "none",
"tcpSettings": {
"acceptProxyProtocol": true
}
}
}, },
streamSettings: {
network: "tcp",
security: "none",
tcpSettings: {
acceptProxyProtocol: true,
},
},
}
``` ```
看,神奇的事情发生了, `trojan` 协议这里又出现了一个新的 `fallbacks`。前面已经说过,`xray` 中的 `trojan` 协议也具有完整的回落能力,所以,此时 `trojan` 协议可以再次做判断和回落(这也就是传说中的套娃回落了): 看,神奇的事情发生了, `trojan` 协议这里又出现了一个新的 `fallbacks`。前面已经说过,`xray` 中的 `trojan` 协议也具有完整的回落能力,所以,此时 `trojan` 协议可以再次做判断和回落(这也就是传说中的套娃回落了):
@ -266,94 +264,94 @@
2. 后续处理回落至 `1234` 端口的流量,仔细看!它其实是 `vless+ws` 2. 后续处理回落至 `1234` 端口的流量,仔细看!它其实是 `vless+ws`
``` ```json5
{ {
"port": 1234, port: 1234,
"listen": "127.0.0.1", listen: "127.0.0.1",
"protocol": "vless", protocol: "vless",
"settings": { settings: {
"clients": [ clients: [
{ {
"id": "", // 填写你的 UUID id: "", // 填写你的 UUID
"level": 0, level: 0,
"email": "love@example.com" email: "love@example.com",
} },
], ],
"decryption": "none" decryption: "none",
}, },
"streamSettings": { streamSettings: {
"network": "ws", network: "ws",
"security": "none", security: "none",
"wsSettings": { wsSettings: {
"acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行 acceptProxyProtocol: true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行
"path": "/websocket" // 必须换成自定义的 PATH需要和分流的一致 path: "/websocket", // 必须换成自定义的 PATH需要和分流的一致
}
}
}, },
},
}
``` ```
3. 后续处理回落至 `2345` 端口的流量,仔细看!它其实是 `vmess直连` 3. 后续处理回落至 `2345` 端口的流量,仔细看!它其实是 `vmess直连`
``` ```json5
{ {
"port": 2345, port: 2345,
"listen": "127.0.0.1", listen: "127.0.0.1",
"protocol": "vmess", protocol: "vmess",
"settings": { settings: {
"clients": [ clients: [
{ {
"id": "", // 填写你的 UUID id: "", // 填写你的 UUID
"level": 0, level: 0,
"email": "love@example.com" email: "love@example.com",
}
]
}, },
"streamSettings": { ],
"network": "tcp",
"security": "none",
"tcpSettings": {
"acceptProxyProtocol": true,
"header": {
"type": "http",
"request": {
"path": [
"/vmesstcp" // 必须换成自定义的 PATH需要和分流的一致
]
}
}
}
}
}, },
streamSettings: {
network: "tcp",
security: "none",
tcpSettings: {
acceptProxyProtocol: true,
header: {
type: "http",
request: {
path: [
"/vmesstcp", // 必须换成自定义的 PATH需要和分流的一致
],
},
},
},
},
}
``` ```
4. 后续处理回落至 `3456` 端口的流量,再仔细看!它其实是是 `vmess+ws(+cdn)` 4. 后续处理回落至 `3456` 端口的流量,再仔细看!它其实是是 `vmess+ws(+cdn)`
::: warning ::: warning 说明
**说明:** 你没看错,这就是 v2fly 曾经的推荐组合之一,并可完整支持 `CDN`。现已加入完美回落套餐哦! 你没看错,这就是 v2fly 曾经的推荐组合之一,并可完整支持 `CDN`。现已加入完美回落套餐哦!
::: :::
``` ```json5
{ {
"port": 3456, port: 3456,
"listen": "127.0.0.1", listen: "127.0.0.1",
"protocol": "vmess", protocol: "vmess",
"settings": { settings: {
"clients": [ clients: [
{ {
"id": "", // 填写你的 UUID id: "", // 填写你的 UUID
"level": 0, level: 0,
"email": "love@example.com" email: "love@example.com",
} },
] ],
},
streamSettings: {
network: "ws",
security: "none",
wsSettings: {
acceptProxyProtocol: true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行
path: "/vmessws", // 必须换成自定义的 PATH需要和分流的一致
},
}, },
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行
"path": "/vmessws" // 必须换成自定义的 PATH需要和分流的一致
}
}
} }
``` ```

View File

@ -1,3 +1,7 @@
---
title: SNI 回落
---
# 通过 SNI 回落功能实现伪装与按域名分流 # 通过 SNI 回落功能实现伪装与按域名分流
VLESS 是一种很轻的协议,和 Trojan 一样,不对流量进行复杂的加密和混淆,而是大隐隐于市,通过 TLS 协议加密,混杂在其他 HTTPS 流量中在墙内外穿进穿出。为了更好的伪装以应对主动探测Fallbacks 回落功能随 VLESS 同时出现。这篇教程将演示如何使用 Xray 中 VLESS 入站协议的回落功能配合 Nginx 或 Caddy 在保证伪装完全的前提下实现按域名分流。 VLESS 是一种很轻的协议,和 Trojan 一样,不对流量进行复杂的加密和混淆,而是大隐隐于市,通过 TLS 协议加密,混杂在其他 HTTPS 流量中在墙内外穿进穿出。为了更好的伪装以应对主动探测Fallbacks 回落功能随 VLESS 同时出现。这篇教程将演示如何使用 Xray 中 VLESS 入站协议的回落功能配合 Nginx 或 Caddy 在保证伪装完全的前提下实现按域名分流。
@ -70,91 +74,91 @@ acme.sh --install-cert -d example.com --fullchain-file /etc/ssl/xray/cert.pem --
## Xray 配置 ## Xray 配置
```json ```json5
{ {
"log": { log: {
"loglevel": "warning" loglevel: "warning",
}, },
"inbounds": [ inbounds: [
{ {
"port": 443, port: 443,
"protocol": "vless", protocol: "vless",
"settings": { settings: {
"clients": [ clients: [
{ {
"id": "UUID", id: "UUID",
"flow": "xtls-rprx-direct" flow: "xtls-rprx-direct",
} },
], ],
"decryption": "none", decryption: "none",
"fallbacks": [ fallbacks: [
{ {
"name": "example.com", name: "example.com",
"path": "/vmessws", path: "/vmessws",
"dest": 5000, dest: 5000,
"xver": 1 xver: 1,
}, },
{ {
"dest": 5001, dest: 5001,
"xver": 1 xver: 1,
}, },
{ {
"alpn": "h2", alpn: "h2",
"dest": 5002, dest: 5002,
"xver": 1 xver: 1,
}, },
{ {
"name": "blog.example.com", name: "blog.example.com",
"dest": 5003, dest: 5003,
"xver": 1 xver: 1,
}, },
{ {
"name": "blog.example.com", name: "blog.example.com",
"alpn": "h2", alpn: "h2",
"dest": 5004, dest: 5004,
"xver": 1 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"
}
}
}
], ],
"outbounds": [ },
streamSettings: {
network: "tcp",
security: "xtls",
xtlsSettings: {
alpn: ["h2", "http/1.1"],
certificates: [
{ {
"protocol": "freedom" 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",
},
},
},
],
outbounds: [
{
protocol: "freedom",
},
],
} }
``` ```
@ -188,7 +192,7 @@ acme.sh --install-cert -d example.com --fullchain-file /etc/ssl/xray/cert.pem --
如果使用 Caddy 就大可不必如此繁杂了,因为它**可以**在同一端口上同时监听 HTTP/1.1 和 h2c配置改动如下 如果使用 Caddy 就大可不必如此繁杂了,因为它**可以**在同一端口上同时监听 HTTP/1.1 和 h2c配置改动如下
```json ```json5
"fallbacks": [ "fallbacks": [
{ {
"name": "example.com", "name": "example.com",

View File

@ -51,7 +51,7 @@
下面的入站配置示例,用大白话说就是:数据按照 `socks` 协议,通过 `10808` 端口,从本机 `127.0.0.1` 流入`Xray`。同时,`Xray` 将这个入站用 `[tag]` 命名为 `inbound-10808` 下面的入站配置示例,用大白话说就是:数据按照 `socks` 协议,通过 `10808` 端口,从本机 `127.0.0.1` 流入`Xray`。同时,`Xray` 将这个入站用 `[tag]` 命名为 `inbound-10808`
``` ```json5
"inbounds": [ "inbounds": [
{ {
"tag": "inbound-10808", "tag": "inbound-10808",
@ -73,7 +73,7 @@
下面的出站配置示例,用大白话说就是:数据按照 `VLESS` 协议,以 `tcp + xtls (direct)` 的方式、及其他相关设置,把流量发送给对应的 VPS。同时`Xray` 将这个出站用 `[tag]` 命名为 `proxy-out-vless` 下面的出站配置示例,用大白话说就是:数据按照 `VLESS` 协议,以 `tcp + xtls (direct)` 的方式、及其他相关设置,把流量发送给对应的 VPS。同时`Xray` 将这个出站用 `[tag]` 命名为 `proxy-out-vless`
``` ```json5
"outbounds": [ "outbounds": [
{ {
"tag": "proxy-out-vless", "tag": "proxy-out-vless",
@ -113,7 +113,7 @@
下面的路由配置示例,用大白话说就是:把所有通过 `[tag]="inbound-10808"` 入站流入 `Xray` 的流量,`100%` 全部流转导入 `[tag]="proxy-out-vless"` 的出站,没有任何分流或其他操作。 下面的路由配置示例,用大白话说就是:把所有通过 `[tag]="inbound-10808"` 入站流入 `Xray` 的流量,`100%` 全部流转导入 `[tag]="proxy-out-vless"` 的出站,没有任何分流或其他操作。
``` ```json5
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"rules": [ "rules": [
@ -201,7 +201,7 @@
在上例的基础上,我们已经有了 `[proxy]` 的出站 `"proxy-out-vless"`,所以它保持不变。显而易见,我们需要加入两个新的出站方式:`[block]``[direct]`,如下: 在上例的基础上,我们已经有了 `[proxy]` 的出站 `"proxy-out-vless"`,所以它保持不变。显而易见,我们需要加入两个新的出站方式:`[block]``[direct]`,如下:
``` ```json5
"outbounds": [ "outbounds": [
{ {
"tag": "proxy-out-vless", "tag": "proxy-out-vless",
@ -228,7 +228,7 @@
接下来就是见证奇迹的时刻了,我们可以用【路由】的配置把这些连接起来! 接下来就是见证奇迹的时刻了,我们可以用【路由】的配置把这些连接起来!
``` ```json5
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"rules": [ "rules": [
@ -360,9 +360,9 @@
上一步我们已经配置出了 **【默认科学上网、国内网站白名单直连】** 的规则。那么现在只要 **【把直连规则放在第一位】**,就立即变成了正好相反的 **【默认直连、国外网站白名单科学上网】** 规则。 上一步我们已经配置出了 **【默认科学上网、国内网站白名单直连】** 的规则。那么现在只要 **【把直连规则放在第一位】**,就立即变成了正好相反的 **【默认直连、国外网站白名单科学上网】** 规则。
是不是,非常简单? 是不是,非常简单?
``` ```json5
"outbounds": [ "outbounds": [
{ {
"tag": "direct-out", "tag": "direct-out",

View File

@ -50,7 +50,7 @@
上述配置如下: 上述配置如下:
``` ```json5
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"rules": [ "rules": [
@ -92,7 +92,7 @@
上述配置如下: 上述配置如下:
``` ```json5
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"rules": [ "rules": [
@ -125,7 +125,7 @@
上述配置如下: 上述配置如下:
``` ```json5
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"rules": [ "rules": [
@ -157,7 +157,7 @@
你需要打开入站代理中的 `sniffing` 才能使用此种方式分流。 你需要打开入站代理中的 `sniffing` 才能使用此种方式分流。
::: :::
``` ```json5
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"rules": [ "rules": [
@ -205,7 +205,7 @@
`[1-block] --> [2-direct] --> [3-proxy] --> [4-first-outbound]` `[1-block] --> [2-direct] --> [3-proxy] --> [4-first-outbound]`
::: :::
``` ```json5
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"rules": [ "rules": [
@ -325,7 +325,7 @@
为了实现上面的目标,他写出了以下路由规则: 为了实现上面的目标,他写出了以下路由规则:
``` ```json5
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"rules": [ "rules": [
@ -357,7 +357,7 @@
正确示范,自然就是将不同的匹配依据独立出来: 正确示范,自然就是将不同的匹配依据独立出来:
``` ```json5
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"rules": [ "rules": [

View File

@ -8,15 +8,15 @@
"devDependencies": { "devDependencies": {
"@types/bootstrap": "^5.0.13", "@types/bootstrap": "^5.0.13",
"@types/jquery": "^3.5.5", "@types/jquery": "^3.5.5",
"@vuepress/plugin-back-to-top": "^2.0.0-beta.12", "@vuepress/plugin-back-to-top": "^2.0.0-beta.13",
"@vuepress/plugin-search": "^2.0.0-beta.12", "@vuepress/plugin-search": "^2.0.0-beta.13",
"postcss-loader": "^5.2.0", "postcss-loader": "^5.2.0",
"prettier": "^2.2.1", "prettier": "^2.2.1",
"sass": "^1.32.12", "sass": "^1.32.12",
"sass-loader": "^11.0.1", "sass-loader": "^11.0.1",
"vue-property-decorator": "^9.1.2", "vue-property-decorator": "^9.1.2",
"vuepress": "^2.0.0-beta.12", "vuepress": "^2.0.0-beta.13",
"vuepress-vite": "^2.0.0-beta.12" "vuepress-vite": "^2.0.0-beta.13"
}, },
"scripts": { "scripts": {
"docs:dev": "vuepress dev docs", "docs:dev": "vuepress dev docs",
@ -25,8 +25,8 @@
}, },
"dependencies": { "dependencies": {
"@popperjs/core": "^2.9.1", "@popperjs/core": "^2.9.1",
"@vuepress/plugin-debug": "^2.0.0-beta.12", "@vuepress/plugin-debug": "^2.0.0-beta.13",
"bootstrap": "^5.0.0-beta3", "bootstrap": "^5.0.0",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"markdown-it-footnote": "^3.0.2", "markdown-it-footnote": "^3.0.2",
"vuepress-plugin-mermaidjs": "^1.8.1" "vuepress-plugin-mermaidjs": "^1.8.1"

228
yarn.lock
View File

@ -340,16 +340,16 @@
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.0.11.tgz#20d22dd0da7d358bb21c17f9bde8628152642c77" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.0.11.tgz#20d22dd0da7d358bb21c17f9bde8628152642c77"
integrity sha512-b+zB8A2so8eCE0JsxjL24J7vdGl8rzPQ09hZNhystm+KqSbKcAej1A+Hbva1rCMmTTqA+hFnUSDc5kouEo0JzA== integrity sha512-b+zB8A2so8eCE0JsxjL24J7vdGl8rzPQ09hZNhystm+KqSbKcAej1A+Hbva1rCMmTTqA+hFnUSDc5kouEo0JzA==
"@vuepress/bundler-vite@2.0.0-beta.12": "@vuepress/bundler-vite@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.12.tgz#723afc6318a63355a5f95c99a14bbde948c3f541" resolved "https://registry.yarnpkg.com/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.13.tgz#51886f68bf17b0bf12d5f0f73d3e0f5138deb96b"
integrity sha512-oxto3yC958KuKf2PEraBmIbzylUpaGke4oJA/RRDOQsixwMJafPYTi8FDpTUqST7A36p7wM/5v+lmF3IT9TwBw== integrity sha512-hkvtEaXbMhNaEetpbKTfrCEcPnHcywu2/S2AtGO4nvu11JryXnGG4JdoPzA9O3qo/ZV5xq4eLTHyapu6kse/xA==
dependencies: dependencies:
"@vitejs/plugin-vue" "^1.2.2" "@vitejs/plugin-vue" "^1.2.2"
"@vue/compiler-sfc" "^3.0.11" "@vue/compiler-sfc" "^3.0.11"
"@vue/server-renderer" "^3.0.11" "@vue/server-renderer" "^3.0.11"
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/shared" "2.0.0-beta.7" "@vuepress/shared" "2.0.0-beta.7"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
rollup "^2.45.2" rollup "^2.45.2"
@ -357,17 +357,17 @@
vue "^3.0.11" vue "^3.0.11"
vue-router "^4.0.6" vue-router "^4.0.6"
"@vuepress/bundler-webpack@2.0.0-beta.12": "@vuepress/bundler-webpack@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/bundler-webpack/-/bundler-webpack-2.0.0-beta.12.tgz#26e9ac1db976094aded352dd93ed243be4cf2f7d" resolved "https://registry.yarnpkg.com/@vuepress/bundler-webpack/-/bundler-webpack-2.0.0-beta.13.tgz#302a0251903c69a53b47632acd5beb11d2905b24"
integrity sha512-hbNsGMuHQebMTRjwVW5T9nKS0OkY3SEN/yOLwCqtNpq5X0hsQRdbpMOYLZl/OncaVqRs6EjCEu0CEPwbSQWnuw== integrity sha512-2M0cM+AXNUgclLjYTH8IJPZxzlvIsyw5e+N76M5JpTPnDvttfSdylKYVY6Y06SIYJzgQ7L9CMS9ib9C4KkDI5Q==
dependencies: dependencies:
"@types/express" "^4.17.11" "@types/express" "^4.17.11"
"@types/webpack-env" "^1.16.0" "@types/webpack-env" "^1.16.0"
"@vue/compiler-sfc" "^3.0.11" "@vue/compiler-sfc" "^3.0.11"
"@vue/server-renderer" "^3.0.11" "@vue/server-renderer" "^3.0.11"
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/shared" "2.0.0-beta.7" "@vuepress/shared" "2.0.0-beta.7"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
autoprefixer "^10.2.5" autoprefixer "^10.2.5"
@ -392,12 +392,12 @@
webpack-dev-server "4.0.0-beta.2" webpack-dev-server "4.0.0-beta.2"
webpack-merge "^5.7.3" webpack-merge "^5.7.3"
"@vuepress/cli@2.0.0-beta.12": "@vuepress/cli@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/cli/-/cli-2.0.0-beta.12.tgz#a00905892037560012dc37b3895031a75296d21c" resolved "https://registry.yarnpkg.com/@vuepress/cli/-/cli-2.0.0-beta.13.tgz#95a272f8df6c5ded71c47c4005bce10a113a5e96"
integrity sha512-bQWxURVqW2q/4MabUwhY5VMmkjWy0m6U0agr1Ae2lD/LEWQhrkMRuSK7+V7HxSD7YCu7Rrp+dDXzf/te5CWvpw== integrity sha512-xbjBLn+g5Uo0I55j7TM6O6GmkIHzXFVWjcqL72JFFUNK/fbbGHln3Gzwsu7jXHUdGLiNx86nkeKFl9b0IzPzag==
dependencies: dependencies:
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
cac "^6.7.3" cac "^6.7.3"
chokidar "^3.5.1" chokidar "^3.5.1"
@ -413,22 +413,22 @@
vue "^3.0.11" vue "^3.0.11"
vue-router "^4.0.6" vue-router "^4.0.6"
"@vuepress/core@2.0.0-beta.12": "@vuepress/core@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/core/-/core-2.0.0-beta.12.tgz#234098cf91160abcb639f67496df465e7c0e4df1" resolved "https://registry.yarnpkg.com/@vuepress/core/-/core-2.0.0-beta.13.tgz#df2292a61f94de633195c915709b898e9d0c2306"
integrity sha512-OEo98+A/pfnOT5H4r5zUL/qQHMZB4oml19/2JYwI8SmDdp3XhiyyEVUrlgQou8+S/8cxH95YdIJ/NCvFkWYR9A== integrity sha512-jFaMVmXRSMszZtx4y6GVg/YDWWSmV59NABpdUgyY5rt2JeBoIyWo+QePPPwiwId1zNCSov7FA2iR/WEsU35Y1g==
dependencies: dependencies:
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/markdown" "2.0.0-beta.12" "@vuepress/markdown" "2.0.0-beta.13"
"@vuepress/shared" "2.0.0-beta.7" "@vuepress/shared" "2.0.0-beta.7"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
gray-matter "^4.0.3" gray-matter "^4.0.3"
toml "^3.0.0" toml "^3.0.0"
"@vuepress/markdown@2.0.0-beta.12": "@vuepress/markdown@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/markdown/-/markdown-2.0.0-beta.12.tgz#af60a29648a967fcdf1f15e8a4662c172c1b571d" resolved "https://registry.yarnpkg.com/@vuepress/markdown/-/markdown-2.0.0-beta.13.tgz#322c275fd9e3401e9e0666cd46ccf8d6f1dfe603"
integrity sha512-RhvcT+imWvCNc6us0BY8KGeXuNcxTn9NlcGNxyUuvxaKJah/kYniQ2shhMob0UBwc2I6gbTQTbACgS4IEJN0Rw== integrity sha512-sm1A5fcCsVfOns1KZOfLdoMzZT33bh691UzUk47VxYvY1CqkF7PAmWh+dfn9/KzDw6hhJYUbzfBjwToQKUzs7g==
dependencies: dependencies:
"@types/markdown-it" "^12.0.1" "@types/markdown-it" "^12.0.1"
"@vuepress/shared" "2.0.0-beta.7" "@vuepress/shared" "2.0.0-beta.7"
@ -437,120 +437,120 @@
markdown-it-anchor "^7.1.0" markdown-it-anchor "^7.1.0"
markdown-it-emoji "^2.0.0" markdown-it-emoji "^2.0.0"
"@vuepress/plugin-active-header-links@2.0.0-beta.12": "@vuepress/plugin-active-header-links@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.12.tgz#ae08d5eb801a720e9781f3f5e10bf197095a308b" resolved "https://registry.yarnpkg.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.13.tgz#e85c84475e4be3a318897c9d0599767bcba4199c"
integrity sha512-De/9AfpFC53YKAccbHoNxxZzKZS5IWsFqNjDSaEr0BDj08H43Q9vsqTcNT+PIqXuZT4y11P1iIMCEG6OyW5Lwg== integrity sha512-/D0EvQxkE7blzimAvejOv0rYXanms3B0BLvMRH/ROhjz1sITZ1PtsZwha237qpb/+Y9HVC2OERdT8GYYfToVhA==
dependencies: dependencies:
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
ts-debounce "^3.0.0" ts-debounce "^3.0.0"
vue "^3.0.11" vue "^3.0.11"
vue-router "^4.0.6" vue-router "^4.0.6"
"@vuepress/plugin-back-to-top@2.0.0-beta.12", "@vuepress/plugin-back-to-top@^2.0.0-beta.12": "@vuepress/plugin-back-to-top@2.0.0-beta.13", "@vuepress/plugin-back-to-top@^2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-beta.12.tgz#bdb776ed2db8eae37efd4eb9143deeb9e1b257e2" resolved "https://registry.yarnpkg.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-beta.13.tgz#de982688e740bcc7e9fb4eec8d780192c665986c"
integrity sha512-MMl1KtSp+d9FezFho058S9pAj569HElBTNdmoEyDimmyEPTu7N5SoGd2RonRpCW28/WBUkuZPA4GUfg8mnnvOQ== integrity sha512-eT+R0PqxGwyc1FA/m1m37jOfYPbjit3YYjRwisW1fYDpges9K6suhlOMsOnROCsiJohyXhK2FuiB/uFHpZYAAw==
dependencies: dependencies:
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
ts-debounce "^3.0.0" ts-debounce "^3.0.0"
vue "^3.0.11" vue "^3.0.11"
"@vuepress/plugin-container@2.0.0-beta.12": "@vuepress/plugin-container@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-container/-/plugin-container-2.0.0-beta.12.tgz#902a4c8549dca06d5e3fcd27e9e6df34d8e70325" resolved "https://registry.yarnpkg.com/@vuepress/plugin-container/-/plugin-container-2.0.0-beta.13.tgz#ed74aa7a1ea3e198428194e350d622c51b150d30"
integrity sha512-004eP4KMGLKfjieJkpE+h9Is5hZra5zCKZZHr00aYAEXeQlw/EP9AKSnL/Ht/UaUNPH3qDzoij+QjkTSRsObSA== integrity sha512-eNCJFX0jrl0N2pfiMakHGc5UC/onZSMzqRFifll+I3GnpgXFZ/wZBStcxJ7NuT93zjXYLQNt29WiP3V3S1eIvg==
dependencies: dependencies:
"@types/markdown-it" "^12.0.1" "@types/markdown-it" "^12.0.1"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/markdown" "2.0.0-beta.12" "@vuepress/markdown" "2.0.0-beta.13"
"@vuepress/shared" "2.0.0-beta.7" "@vuepress/shared" "2.0.0-beta.7"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
markdown-it "^12.0.4" markdown-it "^12.0.4"
markdown-it-container "^3.0.0" markdown-it-container "^3.0.0"
"@vuepress/plugin-debug@^2.0.0-beta.12": "@vuepress/plugin-debug@^2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-debug/-/plugin-debug-2.0.0-beta.12.tgz#faeb11ed539902396ad5868f3efec8f5b9783530" resolved "https://registry.yarnpkg.com/@vuepress/plugin-debug/-/plugin-debug-2.0.0-beta.13.tgz#6ce609131b6d2b0413b8ff5c2bcabc9c0d7dc606"
integrity sha512-SaMcVBRrSlM6T/X+XLMTxbKMD+BfGLDIrxHUHw5i8qlnaIei2UcvB66Wc2pfO/pRwlTCQ+9+CbFPOADck+ITqA== integrity sha512-dXutfiBN1gWP8yK4pecp+5PWlzZiOtV5X0ZKtHrV/zsK7p5/9cucRtEp0TtNNwG1V5EHxMNtv22R93e16FBppg==
dependencies: dependencies:
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
vue "^3.0.11" vue "^3.0.11"
vue-router "^4.0.6" vue-router "^4.0.6"
"@vuepress/plugin-git@2.0.0-beta.12": "@vuepress/plugin-git@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.12.tgz#4597f87599f1480804150fe3bd750d0040447775" resolved "https://registry.yarnpkg.com/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.13.tgz#4a974a84e826278959089858fe1573fcae3aa742"
integrity sha512-7ntlAJ6pn9bhpAxw7oQpEo5ACsARAfbhNq4O+UVk81JILtfl9kOZp1YBypxNrRL3Ww1ZkXb6mbwsJMNUJFrTtg== integrity sha512-d416V+xM/5g+tUPmHHHV+FfpC5iJhf3dykZDErvcWeEc37Vzpwn5vOSHLyFWtvnBdCnphOV0/t8XWmeBFLQfNA==
dependencies: dependencies:
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
execa "^5.0.0" execa "^5.0.0"
"@vuepress/plugin-medium-zoom@2.0.0-beta.12": "@vuepress/plugin-medium-zoom@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-beta.12.tgz#50b4e2cc41891ccbe07283bbe60c9fcf2594a779" resolved "https://registry.yarnpkg.com/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-beta.13.tgz#73fb5d1753c350dba8700e04c5db05f02dd61d1d"
integrity sha512-PpMZL866mpreoJlxiafJt0gH3e3NhQJlnUdw+uSeF9THRwgUJtKdcQYgbnUi4Mq2reWUtjtiHogyIPrFOj9LTw== integrity sha512-Qsm1/bJvm6tZRt2YnuuxBOI0cUeAdcG/63I5T2QmObNSokcYRHrT+yHPoMo5eIyhGFKexgycPtiEPrpJJStwQA==
dependencies: dependencies:
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
medium-zoom "^1.0.6" medium-zoom "^1.0.6"
vue "^3.0.11" vue "^3.0.11"
"@vuepress/plugin-nprogress@2.0.0-beta.12": "@vuepress/plugin-nprogress@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-beta.12.tgz#3dcac1e487b0f103ff1e8bbef8409fbb6c618186" resolved "https://registry.yarnpkg.com/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-beta.13.tgz#fcb2350076bd96917186e5a8b3ed12c2c68e5b8e"
integrity sha512-UONQ/Kg7ZDlOXwDUvwQeYjGhqPHPVDUEg41UVxqzzgXa1VDeILa6buq4kosYxiAFLgtc37RynIYzQIH+4/Y0ZA== integrity sha512-PblCu4LzihK2Aw1c9nJO0cMe7jwnNVV4hnTe+kO7ftKa3c935nwFiRG2GVmVdaE/zGw8NgjXdMx+7FVNYGPwgA==
dependencies: dependencies:
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
nprogress "^0.2.0" nprogress "^0.2.0"
vue "^3.0.11" vue "^3.0.11"
vue-router "^4.0.6" vue-router "^4.0.6"
"@vuepress/plugin-palette@2.0.0-beta.12": "@vuepress/plugin-palette@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-palette/-/plugin-palette-2.0.0-beta.12.tgz#cc9ce3cde8eab3b6442773d409d73a4e09abd15a" resolved "https://registry.yarnpkg.com/@vuepress/plugin-palette/-/plugin-palette-2.0.0-beta.13.tgz#25666629eaec86c96b92ebefebf48587208ba27b"
integrity sha512-h5hAfqW3aorKo/Q0VmxgAwfM9fIts8IbFogT/gH/t8jeYRB4RlAa5J3Q1npcK3zMlJy6h56lHdeFio4+xfanqw== integrity sha512-y+aZS0ucip/7qi69ShbL3UA1v3MIx0QVAZ6FtNBTzU0BqbJE12XUa8mw4XCkIRdO6Bo3sjyPIPK/rK9490aWag==
dependencies: dependencies:
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
chokidar "^3.5.1" chokidar "^3.5.1"
"@vuepress/plugin-prismjs@2.0.0-beta.12": "@vuepress/plugin-prismjs@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-beta.12.tgz#d4b2a8e8c7a136d4a9fe1cf2788263a7f8cdb405" resolved "https://registry.yarnpkg.com/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-beta.13.tgz#deb7acf2c788279556ea414b24cbac516b8ba408"
integrity sha512-1wd6LRCfOGXMYfVXfnBZvHEQosIQ3A8ZyF2Gaqf89UI0V6qoYdaMP7CeAafBFDgjvBCLZm4R1yrBrofB/DG8DQ== integrity sha512-9bX3ohRBYutO82ACJL/ol0aL4PcyXbx7JI15no5CsVV1hPaPC84xdo1ZP/XrvfSChODskx2r18nr02bReFGP5w==
dependencies: dependencies:
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
prismjs "^1.23.0" prismjs "^1.23.0"
"@vuepress/plugin-search@^2.0.0-beta.12": "@vuepress/plugin-search@^2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-search/-/plugin-search-2.0.0-beta.12.tgz#b0e7ad3ba20458f28f45d0e5a3e6d22badb96a0c" resolved "https://registry.yarnpkg.com/@vuepress/plugin-search/-/plugin-search-2.0.0-beta.13.tgz#15b44034b7566e0ff0e3b6ea641be3a2ef5c573e"
integrity sha512-a3s1mZNa+osTsOO9zqbgB7SWLvb5HUgFwC2HglGGFxWYfWp2hjY6vEUksGQDgh2gDVMuK77XvSSFJc4DMTJLIw== integrity sha512-gehkWIXtYZ4qe9XNt3kqkuDqwpisoWCMnW6dsH/eKgvGdA30Me8wSRmyY5jkCv3wB7go2v1BEPaDntVVnhUD4A==
dependencies: dependencies:
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/shared" "2.0.0-beta.7" "@vuepress/shared" "2.0.0-beta.7"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
chokidar "^3.5.1" chokidar "^3.5.1"
vue "^3.0.11" vue "^3.0.11"
vue-router "^4.0.6" vue-router "^4.0.6"
"@vuepress/plugin-theme-data@2.0.0-beta.12": "@vuepress/plugin-theme-data@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.12.tgz#8ca8e227b2ac1fb552b49b05238008e94d7b82f5" resolved "https://registry.yarnpkg.com/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.13.tgz#3c8c15f403f024cf3cdbcb8696f9d25bab502289"
integrity sha512-3YeGZgHxQ6pwrgXM13oKBxCL8xXBNZ5VyglBM1cy8irM9Q0TgmDOyDo06CdOClVCNO5JkeFNDrMXtB3u99d7jg== integrity sha512-VswhgTg9KAoCTRv8Z0tyxc2X4k4o23a8y3bihbw6HEJg8vFym9HlUFfSLJw8IFio+SO6llSIZX0toXwpaI19YQ==
dependencies: dependencies:
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/shared" "2.0.0-beta.7" "@vuepress/shared" "2.0.0-beta.7"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
@ -561,22 +561,22 @@
dependencies: dependencies:
"@vue/shared" "^3.0.11" "@vue/shared" "^3.0.11"
"@vuepress/theme-default@2.0.0-beta.12": "@vuepress/theme-default@2.0.0-beta.13":
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@vuepress/theme-default/-/theme-default-2.0.0-beta.12.tgz#9d09bda45e07eef1a70660d912695007af4b7ea8" resolved "https://registry.yarnpkg.com/@vuepress/theme-default/-/theme-default-2.0.0-beta.13.tgz#d4d7aa98fca6e647534662f72df48a8816257775"
integrity sha512-BRYVF3vSGYjM3OHxMSASI8/GouoP6k2qQCBkEs09KChu+z+T+6F6w129pWs0tG5pZx9RTPkkGIOFoFpyuDPGyQ== integrity sha512-KcNvLHVt9+EsSRTztbZo5yyo2cFPdg+QE5+2IC7PqjhpYY8a0DprjmsT3kUc+qEZhBHPEydwU9jdxq2nEUxTIg==
dependencies: dependencies:
"@vuepress/client" "2.0.0-beta.12" "@vuepress/client" "2.0.0-beta.12"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/plugin-active-header-links" "2.0.0-beta.12" "@vuepress/plugin-active-header-links" "2.0.0-beta.13"
"@vuepress/plugin-back-to-top" "2.0.0-beta.12" "@vuepress/plugin-back-to-top" "2.0.0-beta.13"
"@vuepress/plugin-container" "2.0.0-beta.12" "@vuepress/plugin-container" "2.0.0-beta.13"
"@vuepress/plugin-git" "2.0.0-beta.12" "@vuepress/plugin-git" "2.0.0-beta.13"
"@vuepress/plugin-medium-zoom" "2.0.0-beta.12" "@vuepress/plugin-medium-zoom" "2.0.0-beta.13"
"@vuepress/plugin-nprogress" "2.0.0-beta.12" "@vuepress/plugin-nprogress" "2.0.0-beta.13"
"@vuepress/plugin-palette" "2.0.0-beta.12" "@vuepress/plugin-palette" "2.0.0-beta.13"
"@vuepress/plugin-prismjs" "2.0.0-beta.12" "@vuepress/plugin-prismjs" "2.0.0-beta.13"
"@vuepress/plugin-theme-data" "2.0.0-beta.12" "@vuepress/plugin-theme-data" "2.0.0-beta.13"
"@vuepress/shared" "2.0.0-beta.7" "@vuepress/shared" "2.0.0-beta.7"
"@vuepress/utils" "2.0.0-beta.11" "@vuepress/utils" "2.0.0-beta.11"
sass "^1.32.11" sass "^1.32.11"
@ -928,10 +928,10 @@ boolbase@^1.0.0, boolbase@~1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
bootstrap@^5.0.0-beta3: bootstrap@^5.0.0:
version "5.0.0-beta3" version "5.0.0"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.0.0-beta3.tgz#c959f61fbd03667a1b158f763856994859d7a465" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.0.0.tgz#97635ac0e0d6cb466700ebf0fd266bfabf352ed2"
integrity sha512-0urccjfIOzhrb9qJysN8XW/DRw6rg3zH7qLeKIp4Zyl8+Ens4JWB0NC0cB5AhnSFPd2tftRggjwCMxablo6Tpg== integrity sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA==
brace-expansion@^1.1.7: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.11"
@ -4149,25 +4149,25 @@ vuepress-plugin-mermaidjs@^1.8.1:
dependencies: dependencies:
mermaid "^8.8.3" mermaid "^8.8.3"
vuepress-vite@^2.0.0-beta.12: vuepress-vite@^2.0.0-beta.13:
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/vuepress-vite/-/vuepress-vite-2.0.0-beta.12.tgz#d82082dd84f95849a658c33a2409894c058e3861" resolved "https://registry.yarnpkg.com/vuepress-vite/-/vuepress-vite-2.0.0-beta.13.tgz#27c6910d7ccc9da4e503da0103ae7f005e076494"
integrity sha512-QmVzU4W2EphdzJq1+QvegEXO7H4SutUEoe5SLOEwCuWShhQV5mK5iHfe1MBj1smn6nSl+DpIREzFkGV1fFm+Rg== integrity sha512-oBW6wT5qb3i95d8ofGDrDWtnQEfmKzgC8qBehHA8vzC32rGn6M8nNwp2p7AQ9Ja7vXadGB+ni7WXwMUrz/vL9A==
dependencies: dependencies:
"@vuepress/bundler-vite" "2.0.0-beta.12" "@vuepress/bundler-vite" "2.0.0-beta.13"
"@vuepress/cli" "2.0.0-beta.12" "@vuepress/cli" "2.0.0-beta.13"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/theme-default" "2.0.0-beta.12" "@vuepress/theme-default" "2.0.0-beta.13"
vuepress@^2.0.0-beta.12: vuepress@^2.0.0-beta.13:
version "2.0.0-beta.12" version "2.0.0-beta.13"
resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-2.0.0-beta.12.tgz#0b9f21283f13a415f5fcae3a346dd15784625478" resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-2.0.0-beta.13.tgz#d0649420781f0357072cae00ebb71283c2e475f4"
integrity sha512-4F73CBC9/eFQ9olHY8kV6fiI5ZHEfzuXwK7GwHknddvtBN/GuO+pjwgiEq6OZ9VmcpSBIIjJMHNPN0E0ufDtTw== integrity sha512-41MEemyW5d3zjOznNanjESRJU1RrkzeuZ411UxwSGxm6gn9EQYn5ACLi8c05cmTZ9+GXl/lhjsbs/J62hJ+qOQ==
dependencies: dependencies:
"@vuepress/bundler-webpack" "2.0.0-beta.12" "@vuepress/bundler-webpack" "2.0.0-beta.13"
"@vuepress/cli" "2.0.0-beta.12" "@vuepress/cli" "2.0.0-beta.13"
"@vuepress/core" "2.0.0-beta.12" "@vuepress/core" "2.0.0-beta.13"
"@vuepress/theme-default" "2.0.0-beta.12" "@vuepress/theme-default" "2.0.0-beta.13"
watchpack@^2.0.0: watchpack@^2.0.0:
version "2.1.1" version "2.1.1"