Be bold in stating your key points. Put them in a list:
-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; - } - ``` + ``` + + + +Be bold in stating your key points. Put them in a list:
+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