Fix: format

This commit is contained in:
JimhHan 2021-03-26 14:01:07 +08:00
parent 9bf9c2f885
commit 71eaa61dbd
No known key found for this signature in database
GPG key ID: 48D5D7CF95157AC5
60 changed files with 2107 additions and 2242 deletions

View file

@ -22,7 +22,7 @@ Xray 的配置文件为 json 格式, 客户端和服务端的配置格式没有
"transport": {}, "transport": {},
"stats": {}, "stats": {},
"reverse": {}, "reverse": {},
"fakedns":{} "fakedns": {}
} }
``` ```
@ -34,11 +34,11 @@ Xray 的配置文件为 json 格式, 客户端和服务端的配置格式没有
> log:[LogObject](./log.md) > log:[LogObject](./log.md)
日志配置,控制 Xray输出日志的方式. 日志配置,控制 Xray 输出日志的方式.
> api:[ApiObject](./api.md) > api:[ApiObject](./api.md)
提供了一些API接口供远程调用。 提供了一些 API 接口供远程调用。
> dns: [DnsObject](./dns.md) > dns: [DnsObject](./dns.md)
@ -46,7 +46,7 @@ Xray 的配置文件为 json 格式, 客户端和服务端的配置格式没有
> routing: [RoutingObject](./routing.md) > routing: [RoutingObject](./routing.md)
路由功能。可以设置规则分流数据从不同的outbound发出. 路由功能。可以设置规则分流数据从不同的 outbound 发出.
> policy: [PolicyObject](./policy.md) > policy: [PolicyObject](./policy.md)

View file

@ -1,8 +1,8 @@
# API接口 # API 接口
API接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供远程调用。 API 接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供远程调用。
可以通过api配置模块开启接口. 当api配置开启时Xray 会自建一个出站代理,须手动将所有的 API 入站连接通过 [路由规则配置](./routing.md) 指向这一出站代理。 可以通过 api 配置模块开启接口. 当 api 配置开启时Xray 会自建一个出站代理,须手动将所有的 API 入站连接通过 [路由规则配置](./routing.md) 指向这一出站代理。
请参考本节中的 [相关配置](#相关配置) 请参考本节中的 [相关配置](#相关配置)
@ -18,11 +18,7 @@ API接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供
{ {
"api": { "api": {
"tag": "api", "tag": "api",
"services": [ "services": ["HandlerService", "LoggerService", "StatsService"]
"HandlerService",
"LoggerService",
"StatsService"
]
} }
} }
``` ```
@ -35,7 +31,6 @@ API接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供
开启的 API 列表,可选的值见 [API 列表](#支持的-api-列表)。 开启的 API 列表,可选的值见 [API 列表](#支持的-api-列表)。
## 相关配置 ## 相关配置
可以在 inbounds 配置中增加一个 api 的 inbound 可以在 inbounds 配置中增加一个 api 的 inbound
@ -54,7 +49,7 @@ API接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供
] ]
``` ```
在路由配置中增加针对api inbound的路由规则 在路由配置中增加针对 api inbound 的路由规则
```json ```json
"routing": { "routing": {
@ -73,7 +68,6 @@ API接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供
} }
``` ```
## 支持的 API 列表 ## 支持的 API 列表
### HandlerService ### HandlerService

View file

@ -1,4 +1,4 @@
# 内置DNS服务器 # 内置 DNS 服务器
## DNS 服务器 ## DNS 服务器
@ -21,9 +21,9 @@ Xray 内置的 DNS 模块,主要有两大用途:
只支持最基本的 IP 查询A 和 AAAA 记录)。其他查询不会进入内置 DNS 服务器。 只支持最基本的 IP 查询A 和 AAAA 记录)。其他查询不会进入内置 DNS 服务器。
::: :::
## DNS 处理流程 ## DNS 处理流程
DNS 服务器配置模块可以配置多个DNS服务器, 并且指定优先匹配列表.
DNS 服务器配置模块可以配置多个 DNS 服务器, 并且指定优先匹配列表.
1. 查询的域名与某个 DNS 服务器指定的域名列表匹配时Xray 会优先使用这个 DNS 服务器进行查询。 1. 查询的域名与某个 DNS 服务器指定的域名列表匹配时Xray 会优先使用这个 DNS 服务器进行查询。
2. 无匹配时, 按从上往下的顺序进行查询,并且会跳过 1 步骤中使用的最后一个服务器。 2. 无匹配时, 按从上往下的顺序进行查询,并且会跳过 1 步骤中使用的最后一个服务器。
@ -33,8 +33,8 @@ DNS 服务器的处理流程示意图如下:
![](./dns_flow.png?classes=border,shadow) ![](./dns_flow.png?classes=border,shadow)
## DnsObject ## DnsObject
`DnsObject` 对应配置文件的 `dns` 项。 `DnsObject` 对应配置文件的 `dns` 项。
```json ```json
@ -60,7 +60,7 @@ DNS 服务器的处理流程示意图如下:
} }
``` ```
>`hosts`: map{string: address} > `hosts`: map{string: address}
静态 IP 列表,其值为一系列的 "域名": "地址"。其中地址可以是 IP 或者域名。在解析域名时,如果域名匹配这个列表中的某一项: 静态 IP 列表,其值为一系列的 "域名": "地址"。其中地址可以是 IP 或者域名。在解析域名时,如果域名匹配这个列表中的某一项:
@ -70,12 +70,12 @@ DNS 服务器的处理流程示意图如下:
域名的格式有以下几种形式: 域名的格式有以下几种形式:
- 纯字符串:当此字符串完整匹配目标域名时,该规则生效。例如 "xray.com" 匹配 "xray.com",但不匹配 "www.xray.com"。 - 纯字符串:当此字符串完整匹配目标域名时,该规则生效。例如 "xray.com" 匹配 "xray.com",但不匹配 "www.xray.com"。
- 正则表达式:由 `"regexp:"` 开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如 "regexp:\\\\.goo.\*\\\\.com$" 匹配 "www.google.com"、"fonts.googleapis.com",但不匹配 "google.com"。 - 正则表达式:由 `"regexp:"` 开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如 "regexp:\\\\.goo.\*\\\\.com\$" 匹配 "www.google.com"、"fonts.googleapis.com",但不匹配 "google.com"。
- 子域名 (推荐):由 `"domain:"` 开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如 "domain:xray.com" 匹配 "www.xray.com" 与 "xray.com",但不匹配 "wxray.com"。 - 子域名 (推荐):由 `"domain:"` 开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如 "domain:xray.com" 匹配 "www.xray.com" 与 "xray.com",但不匹配 "wxray.com"。
- 子串:由 `"keyword:"` 开始,余下部分是一个字符串。当此字符串匹配目标域名中任意部分,该规则生效。比如 "keyword:sina.com" 可以匹配 "sina.com"、"sina.com.cn" 和 "www.sina.com",但不匹配 "sina.cn"。 - 子串:由 `"keyword:"` 开始,余下部分是一个字符串。当此字符串匹配目标域名中任意部分,该规则生效。比如 "keyword:sina.com" 可以匹配 "sina.com"、"sina.com.cn" 和 "www.sina.com",但不匹配 "sina.cn"。
- 预定义域名列表:由 `"geosite:"` 开头,余下部分是一个名称,如 `geosite:google` 或者 `geosite:cn`。名称及域名列表参考 [预定义域名列表](./routing.md#预定义域名列表)。 - 预定义域名列表:由 `"geosite:"` 开头,余下部分是一个名称,如 `geosite:google` 或者 `geosite:cn`。名称及域名列表参考 [预定义域名列表](./routing.md#预定义域名列表)。
>`servers`: \[string | [ServerObject](#serverobject) \] > `servers`: \[string | [ServerObject](#serverobject) \]
一个 DNS 服务器列表支持的类型有两种DNS 地址(字符串形式)和 [ServerObject](#serverobject) 。 一个 DNS 服务器列表支持的类型有两种DNS 地址(字符串形式)和 [ServerObject](#serverobject) 。
@ -83,7 +83,7 @@ DNS 服务器的处理流程示意图如下:
当值为 `"localhost"` 时,表示使用本机预设的 DNS 配置。 当值为 `"localhost"` 时,表示使用本机预设的 DNS 配置。
当值是 `"https://host:port/dns-query"` 的形式,如 `"https://dns.google/dns-query"`Xray 会使用 `DNS over HTTPS` (RFC8484, 简称 DOH) 进行查询。有些服务商拥有 IP 别名的证书,可以直接写 IP 形式,比如 `https://1.1.1.1/dns-query`。也可使用非标准端口和路径,如 `"https://a.b.c.d:8443/my-dns-query"` 当值是 `"https://host:port/dns-query"` 的形式,如 `"https://dns.google/dns-query"`Xray 会使用 `DNS over HTTPS` (RFC8484, 简称 DOH) 进行查询。有些服务商拥有 IP 别名的证书,可以直接写 IP 形式,比如 `https://1.1.1.1/dns-query`。也可使用非标准端口和路径,如 `"https://a.b.c.d:8443/my-dns-query"`
当值是 `"https+local://host:port/dns-query"` 的形式,如 `"https+local://dns.google/dns-query"`Xray 会使用 `DOH本地模式` 进行查询,即 DOH 请求不会经过 Routing/Outbound 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。 当值是 `"https+local://host:port/dns-query"` 的形式,如 `"https+local://dns.google/dns-query"`Xray 会使用 `DOH本地模式` 进行查询,即 DOH 请求不会经过 Routing/Outbound 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
@ -101,29 +101,26 @@ DNS 服务器的处理流程示意图如下:
(v1.4.0+) 可以在 [日志](./log.md) 中打开 DNS 查询日志。 (v1.4.0+) 可以在 [日志](./log.md) 中打开 DNS 查询日志。
::: :::
>`clientIp`: string > `clientIp`: string
用于 DNS 查询时通知服务器以指定IP位置。不能是私有地址。 用于 DNS 查询时通知服务器以指定 IP 位置。不能是私有地址。
>`tag`: string > `tag`: string
由内置 DNS 发出的查询流量,除 `localhost``DOHL_` 模式外,都可以用此标识在路由使用 `inboundTag` 进行匹配。 由内置 DNS 发出的查询流量,除 `localhost``DOHL_` 模式外,都可以用此标识在路由使用 `inboundTag` 进行匹配。
### ServerObject ### ServerObject
```json ```json
{ {
"address": "1.2.3.4", "address": "1.2.3.4",
"port": 5353, "port": 5353,
"domains": [ "domains": ["domain:xray.com"],
"domain:xray.com" "expectIPs": ["geoip:cn"]
],
"expectIPs": [
"geoip:cn"
]
} }
``` ```
>`address`: address
> `address`: address
一个 DNS 服务器列表支持的类型有两种DNS 地址(字符串形式)和 ServerObject 。 一个 DNS 服务器列表支持的类型有两种DNS 地址(字符串形式)和 ServerObject 。
@ -133,19 +130,19 @@ DNS 服务器的处理流程示意图如下:
当值是 "https://host:port/dns-query" 的形式,如 "https://dns.google/dns-query"Xray 会使用 DNS over HTTPS (RFC8484, 简称 DOH) 进行查询。有些服务商拥有 IP 别名的证书,可以直接写 IP 形式,比如 https://1.1.1.1/dns-query。也可使用非标准端口和路径如 "https://a.b.c.d:8443/my-dns-query" 当值是 "https://host:port/dns-query" 的形式,如 "https://dns.google/dns-query"Xray 会使用 DNS over HTTPS (RFC8484, 简称 DOH) 进行查询。有些服务商拥有 IP 别名的证书,可以直接写 IP 形式,比如 https://1.1.1.1/dns-query。也可使用非标准端口和路径如 "https://a.b.c.d:8443/my-dns-query"
当值是 "https+local://host:port/dns-query" 的形式,如 "https+local://dns.google/dns-query"Xray 会使用 DOH本地模式 进行查询,即 DOH 请求不会经过 Routing/Outbound 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。 当值是 "https+local://host:port/dns-query" 的形式,如 "https+local://dns.google/dns-query"Xray 会使用 DOH 本地模式 进行查询,即 DOH 请求不会经过 Routing/Outbound 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
当值是 `fakedns` 时,将使用 FakeDNS 功能进行查询。 当值是 `fakedns` 时,将使用 FakeDNS 功能进行查询。
>`port`: number > `port`: number
DNS 服务器端口,如 `53`。此项缺省时默认为 `53`。当使用 DOH 模式该项无效,非标端口应在 URL 中指定。 DNS 服务器端口,如 `53`。此项缺省时默认为 `53`。当使用 DOH 模式该项无效,非标端口应在 URL 中指定。
>`domains`: \[string\] > `domains`: \[string\]
一个域名列表,此列表包含的域名,将优先使用此服务器进行查询。域名格式和 [路由配置](./routing.md#ruleobject) 中相同。 一个域名列表,此列表包含的域名,将优先使用此服务器进行查询。域名格式和 [路由配置](./routing.md#ruleobject) 中相同。
>`expectIPs`:\[string\] > `expectIPs`:\[string\]
一个 IP 范围列表,格式和 [路由配置](./routing.md#ruleobject) 中相同。 一个 IP 范围列表,格式和 [路由配置](./routing.md#ruleobject) 中相同。

View file

@ -12,12 +12,12 @@ FakeDNS 有可能会污染本地 DNS导致 Xray 关闭后“无法访问网
```json ```json
{ {
"ipPool": "198.18.0.0/16", "ipPool": "198.18.0.0/16",
"poolSize": 65535 "poolSize": 65535
} }
``` ```
> `ipPool`: CIDR > `ipPool`: CIDR
FakeDNS 将使用此选项指定的 IP 块分配地址。 FakeDNS 将使用此选项指定的 IP 块分配地址。

View file

@ -26,7 +26,6 @@ Xray 提供以下环境变量以供修改 Xray 的一些底层配置。
可打开此环境变量并根据是否有输出 XTLS 相关信息, 来确定 XTLS 是否成功被应用. 可打开此环境变量并根据是否有输出 XTLS 相关信息, 来确定 XTLS 是否成功被应用.
::: :::
## 资源文件路径 ## 资源文件路径
- 名称:`xray.location.asset``XRAY_LOCATION_ASSET` - 名称:`xray.location.asset``XRAY_LOCATION_ASSET`

View file

@ -6,8 +6,7 @@ fallback 为 Xray 提供了高强度的防主动探测性, 并且具有独创的
fallback 也可以将不同类型的流量根据 path 进行分流, 从而实现一个端口, 多种服务共享. fallback 也可以将不同类型的流量根据 path 进行分流, 从而实现一个端口, 多种服务共享.
目前您可以在使用 VLESS 或者 trojan 协议时, 通过配置 fallbacks 来使用回落这一特性, 并且创造出非常丰富的组合玩法. 目前您可以在使用 VLESS 或者 trojan 协议时, 通过配置 fallbacks 来使用回落这一特性, 并且创造出非常丰富的组合玩法.
## fallbacks 配置 ## fallbacks 配置
@ -48,6 +47,7 @@ VLESS 会把 TLS 解密后首包长度 < 18 或协议版本无效、身份认证
其它传输组合必须删掉 `fallbacks` 项或所有子元素,此时也不会开启 FallbackVLESS 会等待读够所需长度,协议版本无效或身份认证失败时,将直接断开连接。 其它传输组合必须删掉 `fallbacks` 项或所有子元素,此时也不会开启 FallbackVLESS 会等待读够所需长度,协议版本无效或身份认证失败时,将直接断开连接。
> `name`: string > `name`: string
尝试匹配 TLS SNI(Server Name Indication),空为任意,默认为 "" 尝试匹配 TLS SNI(Server Name Indication),空为任意,默认为 ""
> `alpn`: string > `alpn`: string
@ -86,12 +86,10 @@ Fallback 内设置的 `alpn` 是匹配实际协商出的 ALPN而 Inbound TLS
目前填 1 或 2功能完全相同只是结构不同且前者可打印后者为二进制。Xray 的 TCP 和 WS 入站均已支持接收 PROXY protocol。 目前填 1 或 2功能完全相同只是结构不同且前者可打印后者为二进制。Xray 的 TCP 和 WS 入站均已支持接收 PROXY protocol。
::: warning ::: warning
若你正在 [配置 Nginx 接收 PROXY protocol](https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/#configuring-nginx-to-accept-the-proxy-protocol),除了设置 proxy_protocol 外,还需设置 set_real_ip_from否则可能会出问题。 若你正在 [配置 Nginx 接收 PROXY protocol](https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/#configuring-nginx-to-accept-the-proxy-protocol),除了设置 proxy_protocol 外,还需设置 set_real_ip_from否则可能会出问题。
::: :::
### 补充说明 ### 补充说明
- 将匹配到最精确的子元素,与子元素的排列顺序无关。若配置了几个 alpn 和 path 均相同的子元素,则会以最后的为准。 - 将匹配到最精确的子元素,与子元素的排列顺序无关。若配置了几个 alpn 和 path 均相同的子元素,则会以最后的为准。
@ -99,6 +97,4 @@ Fallback 内设置的 `alpn` 是匹配实际协商出的 ALPN而 Inbound TLS
- 您可以查看更多的关于 Fallbacks 的使用技巧和心得 - 您可以查看更多的关于 Fallbacks 的使用技巧和心得
- [Fallbacks 功能简析](../documents/level-1/fallbacks-lv1) - [Fallbacks 功能简析](../documents/level-1/fallbacks-lv1)
## Fallbacks 设计理论 <Badge text="WIP" type="warning"/> ## Fallbacks 设计理论 <Badge text="WIP" type="warning"/>

View file

@ -28,26 +28,26 @@ $ xray run -confdir /etc/xray/confs
比如: 比如:
* base.json - base.json
```json ```json
{ {
"log": {}, "log": {},
"api": {}, "api": {},
"dns": {}, "dns": {},
"stats": {}, "stats": {},
"policy": {}, "policy": {},
"transport": {}, "transport": {},
"routing": {}, "routing": {},
"inbounds": [] "inbounds": []
} }
``` ```
* outbounds.json - outbounds.json
```json ```json
{ {
"outbounds": [] "outbounds": []
} }
``` ```
@ -61,13 +61,13 @@ $ xray run -confdir /etc/xray/confs
如果需要改编日志 log 的级别,也不需要改 `base.json`,只需后续增加一个配置: 如果需要改编日志 log 的级别,也不需要改 `base.json`,只需后续增加一个配置:
* debuglog.json - debuglog.json
```json ```json
{ {
"log": { "log": {
"loglevel": "debug" "loglevel": "debug"
} }
} }
``` ```
@ -77,8 +77,8 @@ $ xray run -confdir /etc/xray/confs
在 json 配置中的`inbounds``outbounds`是数组结构,他们有特殊的规则: 在 json 配置中的`inbounds``outbounds`是数组结构,他们有特殊的规则:
* 当配置中的数组元素有 2 或以上,覆盖前者的 inbounds/oubounds - 当配置中的数组元素有 2 或以上,覆盖前者的 inbounds/oubounds
* 当配置中的数组元素只有 1 个时,查找原有`tag`相同的元素进行覆盖;若无法找到: - 当配置中的数组元素只有 1 个时,查找原有`tag`相同的元素进行覆盖;若无法找到:
- 对于 inbounds添加至最后inbounds 内元素顺序无关) - 对于 inbounds添加至最后inbounds 内元素顺序无关)
- 对于 outbounds添加至最前outbounds 默认首选出口);但如果文件名含有 tail大小写均可添加至最后。 - 对于 outbounds添加至最前outbounds 默认首选出口);但如果文件名含有 tail大小写均可添加至最后。
@ -86,44 +86,44 @@ $ xray run -confdir /etc/xray/confs
以下例子不是有效配置,只为展示上述规则。 以下例子不是有效配置,只为展示上述规则。
* 000.json - 000.json
```json ```json
{ {
"inbounds": [ "inbounds": [
{ {
"protocol": "socks", "protocol": "socks",
"tag":"socks", "tag": "socks",
"port": 1234 "port": 1234
} }
] ]
} }
``` ```
* 001.json - 001.json
```json ```json
{ {
"inbounds": [ "inbounds": [
{ {
"protocol": "http", "protocol": "http",
"tag":"http" "tag": "http"
} }
] ]
} }
``` ```
* 002.json - 002.json
```json ```json
{ {
"inbounds": [ "inbounds": [
{ {
"protocol": "socks", "protocol": "socks",
"tag":"socks", "tag": "socks",
"port": 4321 "port": 4321
} }
] ]
} }
``` ```
@ -131,22 +131,20 @@ $ xray run -confdir /etc/xray/confs
```json ```json
{ {
"inbounds": [ "inbounds": [
{ {
"protocol": "socks", "protocol": "socks",
"tag":"socks", "tag": "socks",
"port": 4321 // < 002顺序在000后因此覆盖tag为socks的inbound端口为4321 "port": 4321 // < 002顺序在000后因此覆盖tag为socks的inbound端口为4321
}, },
{ {
"protocol": "http", "protocol": "http",
"tag":"http" "tag": "http"
} }
] ]
} }
``` ```
## 推荐的多文件列表 ## 推荐的多文件列表
执行: 执行:

View file

@ -29,18 +29,18 @@
- iOS / Mac - iOS / Mac
- [Shadowrocket](https://apps.apple.com/app/shadowrocket/id932747118) - [Shadowrocket](https://apps.apple.com/app/shadowrocket/id932747118)
## Fallbacks ## Fallbacks
Fallbacks 是 Xray 独创的新型协议回落模式解析, 可有效防止主动探测, 自由配置常用端口多服务共享. Fallbacks 是 Xray 独创的新型协议回落模式解析, 可有效防止主动探测, 自由配置常用端口多服务共享.
目前 Xray 中的 VLESS 和 trojan 协议支持Fallbacks. 目前 Xray 中的 VLESS 和 trojan 协议支持 Fallbacks.
- [Fallbacks 配置说明](../fallback/#fallbacks-配置) - [Fallbacks 配置说明](../fallback/#fallbacks-配置)
- [Fallbacks 功能简析]() - [Fallbacks 功能简析]()
- [Fallbacks 设计理论](../fallback/#fallbacks-设计理论) - [Fallbacks 设计理论](../fallback/#fallbacks-设计理论)
## VLESS 分享链接标准 ## VLESS 分享链接标准
感谢 <img src="https://avatars2.githubusercontent.com/u/7822648?s=32" width="32px" height="32px" alt="a"/> [@DuckSoft](https://github.com/DuckSoft) 的提案! 感谢 <img src="https://avatars2.githubusercontent.com/u/7822648?s=32" width="32px" height="32px" alt="a"/> [@DuckSoft](https://github.com/DuckSoft) 的提案!
目前为初步提案, 详情请见 [VMessAEAD / VLESS 分享链接标准提案](https://github.com/XTLS/Xray-core/issues/91) 目前为初步提案, 详情请见 [VMessAEAD / VLESS 分享链接标准提案](https://github.com/XTLS/Xray-core/issues/91)

View file

@ -2,4 +2,4 @@
> **XTLS 是 Xray 的原创黑科技, 也是使 Xray 性能一骑绝尘的核心动力** > **XTLS 是 Xray 的原创黑科技, 也是使 Xray 性能一骑绝尘的核心动力**
<Badge text="WIP" type="warning"/> <Badge text="WIP" type="warning"/>

View file

@ -30,7 +30,7 @@
} }
``` ```
>`listen`: address > `listen`: address
监听地址IP 地址或 Unix domain socket默认值为 `"0.0.0.0"`,表示接收所有网卡上的连接. 监听地址IP 地址或 Unix domain socket默认值为 `"0.0.0.0"`,表示接收所有网卡上的连接.
@ -40,7 +40,7 @@
填写 Unix domain socket 时,`port``allocate` 将被忽略,协议目前可选 VLESS、VMess、Trojan传输方式可选 TCP、WebSocket、HTTP/2。 填写 Unix domain socket 时,`port``allocate` 将被忽略,协议目前可选 VLESS、VMess、Trojan传输方式可选 TCP、WebSocket、HTTP/2。
>`port`: number | "env:variable" | string > `port`: number | "env:variable" | string
端口。接受的格式如下: 端口。接受的格式如下:
@ -50,41 +50,42 @@
当只有一个端口时Xray 会在此端口监听入站连接。当指定了一个端口范围时,取决于 `allocate` 设置。 当只有一个端口时Xray 会在此端口监听入站连接。当指定了一个端口范围时,取决于 `allocate` 设置。
>`protocol`: string > `protocol`: string
连接协议名称,可选的协议类型见 [inbound 可用协议列表](./inbounds/)。 连接协议名称,可选的协议类型见 [inbound 可用协议列表](./inbounds/)。
>`settings`: InboundConfigurationObject > `settings`: InboundConfigurationObject
具体的配置内容,视协议不同而不同。详见每个协议中的 `InboundConfigurationObject` 具体的配置内容,视协议不同而不同。详见每个协议中的 `InboundConfigurationObject`
>`streamSettings`: [StreamSettingsObject](./transport.md#streamsettingsobject) > `streamSettings`: [StreamSettingsObject](./transport.md#streamsettingsobject)
底层传输方式transport是当前 Xray 节点和其它节点对接的方式 底层传输方式transport是当前 Xray 节点和其它节点对接的方式
>`tag`: string > `tag`: string
此入站连接的标识,用于在其它的配置中定位此连接。 > 此入站连接的标识,用于在其它的配置中定位此连接。
::: danger ::: danger
当其不为空时,其值必须在所有 `tag` 中**唯一**。 当其不为空时,其值必须在所有 `tag` 中**唯一**。
::: :::
>`sniffing`: [SniffingObject](#sniffingobject) > `sniffing`: [SniffingObject](#sniffingobject)
流量探测主要作用于在透明代理等用途. 流量探测主要作用于在透明代理等用途.
比如一个典型流程如下: 比如一个典型流程如下:
1. 如有一个设备上网,去访问abc.com,首先设备通过DNS查询得到abc.com的IP是1.2.3.4,然后设备会向1.2.3.4去发起连接.
2. 如果不设置嗅探,Xray收到的连接请求是1.2.3.4,并不能用于域名规则的路由分流.
3. 当设置了sniffing中的enable为true,Xray处理此连接的流量时,会从流量的数据中,嗅探出域名,即abc.com
4. Xray会把1.2.3.4重置为abc.com.路由就可以根据域名去进行路由的域名规则的分流
因为变成了一个向abc.com请求的连接, 就可以做更多的事情, 除了路由域名规则分流, 还能重新做DNS解析等其他工作. 1. 如有一个设备上网,去访问 abc.com,首先设备通过 DNS 查询得到 abc.com 的 IP 是 1.2.3.4,然后设备会向 1.2.3.4 去发起连接.
2. 如果不设置嗅探,Xray 收到的连接请求是 1.2.3.4,并不能用于域名规则的路由分流.
3. 当设置了 sniffing 中的 enable 为 true,Xray 处理此连接的流量时,会从流量的数据中,嗅探出域名,即 abc.com
4. Xray 会把 1.2.3.4 重置为 abc.com.路由就可以根据域名去进行路由的域名规则的分流
当设置了sniffing中的enable为true, 还能嗅探出bittorrent类型的流量, 然后可以在路由中配置"protocol"项来设置规则处理BT流量, 比如服务端用来拦截BT流量, 或客户端固定转发BT流量到某个VPS去等. 因为变成了一个向 abc.com 请求的连接, 就可以做更多的事情, 除了路由域名规则分流, 还能重新做 DNS 解析等其他工作.
>`allocate`: [AllocateObject](#allocateobject) 当设置了 sniffing 中的 enable 为 true, 还能嗅探出 bittorrent 类型的流量, 然后可以在路由中配置"protocol"项来设置规则处理 BT 流量, 比如服务端用来拦截 BT 流量, 或客户端固定转发 BT 流量到某个 VPS 去等.
当设置了多个port时, 端口分配的具体设置 > `allocate`: [AllocateObject](#allocateobject)
当设置了多个 port 时, 端口分配的具体设置
### SniffingObject ### SniffingObject
@ -96,15 +97,15 @@
} }
``` ```
>`enabled`: true | false > `enabled`: true | false
是否开启流量探测。 是否开启流量探测。
>`destOverride`: \["http" | "tls" | "fakedns" \] > `destOverride`: \["http" | "tls" | "fakedns" \]
当流量为指定类型时,按其中包括的目标地址重置当前连接的目标。 当流量为指定类型时,按其中包括的目标地址重置当前连接的目标。
>`metadataOnly`: true | false > `metadataOnly`: true | false
当启用时,将仅使用连接的元数据嗅探目标地址。此时,`http``tls` 将不能使用。 当启用时,将仅使用连接的元数据嗅探目标地址。此时,`http``tls` 将不能使用。
@ -118,16 +119,17 @@
} }
``` ```
>`strategy`: "always" | "random" > `strategy`: "always" | "random"
端口分配策略。
端口分配策略。
- `"always"` 表示总是分配所有已指定的端口,`port` 中指定了多少个端口Xray 就会监听这些端口。 - `"always"` 表示总是分配所有已指定的端口,`port` 中指定了多少个端口Xray 就会监听这些端口。
- `"random"` 表示随机开放端口,每隔 `refresh` 分钟在 `port` 范围中随机选取 `concurrency` 个端口来监听。 - `"random"` 表示随机开放端口,每隔 `refresh` 分钟在 `port` 范围中随机选取 `concurrency` 个端口来监听。
>`refresh`: number > `refresh`: number
随机端口刷新间隔,单位为分钟。最小值为 `2`,建议值为 `5`。这个属性仅当 `strategy` 设置为 `"random"` 时有效。 随机端口刷新间隔,单位为分钟。最小值为 `2`,建议值为 `5`。这个属性仅当 `strategy` 设置为 `"random"` 时有效。
>`concurrency`: number > `concurrency`: number
随机端口数量。最小值为 `1`,最大值为 `port` 范围的三分之一。建议值为 `3` 随机端口数量。最小值为 `1`,最大值为 `port` 范围的三分之一。建议值为 `3`

View file

@ -4,31 +4,30 @@
## 协议列表 ## 协议列表
>[Dokodemo-door](./dokodemo.md) > [Dokodemo-door](./dokodemo.md)
Dokodemo door任意门可以监听一个本地端口并把所有进入此端口的数据发送至指定服务器的一个端口从而达到端口映射的效果。 Dokodemo door任意门可以监听一个本地端口并把所有进入此端口的数据发送至指定服务器的一个端口从而达到端口映射的效果。
>[HTTP](./http.md) > [HTTP](./http.md)
HTTP 协议 HTTP 协议
>[Socks](./socks.md) > [Socks](./socks.md)
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。 标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
>[VLESS](./vless.md) > [VLESS](./vless.md)
VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。 VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
>[VMess](./vmess.md) > [VMess](./vmess.md)
[VMess](../development/protocols/vmess.md) 是一个加密传输协议,,可以作为 Xray 客户端和服务器之间的桥梁。 [VMess](../development/protocols/vmess.md) 是一个加密传输协议,,可以作为 Xray 客户端和服务器之间的桥梁。
>[Trojan](./trojan.md) > [Trojan](./trojan.md)
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议 [Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议
>[Shadowsocks](./shadowsocks.md) > [Shadowsocks](./shadowsocks.md)
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议。 [Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议。

View file

@ -1,4 +1,5 @@
# HTTP # HTTP
HTTP 协议。 HTTP 协议。
::: warning ::: warning
@ -7,9 +8,8 @@ HTTP 协议。
`http` 入站更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。 `http` 入站更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
::: tip TIP 1 ::: tip TIP 1
`http proxy` 只能代理 tcp 协议udp 系的协议均不能通过。 `http proxy` 只能代理 tcp 协议udp 系的协议均不能通过。
::: :::
::: tip TIP 2 ::: tip TIP 2
@ -17,7 +17,7 @@ HTTP 协议。
- `export http_proxy=http://127.0.0.1:8080/` (地址须改成你配置的 HTTP 入站代理地址) - `export http_proxy=http://127.0.0.1:8080/` (地址须改成你配置的 HTTP 入站代理地址)
- `export https_proxy=$http_proxy` - `export https_proxy=$http_proxy`
::: :::
## InboundConfigurationObject ## InboundConfigurationObject
@ -77,4 +77,3 @@ userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值
> `pass`: string > `pass`: string
密码,字符串类型。必填。 密码,字符串类型。必填。

View file

@ -4,18 +4,20 @@
目前兼容性如下: 目前兼容性如下:
* 支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭; - 支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;
* 推荐的加密方式: - 推荐的加密方式:
* AES-256-GCM
* AES-128-GCM - AES-256-GCM
* ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305 - AES-128-GCM
* none 或 plain - ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
不推荐的加密方式: 不推荐的加密方式:
* AES-256-CFB
* AES-128-CFB - AES-256-CFB
* ChaCha20 - AES-128-CFB
* ChaCha20-IETF - ChaCha20
- ChaCha20-IETF
::: danger ::: danger
"none" 不加密方式下,服务器端不会验证 "password" 中的密码。为确保安全性, 一般需要加上 TLS 并在传输层使用安全配置,例如 WebSocket 配置较长的 path "none" 不加密方式下,服务器端不会验证 "password" 中的密码。为确保安全性, 一般需要加上 TLS 并在传输层使用安全配置,例如 WebSocket 配置较长的 path
@ -25,11 +27,11 @@
```json ```json
{ {
"email": "love@xray.com", "email": "love@xray.com",
"method": "aes-256-gcm", "method": "aes-256-gcm",
"password": "密码", "password": "密码",
"level": 0, "level": 0,
"network": "tcp" "network": "tcp"
} }
``` ```
@ -40,11 +42,12 @@
> `method`: string > `method`: string
必填。 必填。
* 推荐的加密方式:
* AES-256-GCM - 推荐的加密方式:
* AES-128-GCM - AES-256-GCM
* ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305 - AES-128-GCM
* none 或 plain - ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
> `password`: string > `password`: string

View file

@ -8,7 +8,6 @@
`socks` 入站更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。 `socks` 入站更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
## InboundConfigurationObject ## InboundConfigurationObject
```json ```json
@ -58,7 +57,6 @@ Socks 协议的认证方式,支持 `"noauth"` 匿名方式和 `"password"` 用
userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。 userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。
### AccountObject ### AccountObject
```json ```json

View file

@ -39,7 +39,7 @@ fallbacks 的具体配置请点击[FallbackObject](../examples/fallback.md#fallb
::: tip ::: tip
Xray 的 Trojan 有完整的 fallbacks 支持,配置方式完全一致。 Xray 的 Trojan 有完整的 fallbacks 支持,配置方式完全一致。
触发回落的条件也与VLESS类似首包长度 < 58 或第 57 个字节不为 `\r`因为 Trojan 没有协议版本或身份认证失败 触发回落的条件也与 VLESS 类似:首包长度 < 58 或第 57 个字节不为 `\r`因为 Trojan 没有协议版本或身份认证失败
::: :::
### ClientObject ### ClientObject

View file

@ -62,16 +62,17 @@ fallbacks 的具体配置请点击 [FallbackObject](../examples/fallback.md#fall
> `id`: string > `id`: string
VLESS 的用户 ID可以是任意小于30字节的字符串, 也可以是一个合法的UUID. VLESS 的用户 ID可以是任意小于 30 字节的字符串, 也可以是一个合法的 UUID.
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写id来标识同一用户,即 自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写 id 来标识同一用户,即
- 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此UUID是 `我爱🍉老师1314` 的 UUID 映射) - 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此 UUID 是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158) 其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID。 你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID。
>也可以使用命令 `xray uuid` 生成随机的UUID. > 也可以使用命令 `xray uuid` 生成随机的 UUID.
> `level`: number > `level`: number

View file

@ -48,12 +48,12 @@ VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在
> `disableInsecureEncryption`: true | false > `disableInsecureEncryption`: true | false
是否禁止客户端使用不安全的加密方式,如果设置为 true 当客户端指定下列加密方式时,服务器会主动断开连接。 是否禁止客户端使用不安全的加密方式,如果设置为 true 当客户端指定下列加密方式时,服务器会主动断开连接。
- `"none"` - `"none"`
- `"aes-128-cfb"` - `"aes-128-cfb"`
默认值为`false` 默认值为`false`
### ClientObject ### ClientObject
```json ```json
@ -67,19 +67,20 @@ VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在
> `id`: string > `id`: string
Vmess 的用户 ID可以是任意小于30字节的字符串, 也可以是一个合法的UUID. Vmess 的用户 ID可以是任意小于 30 字节的字符串, 也可以是一个合法的 UUID.
::: tip ::: tip
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写id来标识同一用户,即 自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写 id 来标识同一用户,即
- 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此UUID是 `我爱🍉老师1314` 的 UUID 映射) - 写 `"id": "我爱🍉老师1314"`,
::: - 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此 UUID 是 `我爱🍉老师1314` 的 UUID 映射)
:::
其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158) 其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID。 你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID。
> 也可以使用命令 `xray uuid` 生成随机的UUID. > 也可以使用命令 `xray uuid` 生成随机的 UUID.
> `level`: number > `level`: number
@ -113,7 +114,7 @@ level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。
> `to`: string > `to`: string
一个 inbound 的`tag`, 指定的 inbound 的必须是使用 VMess 协议的 inbound. 一个 inbound 的`tag`, 指定的 inbound 的必须是使用 VMess 协议的 inbound.
### DefaultObject ### DefaultObject

View file

@ -1,6 +1,6 @@
# 日志配置 # 日志配置
日志配置,控制 Xray输出日志的方式. 日志配置,控制 Xray 输出日志的方式.
Xray 有两种日志, 访问日志和错误日志, 你可以分别配置两种日志的输出方式. Xray 有两种日志, 访问日志和错误日志, 你可以分别配置两种日志的输出方式.
@ -42,6 +42,6 @@ error 日志的级别, 指示 error 日志需要记录的信息.
- `"error"`Xray 遇到了无法正常运行的问题,需要立即解决。 - `"error"`Xray 遇到了无法正常运行的问题,需要立即解决。
- `"none"`:不记录任何内容。 - `"none"`:不记录任何内容。
> `dnsLog`: bool > `dnsLog`: bool
是否启用 DNS 查询日志,例如:`DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms` 是否启用 DNS 查询日志,例如:`DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms`

View file

@ -7,10 +7,9 @@
`OutboundObject` 对应配置文件中 `outbounds` 项的一个子元素。 `OutboundObject` 对应配置文件中 `outbounds` 项的一个子元素。
::: tip ::: tip
列表中的第一个元素作为主outbound。当路由匹配不存在或没有匹配成功时流量由主outbound发出。 列表中的第一个元素作为主 outbound。当路由匹配不存在或没有匹配成功时流量由主 outbound 发出。
::: :::
```json ```json
{ {
"outbounds": [ "outbounds": [
@ -29,16 +28,19 @@
} }
``` ```
>`sendThrough`: address > `sendThrough`: address
用于发送数据的 IP 地址,当主机有多个 IP 地址时有效,默认值为 `"0.0.0.0"` 用于发送数据的 IP 地址,当主机有多个 IP 地址时有效,默认值为 `"0.0.0.0"`
>`protocol`: string
> `protocol`: string
连接协议名称,可选的协议类型见 [outbound 可用协议列表](./outbounds/)。 连接协议名称,可选的协议类型见 [outbound 可用协议列表](./outbounds/)。
>`settings`: OutboundConfigurationObject
> `settings`: OutboundConfigurationObject
具体的配置内容,视协议不同而不同。详见每个协议中的 `OutboundConfigurationObject` 具体的配置内容,视协议不同而不同。详见每个协议中的 `OutboundConfigurationObject`
>`tag`: string
> `tag`: string
此出站连接的标识,用于在其它的配置中定位此连接。 此出站连接的标识,用于在其它的配置中定位此连接。
@ -46,29 +48,29 @@
当其不为空时,其值必须在所有 `tag`**唯一** 当其不为空时,其值必须在所有 `tag`**唯一**
::: :::
>`streamSettings`: [StreamSettingsObject](./transport.md#streamsettingsobject) > `streamSettings`: [StreamSettingsObject](./transport.md#streamsettingsobject)
底层传输方式transport是当前 Xray 节点和其它节点对接的方式 底层传输方式transport是当前 Xray 节点和其它节点对接的方式
>`proxySettings`: [ProxySettingsObject](#proxysettingsobject) > `proxySettings`: [ProxySettingsObject](#proxysettingsobject)
出站代理配置。当出站代理生效时此outbound的 `streamSettings` 将不起作用。 出站代理配置。当出站代理生效时,此 outbound `streamSettings` 将不起作用。
>`mux`: [MuxObject](#muxobject) > `mux`: [MuxObject](#muxobject)
Mux 相关的具体配置。 Mux 相关的具体配置。
### ProxySettingsObject ### ProxySettingsObject
```json ```json
{ {
"tag": "another-outbound-tag" "tag": "another-outbound-tag"
} }
``` ```
>`tag`: string > `tag`: string
当指定另一个outbound的标识时此outbound发出的数据将被转发至所指定的outbound发出。 当指定另一个 outbound 的标识时,此 outbound 发出的数据,将被转发至所指定的 outbound 发出。
::: danger ::: danger
这种转发方式**不经过**底层传输方式。如果需要使用支持底层传输方式的转发,请使用 [SockOpt.dialerProxy](./transport.md#sockoptobject)。 这种转发方式**不经过**底层传输方式。如果需要使用支持底层传输方式的转发,请使用 [SockOpt.dialerProxy](./transport.md#sockoptobject)。
@ -83,6 +85,7 @@ Mux 相关的具体配置。
::: :::
### MuxObject ### MuxObject
Mux 功能是在一条 TCP 连接上分发多个 TCP 连接的数据。实现细节详见 [Mux.Cool](../../development/protocols/muxcool)。Mux 是为了减少 TCP 的握手延迟而设计,而非提高连接的吞吐量。使用 Mux 看视频、下载或者测速通常都有反效果。Mux 只需要在客户端启用,服务器端自动适配。 Mux 功能是在一条 TCP 连接上分发多个 TCP 连接的数据。实现细节详见 [Mux.Cool](../../development/protocols/muxcool)。Mux 是为了减少 TCP 的握手延迟而设计,而非提高连接的吞吐量。使用 Mux 看视频、下载或者测速通常都有反效果。Mux 只需要在客户端启用,服务器端自动适配。
`MuxObject` 对应 `OutboundObject` 中的 `mux` 项。 `MuxObject` 对应 `OutboundObject` 中的 `mux` 项。
@ -94,10 +97,11 @@ Mux 功能是在一条 TCP 连接上分发多个 TCP 连接的数据。实现细
} }
``` ```
>`enabled`: true | false > `enabled`: true | false
是否启用 Mux 转发请求,默认值 `false` 是否启用 Mux 转发请求,默认值 `false`
>`concurrency`: number
> `concurrency`: number
最大并发连接数。最小值 `1`,最大值 `1024`,默认值 `8` 最大并发连接数。最小值 `1`,最大值 `1024`,默认值 `8`

View file

@ -4,38 +4,38 @@
## 协议列表 ## 协议列表
>[Blackhole](./blackhole.md) > [Blackhole](./blackhole.md)
Blackhole黑洞是一个出站数据协议它会阻碍所有数据的出站配合 [路由Routing](../routing.md) 一起使用,可以达到禁止访问某些网站的效果。 Blackhole黑洞是一个出站数据协议它会阻碍所有数据的出站配合 [路由Routing](../routing.md) 一起使用,可以达到禁止访问某些网站的效果。
>[DNS](./dns.md) > [DNS](./dns.md)
DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。此出站协议只能接收 DNS 流量(包含基于 UDP 和 TCP 协议的查询),其它类型的流量会导致错误。 DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。此出站协议只能接收 DNS 流量(包含基于 UDP 和 TCP 协议的查询),其它类型的流量会导致错误。
>[Freedom](./freedom.md) > [Freedom](./freedom.md)
Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。 Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
>[HTTP](./http.md) > [HTTP](./http.md)
HTTP 协议 HTTP 协议
>[Socks](./socks.md) > [Socks](./socks.md)
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。 标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
>[VLESS](./vless.md) > [VLESS](./vless.md)
VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。 VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
>[VMess](./vmess.md) > [VMess](./vmess.md)
[VMess](../development/protocols/vmess.md) 是一个加密传输协议,可以作为 Xray 客户端和服务器之间的桥梁。 [VMess](../development/protocols/vmess.md) 是一个加密传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
>[Trojan](./trojan.md) > [Trojan](./trojan.md)
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议。 [Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议。
>[Shadowsocks](./shadowsocks.md) > [Shadowsocks](./shadowsocks.md)
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议。 [Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议。

View file

@ -28,4 +28,4 @@ DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。
修改 DNS 服务器端口。当不指定时,保持来源中指定的端口不变。 修改 DNS 服务器端口。当不指定时,保持来源中指定的端口不变。
## DNS配置实例 <Badge text="WIP" type="warning"/> ## DNS 配置实例 <Badge text="WIP" type="warning"/>

View file

@ -15,9 +15,10 @@ Freedom 是一个出站协议,可以用来向任意网络发送(正常的)
> `domainStrategy`: "AsIs" | "UseIP" | "UseIPv4" | "UseIPv6" > `domainStrategy`: "AsIs" | "UseIP" | "UseIPv4" | "UseIPv6"
在目标地址为域名时, 配置相应的值, Freedom 的行为模式如下: 在目标地址为域名时, 配置相应的值, Freedom 的行为模式如下:
- `"AsIs"`: Freedom 通过系统DNS服务器解析获取IP, 向此域名发出连接.
- `"UseIP"``"UseIPv4"``"UseIPv6"`: Xray 使用 [内置 DNS 服务器](../dns.md) 解析获取IP, 向此域名发出连接. - `"AsIs"`: Freedom 通过系统 DNS 服务器解析获取 IP, 向此域名发出连接.
默认值为 `"AsIs"` - `"UseIP"``"UseIPv4"``"UseIPv6"`: Xray 使用 [内置 DNS 服务器](../dns.md) 解析获取 IP, 向此域名发出连接.
默认值为 `"AsIs"`
::: tip TIP 1 ::: tip TIP 1
当使用 `"UseIP"` 模式,并且 [出站连接配置](../outbound.md#outboundobject) 中指定了 `sendThrough`Freedom 会根据 `sendThrough` 的值自动判断所需的 IP 类型IPv4 或 IPv6。 当使用 `"UseIP"` 模式,并且 [出站连接配置](../outbound.md#outboundobject) 中指定了 `sendThrough`Freedom 会根据 `sendThrough` 的值自动判断所需的 IP 类型IPv4 或 IPv6。

View file

@ -7,7 +7,7 @@ HTTP 协议。
::: :::
::: tip ::: tip
`http` 只能代理 tcp 协议udp 系的协议均不能通过。 `http` 只能代理 tcp 协议udp 系的协议均不能通过。
::: :::
## OutboundConfigurationObject ## OutboundConfigurationObject

View file

@ -72,11 +72,12 @@ Shadowsocks 服务端端口。必填。
> `method`: string > `method`: string
必填。 必填。
* 推荐的加密方式:
* AES-256-GCM - 推荐的加密方式:
* AES-128-GCM - AES-256-GCM
* ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305 - AES-128-GCM
* none 或 plain - ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
> `password`: string > `password`: string
@ -88,4 +89,4 @@ Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。 用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
`level` 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。 `level` 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。

View file

@ -88,4 +88,4 @@ Socks 服务器列表,其中每一项是一个服务器配置。
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。 用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。 userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。

View file

@ -70,13 +70,15 @@ Trojan 被设计工作在正确配置的加密 TLS 隧道
- `xtls-rprx-splice-udp443`:同 `xtls-rprx-splice`, 但是放行了目标为 443 端口的 UDP 流量 - `xtls-rprx-splice-udp443`:同 `xtls-rprx-splice`, 但是放行了目标为 443 端口的 UDP 流量
::: warning 注意 ::: warning 注意
`flow` 被指定时,还需要将该出站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../transport.md#streamsettingsobject)。 `flow` 被指定时,还需要将该出站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../transport.md#streamsettingsobject)。
::: :::
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。 此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。
<!-- prettier-ignore-start -->
::: tip 关于 xtls-rprx-\*-udp443 流控模式
<!-- prettier-ignore-end -->
::: tip 关于 xtls-rprx-*-udp443 流控模式
启用了 Xray-core 的 XTLS 时,通往 UDP 443 端口的流量默认会被拦截(一般情况下为 QUIC这样应用就不会使用 QUIC 而会使用 TLSXTLS 才会真正生效。实际上QUIC 本身也不适合被代理,因为 QUIC 自带了 TCP 的功能, 它作为 UDP 流量在通过 Trojan 协议传输时,底层协议为 TCP就相当于两层 TCP 了。 启用了 Xray-core 的 XTLS 时,通往 UDP 443 端口的流量默认会被拦截(一般情况下为 QUIC这样应用就不会使用 QUIC 而会使用 TLSXTLS 才会真正生效。实际上QUIC 本身也不适合被代理,因为 QUIC 自带了 TCP 的功能, 它作为 UDP 流量在通过 Trojan 协议传输时,底层协议为 TCP就相当于两层 TCP 了。
若不需要拦截,请在客户端填写 `xtls-rprx-*-udp443`,服务端不变。 若不需要拦截,请在客户端填写 `xtls-rprx-*-udp443`,服务端不变。

View file

@ -76,14 +76,15 @@ VLESS 是一个无状态的轻量传输协议,它分为入站和出站两部
> `id`: string > `id`: string
VLESS 的用户 ID可以是任意小于30字节的字符串, 也可以是一个合法的UUID. VLESS 的用户 ID可以是任意小于 30 字节的字符串, 也可以是一个合法的 UUID.
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写id来标识同一用户,即 自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写 id 来标识同一用户,即
- 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此UUID是 `我爱🍉老师1314` 的 UUID 映射) - 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此 UUID 是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158) 其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID也可以使用命令 `xray uuid` 生成随机的UUID。 你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID也可以使用命令 `xray uuid` 生成随机的 UUID。
> `encryption`: "none" > `encryption`: "none"
@ -107,12 +108,15 @@ VLESS 的用户 ID可以是任意小于30字节的字符串, 也可以是一
- `xtls-rprx-splice-udp443`:同 `xtls-rprx-splice`, 但是放行了目标为 443 端口的 UDP 流量 - `xtls-rprx-splice-udp443`:同 `xtls-rprx-splice`, 但是放行了目标为 443 端口的 UDP 流量
::: warning 注意 ::: warning 注意
`flow` 被指定时,还需要将该出站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../transport.md#streamsettingsobject)。 `flow` 被指定时,还需要将该出站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../transport.md#streamsettingsobject)。
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。 此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。
::: :::
::: tip 关于 xtls-rprx-*-udp443 流控模式 <!-- prettier-ignore-start -->
::: tip 关于 xtls-rprx-*-udp443 流控模式
<!-- prettier-ignore-end -->
启用了 Xray-core 的 XTLS 时,通往 UDP 443 端口的流量默认会被拦截(一般情况下为 QUIC这样应用就不会使用 QUIC 而会使用 TLSXTLS 才会真正生效。实际上QUIC 本身也不适合被代理,因为 QUIC 自带了 TCP 的功能,它作为 UDP 流量在通过 VLESS 协议传输时,底层协议为 TCP就相当于两层 TCP 了。 启用了 Xray-core 的 XTLS 时,通往 UDP 443 端口的流量默认会被拦截(一般情况下为 QUIC这样应用就不会使用 QUIC 而会使用 TLSXTLS 才会真正生效。实际上QUIC 本身也不适合被代理,因为 QUIC 自带了 TCP 的功能,它作为 UDP 流量在通过 VLESS 协议传输时,底层协议为 TCP就相当于两层 TCP 了。
若不需要拦截,请在客户端填写 `xtls-rprx-*-udp443`,服务端不变。 若不需要拦截,请在客户端填写 `xtls-rprx-*-udp443`,服务端不变。
@ -132,11 +136,8 @@ Splice 模式的的使用限制:
需要注意的是,使用 mKCP 协议时不会使用 Splice是的虽然没有报错但实际上根本没用到 需要注意的是,使用 mKCP 协议时不会使用 Splice是的虽然没有报错但实际上根本没用到
> `level`: number > `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。 用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。 level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。

View file

@ -29,7 +29,7 @@ VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在
> `vnext`\[ [ServerObject](#serverobject) \] > `vnext`\[ [ServerObject](#serverobject) \]
一个数组,包含一组的服务端配置. 一个数组,包含一组的服务端配置.
其中每一项是一个服务端配置[ServerObject](#serverobject)。 其中每一项是一个服务端配置[ServerObject](#serverobject)。
@ -57,8 +57,6 @@ VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在
其中每一项是一个用户[UserObject](#userobject)。 其中每一项是一个用户[UserObject](#userobject)。
#### UserObject #### UserObject
```json ```json
@ -72,15 +70,16 @@ VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在
> `id`string > `id`string
Vmess 的用户 ID可以是任意小于30字节的字符串, 也可以是一个合法的UUID. Vmess 的用户 ID可以是任意小于 30 字节的字符串, 也可以是一个合法的 UUID.
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写 id 来标识同一用户,即
- 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此 UUID 是 `我爱🍉老师1314` 的 UUID 映射)
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写id来标识同一用户,即
- 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此UUID是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158) 其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID, 也可以使用命令 `xray uuid` 生成随机的UUID。 你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID, 也可以使用命令 `xray uuid` 生成随机的 UUID。
> `alterId`number > `alterId`number
@ -100,7 +99,7 @@ Vmess 的用户 ID可以是任意小于30字节的字符串, 也可以是一
level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。 level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。
> `security`: "aes-128-gcm" | "chacha20-poly1305" | "auto" | "none" | "zero" > `security`: "aes-128-gcm" | "chacha20-poly1305" | "auto" | "none" | "zero"
加密方式,客户端将使用配置的加密方式发送数据,服务器端自动识别,无需配置。 加密方式,客户端将使用配置的加密方式发送数据,服务器端自动识别,无需配置。
@ -108,6 +107,7 @@ level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。
- `"chacha20-poly1305"`:推荐在手机端使用 - `"chacha20-poly1305"`:推荐在手机端使用
- `"auto"`:默认值,自动选择(运行框架为 AMD64、ARM64 或 s390x 时为 aes-128-gcm 加密方式,其他情况则为 Chacha20-Poly1305 加密方式) - `"auto"`:默认值,自动选择(运行框架为 AMD64、ARM64 或 s390x 时为 aes-128-gcm 加密方式,其他情况则为 Chacha20-Poly1305 加密方式)
- `"none"`:不加密 - `"none"`:不加密
* `"zero"`:不加密,也不进行消息认证 (v1.4.0+) * `"zero"`:不加密,也不进行消息认证 (v1.4.0+)
::: tip ::: tip
@ -121,4 +121,4 @@ level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。
如果使用 CDN 或其他会解密 TLS 的中转平台或网络环境建立连接,不建议使用 `"none"` `"zero"` 伪加密方式。 如果使用 CDN 或其他会解密 TLS 的中转平台或网络环境建立连接,不建议使用 `"none"` `"zero"` 伪加密方式。
无论使用哪种加密方式, VMess 的包头都会受到加密和认证的保护。 无论使用哪种加密方式, VMess 的包头都会受到加密和认证的保护。
::: :::

View file

@ -29,7 +29,8 @@
} }
} }
``` ```
>`level`: map{string: [LevelPolicyObject](#levelpolicyobject)}
> `level`: map{string: [LevelPolicyObject](#levelpolicyobject)}
一组键值对每个键是一个字符串形式的数字JSON 的要求),比如 `"0"``"1"` 等,双引号不能省略,此数字对应用户等级。每一个值是一个 [LevelPolicyObject](#levelpolicyobject). 一组键值对每个键是一个字符串形式的数字JSON 的要求),比如 `"0"``"1"` 等,双引号不能省略,此数字对应用户等级。每一个值是一个 [LevelPolicyObject](#levelpolicyobject).
@ -37,37 +38,37 @@
每个入站出站代理现在都可以设置用户等级Xray 会根据实际的用户等级应用不同的本地策略。 每个入站出站代理现在都可以设置用户等级Xray 会根据实际的用户等级应用不同的本地策略。
::: :::
>`system`: [SystemPolicyObject](#systempolicyobject) > `system`: [SystemPolicyObject](#systempolicyobject)
Xray系统级别的策略
Xray 系统级别的策略
### LevelPolicyObject ### LevelPolicyObject
```json ```json
{ {
"handshake": 4, "handshake": 4,
"connIdle": 300, "connIdle": 300,
"uplinkOnly": 2, "uplinkOnly": 2,
"downlinkOnly": 5, "downlinkOnly": 5,
"statsUserUplink": false, "statsUserUplink": false,
"statsUserDownlink": false, "statsUserDownlink": false,
"bufferSize": 10240 "bufferSize": 10240
} }
``` ```
>`handshake`: number
> `handshake`: number
连接建立时的握手时间限制。单位为秒。默认值为 `4`。在入站代理处理一个新连接时,在握手阶段如果使用的时间超过这个时间,则中断该连接。 连接建立时的握手时间限制。单位为秒。默认值为 `4`。在入站代理处理一个新连接时,在握手阶段如果使用的时间超过这个时间,则中断该连接。
>`connIdle`: number > `connIdle`: number
连接空闲的时间限制。单位为秒。默认值为 `300`。inbound/outbound处理一个连接时如果在 `connIdle` 时间内,没有任何数据被传输(包括上行和下行数据),则中断该连接。 连接空闲的时间限制。单位为秒。默认值为 `300`。inbound/outbound 处理一个连接时,如果在 `connIdle` 时间内,没有任何数据被传输(包括上行和下行数据),则中断该连接。
>`uplinkOnly`: number > `uplinkOnly`: number
当连接下行线路关闭后的时间限制。单位为秒。默认值为 `2`。当服务器(如远端网站)关闭下行连接时,出站代理会在等待 `uplinkOnly` 时间后中断连接。 当连接下行线路关闭后的时间限制。单位为秒。默认值为 `2`。当服务器(如远端网站)关闭下行连接时,出站代理会在等待 `uplinkOnly` 时间后中断连接。
>`downlinkOnly`: number > `downlinkOnly`: number
当连接上行线路关闭后的时间限制。单位为秒。默认值为 `5`。当客户端(如浏览器)关闭上行连接时,入站代理会在等待 `downlinkOnly` 时间后中断连接。 当连接上行线路关闭后的时间限制。单位为秒。默认值为 `5`。当客户端(如浏览器)关闭上行连接时,入站代理会在等待 `downlinkOnly` 时间后中断连接。
@ -75,46 +76,47 @@ Xray系统级别的策略
在 HTTP 浏览的场景中,可以将 `uplinkOnly``downlinkOnly` 设为 `0`,以提高连接关闭的效率。 在 HTTP 浏览的场景中,可以将 `uplinkOnly``downlinkOnly` 设为 `0`,以提高连接关闭的效率。
::: :::
>`statsUserUplink`: true | false > `statsUserUplink`: true | false
当值为 `true` 时,开启当前等级的所有用户的上行流量统计。 当值为 `true` 时,开启当前等级的所有用户的上行流量统计。
>`statsUserDownlink`: true | false > `statsUserDownlink`: true | false
当值为 `true` 时,开启当前等级的所有用户的下行流量统计。 当值为 `true` 时,开启当前等级的所有用户的下行流量统计。
>`bufferSize`: number > `bufferSize`: number
每个连接的内部缓存大小。单位为 kB。当值为 `0` 时,内部缓存被禁用。 每个连接的内部缓存大小。单位为 kB。当值为 `0` 时,内部缓存被禁用。
默认值: 默认值:
* 在 ARM、MIPS、MIPSLE 平台上,默认值为 `0`
* 在 ARM64、MIPS64、MIPS64LE 平台上,默认值为 `4` - 在 ARM、MIPS、MIPSLE 平台上,默认值为 `0`
* 在其它平台上,默认值为 `512` - 在 ARM64、MIPS64、MIPS64LE 平台上,默认值为 `4`
- 在其它平台上,默认值为 `512`
### SystemPolicyObject ### SystemPolicyObject
```json ```json
{ {
"statsInboundUplink": false, "statsInboundUplink": false,
"statsInboundDownlink": false, "statsInboundDownlink": false,
"statsOutboundUplink": false, "statsOutboundUplink": false,
"statsOutboundDownlink": false "statsOutboundDownlink": false
} }
``` ```
>`statsInboundUplink`: true | false > `statsInboundUplink`: true | false
当值为 `true` 时,开启所有入站代理的上行流量统计。 当值为 `true` 时,开启所有入站代理的上行流量统计。
>`statsInboundDownlink`: true | false > `statsInboundDownlink`: true | false
当值为 `true` 时,开启所有入站代理的下行流量统计。 当值为 `true` 时,开启所有入站代理的下行流量统计。
>`statsOutboundUplink`: true | false > `statsOutboundUplink`: true | false
当值为 `true` 时,开启所有出站代理的上行流量统计。 当值为 `true` 时,开启所有出站代理的上行流量统计。
>`statsOutboundDownlink`: true | false > `statsOutboundDownlink`: true | false
当值为 `true` 时,开启所有出站代理的下行流量统计。 当值为 `true` 时,开启所有出站代理的下行流量统计。

View file

@ -4,21 +4,20 @@
反向代理的大致工作原理如下: 反向代理的大致工作原理如下:
* 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP无法在公网上直接访问。另有一台主机 B它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。 - 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP无法在公网上直接访问。另有一台主机 B它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。
* 在主机 A 中配置 Xray称为`bridge`,在 B 中也配置 Xray称为 `portal` - 在主机 A 中配置 Xray称为`bridge`,在 B 中也配置 Xray称为 `portal`
* `bridge` 会向 `portal` 主动建立连接,此连接的目标地址可以自行设定。`portal` 会收到两种连接,一是由 `bridge` 发来的连接,二是公网用户发来的连接。`portal` 会自动将两类连接合并。于是 `bridge` 就可以收到公网流量了。 - `bridge` 会向 `portal` 主动建立连接,此连接的目标地址可以自行设定。`portal` 会收到两种连接,一是由 `bridge` 发来的连接,二是公网用户发来的连接。`portal` 会自动将两类连接合并。于是 `bridge` 就可以收到公网流量了。
* `bridge` 在收到公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由的协作。 - `bridge` 在收到公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由的协作。
* `bridge` 会根据流量的大小进行动态的负载均衡。 - `bridge` 会根据流量的大小进行动态的负载均衡。
::: tip ::: tip
反向代理默认已开启 [Mux](../../development/protocols/muxcool/)请不要在其用到的outbound上再次开启 Mux。 反向代理默认已开启 [Mux](../../development/protocols/muxcool/),请不要在其用到的 outbound 上再次开启 Mux。
::: :::
::: warning ::: warning
反向代理功能尚处于测试阶段,可能会有一些问题。 反向代理功能尚处于测试阶段,可能会有一些问题。
::: :::
## ReverseObject ## ReverseObject
`ReverseObject` 对应配置文件的 `reverse` 项。 `ReverseObject` 对应配置文件的 `reverse` 项。
@ -44,53 +43,45 @@
> `bridges`: \[[BridgeObject](#bridgeobject)\] > `bridges`: \[[BridgeObject](#bridgeobject)\]
数组,每一项表示一个 `bridge`。每个 `bridge` 的配置是一个 [BridgeObject](#bridgeobject)。 数组,每一项表示一个 `bridge`。每个 `bridge` 的配置是一个 [BridgeObject](#bridgeobject)。
> `portals`: \[[PortalObject](#portalobject)\] > `portals`: \[[PortalObject](#portalobject)\]
数组,每一项表示一个 `portal`。每个 `portal` 的配置是一个 [PortalObject](#bridgeobject)。 数组,每一项表示一个 `portal`。每个 `portal` 的配置是一个 [PortalObject](#bridgeobject)。
### BridgeObject ### BridgeObject
```json ```json
{ {
"tag": "bridge", "tag": "bridge",
"domain": "test.xray.com" "domain": "test.xray.com"
} }
``` ```
> `tag`: string > `tag`: string
所有由 `bridge` 发出的连接,都会带有这个标识。可以在 [路由配置](./routing.md) 中使用 `inboundTag` 进行识别。 所有由 `bridge` 发出的连接,都会带有这个标识。可以在 [路由配置](./routing.md) 中使用 `inboundTag` 进行识别。
> `domain`: string > `domain`: string
指定一个域名,`bridge``portal` 建立的连接,都会使用这个域名进行发送。 指定一个域名,`bridge``portal` 建立的连接,都会使用这个域名进行发送。
这个域名只作为 `bridge``portal` 的通信用途,不必真实存在。 这个域名只作为 `bridge``portal` 的通信用途,不必真实存在。
### PortalObject ### PortalObject
```json ```json
{ {
"tag": "portal", "tag": "portal",
"domain": "test.xray.com" "domain": "test.xray.com"
} }
``` ```
> `tag`: string > `tag`: string
`portal` 的标识。在 [路由配置](./routing.md) 中使用 `outboundTag` 将流量转发到这个 `portal`
`portal` 的标识。在 [路由配置](./routing.md) 中使用 `outboundTag` 将流量转发到这个 `portal`
> `domain`: string > `domain`: string
一个域名。当 `portal` 接收到流量时,如果流量的目标域名是此域名,则 `portal` 认为当前连接上 `bridge` 发来的通信连接。而其它流量则会被当成需要转发的流量。`portal` 所做的工作就是把这两类连接进行识别并拼接。 一个域名。当 `portal` 接收到流量时,如果流量的目标域名是此域名,则 `portal` 认为当前连接上 `bridge` 发来的通信连接。而其它流量则会被当成需要转发的流量。`portal` 所做的工作就是把这两类连接进行识别并拼接。
::: tip ::: tip
@ -99,12 +90,11 @@
## 完整配置样例 ## 完整配置样例
::: tip ::: tip
在运行过程中,建议先启用 `bridge`,再启用 `portal` 在运行过程中,建议先启用 `bridge`,再启用 `portal`
::: :::
### bridge配置 ### bridge 配置
`bridge` 通常需要两个 outbound一个用于连接 `portal`,另一个用于发送实际的流量。也就是说,你需要用路由区分两种流量。 `bridge` 通常需要两个 outbound一个用于连接 `portal`,另一个用于发送实际的流量。也就是说,你需要用路由区分两种流量。
@ -112,42 +102,42 @@
```json ```json
{ {
"bridges": [ "bridges": [
{ {
"tag": "bridge", "tag": "bridge",
"domain": "test.xray.com" "domain": "test.xray.com"
} }
] ]
} }
``` ```
outbound: outbound:
```json ```json
{ ({
"tag": "out", "tag": "out",
"protocol": "freedom", "protocol": "freedom",
"settings": { "settings": {
"redirect": "127.0.0.1:80" // 将所有流量转发到网页服务器 "redirect": "127.0.0.1:80" // 将所有流量转发到网页服务器
} }
}, },
{ {
"protocol": "vmess", "protocol": "vmess",
"settings": { "settings": {
"vnext": [ "vnext": [
{ {
"address": "portal 的 IP 地址", "address": "portal 的 IP 地址",
"port": 1024, "port": 1024,
"users": [ "users": [
{ {
"id": "5783a3e7-e373-51cd-8642-c83782b807c5" "id": "5783a3e7-e373-51cd-8642-c83782b807c5"
} }
]
}
] ]
}, }
"tag": "interconn" ]
} },
"tag": "interconn"
})
``` ```
路由配置: 路由配置:
@ -176,8 +166,7 @@ outbound:
} }
``` ```
### portal 配置
### portal配置
`portal` 通常需要两个 inbound一个用于接收 `bridge` 的连接,另一个用于接收实际的流量。同时你也需要用路由区分两种流量。 `portal` 通常需要两个 inbound一个用于接收 `bridge` 的连接,另一个用于接收实际的流量。同时你也需要用路由区分两种流量。
@ -185,40 +174,40 @@ outbound:
```json ```json
{ {
"portals": [ "portals": [
{ {
"tag": "portal", "tag": "portal",
"domain": "test.xray.com" // 必须和 bridge 的配置一样 "domain": "test.xray.com" // 必须和 bridge 的配置一样
} }
] ]
} }
``` ```
inbound: inbound:
```json ```json
{ ({
"tag": "external", "tag": "external",
"port": 80, // 开放 80 端口,用于接收外部的 HTTP 访问 "port": 80, // 开放 80 端口,用于接收外部的 HTTP 访问
"protocol": "dokodemo-door", "protocol": "dokodemo-door",
"settings": { "settings": {
"address": "127.0.0.1", "address": "127.0.0.1",
"port": 80, "port": 80,
"network": "tcp" "network": "tcp"
} }
}, },
{ {
"port": 1024, // 用于接收 bridge 的连接 "port": 1024, // 用于接收 bridge 的连接
"tag": "interconn", "tag": "interconn",
"protocol": "vmess", "protocol": "vmess",
"settings": { "settings": {
"clients": [ "clients": [
{ {
"id": "5783a3e7-e373-51cd-8642-c83782b807c5" "id": "5783a3e7-e373-51cd-8642-c83782b807c5"
} }
] ]
} }
} })
``` ```
路由配置: 路由配置:
@ -243,4 +232,3 @@ inbound:
] ]
} }
``` ```

View file

@ -17,149 +17,127 @@
} }
} }
``` ```
>`domainStrategy`: "AsIs" | "IPIfNonMatch" | "IPOnDemand"
> `domainStrategy`: "AsIs" | "IPIfNonMatch" | "IPOnDemand"
域名解析策略,根据不同的设置使用不同的策略。 域名解析策略,根据不同的设置使用不同的策略。
* `"AsIs"`:只使用域名进行路由选择。默认值。 - `"AsIs"`:只使用域名进行路由选择。默认值。
* `"IPIfNonMatch"`:当域名没有匹配任何规则时,将域名解析成 IPA 记录或 AAAA 记录)再次进行匹配; - `"IPIfNonMatch"`:当域名没有匹配任何规则时,将域名解析成 IPA 记录或 AAAA 记录)再次进行匹配;
* 当一个域名有多个 A 记录时,会尝试匹配所有的 A 记录,直到其中一个与某个规则匹配为止; - 当一个域名有多个 A 记录时,会尝试匹配所有的 A 记录,直到其中一个与某个规则匹配为止;
* 解析后的 IP 仅在路由选择时起作用,转发的数据包中依然使用原始域名; - 解析后的 IP 仅在路由选择时起作用,转发的数据包中依然使用原始域名;
* `"IPOnDemand"`:当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配; - `"IPOnDemand"`:当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配;
>`rules`: \[[RuleObject](#ruleobject)\] > `rules`: \[[RuleObject](#ruleobject)\]
对应一个数组,数组中每一项是一个规则。 对应一个数组,数组中每一项是一个规则。
对于每一个连接,路由将根据这些规则依次进行判断,当一个规则生效时,即将这个连接转发至它所指定的 `outboundTag``balancerTag` 对于每一个连接,路由将根据这些规则依次进行判断,当一个规则生效时,即将这个连接转发至它所指定的 `outboundTag``balancerTag`
::: tip ::: tip
当没有匹配到任何规则时流量默认由第一个outbound发出。 当没有匹配到任何规则时,流量默认由第一个 outbound 发出。
::: :::
>`balancers`: \[ [BalancerObject](#balancerobject) \] > `balancers`: \[ [BalancerObject](#balancerobject) \]
一个数组,数组中每一项是一个负载均衡器的配置。 一个数组,数组中每一项是一个负载均衡器的配置。
当一个规则指向一个负载均衡器时Xray 会通过此负载均衡器选出一个 outbound, 然后由它转发流量。 当一个规则指向一个负载均衡器时Xray 会通过此负载均衡器选出一个 outbound, 然后由它转发流量。
### RuleObject ### RuleObject
```json ```json
{ {
"type": "field", "type": "field",
"domain": [ "domain": ["baidu.com", "qq.com", "geosite:cn"],
"baidu.com", "ip": ["0.0.0.0/8", "10.0.0.0/8", "fc00::/7", "fe80::/10", "geoip:cn"],
"qq.com", "port": "53,443,1000-2000",
"geosite:cn" "sourcePort": "53,443,1000-2000",
], "network": "tcp",
"ip": [ "source": ["10.0.0.1"],
"0.0.0.0/8", "user": ["love@xray.com"],
"10.0.0.0/8", "inboundTag": ["tag-vmess"],
"fc00::/7", "protocol": ["http", "tls", "bittorrent"],
"fe80::/10", "attrs": "attrs[':method'] == 'GET'",
"geoip:cn" "outboundTag": "direct",
], "balancerTag": "balancer"
"port": "53,443,1000-2000",
"sourcePort": "53,443,1000-2000",
"network": "tcp",
"source": [
"10.0.0.1"
],
"user": [
"love@xray.com"
],
"inboundTag": [
"tag-vmess"
],
"protocol": [
"http",
"tls",
"bittorrent"
],
"attrs": "attrs[':method'] == 'GET'",
"outboundTag": "direct",
"balancerTag": "balancer"
} }
``` ```
::: danger ::: danger
当多个属性同时指定时,这些属性需要**同时**满足,才可以使当前规则生效。 当多个属性同时指定时,这些属性需要**同时**满足,才可以使当前规则生效。
::: :::
>`type`: "field" > `type`: "field"
目前只支持`"field"`这一个选项。 目前只支持`"field"`这一个选项。
>`domain`: \[string\] > `domain`: \[string\]
一个数组,数组每一项是一个域名的匹配。有以下几种形式: 一个数组,数组每一项是一个域名的匹配。有以下几种形式:
* 纯字符串:当此字符串匹配目标域名中任意部分,该规则生效。比如 "sina.com" 可以匹配 "sina.com"、"sina.com.cn" 和 "www.sina.com",但不匹配 "sina.cn"。 - 纯字符串:当此字符串匹配目标域名中任意部分,该规则生效。比如 "sina.com" 可以匹配 "sina.com"、"sina.com.cn" 和 "www.sina.com",但不匹配 "sina.cn"。
* 正则表达式:由 `"regexp:"` 开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如 "regexp:\\\\.goo.*\\\\.com$" 匹配 "www.google.com" 或 "fonts.googleapis.com",但不匹配 "google.com"。 - 正则表达式:由 `"regexp:"` 开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如 "regexp:\\\\.goo.\*\\\\.com\$" 匹配 "www.google.com" 或 "fonts.googleapis.com",但不匹配 "google.com"。
* 子域名(推荐):由 `"domain:"` 开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如 "domain:xray.com" 匹配 "www.xray.com"、"xray.com",但不匹配 "wxray.com"。 - 子域名(推荐):由 `"domain:"` 开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如 "domain:xray.com" 匹配 "www.xray.com"、"xray.com",但不匹配 "wxray.com"。
* 完整匹配:由 `"full:"` 开始,余下部分是一个域名。当此域名完整匹配目标域名时,该规则生效。例如 "full:xray.com" 匹配 "xray.com" 但不匹配 "www.xray.com"。 - 完整匹配:由 `"full:"` 开始,余下部分是一个域名。当此域名完整匹配目标域名时,该规则生效。例如 "full:xray.com" 匹配 "xray.com" 但不匹配 "www.xray.com"。
* 预定义域名列表:由 `"geosite:"` 开头,余下部分是一个名称,如 `geosite:google` 或者 `geosite:cn`。名称及域名列表参考 [预定义域名列表](#预定义域名列表)。 - 预定义域名列表:由 `"geosite:"` 开头,余下部分是一个名称,如 `geosite:google` 或者 `geosite:cn`。名称及域名列表参考 [预定义域名列表](#预定义域名列表)。
* 从文件中加载域名:形如 `"ext:file:tag"`,必须以 `ext:`(小写)开头,后面跟文件名和标签,文件存放在 [资源目录](./features/env.md#资源文件路径) 中,文件格式与 `geosite.dat` 相同,标签必须在文件中存在。 - 从文件中加载域名:形如 `"ext:file:tag"`,必须以 `ext:`(小写)开头,后面跟文件名和标签,文件存放在 [资源目录](./features/env.md#资源文件路径) 中,文件格式与 `geosite.dat` 相同,标签必须在文件中存在。
::: tip ::: tip
`"ext:geoip.dat:cn"` 等价于 `"geoip:cn"` `"ext:geoip.dat:cn"` 等价于 `"geoip:cn"`
::: :::
>`ip`: \[string\] > `ip`: \[string\]
一个数组,数组内每一项代表一个 IP 范围。当某一项匹配目标 IP 时,此规则生效。有以下几种形式: 一个数组,数组内每一项代表一个 IP 范围。当某一项匹配目标 IP 时,此规则生效。有以下几种形式:
* IP形如 `"127.0.0.1"` - IP形如 `"127.0.0.1"`
* [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing):形如 `"10.0.0.0/8"` - [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing):形如 `"10.0.0.0/8"`
* 预定义IP列表:此列表预置于每一个 Xray 的安装包中,文件名为 `geoip.dat`。使用方式形如 `"geoip:cn"`,必须以 `geoip:`(小写)开头,后面跟双字符国家代码,支持几乎所有可以上网的国家。 - 预定义 IP 列表:此列表预置于每一个 Xray 的安装包中,文件名为 `geoip.dat`。使用方式形如 `"geoip:cn"`,必须以 `geoip:`(小写)开头,后面跟双字符国家代码,支持几乎所有可以上网的国家。
* 特殊值:`"geoip:private"`,包含所有私有地址,如 `127.0.0.1` - 特殊值:`"geoip:private"`,包含所有私有地址,如 `127.0.0.1`
* 从文件中加载 IP形如 `"ext:file:tag"`,必须以 `ext:`(小写)开头,后面跟文件名和标签,文件存放在 [资源目录](./features/env.md#资源文件路径) 中,文件格式与 `geoip.dat` 相同标签必须在文件中存在。 - 从文件中加载 IP形如 `"ext:file:tag"`,必须以 `ext:`(小写)开头,后面跟文件名和标签,文件存放在 [资源目录](./features/env.md#资源文件路径) 中,文件格式与 `geoip.dat` 相同标签必须在文件中存在。
>`port`number | string > `port`number | string
目标端口范围,有三种形式: 目标端口范围,有三种形式:
* `"a-b"`a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间当目标端口落在此范围内时此规则生效。 - `"a-b"`a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间当目标端口落在此范围内时此规则生效。
* `a`a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。 - `a`a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。
* 以上两种形式的混合,以逗号 "," 分隔。形如:`"53,443,1000-2000"` - 以上两种形式的混合,以逗号 "," 分隔。形如:`"53,443,1000-2000"`
>`sourcePort`number | string > `sourcePort`number | string
来源端口,有三种形式: 来源端口,有三种形式:
* `"a-b"`a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间当目标端口落在此范围内时此规则生效。 - `"a-b"`a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间当目标端口落在此范围内时此规则生效。
* `a`a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。 - `a`a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。
* 以上两种形式的混合,以逗号 "," 分隔。形如:`"53,443,1000-2000"` - 以上两种形式的混合,以逗号 "," 分隔。形如:`"53,443,1000-2000"`
>`network`: "tcp" | "udp" | "tcp,udp" > `network`: "tcp" | "udp" | "tcp,udp"
可选的值有 "tcp"、"udp" 或 "tcp,udp",当连接方式是指定的方式时,此规则生效。 可选的值有 "tcp"、"udp" 或 "tcp,udp",当连接方式是指定的方式时,此规则生效。
>`source`: \[string\] > `source`: \[string\]
一个数组,数组内每一项代表一个 IP 范围,形式有 IP、CIDR、GeoIP 和从文件中加载 IP。当某一项匹配来源 IP 时,此规则生效。 一个数组,数组内每一项代表一个 IP 范围,形式有 IP、CIDR、GeoIP 和从文件中加载 IP。当某一项匹配来源 IP 时,此规则生效。
>`user`: \[string\] > `user`: \[string\]
一个数组,数组内每一项是一个邮箱地址。当某一项匹配来源用户时,此规则生效。 一个数组,数组内每一项是一个邮箱地址。当某一项匹配来源用户时,此规则生效。
>`inboundTag`: \[string\] > `inboundTag`: \[string\]
一个数组,数组内每一项是一个标识。当某一项匹配入站协议的标识时,此规则生效。 一个数组,数组内每一项是一个标识。当某一项匹配入站协议的标识时,此规则生效。
>`protocol`: \[ "http" | "tls" | "bittorrent" \] > `protocol`: \[ "http" | "tls" | "bittorrent" \]
一个数组,数组内每一项表示一种协议。当某一个协议匹配当前连接的协议类型时,此规则生效。 一个数组,数组内每一项表示一种协议。当某一个协议匹配当前连接的协议类型时,此规则生效。
::: tip ::: tip
必须开启入站代理中的 `sniffing` 选项, 才能嗅探出连接所使用的协议类型. 必须开启入站代理中的 `sniffing` 选项, 才能嗅探出连接所使用的协议类型.
::: :::
>`attrs`: string > `attrs`: string
一段脚本,用于检测流量的属性值。当此脚本返回真值时,此规则生效。 一段脚本,用于检测流量的属性值。当此脚本返回真值时,此规则生效。
@ -169,17 +147,17 @@
示例: 示例:
* 检测 HTTP GET`"attrs[':method'] == 'GET'"` - 检测 HTTP GET`"attrs[':method'] == 'GET'"`
* 检测 HTTP Path`"attrs[':path'].startswith('/test')"` - 检测 HTTP Path`"attrs[':path'].startswith('/test')"`
* 检测 Content Type`"attrs['accept'].index('text/html') >= 0"` - 检测 Content Type`"attrs['accept'].index('text/html') >= 0"`
>`outboundTag`: string > `outboundTag`: string
对应一个outbound的标识。 对应一个 outbound 的标识。
>`balancerTag`: string > `balancerTag`: string
对应一个Balancer的标识。 对应一个 Balancer 的标识。
::: tip ::: tip
`balancerTag``outboundTag` 须二选一。当同时指定时,`outboundTag` 生效。 `balancerTag``outboundTag` 须二选一。当同时指定时,`outboundTag` 生效。
@ -187,26 +165,24 @@
### BalancerObject ### BalancerObject
负载均衡器配置。当一个负载均衡器生效时它会从指定的outbound中按配置选出一个最合适的outbound进行流量转发。 负载均衡器配置。当一个负载均衡器生效时,它会从指定的 outbound 中,按配置选出一个最合适的 outbound进行流量转发。
```json ```json
{ {
"tag": "balancer", "tag": "balancer",
"selector": [] "selector": []
} }
``` ```
>`tag`: string > `tag`: string
此负载均衡器的标识,用于匹配 `RuleObject` 中的 `balancerTag` 此负载均衡器的标识,用于匹配 `RuleObject` 中的 `balancerTag`
>`selector`: \[ string \] > `selector`: \[ string \]
一个字符串数组,其中每一个字符串将用于和 outbound 标识的前缀匹配。在以下几个 outbound 标识中:`[ "a", "ab", "c", "ba" ]``"selector": ["a"]` 将匹配到 `[ "a", "ab" ]`
一个字符串数组其中每一个字符串将用于和outbound标识的前缀匹配。在以下几个outbound标识中`[ "a", "ab", "c", "ba" ]``"selector": ["a"]` 将匹配到 `[ "a", "ab" ]` 如果匹配到多个 outbound负载均衡器目前会从中随机选出一个作为最终的 outbound。
如果匹配到多个outbound负载均衡器目前会从中随机选出一个作为最终的outbound。
### 预定义域名列表 ### 预定义域名列表
@ -214,16 +190,16 @@
常见的域名有: 常见的域名有:
* `category-ads`:包含了常见的广告域名。 - `category-ads`:包含了常见的广告域名。
* `category-ads-all`:包含了常见的广告域名,以及广告提供商的域名。 - `category-ads-all`:包含了常见的广告域名,以及广告提供商的域名。
* `cn`:相当于 `geolocation-cn``tld-cn` 的合集。 - `cn`:相当于 `geolocation-cn``tld-cn` 的合集。
* `apple`:包含了 Apple 旗下绝大部分域名。 - `apple`:包含了 Apple 旗下绝大部分域名。
* `google`:包含了 Google 旗下绝大部分域名。 - `google`:包含了 Google 旗下绝大部分域名。
* `microsoft`:包含了 Microsoft 旗下绝大部分域名。 - `microsoft`:包含了 Microsoft 旗下绝大部分域名。
* `facebook`:包含了 Facebook 旗下绝大部分域名。 - `facebook`:包含了 Facebook 旗下绝大部分域名。
* `twitter`:包含了 Twitter 旗下绝大部分域名。 - `twitter`:包含了 Twitter 旗下绝大部分域名。
* `telegram`:包含了 Telegram 旗下绝大部分域名。 - `telegram`:包含了 Telegram 旗下绝大部分域名。
* `geolocation-cn`:包含了常见的大陆站点域名。 - `geolocation-cn`:包含了常见的大陆站点域名。
* `geolocation-!cn`:包含了常见的非大陆站点域名,同时包含了 `tld-!cn` - `geolocation-!cn`:包含了常见的非大陆站点域名,同时包含了 `tld-!cn`
* `tld-cn`:包含了 CNNIC 管理的用于中国大陆的顶级域名,如以 `.cn``.中国` 结尾的域名。 - `tld-cn`:包含了 CNNIC 管理的用于中国大陆的顶级域名,如以 `.cn``.中国` 结尾的域名。
* `tld-!cn`:包含了非中国大陆使用的顶级域名,如以 `.hk`(香港)、`.tw`(台湾)、`.jp`(日本)、`.sg`(新加坡)、`.us`(美国)`.ca`(加拿大)等结尾的域名。 - `tld-!cn`:包含了非中国大陆使用的顶级域名,如以 `.hk`(香港)、`.tw`(台湾)、`.jp`(日本)、`.sg`(新加坡)、`.us`(美国)`.ca`(加拿大)等结尾的域名。

View file

@ -16,7 +16,6 @@
开启了统计以后, 只需在 [Policy](./policy.md) 中开启对应的项,就可以统计对应的数据。 开启了统计以后, 只需在 [Policy](./policy.md) 中开启对应的项,就可以统计对应的数据。
## 获取统计信息 ## 获取统计信息
可以用 `xray api` 的相关命令获取统计信息. 可以用 `xray api` 的相关命令获取统计信息.
@ -29,7 +28,7 @@
特定用户的上行流量,单位字节。 特定用户的上行流量,单位字节。
- `user>>>[email]>>>traffic>>>downlink` - `user>>>[email]>>>traffic>>>downlink`
特定用户的下行流量,单位字节。 特定用户的下行流量,单位字节。
@ -37,21 +36,20 @@
如果对应用户没有指定 Email则不会开启统计。 如果对应用户没有指定 Email则不会开启统计。
::: :::
- 全局数据 - 全局数据
- `inbound>>>[tag]>>>traffic>>>uplink` - `inbound>>>[tag]>>>traffic>>>uplink`
特定inbound的上行流量单位字节。 特定 inbound 的上行流量,单位字节。
- `inbound>>>[tag]>>>traffic>>>downlink` - `inbound>>>[tag]>>>traffic>>>downlink`
特定inbound的下行流量单位字节。 特定 inbound 的下行流量,单位字节。
- `outbound>>>[tag]>>>traffic>>>uplink` - `outbound>>>[tag]>>>traffic>>>uplink`
特定outbound的上行流量单位字节。 特定 outbound 的上行流量,单位字节。
- `outbound>>>[tag]>>>traffic>>>downlink` - `outbound>>>[tag]>>>traffic>>>downlink`
特定outbound的下行流量单位字节。 特定 outbound 的下行流量,单位字节。

View file

@ -4,12 +4,13 @@
传输方式指定了稳定的数据传输的方式。通常来说,一个网络连接的两端需要有对称的传输方式。比如一端用了 WebSocket那么另一个端也必须使用 WebSocket否则无法建立连接。 传输方式指定了稳定的数据传输的方式。通常来说,一个网络连接的两端需要有对称的传输方式。比如一端用了 WebSocket那么另一个端也必须使用 WebSocket否则无法建立连接。
传输方式transport配置有两部分: 传输方式transport配置有两部分:
1. 全局配置([TransportObject](#transportobject) 1. 全局配置([TransportObject](#transportobject)
2. 局部配置([StreamSettingsObject](#streamsettingsobject))。 2. 局部配置([StreamSettingsObject](#streamsettingsobject))。
- 局部配置时,可以指定每个单独的入站或出站用怎样的方式传输。
- 通常来说客户端和服务器对应的入站和出站需要使用同样的传输方式。当其配置指定了一种传输方式,但没有填写具体设置时,此传输方式会使用全局配置中的设置。
- 局部配置时,可以指定每个单独的入站或出站用怎样的方式传输。
- 通常来说客户端和服务器对应的入站和出站需要使用同样的传输方式。当其配置指定了一种传输方式,但没有填写具体设置时,此传输方式会使用全局配置中的设置。
## TransportObject ## TransportObject
@ -57,172 +58,168 @@
针对 Domain Socket 连接的配置。 针对 Domain Socket 连接的配置。
## StreamSettingsObject ## StreamSettingsObject
`StreamSettingsObject` 对应入站或出站中的 `streamSettings` 项。每一个入站或出站都可以分别配置不同的传输配置,都可以设置 `streamSettings` 来进行一些传输的配置。 `StreamSettingsObject` 对应入站或出站中的 `streamSettings` 项。每一个入站或出站都可以分别配置不同的传输配置,都可以设置 `streamSettings` 来进行一些传输的配置。
```json ```json
{ {
"network": "tcp", "network": "tcp",
"security": "none", "security": "none",
"tlsSettings": {}, "tlsSettings": {},
"xtlsSettings": {}, "xtlsSettings": {},
"tcpSettings": {}, "tcpSettings": {},
"kcpSettings": {}, "kcpSettings": {},
"wsSettings": {}, "wsSettings": {},
"httpSettings": {}, "httpSettings": {},
"quicSettings": {}, "quicSettings": {},
"dsSettings": {}, "dsSettings": {},
"grpcSettings": {}, "grpcSettings": {},
"sockopt": { "sockopt": {
"mark": 0, "mark": 0,
"tcpFastOpen": false, "tcpFastOpen": false,
"tproxy": "off", "tproxy": "off",
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"dialerProxy": "" "dialerProxy": ""
} }
} }
``` ```
> `network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic" > `network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"
连接的数据流所使用的传输方式类型,默认值为 `"tcp"` 连接的数据流所使用的传输方式类型,默认值为 `"tcp"`
> `security`: "none" | "tls" | "xtls" > `security`: "none" | "tls" | "xtls"
是否启用传输层加密,支持的选项有
是否启用传输层加密,支持的选项有
- `"none"` 表示不加密(默认值) - `"none"` 表示不加密(默认值)
- `"tls"` 表示使用 [TLS](https://en.wikipedia.org/wiki/base/transport_Layer_Security)。 - `"tls"` 表示使用 [TLS](https://en.wikipedia.org/wiki/base/transport_Layer_Security)。
- `"xtls"` 表示使用 [XTLS](../features/xtls.md)。 - `"xtls"` 表示使用 [XTLS](../features/xtls.md)。
> `tlsSettings`: [TLSObject](#tlsobject) > `tlsSettings`: [TLSObject](#tlsobject)
TLS 配置。TLS 由 Golang 提供通常情况下TLS协商的结果为使用 TLS 1.3,不支持 DTLS。 TLS 配置。TLS 由 Golang 提供,通常情况下 TLS 协商的结果为使用 TLS 1.3,不支持 DTLS。
> `xtlsSettings`: [XTLSObject](#tlsobject) > `xtlsSettings`: [XTLSObject](#tlsobject)
XTLS 配置。XTLS 是 Xray 的原创黑科技, 也是使 Xray 性能一骑绝尘的核心动力。 XTLS 配置。XTLS 是 Xray 的原创黑科技, 也是使 Xray 性能一骑绝尘的核心动力。
XTLS 与 TLS 有相同的安全性, 配置方式也和TLS一致. 点击此处查看 [XTLS的技术细节剖析](../features/xtls.md) XTLS 与 TLS 有相同的安全性, 配置方式也和 TLS 一致. 点击此处查看 [XTLS 的技术细节剖析](../features/xtls.md)
::: danger ::: danger
TLS / XTLS 是目前最安全的传输加密方案, 且外部看来流量类型和正常上网具有一致性。 TLS / XTLS 是目前最安全的传输加密方案, 且外部看来流量类型和正常上网具有一致性。
启用 XTLS 并且配置合适的XTLS流控模式, 可以在保持和 TLS 相同的安全性的前提下, 性能达到数倍甚至十几倍的提升。 启用 XTLS 并且配置合适的 XTLS 流控模式, 可以在保持和 TLS 相同的安全性的前提下, 性能达到数倍甚至十几倍的提升。
`security` 的值从 `tls` 改为 `xtls` 时, 只需将 `tlsSettings` 修改成为 `xtlsSettings` `security` 的值从 `tls` 改为 `xtls` 时, 只需将 `tlsSettings` 修改成为 `xtlsSettings`
::: :::
> `tcpSettings`: [TcpObject](./transports/tcp.md) > `tcpSettings`: [TcpObject](./transports/tcp.md)
当前连接的 TCP 配置,仅当此连接使用 TCP 时有效。配置内容与上面的全局配置相同。 当前连接的 TCP 配置,仅当此连接使用 TCP 时有效。配置内容与上面的全局配置相同。
> `kcpSettings`: [KcpObject](./transports/mkcp.md) > `kcpSettings`: [KcpObject](./transports/mkcp.md)
当前连接的 mKCP 配置,仅当此连接使用 mKCP 时有效。配置内容与上面的全局配置相同。 当前连接的 mKCP 配置,仅当此连接使用 mKCP 时有效。配置内容与上面的全局配置相同。
> `wsSettings`: [WebSocketObject](./transports/websocket.md) > `wsSettings`: [WebSocketObject](./transports/websocket.md)
当前连接的 WebSocket 配置,仅当此连接使用 WebSocket 时有效。配置内容与上面的全局配置相同。 当前连接的 WebSocket 配置,仅当此连接使用 WebSocket 时有效。配置内容与上面的全局配置相同。
> `httpSettings`: [HttpObject](./transports/h2.md) > `httpSettings`: [HttpObject](./transports/h2.md)
当前连接的 HTTP/2 配置,仅当此连接使用 HTTP/2 时有效。配置内容与上面的全局配置相同。 当前连接的 HTTP/2 配置,仅当此连接使用 HTTP/2 时有效。配置内容与上面的全局配置相同。
> `quicSettings`: [QUICObject](./transports/quic.md) > `quicSettings`: [QUICObject](./transports/quic.md)
当前连接的 QUIC 配置,仅当此连接使用 QUIC 时有效。配置内容与上面的全局配置相同。 当前连接的 QUIC 配置,仅当此连接使用 QUIC 时有效。配置内容与上面的全局配置相同。
> `grpcSettings`: [GRPCObject](./transports/grpc.md) > `grpcSettings`: [GRPCObject](./transports/grpc.md)
当前连接的 gRPC 配置,仅当此连接使用 gRPC 时有效。配置内容与上面的全局配置相同。 当前连接的 gRPC 配置,仅当此连接使用 gRPC 时有效。配置内容与上面的全局配置相同。
> `dsSettings`: [DomainSocketObject](./transports/domainsocket.md) > `dsSettings`: [DomainSocketObject](./transports/domainsocket.md)
当前连接的 Domain socket 配置,仅当此连接使用 Domain socket 时有效。配置内容与上面的全局配置相同。 当前连接的 Domain socket 配置,仅当此连接使用 Domain socket 时有效。配置内容与上面的全局配置相同。
> `sockopt`: [SockoptObject](#sockoptobject) > `sockopt`: [SockoptObject](#sockoptobject)
透明代理相关的具体配置。 透明代理相关的具体配置。
### TLSObject ### TLSObject
```json ```json
{ {
"serverName": "xray.com", "serverName": "xray.com",
"allowInsecure": false, "allowInsecure": false,
"alpn": [ "alpn": ["h2", "http/1.1"],
"h2", "minVersion": "1.2",
"http/1.1" "maxVersion": "1.3",
], "preferServerCipherSuites": true,
"minVersion": "1.2", "cipherSuites": "此处填写你需要的加密套件名称,每个套件名称之间用:进行分隔",
"maxVersion": "1.3", "certificates": [],
"preferServerCipherSuites": true, "disableSystemRoot": false,
"cipherSuites": "此处填写你需要的加密套件名称,每个套件名称之间用:进行分隔", "enableSessionResumption": false
"certificates": [],
"disableSystemRoot": false,
"enableSessionResumption": false
} }
``` ```
> `serverName`: string > `serverName`: string
指定服务器端证书的域名,在连接由 IP 建立时有用。 指定服务器端证书的域名,在连接由 IP 建立时有用。
当目标连接由域名指定时,比如在 Socks 入站接收到了域名,或者由 Sniffing 功能探测出了域名,这个域名会自动用于 `serverName`,无须手动配置。 当目标连接由域名指定时,比如在 Socks 入站接收到了域名,或者由 Sniffing 功能探测出了域名,这个域名会自动用于 `serverName`,无须手动配置。
> `alpn`: \[ string \] > `alpn`: \[ string \]
一个字符串数组,指定了 TLS 握手时指定的 ALPN 数值。默认值为 `["h2", "http/1.1"]` 一个字符串数组,指定了 TLS 握手时指定的 ALPN 数值。默认值为 `["h2", "http/1.1"]`
> `minVersion`: \[ string \] > `minVersion`: \[ string \]
minVersion为可接受的最小SSL/TLS版本。 minVersion 为可接受的最小 SSL/TLS 版本。
> `maxVersion`: \[ string \] > `maxVersion`: \[ string \]
maxVersion为可接受的最大SSL/TLS版本。 maxVersion 为可接受的最大 SSL/TLS 版本。
> `preferServerCipherSuites`: true | false > `preferServerCipherSuites`: true | false
指示服务器选择客户端最喜欢的密码套件 或 服务器最优选的密码套件。 指示服务器选择客户端最喜欢的密码套件 或 服务器最优选的密码套件。
如果为true则为使用服务器的最优选的密码套件 如果为 true 则为使用服务器的最优选的密码套件
> `cipherSuites`: \[ string \] > `cipherSuites`: \[ string \]
CipherSuites用于配置受支持的密码套件列表, 每个套件名称之间用:进行分隔. CipherSuites 用于配置受支持的密码套件列表, 每个套件名称之间用:进行分隔.
你可以在 [这里](https://golang.org/src/crypto/tls/cipher_suites.go#L500 )或 [这里](https://golang.org/src/crypto/tls/cipher_suites.go#L44) 找到golang加密套件的名词和说明 你可以在 [这里](https://golang.org/src/crypto/tls/cipher_suites.go#L500)或 [这里](https://golang.org/src/crypto/tls/cipher_suites.go#L44) 找到 golang 加密套件的名词和说明
::: danger ::: danger
以上两项配置为非必要选项,正常情况下不影响安全性 以上两项配置为非必要选项,正常情况下不影响安全性
在未配置的情况下golang根据设备自动选择. 在未配置的情况下 golang 根据设备自动选择.
若不熟悉, 请勿配置此选项, 填写不当引起的问题自行负责 若不熟悉, 请勿配置此选项, 填写不当引起的问题自行负责
::: :::
> `allowInsecure`: true | false > `allowInsecure`: true | false
是否允许不安全连接(仅用于客户端)。默认值为 `false` 是否允许不安全连接(仅用于客户端)。默认值为 `false`
当值为 `true`Xray 不会检查远端主机所提供的 TLS 证书的有效性。 当值为 `true`Xray 不会检查远端主机所提供的 TLS 证书的有效性。
::: danger ::: danger
出于安全性考虑这个选项不应该在实际场景中选择true否则可能遭受中间人攻击。 出于安全性考虑,这个选项不应该在实际场景中选择 true否则可能遭受中间人攻击。
::: :::
> `disableSystemRoot`: true | false > `disableSystemRoot`: true | false
是否禁用操作系统自带的 CA 证书。默认值为 `false` 是否禁用操作系统自带的 CA 证书。默认值为 `false`
当值为 `true`Xray 只会使用 `certificates` 中指定的证书进行 TLS 握手。当值为 `false`Xray 只会使用操作系统自带的 CA 证书进行 TLS 握手。 当值为 `true`Xray 只会使用 `certificates` 中指定的证书进行 TLS 握手。当值为 `false`Xray 只会使用操作系统自带的 CA 证书进行 TLS 握手。
> `enableSessionResumption`: true | false > `enableSessionResumption`: true | false
此参数的设置为false时, ClientHello 里没有 session_ticket 这个扩展。 此参数的设置为 false 时, ClientHello 里没有 session_ticket 这个扩展。
通常来讲 go 语言程序的 ClientHello 里并没有用到这个扩展, 因此建议保持默认值。 通常来讲 go 语言程序的 ClientHello 里并没有用到这个扩展, 因此建议保持默认值。
默认值为 `false` 默认值为 `false`
> `certificates`: \[ [CertificateObject](#certificateobject) \] > `certificates`: \[ [CertificateObject](#certificateobject) \]
证书列表,其中每一项表示一个证书(建议 fullchain 证书列表,其中每一项表示一个证书(建议 fullchain
@ -230,76 +227,76 @@ CipherSuites用于配置受支持的密码套件列表, 每个套件名称之间
如果要在 ssllibs 或者 myssl 获得 A/A+ 等级的评价, 请参考 [这里](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600). 如果要在 ssllibs 或者 myssl 获得 A/A+ 等级的评价, 请参考 [这里](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600).
::: :::
#### CertificateObject #### CertificateObject
```json ```json
{ {
"ocspStapling": 3600, "ocspStapling": 3600,
"usage": "encipherment", "usage": "encipherment",
"certificateFile": "/path/to/certificate.crt", "certificateFile": "/path/to/certificate.crt",
"keyFile": "/path/to/key.key", "keyFile": "/path/to/key.key",
"certificate": [ "certificate": [
"--BEGIN CERTIFICATE--", "--BEGIN CERTIFICATE--",
"MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw", "MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
"ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3", "ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
"DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+", "DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
"3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw", "3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
"OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5", "OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
"pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON", "pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
"OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp", "OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
"noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G", "noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
"A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA", "A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
"MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU", "MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
"7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+", "7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
"9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO", "9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
"6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8", "6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
"r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/", "r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
"d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q", "d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
"--END CERTIFICATE--" "--END CERTIFICATE--"
], ],
"key": [ "key": [
"--BEGIN RSA PRIVATE KEY--", "--BEGIN RSA PRIVATE KEY--",
"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",
"--END RSA PRIVATE KEY--" "--END RSA PRIVATE KEY--"
] ]
} }
``` ```
> `ocspStapling`: number
> `ocspStapling`: number
ocspStapling 检查更新时间间隔。 单位:秒 ocspStapling 检查更新时间间隔。 单位:秒
> `usage`: "encipherment" | "verify" | "issue" > `usage`: "encipherment" | "verify" | "issue"
证书用途,默认值为 `"encipherment"` 证书用途,默认值为 `"encipherment"`
* `"encipherment"`:证书用于 TLS 认证和加密。 - `"encipherment"`:证书用于 TLS 认证和加密。
* `"verify"`:证书用于验证远端 TLS 的证书。当使用此项时,当前证书必须为 CA 证书。 - `"verify"`:证书用于验证远端 TLS 的证书。当使用此项时,当前证书必须为 CA 证书。
* `"issue"`:证书用于签发其它证书。当使用此项时,当前证书必须为 CA 证书。 - `"issue"`:证书用于签发其它证书。当使用此项时,当前证书必须为 CA 证书。
::: tip TIP 1 ::: tip TIP 1
在 Windows 平台上可以将自签名的 CA 证书安装到系统中,即可验证远端 TLS 的证书。 在 Windows 平台上可以将自签名的 CA 证书安装到系统中,即可验证远端 TLS 的证书。
@ -325,75 +322,75 @@ ocspStapling 检查更新时间间隔。 单位:秒
如已经拥有一个域名, 可以使用工具便捷的获取免费第三方证书,如[acme.sh](https://github.com/acmesh-official/acme.sh) 如已经拥有一个域名, 可以使用工具便捷的获取免费第三方证书,如[acme.sh](https://github.com/acmesh-official/acme.sh)
::: :::
> `certificateFile`: string > `certificateFile`: string
证书文件路径,如使用 OpenSSL 生成,后缀名为 .crt。 证书文件路径,如使用 OpenSSL 生成,后缀名为 .crt。
> `certificate`: \[ string \] > `certificate`: \[ string \]
一个字符串数组,表示证书内容,格式如样例所示。`certificate``certificateFile` 二者选一。 一个字符串数组,表示证书内容,格式如样例所示。`certificate``certificateFile` 二者选一。
> `keyFile`: string > `keyFile`: string
密钥文件路径,如使用 OpenSSL 生成,后缀名为 .key。目前暂不支持需要密码的 key 文件。 密钥文件路径,如使用 OpenSSL 生成,后缀名为 .key。目前暂不支持需要密码的 key 文件。
> `key`: \[ string \] > `key`: \[ string \]
一个字符串数组,表示密钥内容,格式如样例如示。`key``keyFile` 二者选一。 一个字符串数组,表示密钥内容,格式如样例如示。`key``keyFile` 二者选一。
### SockoptObject ### SockoptObject
```json ```json
{ {
"mark": 0, "mark": 0,
"tcpFastOpen": false, "tcpFastOpen": false,
"tproxy": "off", "tproxy": "off",
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
"dialerProxy": "" "dialerProxy": ""
} }
``` ```
> `mark`: number > `mark`: number
一个整数。当其值非零时在ountbound连接以此数值上标记 SO_MARK。 一个整数。当其值非零时,在 ountbound 连接以此数值上标记 SO_MARK。
* 仅适用于 Linux 系统。 - 仅适用于 Linux 系统。
* 需要 CAP_NET_ADMIN 权限。 - 需要 CAP_NET_ADMIN 权限。
> `tcpFastOpen`: true | false > `tcpFastOpen`: true | false
是否启用 [TCP Fast Open](https://zh.wikipedia.org/wiki/TCP%E5%BF%AB%E9%80%9F%E6%89%93%E5%BC%80)。 是否启用 [TCP Fast Open](https://zh.wikipedia.org/wiki/TCP%E5%BF%AB%E9%80%9F%E6%89%93%E5%BC%80)。
当其值为 `true` 时,强制开启 TFO当其值为 `false` 时,强制关闭 TFO当此项不存在时使用系统默认设置。 当其值为 `true` 时,强制开启 TFO当其值为 `false` 时,强制关闭 TFO当此项不存在时使用系统默认设置。
可用于inbound/ountbound。 可用于 inbound/ountbound。
* 仅在以下版本(或更新版本)的操作系统中可用: - 仅在以下版本(或更新版本)的操作系统中可用:
* Windows 10 (1604) - Windows 10 (1604)
* Mac OS 10.11 / iOS 9 - Mac OS 10.11 / iOS 9
* Linux 3.16:系统已默认开启,无需配置。 - Linux 3.16:系统已默认开启,无需配置。
> `tproxy`: "redirect" | "tproxy" | "off" > `tproxy`: "redirect" | "tproxy" | "off"
是否开启透明代理(仅适用于 Linux 是否开启透明代理(仅适用于 Linux
* `"redirect"`:使用 Redirect 模式的透明代理。支持所有基于 IPv4/6 的 TCP 和 UDP 连接。 - `"redirect"`:使用 Redirect 模式的透明代理。支持所有基于 IPv4/6 的 TCP 和 UDP 连接。
* `"tproxy"`:使用 TProxy 模式的透明代理。支持所有基于 IPv4/6 的 TCP 和 UDP 连接。 - `"tproxy"`:使用 TProxy 模式的透明代理。支持所有基于 IPv4/6 的 TCP 和 UDP 连接。
* `"off"`:关闭透明代理。 - `"off"`:关闭透明代理。
透明代理需要 Root 或 `CAP\_NET\_ADMIN` 权限。 透明代理需要 Root 或 `CAP\_NET\_ADMIN` 权限。
::: danger ::: danger
当 [Dokodemo-door](../inbounds/dokodemo.md) 中指定了 `followRedirect``true`,且 Sockopt设置中的`tproxy` 为空时Sockopt设置中的`tproxy` 的值会被设为 `"redirect"` 当 [Dokodemo-door](../inbounds/dokodemo.md) 中指定了 `followRedirect``true`,且 Sockopt 设置中的`tproxy` 为空时Sockopt 设置中的`tproxy` 的值会被设为 `"redirect"`
::: :::
> `domainStrategy`: "AsIs" | "UseIP" | "UseIPv4" | "UseIPv6" > `domainStrategy`: "AsIs" | "UseIP" | "UseIPv4" | "UseIPv6"
在之前的版本中,当 Xray 尝试使用域名建立系统连接时,域名的解析由系统完成,不受 Xray 控制。这导致了在 [非标准Linux环境中无法解析域名](https://github.com/v2ray/v2ray-core/issues/1909) 等问题。为此Xray 1.3.1 为 Sockopt 引入了 Freedom 中的 domainStrategy解决了此问题。 在之前的版本中,当 Xray 尝试使用域名建立系统连接时,域名的解析由系统完成,不受 Xray 控制。这导致了在 [非标准 Linux 环境中无法解析域名](https://github.com/v2ray/v2ray-core/issues/1909) 等问题。为此Xray 1.3.1 为 Sockopt 引入了 Freedom 中的 domainStrategy解决了此问题。
在目标地址为域名时, 配置相应的值, SysteDailer 的行为模式如下: 在目标地址为域名时, 配置相应的值, SysteDailer 的行为模式如下:
- `"AsIs"`: 通过系统DNS服务器解析获取IP, 向此域名发出连接。
- `"UseIP"``"UseIPv4"``"UseIPv6"`: 使用[内置 DNS 服务器](./dns.md)解析获取IP后, 直接向此IP发出连接。 - `"AsIs"`: 通过系统 DNS 服务器解析获取 IP, 向此域名发出连接。
- `"UseIP"``"UseIPv4"``"UseIPv6"`: 使用[内置 DNS 服务器](./dns.md)解析获取 IP 后, 直接向此 IP 发出连接。
默认值为 `"AsIs"` 默认值为 `"AsIs"`
@ -405,6 +402,7 @@ ocspStapling 检查更新时间间隔。 单位:秒
> Tony: 先有鸡还是先有蛋? > Tony: 先有鸡还是先有蛋?
详细解释: 详细解释:
1. 触发条件代理服务器proxy.com。内置 DNS 服务器,非 Local 模式。 1. 触发条件代理服务器proxy.com。内置 DNS 服务器,非 Local 模式。
2. Xray 尝试向 proxy.com 建立 TCP 连接 **前** ,通过内置 DNS 服务器查询 proxy.com。 2. Xray 尝试向 proxy.com 建立 TCP 连接 **前** ,通过内置 DNS 服务器查询 proxy.com。
3. 内置 DNS 服务器向 dns.com 建立连接,并发送查询,以获取 proxy.com 的 IP。 3. 内置 DNS 服务器向 dns.com 建立连接,并发送查询,以获取 proxy.com 的 IP。
@ -424,7 +422,7 @@ ocspStapling 检查更新时间间隔。 单位:秒
因此,**不建议** 经验不足的用户擅自使用此功能。 因此,**不建议** 经验不足的用户擅自使用此功能。
::: :::
> `dialerProxy`: "" > `dialerProxy`: ""
一个出站代理的标识。当值不为空时,将使用指定的 outbound 发出连接。 一个出站代理的标识。当值不为空时,将使用指定的 outbound 发出连接。
此选项可用于支持底层传输方式的链式转发。 此选项可用于支持底层传输方式的链式转发。
@ -432,4 +430,3 @@ ocspStapling 检查更新时间间隔。 单位:秒
::: danger ::: danger
此选项与 PorxySettingsObject.Tag 不兼容 此选项与 PorxySettingsObject.Tag 不兼容
::: :::

View file

@ -31,5 +31,3 @@
> `grpcSettings`: [GRPCObject](./grpc) > `grpcSettings`: [GRPCObject](./grpc)
针对 gRPC 连接的配置。 针对 gRPC 连接的配置。

View file

@ -6,24 +6,27 @@
gRPCHTTP/2内置多路复用不建议使用 gRPC 与 HTTP/2 时启用 mux.cool。 gRPCHTTP/2内置多路复用不建议使用 gRPC 与 HTTP/2 时启用 mux.cool。
::: warning ⚠⚠⚠ ::: warning ⚠⚠⚠
- 目前gRPC 不支持指定 serverName (即 Websocket 与 HTTP/2 的 host).请在出站代理地址中填写 **正确的域名** ,或在 `(x)tlsSettings` 中填写 `ServerName` 否则无法连接。 - 目前gRPC 不支持指定 serverName (即 Websocket 与 HTTP/2 的 host).请在出站代理地址中填写 **正确的域名** ,或在 `(x)tlsSettings` 中填写 `ServerName` 否则无法连接。
- gRPC 不支持回落到其他服务。 - gRPC 不支持回落到其他服务。
- gRPC 服务有明显特征,无法抵抗主动探测。建议使用 Caddy 或 Nginx通过 Path 前置分流。 - gRPC 服务有明显特征,无法抵抗主动探测。建议使用 Caddy 或 Nginx通过 Path 前置分流。
::: :::
::: tip ::: tip
如果您使用 Caddy 或 Nginx 等反向代理,请注意下列事项: 如果您使用 Caddy 或 Nginx 等反向代理,请注意下列事项:
- 请确定反向代理服务器开启了 HTTP/2 - 请确定反向代理服务器开启了 HTTP/2
- 请使用 HTTP/2 或 h2c (Caddy)grpc_pass (Nginx) 连接到 Xray。 - 请使用 HTTP/2 或 h2c (Caddy)grpc_pass (Nginx) 连接到 Xray。
- 普通模式的 Path 为 `/{serviceName}/Tun`, Multi 模式为 `/{serviceName}/TunMulti` - 普通模式的 Path 为 `/{serviceName}/Tun`, Multi 模式为 `/{serviceName}/TunMulti`
::: :::
::: tip ::: tip
如果你正在使用回落,请注意下列事项: 如果你正在使用回落,请注意下列事项:
- 请确认 (x)tlsSettings.alpn 中 h2 位于第一顺位,否则 gRPCHTTP/2可能无法完成 TLS 握手。 - 请确认 (x)tlsSettings.alpn 中 h2 位于第一顺位,否则 gRPCHTTP/2可能无法完成 TLS 握手。
- gRPC 无法通过进行 Path 分流。 - gRPC 无法通过进行 Path 分流。
- 不建议回落到 gRPC存在主动探测的风险。 - 不建议回落到 gRPC存在主动探测的风险。
::: :::
## GRPCObject ## GRPCObject
@ -36,7 +39,7 @@ gRPCHTTP/2内置多路复用不建议使用 gRPC 与 HTTP/2 时启用 m
} }
``` ```
> `serviceName`: string > `serviceName`: string
一个字符串,指定服务路径,**类似于** HTTP/2 与 WebSocket 中的 Path。 一个字符串,指定服务路径,**类似于** HTTP/2 与 WebSocket 中的 Path。
客户端会使用此名称进行通信,服务器会验证服务名称是否匹配。 客户端会使用此名称进行通信,服务器会验证服务名称是否匹配。

View file

@ -15,9 +15,10 @@ HTTP/2 内置多路复用,不建议使用 HTTP/2 时启用 mux.cool。
::: warning ::: warning
⚠️ 如果你正在使用回落,请注意下列事项: ⚠️ 如果你正在使用回落,请注意下列事项:
- 请确认 (x)tlsSettings.alpn 中包含 h2否则 HTTP/2 无法完成 TLS 握手。 - 请确认 (x)tlsSettings.alpn 中包含 h2否则 HTTP/2 无法完成 TLS 握手。
- HTTP/2 无法通过进行 Path 分流,建议使用 SNI 分流。 - HTTP/2 无法通过进行 Path 分流,建议使用 SNI 分流。
::: :::
## HttpObject ## HttpObject

View file

@ -14,15 +14,15 @@ Websocket 会识别 HTTP 请求的 X-Forwarded-For 头来覆写流量的源地
```json ```json
{ {
"acceptProxyProtocol": false, "acceptProxyProtocol": false,
"path": "/", "path": "/",
"headers": { "headers": {
"Host": "xray.com" "Host": "xray.com"
} }
} }
``` ```
> `acceptProxyProtocol`: true | false > `acceptProxyProtocol`: true | false
仅用于 inbound指示是否接收 PROXY protocol。 仅用于 inbound指示是否接收 PROXY protocol。
@ -32,7 +32,7 @@ Websocket 会识别 HTTP 请求的 X-Forwarded-For 头来覆写流量的源地
填写 `true` 时,最底层 TCP 连接建立后,请求方必须先发送 PROXY protocol v1 或 v2否则连接会被关闭。 填写 `true` 时,最底层 TCP 连接建立后,请求方必须先发送 PROXY protocol v1 或 v2否则连接会被关闭。
> `path` string > `path` string
WebSocket 所使用的 HTTP 协议路径,默认值为 `"/"` WebSocket 所使用的 HTTP 协议路径,默认值为 `"/"`
@ -42,7 +42,7 @@ WebSocket 所使用的 HTTP 协议路径,默认值为 `"/"`。
`Early Data` 使用 `Sec-WebSocket-Protocol` 头承载数据。如果你遇到兼容性问题,可以尝试调低阈值。 `Early Data` 使用 `Sec-WebSocket-Protocol` 头承载数据。如果你遇到兼容性问题,可以尝试调低阈值。
::: :::
> `headers`: map \{string: string\} > `headers`: map \{string: string\}
自定义 HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是字符串。 自定义 HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是字符串。

View file

@ -57,6 +57,7 @@ $env:GOARCH="amd64"
go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
``` ```
上传到服务器后,记得在服务器终端内执行 `chmod +x xray` 上传到服务器后,记得在服务器终端内执行 `chmod +x xray`
::: tip ::: tip

View file

@ -1,25 +1,25 @@
# 快速入门 # 快速入门
> **这个章节将告诉您如何用最简单的方式获得Xray,并且开始使用Xray.** > **这个章节将告诉您如何用最简单的方式获得 Xray,并且开始使用 Xray.**
## 下载安装 ## 下载安装
Xray支持各种平台,并且您可以从多种渠道和方式获得Xray的各种版本. Xray 支持各种平台,并且您可以从多种渠道和方式获得 Xray 的各种版本.
请点击 [如何下载安装Xray](./install.md) 以获取Xray 请点击 [如何下载安装 Xray](./install.md) 以获取 Xray
## 配置运行 ## 配置运行
下载并安装Xray后只需对他进行配置即可使用. 下载并安装 Xray 后,只需对他进行配置即可使用.
请点击 [如何配置运行Xray](./config.md) 以学习最简单的配置方式. 请点击 [如何配置运行 Xray](./config.md) 以学习最简单的配置方式.
## 命令参数 ## 命令参数
Xray有多种命令和参数可用,因此变得灵活和强大. Xray 有多种命令和参数可用,因此变得灵活和强大.
请点击 [Xray的命令参数](./command.md) 查看Xray的更多命令和参数用法. 请点击 [Xray 的命令参数](./command.md) 查看 Xray 的更多命令和参数用法.
## 改进文档 ## 改进文档
如果你有兴趣,请点击 [使用文档](./document.md) 帮助我们改进文档,或者点击页面下方的 `帮助我们改善此页面!` 如果你有兴趣,请点击 [使用文档](./document.md) 帮助我们改进文档,或者点击页面下方的 `帮助我们改善此页面!`
@ -27,19 +27,21 @@ Xray有多种命令和参数可用,因此变得灵活和强大.
我们十分感谢每一位 contributor 作出的贡献!是你们让 Project X 变得更加强大! 我们十分感谢每一位 contributor 作出的贡献!是你们让 Project X 变得更加强大!
## 小小白白话文 ## 小小白白话文
给予新手指导的使用心得 给予新手指导的使用心得
请点击 [小小白白话文](./level-0/) 以进行查看 请点击 [小小白白话文](./level-0/) 以进行查看
## 入门技巧 ## 入门技巧
具备了基础之后,你就可以通过 [入门技巧](./level-1/) 来探索更多的使用方式了 具备了基础之后,你就可以通过 [入门技巧](./level-1/) 来探索更多的使用方式了
## 进阶文档 ## 进阶文档
给予进阶用户指导的使用技巧
给予进阶用户指导的使用技巧
点击 [进阶文档](./level-2/) 以进行查看 点击 [进阶文档](./level-2/) 以进行查看
::: tip 感谢 ::: tip 感谢
非常感谢大家无私分享使用技巧和心得, 使得Xray日益强大。 非常感谢大家无私分享使用技巧和心得, 使得 Xray 日益强大。
::: :::

View file

@ -31,6 +31,7 @@ Use "xray help <command>" for more information about a command.
指定一个或多个配置文件,并运行。 指定一个或多个配置文件,并运行。
使用方法: 使用方法:
``` ```
xray run [-c config.json] [-confdir dir] xray run [-c config.json] [-confdir dir]
``` ```
@ -55,6 +56,7 @@ without launching the server
输出 Xray 版本、 Golang 版本等信息。 输出 Xray 版本、 Golang 版本等信息。
使用方法: 使用方法:
``` ```
xray version xray version
``` ```
@ -64,6 +66,7 @@ without launching the server
调用 Xray 的 gRPC API需要在配置文件中开启。 调用 Xray 的 gRPC API需要在配置文件中开启。
使用方法: 使用方法:
``` ```
xray api <command> [arguments] xray api <command> [arguments]
``` ```
@ -84,6 +87,7 @@ xray api <command> [arguments]
一些与 TLS 相关的工具。 一些与 TLS 相关的工具。
使用方法: 使用方法:
``` ```
xray tls <command> [arguments] xray tls <command> [arguments]
``` ```
@ -98,13 +102,14 @@ xray tls <command> [arguments]
生成 UUID。 生成 UUID。
使用方法: 使用方法:
``` ```
xray uuid xray uuid
``` ```
::: tip ::: tip
`-config`没有指定时Xray 将先后尝试从以下路径加载`config.json`: `-config`没有指定时Xray 将先后尝试从以下路径加载`config.json`:
- 工作目录Working Directory - 工作目录Working Directory
- [环境变量](../config/features/env.md#资源文件路径)中`Xray.location.asset`所指定的路径 - [环境变量](../config/features/env.md#资源文件路径)中`Xray.location.asset`所指定的路径
::: :::

View file

@ -90,11 +90,10 @@
## 运行 ## 运行
- 在 Windows 和 macOS 中,配置文件通常是 Xray 同目录下的 `config.json` 文件。 - 在 Windows 和 macOS 中,配置文件通常是 Xray 同目录下的 `config.json` 文件。
- 直接运行 `Xray``Xray.exe` 即可。 - 直接运行 `Xray``Xray.exe` 即可。
- 在 Linux 中,配置文件通常位于 `/etc/xray/``/usr/local/etc/xray/` 目录下。 - 在 Linux 中,配置文件通常位于 `/etc/xray/``/usr/local/etc/xray/` 目录下。
- 运行 `xray run -c /etc/xray/config.json` - 运行 `xray run -c /etc/xray/config.json`
- 或使用 systemd 等工具将 Xray 作为服务在后台运行。 - 或使用 systemd 等工具将 Xray 作为服务在后台运行。
更多详细的说明可以参考 [配置文档](../config/) 和 [使用心得](../documents/)。 更多详细的说明可以参考 [配置文档](../config/) 和 [使用心得](../documents/)。

View file

@ -2,7 +2,6 @@
## 平台支持 ## 平台支持
Xray 在以下平台中可用: Xray 在以下平台中可用:
- Windows 7 及之后版本x86 / amd64 / arm32 - Windows 7 及之后版本x86 / amd64 / arm32
@ -15,14 +14,12 @@ Xray 在以下平台中可用:
## 下载 Xray ## 下载 Xray
预编译的二进制 ZIP 格式压缩包可在 [Github Releases](https://github.com/xtls/Xray-core/releases) 中找到。 预编译的二进制 ZIP 格式压缩包可在 [Github Releases](https://github.com/xtls/Xray-core/releases) 中找到。
下载对应平台的压缩包,解压后即可使用。 下载对应平台的压缩包,解压后即可使用。
## 验证安装包 ## 验证安装包
Xray 提供两种验证方式: Xray 提供两种验证方式:
- ZIP 压缩包的 SHA1 / SHA256 摘要 - ZIP 压缩包的 SHA1 / SHA256 摘要
@ -44,10 +41,12 @@ Xray 提供两种验证方式:
### 安装脚本 ### 安装脚本
- Linux Script - Linux Script
- [Xray-install](https://github.com/XTLS/Xray-install) - [Xray-install](https://github.com/XTLS/Xray-install)
- [Xray-script](https://github.com/kirin10000/Xray-script) - [Xray-script](https://github.com/kirin10000/Xray-script)
- One Click - One Click
- [ProxySU](https://github.com/proxysu/ProxySU) - [ProxySU](https://github.com/proxysu/ProxySU)
- [Xray-agent](https://github.com/mack-a/Xray-agent) - [Xray-agent](https://github.com/mack-a/Xray-agent)
@ -55,10 +54,8 @@ Xray 提供两种验证方式:
- [Xray4Magisk](https://github.com/CerteKim/Xray4Magisk) - [Xray4Magisk](https://github.com/CerteKim/Xray4Magisk)
- [Xray_For_Magisk](https://github.com/E7KMbb/Xray_For_Magisk) - [Xray_For_Magisk](https://github.com/E7KMbb/Xray_For_Magisk)
### Linux 发行版包管理器 ### Linux 发行版包管理器
Linux 发行版 Xray 包(可通过发行版相应的包管理器安装): Linux 发行版 Xray 包(可通过发行版相应的包管理器安装):
- Debian <Badge text="WIP" type="warning"/> - Debian <Badge text="WIP" type="warning"/>
@ -73,7 +70,6 @@ Linux 发行版 Xray 包(可通过发行版相应的包管理器安装):
### Docker image 的文件结构 ### Docker image 的文件结构
- `/etc/xray/config.json`:配置文件 - `/etc/xray/config.json`:配置文件
- `/usr/bin/xray`Xray 主程序 - `/usr/bin/xray`Xray 主程序
- `/usr/local/share/xray/geoip.dat`IP 数据文件 - `/usr/local/share/xray/geoip.dat`IP 数据文件

View file

@ -6,21 +6,20 @@
Made with ❤️ by [@ricuhkaen](https://github.com/ricuhkaen) Made with ❤️ by [@ricuhkaen](https://github.com/ricuhkaen)
::: :::
[【第1章】 前言罗嗦篇](./ch01-preface.md) - 机场还是自建?这是个问题 [【第 1 章】 前言罗嗦篇](./ch01-preface.md) - 机场还是自建?这是个问题
[【第2章】 原料准备篇](./ch02-preparation.md) - 工欲善其事,必先利其器 [【第 2 章】 原料准备篇](./ch02-preparation.md) - 工欲善其事,必先利其器
[【第3章】 远程登录篇](./ch03-ssh.md) - 一桥飞架南北,天堑变通途 [【第 3 章】 远程登录篇](./ch03-ssh.md) - 一桥飞架南北,天堑变通途
[【第4章】 安全防护篇](./ch04-security.md) - 安全不注意,亲人两行泪 [【第 4 章】 安全防护篇](./ch04-security.md) - 安全不注意,亲人两行泪
[【第5章】 网站建设篇](./ch05-webpage.md) - 秀出你的美 [【第 5 章】 网站建设篇](./ch05-webpage.md) - 秀出你的美
[【第6章】 证书管理篇](./ch06-certificates.md) - 领证的才是合法的 [【第 6 章】 证书管理篇](./ch06-certificates.md) - 领证的才是合法的
[【第7章】 Xray服务器篇](./ch07-xray-server.md) - 终于等到你 [【第 7 章】 Xray 服务器篇](./ch07-xray-server.md) - 终于等到你
[【第8章】 Xray客户端篇](./ch08-xray-clients.md) - 新的开始 [【第 8 章】 Xray 客户端篇](./ch08-xray-clients.md) - 新的开始
[【第9章】 附录](./ch09-appendix.md) - 考点都在这里
[【第 9 章】 附录](./ch09-appendix.md) - 考点都在这里

View file

@ -1,15 +1,13 @@
# 【第1章】 小小白白话文 # 【第 1 章】 小小白白话文
## 1.1 这篇文档是写给谁的? ## 1.1 这篇文档是写给谁的?
一句话:写给 **①零基础** **②希望学习自建VPS** 的新人。 一句话:写给 ** 零基础** ** 希望学习自建 VPS** 的新人。
## 1.2 这篇文档不是写给谁的? ## 1.2 这篇文档不是写给谁的?
包括但不限于:各路大神大能、懒得自己折腾的小白、已经会折腾的高手、确定要用机场的土豪、确定要用一键脚本的逍遥派...... 总之只要有技术基础、或不愿不想自建的同学,您直接关闭本文即可,因为这篇文章大概是入不了您的法眼的,更可能会让您生一肚子闲气,那多划不来。 包括但不限于:各路大神大能、懒得自己折腾的小白、已经会折腾的高手、确定要用机场的土豪、确定要用一键脚本的逍遥派...... 总之只要有技术基础、或不愿不想自建的同学,您直接关闭本文即可,因为这篇文章大概是入不了您的法眼的,更可能会让您生一肚子闲气,那多划不来。
## 1.3 郑重声明及其他声明 ## 1.3 郑重声明及其他声明
郑重声明: 郑重声明:
@ -18,22 +16,21 @@
免责声明: 免责声明:
本文内容请您自行判断是否可信可靠可用若您根据本文内容建立和使用VPS服务器时出了任何问题和不良结果鄙人概不负责。 本文内容请您自行判断是否可信可靠可用,若您根据本文内容建立和使用 VPS 服务器时出了任何问题和不良结果,鄙人概不负责。
啰嗦声明: 啰嗦声明:
基于本文【零基础用户】的目标受众,许多内容会尽力详尽说明,所以语言偏啰嗦,请做好心理准备。 基于本文【零基础用户】的目标受众,许多内容会尽力详尽说明,所以语言偏啰嗦,请做好心理准备。
## 1.4 为什么自建是个难题? ## 1.4 为什么自建是个难题?
要回答这个问题,就需要稍微多说一点背景信息了。 要回答这个问题,就需要稍微多说一点背景信息了。
一、科学上网这件事 一、科学上网这件事
科学上网这件事情,说来已经发展了近二十年(震惊!!!.jpg。最初自己稍微动动手即可改改host、连一下ssh、后来需要找一个网页代理再后来需要写一个私有协议(比如Shadowsocks)等等。 科学上网这件事情,说来已经发展了近二十年(震惊!!!.jpg。最初自己稍微动动手即可改改 host、连一下 ssh、后来需要找一个网页代理再后来需要写一个私有协议(比如 Shadowsocks)等等。
随着GFW技术这十几年来不断的迭代升级若要完成【自己动手科学上网】这个目标需要做的事情已经包括但不限于 随着 GFW 技术这十几年来不断的迭代升级,若要完成【自己动手科学上网】这个目标,需要做的事情已经包括但不限于:
1. 了解Linux系统基本命令 1. 了解Linux系统基本命令
2. 了解网络传输协议 2. 了解网络传输协议
@ -41,13 +38,13 @@
4. 有技术和经济能力完成域名购买及管理 4. 有技术和经济能力完成域名购买及管理
5. 有技术能力完成TLS证书申请 等等。 5. 有技术能力完成TLS证书申请 等等。
这就让【自建VPS科学上网】这个曾经简单的行为逐渐变成了令新人望而生畏的挑战。 这就让【自建 VPS 科学上网】这个曾经简单的行为逐渐变成了令新人望而生畏的挑战。
二、零基础用户的无奈 二、零基础用户的无奈
零基础的非技术用户如果完成上面这一连串的操作势必要学习大量的知识但稍微搜索之后新人只怕会更加迷茫大量的信息散布在互联网的各个角落博客、问答网站、群组、论坛、GitHub、Telegram、YouTube 等等等等)。这些信息纷乱复杂、水平良莠不齐、甚至可能互相矛盾。基本上就是不把新人彻底弄晕誓不罢休。 零基础的非技术用户如果完成上面这一连串的操作势必要学习大量的知识但稍微搜索之后新人只怕会更加迷茫大量的信息散布在互联网的各个角落博客、问答网站、群组、论坛、GitHub、Telegram、YouTube 等等等等)。这些信息纷乱复杂、水平良莠不齐、甚至可能互相矛盾。基本上就是不把新人彻底弄晕誓不罢休。
面对这些杂乱无章的信息新人突然就从【信息匮乏】变成了【信息过剩】。若是几番连蒙带猜的折腾以失败告终大概率如此的话他的积极性势必大受挫折。在这个过程中若他又恰好去了一些不太友好的地方去求助恐怕还要雪上加霜的被嘲讽一番“这么菜用机场不就行了瞎折腾什么啊”、“先去学会Linux再回来问吧”。 面对这些杂乱无章的信息,新人突然就从【信息匮乏】变成了【信息过剩】。若是几番连蒙带猜的折腾以失败告终(大概率如此)的话,他的积极性势必大受挫折。在这个过程中,若他又恰好去了一些不太友好的地方去求助,恐怕还要雪上加霜的被嘲讽一番:“这么菜,用机场不就行了,瞎折腾什么啊!”、“先去学会 Linux 再回来问吧”。
这时候,大概也只有一声“呵呵”可以表达心情了。 这时候,大概也只有一声“呵呵”可以表达心情了。
@ -59,10 +56,10 @@
一、“机场“的优势 一、“机场“的优势
所谓“机场”就是“线路提供商”。他负责完成1.4提到的那一串技术操作和管理,用户则付费获得使用权。所以,它的优点至少有: 所谓“机场”,就是“线路提供商”。他负责完成 1.4 提到的那一串技术操作和管理,用户则付费获得使用权。所以,它的优点至少有:
1. **用户操作简单**:扫码操作、一键添加规则等 1. **用户操作简单**:扫码操作、一键添加规则等
2. **线路选择多**可解锁不同国家、地区的网络服务比如iplc等专线服务、游戏加速服务等 2. **线路选择多**:可解锁不同国家、地区的网络服务;比如 iplc 等专线服务、游戏加速服务等
3. **接入节点多**:所以抵抗节点封锁的能力强一些,封了一个就换下一个 3. **接入节点多**:所以抵抗节点封锁的能力强一些,封了一个就换下一个
二、“机场”的风险 二、“机场”的风险
@ -71,23 +68,20 @@
1. **“机场”可完全获得用户信息**:用户在网上的所有痕迹,都【必然】经过且【非常可能】长期存储在其服务器上,这些记录无法受到任何具备法律效力的用户隐私协议的约束(**窥视、记录你的一举一动** 1. **“机场”可完全获得用户信息**:用户在网上的所有痕迹,都【必然】经过且【非常可能】长期存储在其服务器上,这些记录无法受到任何具备法律效力的用户隐私协议的约束(**窥视、记录你的一举一动**
2. **“机场”缺乏市场管理**:不可避免存在着以欺诈为目标的恶意商家(**主动跑路** 2. **“机场”缺乏市场管理**:不可避免存在着以欺诈为目标的恶意商家(**主动跑路**
3. **“机场”面临监管压力**大机场相对有保障的同时也无法避免树大招风。2020年间已经有几个大机场停运、跑路的事件发生用户的正常使用受到严重干扰**被动跑路** 3. **“机场”面临监管压力**大机场相对有保障的同时也无法避免树大招风。2020 年间,已经有几个大机场停运、跑路的事件发生,用户的正常使用受到严重干扰(**被动跑路**
4. **“机场”技术水平难以确定**:线路质量良莠不齐,挂羊头卖狗肉的现象屡见不鲜(**速度慢、掉线多、连不上** 4. **“机场”技术水平难以确定**:线路质量良莠不齐,挂羊头卖狗肉的现象屡见不鲜(**速度慢、掉线多、连不上**
## 1.6 那么你到底要不要自建呢? ## 1.6 那么你到底要不要自建呢?
现在,你已经看到了机场的优势和风险,要用什么,就请各位充分思考并自行决定。毕竟,最适合你的方案才是最好的方案。 现在,你已经看到了机场的优势和风险,要用什么,就请各位充分思考并自行决定。毕竟,最适合你的方案才是最好的方案。
<img src="./ch01-img01-choice.png" alt="It's Your Choice!" /> <img src="./ch01-img01-choice.png" alt="It's Your Choice!" />
1. 如果决定使用机场的话,现在,你可以关闭本文了。 1. 如果决定使用机场的话,现在,你可以关闭本文了。
2. 如果你决定自建,那就请继续阅读后面的章节吧!! 2. 如果你决定自建,那就请继续阅读后面的章节吧!!
总之,本文的目标就是成为零基础用户的知识起点,提供对每一步充分的讲解和演示,清清楚楚(甚至**婆婆妈妈、絮絮叨叨、啰啰嗦嗦**)的协助新人完成【**从输入第一条命令开始完成VPS服务器部署并成功在客户端完成科学上网**】的全程。并在这个过程中帮助新人逐步接触和熟悉Linux的基础操作为之后的进一步自学打下基础。 总之,本文的目标就是成为零基础用户的知识起点,提供对每一步充分的讲解和演示,清清楚楚(甚至**婆婆妈妈、絮絮叨叨、啰啰嗦嗦**)的协助新人完成【**从输入第一条命令开始,完成 VPS 服务器部署,并成功在客户端完成科学上网**】的全程。并在这个过程中帮助新人逐步接触和熟悉 Linux 的基础操作,为之后的进一步自学打下基础。
## 1.7 题外啰嗦几句 ## 1.7 题外啰嗦几句
@ -95,8 +89,7 @@
2. 衷心希望大家获得更顺畅的网络后,可以获取更新鲜的知识、更丰富的娱乐、接触更美好的世界、结交更多志同道合的朋友,但不要成为任何有不可告人目的之人的替罪羊。 2. 衷心希望大家获得更顺畅的网络后,可以获取更新鲜的知识、更丰富的娱乐、接触更美好的世界、结交更多志同道合的朋友,但不要成为任何有不可告人目的之人的替罪羊。
3. 你的互联网身份依然是你的身份绝对的匿名化是极为困难的所以请务必遵守你个人所在地区和IP所在地区的相关法律法规。无论何时自我保护都是最基本的底线。 3. 你的互联网身份依然是你的身份,绝对的匿名化是极为困难的,所以请务必遵守你个人所在地区和 IP 所在地区的相关法律法规。无论何时,自我保护都是最基本的底线。
## 1.8 你的进度 ## 1.8 你的进度

View file

@ -1,54 +1,52 @@
# 【第2章】原料准备篇 # 【第 2 章】原料准备篇
这一章比较特殊,因为涉及到金钱交易行为,本文基于项目的中立立场,不做具体的推荐。我能做的,是告诉你需要准备哪些东西。 这一章比较特殊,因为涉及到金钱交易行为,本文基于项目的中立立场,不做具体的推荐。我能做的,是告诉你需要准备哪些东西。
## 2.1 获取一台VPS ## 2.1 获取一台 VPS
你需要获取一台健康的、IP没有被墙的VPS并在管理后台做下面这些基础准备 你需要获取一台健康的、IP 没有被墙的 VPS并在管理后台做下面这些基础准备
1. 在VPS的后台安装 Debian 10 64bit 系统
2. 小本本记下VPS的IP地址本文会用 `"100.200.300.400"` 来表示)
::: tip
**注意:** 这是一个故意写错的非法IP请替换成你的真实IP
:::
3. 小本本记下VPS的SSH远程登陆端口(Port)
4. 小本本记下SSH远程登录的用户名和密码
购买VPS是一个比较复杂的事情建议先去学习一下相关知识选择适合自己的经济能力和线路需求的即可。另外可以选择薅一些国际大厂的羊毛比如甲骨文和谷歌提供的永久免费或限时免费的套餐。总之务必量力而行。 1. 在 VPS 的后台安装 Debian 10 64bit 系统
2. 小本本记下 VPS 的 IP 地址(本文会用 `"100.200.300.400"` 来表示)
::: tip
**注意:** 这是一个故意写错的非法 IP请替换成你的真实 IP
:::
3. 小本本记下 VPS 的 SSH 远程登陆端口(Port)
4. 小本本记下 SSH 远程登录的用户名和密码
购买 VPS 是一个比较复杂的事情,建议先去学习一下相关知识,选择适合自己的经济能力和线路需求的即可。另外可以选择薅一些国际大厂的羊毛(比如甲骨文和谷歌提供的永久免费或限时免费的套餐)。总之,务必量力而行。
::: tip ::: tip
**说明:** 关于选择 Debian 10 作为操作系统这里稍微多说一句不管你在网上听说了什么不管哪个大神告诉你XXX版的Linux更好、XXX版的Linux更牛这些Linux的派系之争**跟现在的你半毛钱关系也没有**!使用 Debian 10 足以让你的VPS服务器在安全、稳健运行的同时得到足够的优化如cloud专用内核、及时的bbr支持等。等你对Linux熟悉之后再回头去尝试其他的Linux发行版也不迟 **说明:** 关于选择 Debian 10 作为操作系统,这里稍微多说一句:不管你在网上听说了什么,不管哪个大神告诉你 XXX 版的 Linux 更好、XXX 版的 Linux 更牛,这些 Linux 的派系之争**跟现在的你半毛钱关系也没有**!使用 Debian 10 足以让你的 VPS 服务器在安全、稳健运行的同时得到足够的优化(如 cloud 专用内核、及时的 bbr 支持等)。等你对 Linux 熟悉之后,再回头去尝试其他的 Linux 发行版也不迟
::: :::
## 2.2 获取一个心仪的域名 ## 2.2 获取一个心仪的域名
你需要获取一个域名、并在DNS设置中添加一条A记录指向你VPS的IP地址 你需要获取一个域名、并在 DNS 设置中添加一条 A 记录,指向你 VPS 的 IP 地址
1. 请选择靠谱的国际域名服务商。选择一些常见的域名后缀就行,注意不要用 `.cn` 后缀。 1. 请选择靠谱的国际域名服务商。选择一些常见的域名后缀就行,注意不要用 `.cn` 后缀。
2. 在DNS设置中添加一条指向你VPS的IP地址的A记录A记录的名字可以随便起,本文会用 `"a-name"` 来表示。完整的域名则会用 `"二级域名.你的域名.com"` 或者 `"a-name.yourdomain.com"` 来表示)。效果如下图: 2. 在 DNS 设置中,添加一条指向你 VPS 的 IP 地址的 A 记录A 记录的名字可以随便起,本文会用 `"a-name"` 来表示。完整的域名则会用 `"二级域名.你的域名.com"` 或者 `"a-name.yourdomain.com"` 来表示)。效果如下图:
<img src="./ch02-img01-a-name.png" alt="添加A记录" /> <img src="./ch02-img01-a-name.png" alt="添加A记录" />
::: tip ::: tip
**注意:** 这**不是**一个真实可用的网址,请替换成你的真实网址 **注意:** 这**不是**一个真实可用的网址,请替换成你的真实网址
::: :::
## 2.3 你本地电脑上需要安装的软件 ## 2.3 你本地电脑上需要安装的软件
1. SSH远程登录工具 1. SSH 远程登录工具
- Windows: [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
- macOS/Linux: Terminal - Windows: [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
- macOS/Linux: Terminal
2. 远程文件拷贝工具 2. 远程文件拷贝工具
- Windows: [WinSCP](https://winscp.net/eng/index.php)
- macOS/Linux: Terminal
3. 靠谱的文本编辑器
- Windows/macOS/Linux: [VSCode](https://code.visualstudio.com)
- Windows: [WinSCP](https://winscp.net/eng/index.php)
- macOS/Linux: Terminal
3. 靠谱的文本编辑器
- Windows/macOS/Linux: [VSCode](https://code.visualstudio.com)
## 2.4 你的进度 ## 2.4 你的进度

View file

@ -1,89 +1,85 @@
# 【第3章】远程登录篇 # 【第 3 章】远程登录篇
## 3.1 远程登录VPS (PuTTY) ## 3.1 远程登录 VPS (PuTTY)
首先鉴于零基础人群中Windows的用户基数最大所以本文以Windows为例进行展示。 首先,鉴于零基础人群中 Windows 的用户基数最大,所以本文以 Windows 为例进行展示。
其次,虽然Windows 10之后的PowerShell和WSL也可以达到很好的SSH操作体验。但是因为并非所有版本的Windows都有最新的组件故本文还是以老牌的PuTTY为例进行SSH远程登录的操作详解。使用其他工具的话、在SSH登陆之后的操作都是一样的 其次,虽然 Windows 10 之后的 PowerShell 和 WSL 也可以达到很好的 SSH 操作体验。但是因为并非所有版本的 Windows 都有最新的组件,故本文还是以老牌的 PuTTY 为例,进行 SSH 远程登录的操作详解。(使用其他工具的话、在 SSH 登陆之后的操作都是一样的)
下面就跟我一步步操作吧。 下面就跟我一步步操作吧。
1. 进入PuTTY的[官网](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)选择适合你操作系统的版本下载。本文以64位版本为例 1. 进入 PuTTY 的[官网](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html),选择适合你操作系统的版本下载。(本文以 64 位版本为例)
<img src="./ch03-img01-putty-download.png" alt="下载PuTTY"/> <img src="./ch03-img01-putty-download.png" alt="下载PuTTY"/>
2. 安装运行后将会看到PuTTY的主界面。现在请拿出你上一章记东西的[小本本](../ch02-preparation/#21-%E8%8E%B7%E5%8F%96%E4%B8%80%E5%8F%B0vps)在下图的对应位置填入你VPS的**IP地址(VPS IP)**和**端口(VPS PORT)**。为了方便以后使用时不用重复输入,我们可以保存会话 (Saved Sessions)未来使用时只要按Load即可一键载入设置。 2. 安装运行后,将会看到 PuTTY 的主界面。现在请拿出你上一章记东西的[小本本](../ch02-preparation/#21-%E8%8E%B7%E5%8F%96%E4%B8%80%E5%8F%B0vps),在下图的对应位置填入你 VPS 的**IP 地址(VPS IP)**和**端口(VPS PORT)**。为了方便以后使用时不用重复输入,我们可以保存会话 (Saved Sessions),未来使用时只要按 Load 即可一键载入设置。
<img src="./ch03-img02-putty-settings.png" alt="设置PuTTY"/> <img src="./ch03-img02-putty-settings.png" alt="设置PuTTY"/>
3. 我建议将 `Connection` 中的 `keepalive` 设置为 `60`防止你一段时间没有操作之后SSH自动断线。另外务必再次保存设置。 3. 我建议将 `Connection` 中的 `keepalive` 设置为 `60` 秒,防止你一段时间没有操作之后 SSH 自动断线。另外务必再次保存设置。
<img src="./ch03-img03-putty-keepalive.png" alt="防止频繁断线"/> <img src="./ch03-img03-putty-keepalive.png" alt="防止频繁断线"/>
::: warning 注意 ::: warning 注意
对PuTTY的任何设置更新都要再次手动保存Session不然关闭后就会丢失 PuTTY 的任何设置更新都要再次手动保存 Session不然关闭后就会丢失
::: :::
4. 点击 Open 就会进入SSH连接窗口对应下图输入用户名与密码与你的VPS远程主机建立连接。本文假设默认用户名是 `root`另外在Linux系统输入密码的时候是不会出现 `******` 这种提示符的,这样可以避免密码长度泄漏,不是你的键盘坏掉了哦!) 4. 点击 Open 就会进入 SSH 连接窗口,对应下图输入用户名与密码,与你的 VPS 远程主机建立连接。(本文假设默认用户名是 `root`,另外,在 Linux 系统输入密码的时候,是不会出现 `******` 这种提示符的,这样可以避免密码长度泄漏,不是你的键盘坏掉了哦!)
<img src="./ch03-img04-ssh-login.png" alt="SSH远程登录"/> <img src="./ch03-img04-ssh-login.png" alt="SSH远程登录"/>
## 3.2 成功登录 SSH初识命令行界面
## 3.2 成功登录SSH初识命令行界面
1. 如果你的信息都填写正确,你将会看到类似下图的界面,说明已登录成功: 1. 如果你的信息都填写正确,你将会看到类似下图的界面,说明已登录成功:
<img src="./ch03-img05-ssh-login-success.png" alt="初次登录VPS"/> <img src="./ch03-img05-ssh-login-success.png" alt="初次登录VPS"/>
这个界面,就等于远程服务器的【桌面】,但它没有你熟悉的图标和鼠标,没有绚丽的色彩,有的只是简单文字,这就是【**命令行界面**】- `Command Line Interface`,或者缩写为 `CLI` 这个界面,就等于远程服务器的【桌面】,但它没有你熟悉的图标和鼠标,没有绚丽的色彩,有的只是简单文字,这就是【**命令行界面**】- `Command Line Interface`,或者缩写为 `CLI`
接下来的所有操作,都需要你像电影里的黑客一样,在这个命令行界面中完成。也许你会觉得陌生,但请相信我,使用命令行既不可怕,也不神秘。说到底,它只不过是把你习惯的鼠标操作变成了文字指令而已,**你说一句,它做一句**。
2. 现在,你可以稍微观察并熟悉一下命令行环境,这个界面其实已经告诉了你一些有用的信息了,比如系统内核版本(比如图内是 `4.19.37-5`、上次登录时间及IP等。当然根据VPS的不同你看到的界面可能会略有不同。 接下来的所有操作,都需要你像电影里的黑客一样,在这个命令行界面中完成。也许你会觉得陌生,但请相信我,使用命令行既不可怕,也不神秘。说到底,它只不过是把你习惯的鼠标操作变成了文字指令而已,**你说一句,它做一句**。
2. 现在,你可以稍微观察并熟悉一下命令行环境,这个界面其实已经告诉了你一些有用的信息了,比如系统内核版本(比如图内是 `4.19.37-5`)、上次登录时间及 IP 等。当然根据 VPS 的不同,你看到的界面可能会略有不同。
3. 请注意命令行最下面一行,闪动的光标左边,有一串字符。图中显示的是`root@vps-server:~#`,这一串要怎么理解呢?很简单: 3. 请注意命令行最下面一行,闪动的光标左边,有一串字符。图中显示的是`root@vps-server:~#`,这一串要怎么理解呢?很简单:
- 现在的用户是 `root` - 现在的用户是 `root`
- `root` 所在的服务器是 `vps-server` - `root` 所在的服务器是 `vps-server`
- `root` 现在所在的文件夹是 `~` - `root` 现在所在的文件夹是 `~`
- `#` 之后是你可以输入命令的地方 - `#` 之后是你可以输入命令的地方
前两个很直观无需多说。第三个是关于Linux的文件夹系统现在也不需要过于深入你只需要知道"`~`"就是【当前用户的大本营】。第四个,提示符`#`,你也不用管,只需要知道,未来文章中会写一些需要你输入的命令,都会以 "`#`" 或者 "`$`" 开头,提示你**后面**是你输入命令的地方。(所以你复制命令的时候,**只需要复制后面的内容**,不要复制提示符) 前两个很直观,无需多说。第三个是关于 Linux 的文件夹系统,现在也不需要过于深入,你只需要知道,"`~`"就是【当前用户的大本营】。第四个,提示符`#`,你也不用管,只需要知道,未来文章中会写一些需要你输入的命令,都会以 "`#`" 或者 "`$`" 开头,提示你**后面**是你输入命令的地方。(所以你复制命令的时候,**只需要复制后面的内容**,不要复制提示符)
## 3.3 第一次更新 Linux 的软件!
1. 正如你的手机,无论安卓还是 iPhone为了 APP 及时更新(获取安全补丁和新功能),都会时不时从应用商店获得更新信息,并且提示你有多少个 APP 可更新。Linux 系统也有逻辑十分类似的更新机制。所以只要你会更新手机 APP就能学会更新 Linux 软件!
## 3.3 第一次更新Linux的软件 2. Linux 下,每个 APP 都叫做一个“包” package。管理 APP 的程序自然就叫做“包管理器”Package Manager。你可以通过它安装、更新、卸载各种软件、甚至更新 Linux 系统本身。Linux 下的包管理器非常强大,此处按下不表,现在你只需要知道 Debian 系统的包管理器叫做 `apt` 即可。接下来,我们就先使用 `apt` 做一次软件的全面更新,让你熟悉它的基本操作。
1. 正如你的手机无论安卓还是iPhone为了APP及时更新获取安全补丁和新功能都会时不时从应用商店获得更新信息并且提示你有多少个APP可更新。Linux系统也有逻辑十分类似的更新机制。所以只要你会更新手机APP就能学会更新Linux软件 3. 小小白白 Linux 基础命令:
2. Linux下每个APP都叫做一个“包” package。管理APP的程序自然就叫做“包管理器”Package Manager。你可以通过它安装、更新、卸载各种软件、甚至更新Linux系统本身。Linux下的包管理器非常强大此处按下不表现在你只需要知道Debian系统的包管理器叫做 `apt` 即可。接下来,我们就先使用 `apt` 做一次软件的全面更新,让你熟悉它的基本操作。 | 编号 | 命令名称 | 命令说明 |
| :------: | :-----------: | :----------: |
3. 小小白白Linux基础命令 | `cmd-01` | `apt update` | 查询软件更新 |
| `cmd-02` | `apt upgrade` | 执行软件更新 |
| 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:|
| `cmd-01` | `apt update` | 查询软件更新 |
| `cmd-02` | `apt upgrade` | 执行软件更新 |
4. 现在请输入第一条命令,获取更新信息 4. 现在请输入第一条命令,获取更新信息
```
# apt update ```
``` # apt update
```
5. 然后请输入第二条命令,并在询问是否继续安装 `(Y/n)` 时输入 `y` 并回车确认,开始安装 5. 然后请输入第二条命令,并在询问是否继续安装 `(Y/n)` 时输入 `y` 并回车确认,开始安装
```
# apt upgrade ```
``` # apt upgrade
```
6. 完整流程演示如下: 6. 完整流程演示如下:
<img src="./ch03-img06-apt-upgrade-full.gif" alt="初次软件更新流程演示"/> <img src="./ch03-img06-apt-upgrade-full.gif" alt="初次软件更新流程演示"/>
## 3.4 你的进度 ## 3.4 你的进度
**恭喜你又迈出了坚实的一步!** 现在你已经可以通过SSH来登录你的远程服务器了那登录进去之后除了升级软件之外应该再做点什么呢敬请进入下一章一探究竟吧 **恭喜你又迈出了坚实的一步!** 现在,你已经可以通过 SSH 来登录你的远程服务器了!那登录进去之后,除了升级软件之外,应该再做点什么呢?敬请进入下一章一探究竟吧!
> ⬛⬛⬛⬜⬜⬜⬜⬜ 37.5% > ⬛⬛⬛⬜⬜⬜⬜⬜ 37.5%

View file

@ -1,10 +1,10 @@
# 【第4章】安全防护篇 # 【第 4 章】安全防护篇
## 4.1 为什么要做安全防护 ## 4.1 为什么要做安全防护
Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网站、APP、服务、甚至线下基础设施都建立在Linux的基石之上这背后牵涉到巨大的经济利益和商业价值当然也就就意味着黑灰产有巨大的攻击动力。但是这些服务是如此重要、根本不允许出现重大的安全漏洞。于是无数的运维专业人员都在安全攻防的战场上拼搏努力这才让大家能享受到基本稳定的现代化数字生活。 Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的网站、APP、服务、甚至线下基础设施都建立在 Linux 的基石之上,这背后牵涉到巨大的经济利益和商业价值,当然也就就意味着黑灰产有巨大的攻击动力。但是这些服务是如此重要、根本不允许出现重大的安全漏洞。于是无数的运维专业人员都在安全攻防的战场上拼搏努力,这才让大家能享受到基本稳定的现代化数字生活。
现在你拥有了一台VPS并且将会敞开他的数据访问渠道来达到流量转发的目标那就相当于你已经置身于安全攻防战场的第一线、直面所有风险。但与此同时新人由于知识和信息的不足看待安全问题是总是难免两极分化要么觉得轻如鸿毛和自己没有半点关系要么觉得重于泰山甚至惶惶不可终日。 现在,你拥有了一台 VPS并且将会敞开他的数据访问渠道来达到流量转发的目标那就相当于你已经置身于安全攻防战场的第一线、直面所有风险。但与此同时新人由于知识和信息的不足看待安全问题是总是难免两极分化要么觉得轻如鸿毛和自己没有半点关系要么觉得重于泰山甚至惶惶不可终日。
- 对于前者,我的建议是:安全无小事,尽量多查一些安全方面的信息,免得自己真的受了损失才后悔莫及 - 对于前者,我的建议是:安全无小事,尽量多查一些安全方面的信息,免得自己真的受了损失才后悔莫及
@ -12,117 +12,114 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
## 4.2 具体的风险到底是什么 ## 4.2 具体的风险到底是什么
就像我们在《远程登录篇》配置的一样任何人只需要知道【IP地址】+【端口】+【用户名】+【密码】这四个要素就能登录你的VPS服务器。那很显然这四要素的安全就是我们要防护的底线。我们来逐一分析 就像我们在《远程登录篇》配置的一样任何人只需要知道【IP 地址】+【端口】+【用户名】+【密码】这四个要素,就能登录你的 VPS 服务器。那很显然,这四要素的安全就是我们要防护的底线。我们来逐一分析:
1. 【IP地址】恶意脚本会随机尝试和扫描IP段可以简单认为是公开信息、无法隐藏 1. 【IP 地址】:恶意脚本会随机尝试和扫描 IP 段,可以简单认为是公开信息、无法隐藏
2. 【端口】:如果使用默认端口,那么【端口 = `22` 2. 【端口】:如果使用默认端口,那么【端口 = `22`
3. 【用户名】:如果使用默认用户,那么【用户名 = `root` 3. 【用户名】:如果使用默认用户,那么【用户名 = `root`
4. 【密码】密码不存在默认值一定是由VPS后台随机生成或由你自行设置的。也就是说如果你的服务器都是默认设置则四要素中的三个已经是已知的那么你整个服务器的安全就全部寄托在一串小小的密码上了。这时有几种情况 4. 【密码】:密码不存在默认值,一定是由 VPS 后台随机生成或由你自行设置的。也就是说,如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了。这时有几种情况:
- 如果你用了VPS管理后台随机生成密码它一般包含随机的十几个大小写混杂的字母和符号相对比较安全 - 如果你用了 VPS 管理后台随机生成密码,它一般包含随机的十几个大小写混杂的字母和符号,相对比较安全
- 如果你为了好记、把密码改成了类似`123456`这种超弱的密码破解你的VPS服务器可谓不费吹灰之力 - 如果你为了好记、把密码改成了类似`123456`这种超弱的密码,破解你的 VPS 服务器可谓不费吹灰之力
- 如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说`密码表`,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码) - 如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说`密码表`,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码)
5. 但你要明白没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码全部的攻击尝试都是恶意脚本自动进行的它会24小时不眠不休的工作。也许每天你酣睡之时你的服务器都在经受着一轮又一轮的冲击。 5. 但你要明白,没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码,全部的攻击尝试都是恶意脚本自动进行的,它会 24 小时不眠不休的工作。也许每天你酣睡之时,你的服务器都在经受着一轮又一轮的冲击。
一旦密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 `root` 控制权、安装部署它的恶意服务然后就可以用你的服务器来24小时做各种坏事比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做BT中继、甚至暗网公众节点等等等等。如果恶意脚本比较克制其实可以做到相当的隐蔽性。而新人一般也不会去观察留意VPS的登录记录、进程变化、CPU占用变化、流量变化等指标你其实就很难发现自己被黑了。直到你的VPS服务商封禁你的账号、或者收到律师函为止。 一旦密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 `root` 控制权、安装部署它的恶意服务,然后就可以用你的服务器来 24 小时做各种坏事(比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做 BT 中继、甚至暗网公众节点等等等等)。如果恶意脚本比较克制,其实可以做到相当的隐蔽性。而新人一般也不会去观察留意 VPS 的登录记录、进程变化、CPU 占用变化、流量变化等指标,你其实就很难发现自己被黑了。直到你的 VPS 服务商封禁你的账号、或者收到律师函为止。
6. 别忘了你获得VPS时大概率需要使用真实的支付信息你登录各种网站、社交平台时也会留下你的IP地址这些都与你的身份有直接或者间接的关系。于是**一旦这些坏事发生,它们就不可避免的与你产生了关联。** 6. 别忘了,你获得 VPS 时大概率需要使用真实的支付信息,你登录各种网站、社交平台时也会留下你的 IP 地址,这些都与你的身份有直接或者间接的关系。于是,**一旦这些坏事发生,它们就不可避免的与你产生了关联。**
## 4.3 我们要做的安全防护有哪些 ## 4.3 我们要做的安全防护有哪些
基于上述分析,我们要做的,自然就是对【端口】、【用户名】、【密码】这三要素进行加强,来降低被攻破的风险: 基于上述分析,我们要做的,自然就是对【端口】、【用户名】、【密码】这三要素进行加强,来降低被攻破的风险:
1. 【端口】将SSH远程登录端口修改为【非22端口】 4.4 1. 【端口】:将 SSH 远程登录端口修改为【非 22 端口】 4.4
2. 【用户名】建立【非root】的新用户、并禁用root用户SSH远程登录 4.5、4.6 2. 【用户名】:建立【非 root】的新用户、并禁用 root 用户 SSH 远程登录 4.5、4.6
3. 【密码】SSH启用RSA密钥验证登录、同时禁用密码验证登录 4.7 3. 【密码】SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录 4.7
记得按顺序来,别把自己锁在门外了。 记得按顺序来,别把自己锁在门外了。
## 4.4 将SSH远程登录端口修改为非22端口 ## 4.4 将 SSH 远程登录端口修改为非 22 端口
现在,我们来解决【端口 = `22`】的问题。注意有些VPS服务商默认的端口已经是非22端口那么你可以忽略这一步当然也可以跟着本文改成别的端口 现在,我们来解决【端口 = `22`】的问题。(注意:有些 VPS 服务商,默认的端口已经是非 22 端口,那么你可以忽略这一步,当然也可以跟着本文改成别的端口)
1. 小小白白Linux基础命令 1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 | | 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:| | :------: | :-----------------: | :----------: |
| `cmd-03` | `nano` | 文本编辑器 | | `cmd-03` | `nano` | 文本编辑器 |
| `cmd-04` | `systemctl restart` | 重启某个服务 | | `cmd-04` | `systemctl restart` | 重启某个服务 |
2. 小小白白Linux基础配置文件 2. 小小白白 Linux 基础配置文件
| 编号 | 配置文件位置 | 文件说明 | | 编号 | 配置文件位置 | 文件说明 |
|:--:|:--:|:--:| | :-------: | :--------------------: | :------------------: |
| `conf-01` | `/etc/ssh/sshd_config` | SSH远程登录程序设置 | | `conf-01` | `/etc/ssh/sshd_config` | SSH 远程登录程序设置 |
3. 我们要做的第一件事,当然就是【用`nano`这个文本编辑器打开`SSH远程登录程序设置`在Windows下你会【找到文件并双击】在Linux下该怎么办呢仔细看看上面的命令说明是不是就很简单了没错就是 3. 我们要做的第一件事,当然就是【用`nano`这个文本编辑器打开`SSH远程登录程序设置`】,在 Windows 下,你会【找到文件并双击】,在 Linux 下该怎么办呢?仔细看看上面的命令说明,是不是就很简单了?没错,就是:
``` ```
# nano /etc/ssh/sshd_config # nano /etc/ssh/sshd_config
``` ```
4. 文件打开后,你就进入了`nano`的界面,稍微观察一下,你会发现,它把重要的快捷键都显示在屏幕下方了(下图红框内),直接开卷考试、不用死记硬背,是不是很贴心呢? 4. 文件打开后,你就进入了`nano`的界面,稍微观察一下,你会发现,它把重要的快捷键都显示在屏幕下方了(下图红框内),直接开卷考试、不用死记硬背,是不是很贴心呢?
<img src="./ch04-img01-nano-ui.png" alt="nano的界面"/> <img src="./ch04-img01-nano-ui.png" alt="nano的界面"/>
5) 我们要做的第二件事,是【在打开的文件中找到`Port`这一项并修改它的端口】。Port 后面的数字就是 SSH 的端口,一般建议把它改成一个大于`1024`小于`65535`的整数(本文以`9753`为例)。请结合`nano`的快捷键,想一下该怎么操作呢?果然,你又说对了!就是:
5. 我们要做的第二件事,是【在打开的文件中找到`Port`这一项并修改它的端口】。Port后面的数字就是SSH的端口一般建议把它改成一个大于`1024`小于`65535`的整数(本文以`9753`为例)。请结合`nano`的快捷键,想一下该怎么操作呢?果然,你又说对了!就是: - 使用 `ctrl+w` 进入搜索模式,然后输入 `Port 22` 并回车
- 删除 `22` 并改成 `9753`
- 使用 `ctrl+w` 进入搜索模式,然后输入 `Port 22` 并回车 - 说明:如果这一行开头有个`#`,证明这一行【不生效】(被注释掉了),你可像我一样在文件最后写一个不带`#`的,或者把`#`删掉就好。
- 删除 `22` 并改成 `9753`
- 说明:如果这一行开头有个`#`,证明这一行【不生效】(被注释掉了),你可像我一样在文件最后写一个不带`#`的,或者把`#`删掉就好。
::: warning 注意 ::: warning 注意
本文以`9753`为例就意味着随着本文的发布这个端口会变成一个不大不小的特征也许会被攻击者优先尝试、也许被GFW干扰、阻断。所以我强烈建议你用一个自己想到的其他端口毕竟你有6万多个端口可以自由选择。 本文以`9753`为例就意味着随着本文的发布这个端口会变成一个不大不小的特征也许会被攻击者优先尝试、也许被GFW干扰、阻断。所以我强烈建议你用一个自己想到的其他端口毕竟你有6万多个端口可以自由选择。
::: :::
6. 我们要做的第三件事,是【保存文件并退出】 6. 我们要做的第三件事,是【保存文件并退出】
- 如果第3步你有仔细观察,就会发现保存并不是常见的 `ctrl+s` - 如果第 3 步你有仔细观察,就会发现保存并不是常见的 `ctrl+s`
- 正确的快捷键:保存是 `ctrl+o` + `回车`,退出是 `ctrl+x` - 正确的快捷键:保存是 `ctrl+o` + `回车`,退出是 `ctrl+x`
7. 我们最后要做的事是【重启ssh服务使变更生效】 7. 我们最后要做的事,是【重启 ssh 服务,使变更生效】
```
# systemctl restart ssh ```
``` # systemctl restart ssh
```
8. 完整流程演示如下: 8. 完整流程演示如下:
<img src="./ch04-img02-sshd-conf-full.gif" alt="修改非22端口演示"/> <img src="./ch04-img02-sshd-conf-full.gif" alt="修改非22端口演示"/>
9. 修改 PuTTY 配置 9. 修改 PuTTY 配置
现在新的端口已经生效下次使用PuTTY登录时就要用`9753`了。所以现在请到PuTTY的设置中修改端口号码然后保存Session。嗯你应该知道去哪里改了吧如果不知道的话要重读前面的内容了哦 现在新的端口已经生效,下次使用 PuTTY 登录时就要用`9753`了。所以现在请到 PuTTY 的设置中修改端口号码,然后保存 Session。嗯你应该知道去哪里改了吧如果不知道的话要重读前面的内容了哦
## 4.5 建立非 root 的新用户
## 4.5 建立非root的新用户
第二步,我们来解决【用户名 = `root`】的问题。 第二步,我们来解决【用户名 = `root`】的问题。
首先你要理解, Linux系统中的`root`,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦`root`账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。那么就跟随我进行操作吧: 首先你要理解, Linux 系统中的`root`,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦`root`账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。那么就跟随我进行操作吧:
1. 小小白白Linux基础命令 1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 | | 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:| | :------: | :-----------: | :--------------------------: |
| `cmd-05` | `adduser` | 给系统新增用户 | | `cmd-05` | `adduser` | 给系统新增用户 |
| `cmd-06` | `apt install` | 安装某个软件 | | `cmd-06` | `apt install` | 安装某个软件 |
| `cmd-07` | `visudo` | 修改sudo权限设置专用编辑器 | | `cmd-07` | `visudo` | 修改 sudo 权限设置专用编辑器 |
2. 我们要做的第一件事,是【新增一个用户并设定登录密码】,名字你可以随便起,我这里以`vpsadmin`为例: 2. 我们要做的第一件事,是【新增一个用户并设定登录密码】,名字你可以随便起,我这里以`vpsadmin`为例:
``` ```
# adduser vpsadmin # adduser vpsadmin
``` ```
执行命令后,根据提示操作即可。请务必设置一个用户密码(别忘记设置密码时你时看不到 `******` 的)。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。 执行命令后,根据提示操作即可。请务必设置一个用户密码(别忘记设置密码时你时看不到 `******` 的)。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。
@ -135,23 +132,24 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
4. 完整流程演示如下: 4. 完整流程演示如下:
<img src="./ch04-img04-adduser-full.gif" alt="建立新用户"/> <img src="./ch04-img04-adduser-full.gif" alt="建立新用户"/>
5. 我们要做的第二件事,是【安装`sudo`功能】(`sudo` 就是在关键时刻,让普通账户临时获得 `root` 的神力,战力全开拯救世界) 5. 我们要做的第二件事,是【安装`sudo`功能】(`sudo` 就是在关键时刻,让普通账户临时获得 `root` 的神力,战力全开拯救世界)
```
# apt update && apt install sudo
```
聪明的你大概已经发现,这一行命令其实是两个命令。前一半 `apt update` 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 `apt install` 就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的`sudo`程序】。 `&&` 则是把两个命令连起来执行的意思。 ```
# apt update && apt install sudo
```
聪明的你大概已经发现,这一行命令其实是两个命令。前一半 `apt update` 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 `apt install` 就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的`sudo`程序】。 `&&` 则是把两个命令连起来执行的意思。
6. 我们要做的第三件事,是【把`vpsadmin`用户加入`sudo`名单里,让他有资格借用`root`的神力】 6. 我们要做的第三件事,是【把`vpsadmin`用户加入`sudo`名单里,让他有资格借用`root`的神力】
``` ```
# visudo # visudo
``` ```
`User Privilege Specification` 下加入一行 `vpsadmin ALL=(ALL) NOPASSWD: ALL` 即可。
`User Privilege Specification` 下加入一行 `vpsadmin ALL=(ALL) NOPASSWD: ALL` 即可。
::: warning 注意 ::: warning 注意
我要特别说明的是`NOPASSWD`这个设置,它的意思是`vpsadmin`用户临时使用`root`权限时,不用额外输入密码。**这与一般的安全建议相反**。我之所以如此推荐,是因为很多新人不顾危险坚持使用`root`账号就是因为用`root`时不用重复输入密码、觉得轻松。“两害相权取其轻”,我认为【直接用`root`用户的风险】大于【使用`sudo`时不用输密码的风险】,所以做了以上的建议。 我要特别说明的是`NOPASSWD`这个设置,它的意思是`vpsadmin`用户临时使用`root`权限时,不用额外输入密码。**这与一般的安全建议相反**。我之所以如此推荐,是因为很多新人不顾危险坚持使用`root`账号就是因为用`root`时不用重复输入密码、觉得轻松。“两害相权取其轻”,我认为【直接用`root`用户的风险】大于【使用`sudo`时不用输密码的风险】,所以做了以上的建议。
@ -161,49 +159,49 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
7. 完整流程演示如下: 7. 完整流程演示如下:
<img src="./ch04-img05-sudo-full.gif" alt="建立新用户"/> <img src="./ch04-img05-sudo-full.gif" alt="建立新用户"/>
## 4.6 禁用 root 用户 SSH 远程登录
1. 现在你已经逐渐熟悉 Linux 了,所以这次换你思考,我们要做的第一件事是什么呢?没错,还是【用`nano`编辑器打开`SSH远程登录程序设置`】,什么,你想不起来怎么操作了?那去复习一下上面的内容再回来吧!............ 正确答案:
## 4.6 禁用root用户SSH远程登录 ```
# nano /etc/ssh/sshd_config
1. 现在你已经逐渐熟悉Linux了所以这次换你思考我们要做的第一件事是什么呢没错还是【用`nano`编辑器打开`SSH远程登录程序设置`】,什么,你想不起来怎么操作了?那去复习一下上面的内容再回来吧!............ 正确答案: ```
```
# nano /etc/ssh/sshd_config
```
2. 找到`PermitRootLogin Yes`这一项,然后把它后面的设定值改为`no`即可。还记得怎么操作吗?............ 正确答案: 2. 找到`PermitRootLogin Yes`这一项,然后把它后面的设定值改为`no`即可。还记得怎么操作吗?............ 正确答案:
- 使用 `ctrl+w` 进入搜索模式,然后输入 `PermitRootLogin` 并回车
- 删除 `yes` 并改成 `no` - 使用 `ctrl+w` 进入搜索模式,然后输入 `PermitRootLogin` 并回车
- 删除 `yes` 并改成 `no`
3. 保存文件并退出。还记得怎么操作吗?............ 正确答案: 3. 保存文件并退出。还记得怎么操作吗?............ 正确答案:
- 保存是 `ctrl+o`,然后 `回车` 确认
- 退出是 `ctrl+x`
4. 重启ssh服务让变更生效。还记得............ 算了直接公布正确答案: - 保存是 `ctrl+o`,然后 `回车` 确认
``` - 退出是 `ctrl+x`
# systemctl restart ssh
``` 4. 重启 ssh 服务,让变更生效。还记得............ 算了直接公布正确答案:
```
# systemctl restart ssh
```
5. 完整流程演示如下: 5. 完整流程演示如下:
<img src="./ch04-img06-ssh-no-root-full.gif" alt="禁用root用户SSH远程登录"/> <img src="./ch04-img06-ssh-no-root-full.gif" alt="禁用root用户SSH远程登录"/>
6. 下次通过PuTTY远程SSH登录的时候`root`用户已无法连接,用户名就要换成`vpsadmin`方便起见我们可以在PuTTY中把`vpsadmin`设置成默认登录用户名。啰嗦君别忘了保存Session 6. 下次通过 PuTTY 远程 SSH 登录的时候,`root`用户已无法连接,用户名就要换成`vpsadmin`了!方便起见,我们可以在 PuTTY 中把`vpsadmin`设置成默认登录用户名。(啰嗦君:别忘了保存 Session
<img src="./ch04-img07-putty-default-user.png" alt="PuTTY设置默认用户名"/> <img src="./ch04-img07-putty-default-user.png" alt="PuTTY设置默认用户名"/>
## 4.7 使用 RSA 密钥登录并禁用密码登录
## 4.7 使用RSA密钥登录并禁用密码登录
第三步,我们来解决【密码】可能被撞破的问题。 第三步,我们来解决【密码】可能被撞破的问题。
前面我说过,黑客并不是很蠢的用穷举法破解你的密码,而是会用一些比如“密码表”的作弊手段。除非你用的是随机生成的超长密码(比如借助1Password或者macOS的keychain等密码管理工具),否则很容易中招。 前面我说过,黑客并不是很蠢的用穷举法破解你的密码,而是会用一些比如“密码表”的作弊手段。除非你用的是随机生成的超长密码(比如借助 1Password或者 macOS 的 keychain 等密码管理工具),否则很容易中招。
超长随机密码虽然安全性有所提高,但是基本上无法记忆,手动输入也十分麻烦易错。为了解决这个困境,我们可以直接弃用【密码验证】方式,改用更安全的【密钥验证】。 超长随机密码虽然安全性有所提高,但是基本上无法记忆,手动输入也十分麻烦易错。为了解决这个困境,我们可以直接弃用【密码验证】方式,改用更安全的【密钥验证】。
所谓的【密钥验证】就是生成【一对】相关联的密钥文件公钥和私钥然后把【公钥】上传到VPS备用。每次登录时SSH会将【公钥】和【私钥】进行匹配若验证是正确的【密钥对】则验证通过。换言之你无需记忆和输入复杂的密码只要保护好【私钥】这个文件不外泄即可 所谓的【密钥验证】,就是生成【一对】相关联的密钥文件(公钥和私钥),然后把【公钥】上传到 VPS 备用。每次登录时SSH 会将【公钥】和【私钥】进行匹配,若验证是正确的【密钥对】,则验证通过。(换言之,你无需记忆和输入复杂的密码,只要保护好【私钥】这个文件不外泄即可)
::: warning 注意 ::: warning 注意
本文以 `RSA` 密钥举例,是因为 `RSA` 密钥在各种设备、各种 `SSH` 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择。 本文以 `RSA` 密钥举例,是因为 `RSA` 密钥在各种设备、各种 `SSH` 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择。
@ -211,7 +209,7 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
其他的常见密钥还有: 其他的常见密钥还有:
- `DSA` - 已经从数学层面被证明不安全,所以永远不要用它 - `DSA` - 已经从数学层面被证明不安全,所以永远不要用它
- `ECDSA` - 密钥小安全性高但其算法被指留有NSA的后门如果你的VPS上有值得NSA关注的东西就不要用它 - `ECDSA` - 密钥小安全性高,但其算法被指留有 NSA 的后门,如果你的 VPS 上有值得 NSA 关注的东西就不要用它
- `Ed25519` - 这是一个与 `ECDSA` 十分类似的算法,故具有相似的性能优势。同时其文档全部公开,所以普遍认为无后门 - `Ed25519` - 这是一个与 `ECDSA` 十分类似的算法,故具有相似的性能优势。同时其文档全部公开,所以普遍认为无后门
所以,如果你的设备和软件都支持的话,我建议优先选择 `Ed25519` 密钥。 所以,如果你的设备和软件都支持的话,我建议优先选择 `Ed25519` 密钥。
@ -219,102 +217,106 @@ Linux服务器的安全防护是一个纷繁复杂的巨大课题。无数的网
那我们现在就来配置【密钥验证】吧! 那我们现在就来配置【密钥验证】吧!
1. 运行`PuTTYgen` (PuTTY密钥生成器)。位置是 `开始菜单` --> `所有程序` --> `PuTTY (64-bit)` --> `PuTTYgen` 1. 运行`PuTTYgen` (PuTTY 密钥生成器)。位置是 `开始菜单` --> `所有程序` --> `PuTTY (64-bit)` --> `PuTTYgen`
1. 点击`Generate`开始生成(在界面空白处乱晃鼠标增加随机数)
<img src="./ch04-img08-puttygen-save.png" alt="生成密钥"/>
::: warning 注意
本图中是以 `2048` 位的 `RSA` 密钥为例的。但实际上,如果要获得与 `EDCSA/Ed25519``256` 位密钥相同的安全性,你需要使用 `3072` 位的 `RSA` 密钥。(即右下角的数字改成 `3072`
:::
2. 你可以给私钥设置密码,增加一层安全性 1. 点击`Generate`开始生成(在界面空白处乱晃鼠标增加随机数)
3. 点击 `Save public key` 保存公钥,文件名为 `id_rsa.pub` <img src="./ch04-img08-puttygen-save.png" alt="生成密钥"/>
4. 点击 `Save private key` 保存私钥,文件名为 `id_rsa` (PuTTY私钥自带`.ppk`后缀)
5. 最重要的,将上方红框内的内容,向下滚动全部复制出来并保存,文件名为 `authorized_keys`用vscode保存默认会变成带`txt`后缀的文本文件这没关系之后上传VPS时我们会把后缀名去掉
<img src="./ch04-img09-puttygen-save-keys.png" alt="保存密钥"/>
2. 将公钥上传至VPS的`vpsadmin`用户下
1. 这一步就需要用到之前准备的`WinSCP`了。
2. 去[官网](https://winscp.net/eng/index.php)下载并安装会提示你导入PuTTY的设置当然一键导入啦
<img src="./ch04-img10-winscp-import-session.png" alt="一键导入Session"/>
3. 如果没有提示导入或者你已经提前安装好了,那按照下图进行配置即可
<img src="./ch04-img11-winscp-ui.png" alt="WinSCP登录设置"/>
4. WinSCP左边的目录就是本地电脑上的文件夹和文件请定位到密钥所在的文件夹
5. WinSCP右边的目录则是VPS服务器上的文件夹和文件默认就在 `/home/vpsadmin/` 文件夹,此时在请点击右下角 `X hidden` 来显示隐藏文件
<img src="./ch04-img12-winscp-locations.png" alt="本地和远程文件夹"/>
6. 在右边VPS中点击右键并新建文件夹起名`.ssh` (注意有一个`.`
<img src="./ch04-img13-winscp-newfolder-key.png" alt="在VPS中建立放置公钥的文件夹"/>
7. 将【公钥】`authorized_keys`上传到`.ssh`文件夹内 ::: warning 注意
<img src="./ch04-img14-winscp-upload-key.png" alt="上传authorized_keys"/> 本图中是以 `2048` 位的 `RSA` 密钥为例的。但实际上,如果要获得与 `EDCSA/Ed25519``256` 位密钥相同的安全性,你需要使用 `3072` 位的 `RSA` 密钥。(即右下角的数字改成 `3072`
:::
8. 在上传时,将【公钥】从 `authorized_keys.txt` 改名为 `authorized_keys`(去掉`.txt`这个后缀名) 2. 你可以给私钥设置密码,增加一层安全性
<img src="./ch04-img15-winscp-rename-key.png" alt="确保没有任何后缀"/> 3. 点击 `Save public key` 保存公钥,文件名为 `id_rsa.pub`
4. 点击 `Save private key` 保存私钥,文件名为 `id_rsa` (PuTTY 私钥自带`.ppk`后缀)
5. 最重要的,将上方红框内的内容,向下滚动全部复制出来并保存,文件名为 `authorized_keys`。(用 vscode 保存,默认会变成带`txt`后缀的文本文件,这没关系,之后上传 VPS 时我们会把后缀名去掉)
<img src="./ch04-img09-puttygen-save-keys.png" alt="保存密钥"/>
9. 完整流程演示如下: 2. 将公钥上传至 VPS 的`vpsadmin`用户下
<img src="./ch04-img16-winscp-full.gif" alt="WinSCP操作完整演示"/>
3. 在VPS端设置SSH启用RSA密钥验证登录、同时禁用密码验证登录 1. 这一步就需要用到之前准备的`WinSCP`了。
2. 去[官网](https://winscp.net/eng/index.php)下载并安装,会提示你导入 PuTTY 的设置,当然一键导入啦!
<img src="./ch04-img10-winscp-import-session.png" alt="一键导入Session"/>
1. 小小白白Linux基础命令 3. 如果没有提示导入或者你已经提前安装好了,那按照下图进行配置即可
| 编号 | 命令名称 | 命令说明 | <img src="./ch04-img11-winscp-ui.png" alt="WinSCP登录设置"/>
|:--:|:--:|:--:|
| `cmd-08` | `sudo` | 用`root`权限运行某个命令 |
| `cmd-09` | `chmod` | 修改目标文件/文件夹的权限 |
2. SSH远程连接到VPS上PuTTY 4. WinSCP 左边的目录就是本地电脑上的文件夹和文件,请定位到密钥所在的文件夹
3. 修改 `authorized_keys` 文件权限为 `600` (仅所有者可读可写) 5. WinSCP 右边的目录则是 VPS 服务器上的文件夹和文件,默认就在 `/home/vpsadmin/` 文件夹,此时在请点击右下角 `X hidden` 来显示隐藏文件
``` <img src="./ch04-img12-winscp-locations.png" alt="本地和远程文件夹"/>
$ chmod 600 ~/.ssh/authorized_keys
```
4. 修改 SSH 配置。这个我们已经用了很多次,但现在我们已经从无所不能的`root`变成了普通用户`vpsadmin`此时的我们是没有权限直接编辑SSH配置的。这时候就需要使用`sudo`命令了:
```
$ sudo nano /etc/ssh/sshd_config
```
5. 找到(`ctrl+w`) `PasswordAuthentication` 改成 `no`
6. 找到(`ctrl+w`) `PubkeyAuthentication` 改成 `yes`,然后保存(`ctrl+o`)退出(`ctrl+x`)
7. 重启SSH服务。啰嗦君别忘了现在需要使用`sudo`来获得权限)
```
$ sudo systemctl restart ssh
```
8. 完整流程如下:
<img src="./ch04-img17-rsa-login-full.gif" alt="SSH开启密钥验证并禁用密码验证"/> 6. 在右边VPS 中)点击右键并新建文件夹,起名`.ssh` (注意有一个`.`
<img src="./ch04-img13-winscp-newfolder-key.png" alt="在VPS中建立放置公钥的文件夹"/>
4. VPS端已经设置好了公钥现在要给PuTTY指定私钥位置供登录时使用啰嗦君别忘了保存Session 7. 将【公钥】`authorized_keys`上传到`.ssh`文件夹内
<img src="./ch04-img14-winscp-upload-key.png" alt="上传authorized_keys"/>
<img src="./ch04-img18-putty-privatekey-location.png" alt="PuTTY指定私钥位置"/> 8. 在上传时,将【公钥】从 `authorized_keys.txt` 改名为 `authorized_keys`(去掉`.txt`这个后缀名)
<img src="./ch04-img15-winscp-rename-key.png" alt="确保没有任何后缀"/>
5. 至此【密钥登录】已成功开启、【密码验证】已成功关闭、并且还给PuTTY保存了默认的登录用户名和私钥。未来使用PuTTY登录时载入`VPS-SERVER`配置后,点击`Open`就可以一键登录了。
如果你给私钥设置了密码保护,登录时当然还需要输入这个密码才能使用密钥,如下图: 9. 完整流程演示如下:
<img src="./ch04-img16-winscp-full.gif" alt="WinSCP操作完整演示"/>
<img src="./ch04-img19-putty-privatekey-passphrase.png" alt="输入私钥密码"/> 3. 在 VPS 端设置 SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:|
| `cmd-08` | `sudo` | 用`root`权限运行某个命令 |
| `cmd-09` | `chmod` | 修改目标文件/文件夹的权限 |
2. SSH 远程连接到 VPS 上PuTTY
3. 修改 `authorized_keys` 文件权限为 `600` (仅所有者可读可写)
```
$ chmod 600 ~/.ssh/authorized_keys
```
4. 修改 SSH 配置。这个我们已经用了很多次,但现在我们已经从无所不能的`root`变成了普通用户`vpsadmin`,此时的我们是没有权限直接编辑 SSH 配置的。这时候就需要使用`sudo`命令了:
```
$ sudo nano /etc/ssh/sshd_config
```
5. 找到(`ctrl+w`) `PasswordAuthentication` 改成 `no`
6. 找到(`ctrl+w`) `PubkeyAuthentication` 改成 `yes`,然后保存(`ctrl+o`)退出(`ctrl+x`)
7. 重启 SSH 服务。(啰嗦君:别忘了现在需要使用`sudo`来获得权限)
```
$ sudo systemctl restart ssh
```
8. 完整流程如下:
<img src="./ch04-img17-rsa-login-full.gif" alt="SSH开启密钥验证并禁用密码验证"/>
4. VPS 端已经设置好了公钥,现在要给 PuTTY 指定私钥位置供登录时使用(啰嗦君:别忘了保存 Session
<img src="./ch04-img18-putty-privatekey-location.png" alt="PuTTY指定私钥位置"/>
5. 至此,【密钥登录】已成功开启、【密码验证】已成功关闭、并且还给 PuTTY 保存了默认的登录用户名和私钥。未来使用 PuTTY 登录时,载入`VPS-SERVER`配置后,点击`Open`就可以一键登录了。
如果你给私钥设置了密码保护,登录时当然还需要输入这个密码才能使用密钥,如下图:
<img src="./ch04-img19-putty-privatekey-passphrase.png" alt="输入私钥密码"/>
6. 别忘了给`WinSCP`也做对应的密钥设置,否则之后想要传输文件时就无法登录了: 6. 别忘了给`WinSCP`也做对应的密钥设置,否则之后想要传输文件时就无法登录了:
<img src="./ch04-img20-winscp-privatekey-location.png" alt="WinSCP指定私钥位置"/> <img src="./ch04-img20-winscp-privatekey-location.png" alt="WinSCP指定私钥位置"/>
::: warning 注意 ::: warning 注意
任何需要借助SSH进行登录的软件都需要密钥验证了软件过多无法逐一展示请根据你的需要自行设置好哦 任何需要借助 SSH 进行登录的软件都需要密钥验证了,软件过多,无法逐一展示,请根据你的需要自行设置好哦
::: :::
## 4.8 你的进度 ## 4.8 你的进度
到这里为止你的VPS已经完成了【端口】、【用户名】、【密码】这三要素的基本安全保障虽然远称不上固若金汤但一般的恶意脚本应该已经无法对你造成伤害了 到这里为止,你的 VPS 已经完成了【端口】、【用户名】、【密码】这三要素的基本安全保障,虽然远称不上固若金汤,但一般的恶意脚本应该已经无法对你造成伤害了!
现在我们终于有了一个安全的系统基础下一章我们就可以开始逐步安装配置Xray需要的基础设施了什么基础设施呢一个网页一张证书 现在我们终于有了一个安全的系统基础,下一章,我们就可以开始逐步安装配置 Xray 需要的基础设施了!(什么基础设施呢?一个网页,一张证书)
> ⬛⬛⬛⬛⬜⬜⬜⬜ 50% > ⬛⬛⬛⬛⬜⬜⬜⬜ 50%

View file

@ -1,4 +1,4 @@
# 【第5章】网站建设篇 # 【第 5 章】网站建设篇
## 5.1 为什么要做一个网站? ## 5.1 为什么要做一个网站?
@ -6,119 +6,123 @@
先回答第一个问题,建网站的原因有: 先回答第一个问题,建网站的原因有:
1. 申请合法的TLS证书非常重要 1. 申请合法的 TLS 证书(非常重要)
2. 提供合理的回落,防止主动探测攻击,提高安全性 2. 提供合理的回落,防止主动探测攻击,提高安全性
3. 建设一个伪装站(如博客、私人网盘、多媒体网站、游戏网站等),直接访问时有合理的前台,使流量使用看上去更合理。 3. 建设一个伪装站(如博客、私人网盘、多媒体网站、游戏网站等),直接访问时有合理的前台,使流量使用看上去更合理。
再回答第二个问题: 再回答第二个问题:
1. 本文作为演示仅仅使用了一个最简单的【单文件html页面 + Nginx】来搭建以此完成上面的目标所以【非常简单】
1. 本文作为演示,仅仅使用了一个最简单的【单文件 html 页面 + Nginx】来搭建以此完成上面的目标所以【非常简单】
2. 这个网站完全可以不仅仅是伪装,而是真的做大做强,这个复杂性就完全取决于你了 2. 这个网站完全可以不仅仅是伪装,而是真的做大做强,这个复杂性就完全取决于你了
3. 对于“伪装”和“网站运营”这个目标,需要的就是各不相同、秀出真我,需要的同学可以自行搜索学习。这个内容已经完全偏离了科学上网,本文就不深入解析了。 3. 对于“伪装”和“网站运营”这个目标,需要的就是各不相同、秀出真我,需要的同学可以自行搜索学习。这个内容已经完全偏离了科学上网,本文就不深入解析了。
## 5.2 登录VPS、安装运行Nginx ## 5.2 登录 VPS、安装运行 Nginx
1. 这里用到的,都是之前已经详解过的命令,所以就不重复讲解了。看不懂的同学可以看看前面的章节哦。 1. 这里用到的,都是之前已经详解过的命令,所以就不重复讲解了。看不懂的同学可以看看前面的章节哦。
```
$ sudo apt update && sudo apt install nginx
```
2. 完成后Nginx已经自动运行。此时打开Windows上的浏览器并输入 `http://100.200.300.400:80`若看到下图的界面就说明Nginx已经正常在运行了。 ```
$ sudo apt update && sudo apt install nginx
```
<img src="./ch05-img01-nginx-default-running.png" alt="Nginx默认界面"/> 2. 完成后Nginx 已经自动运行。此时打开 Windows 上的浏览器并输入 `http://100.200.300.400:80`,若看到下图的界面就说明 Nginx 已经正常在运行了。
<img src="./ch05-img01-nginx-default-running.png" alt="Nginx默认界面"/>
## 5.3 创建一个最简单的网页 ## 5.3 创建一个最简单的网页
1. 小小白白Linux基础命令 1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 | | 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
| `cmd-10` | `mkdir` | 新建文件夹 | | `cmd-10` | `mkdir` | 新建文件夹 |
| `cmd-11` | `systemctl reload` | 重新加载某个服务 | | `cmd-11` | `systemctl reload` | 重新加载某个服务 |
2. 小小白白Linux基础配置文件 2. 小小白白 Linux 基础配置文件:
| 编号 | 配置文件位置 | 文件说明 | | 编号 | 配置文件位置 | 文件说明 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
| `conf-02` | `/etc/nginx/nginx.conf` | Nginx程序设置 | | `conf-02` | `/etc/nginx/nginx.conf` | Nginx 程序设置 |
3. 创建一个网站专用的文件夹`/home/vpsadmin/www/webpage/`并建立网页文件`index.html` 3. 创建一个网站专用的文件夹`/home/vpsadmin/www/webpage/`并建立网页文件`index.html`
``` ```
$ mkdir -p ~/www/webpage/ && nano ~/www/webpage/index.html $ mkdir -p ~/www/webpage/ && nano ~/www/webpage/index.html
``` ```
::: warning 注意 ::: warning 注意
如果你用的不是 `vpsadmin` 这个用户名,请务必理解这条命令中 `“~”` 符号的意义(这关系到【第5步】你要写的内容): 如果你用的不是 `vpsadmin` 这个用户名,请务必理解这条命令中 `“~”` 符号的意义(这关系到【第 5 步】你要写的内容):
- 如果是 【非 `root` 用户】,`“~”` 就等价于 `/home/用户名` - 如果是 【非 `root` 用户】,`“~”` 就等价于 `/home/用户名`
- 如果是 【 `root` 用户】,`“~”` 就等价于 `/root` - 如果是 【 `root` 用户】,`“~”` 就等价于 `/root`
::: :::
4. 把下面的内容完整的复制进去,然后保存(`ctrl+o`)退出(`ctrl+x`) 4. 把下面的内容完整的复制进去,然后保存(`ctrl+o`)退出(`ctrl+x`)
```
<html>
<!-- Text between angle brackets is an HTML tag and is not displayed.
Most tags, such as the HTML and /HTML tags that surround the contents of
a page, come in pairs; some tags, like HR, for a horizontal rule, stand
alone. Comments, such as the text you're reading, are not displayed when
the Web page is shown. The information between the HEAD and /HEAD tags is
not displayed. The information between the BODY and /BODY tags is displayed.-->
<head>
<title>Enter a title, displayed at the top of the window.</title>
</head>
<!-- The information between the BODY and /BODY tags is displayed.-->
<body>
<h1>Enter the main heading, usually the same as the title.</h1>
<p>Be <b>bold</b> in stating your key points. Put them in a list: </p>
<ul>
<li>The first item in your list</li>
<li>The second item; <i>italicize</i> key words</li>
</ul>
<p>Improve your image by including an image. </p>
<p><img src="https://i.imgur.com/SEBww.jpg" alt="A Great HTML Resource"></p>
<p>Add a link to your favorite <a href="https://www.dummies.com/">Web site</a>.
Break up your page with a horizontal rule or two.
</p>
<hr>
<p>Finally, link to <a href="page2.html">another page</a> in your own Web site.</p>
<!-- And add a copyright notice.-->
<p>&#169; Wiley Publishing, 2011</p>
</body>
</html>
```
5. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的http访问定位到刚才建立的 `html` 页面上 ```
1. 修改 `nginx.conf` <html>
``` <!-- Text between angle brackets is an HTML tag and is not displayed.
$ sudo nano /etc/nginx/nginx.conf Most tags, such as the HTML and /HTML tags that surround the contents of
``` a page, come in pairs; some tags, like HR, for a horizontal rule, stand
alone. Comments, such as the text you're reading, are not displayed when
2. 将下面一段,添加在 `http{}` 内,然后保存(`ctrl+o`)退出(`ctrl+x`)。(记得将域名替换为之前准备好的、包含二级域名的真实域名) the Web page is shown. The information between the HEAD and /HEAD tags is
``` not displayed. The information between the BODY and /BODY tags is displayed.-->
server { <head>
listen 80; <title>Enter a title, displayed at the top of the window.</title>
server_name 二级域名.你的域名.com; </head>
root /home/vpsadmin/www/webpage; <!-- The information between the BODY and /BODY tags is displayed.-->
index index.html; <body>
} <h1>Enter the main heading, usually the same as the title.</h1>
``` <p>Be <b>bold</b> in stating your key points. Put them in a list: </p>
<ul>
<li>The first item in your list</li>
<li>The second item; <i>italicize</i> key words</li>
</ul>
<p>Improve your image by including an image. </p>
<p><img src="https://i.imgur.com/SEBww.jpg" alt="A Great HTML Resource"></p>
<p>Add a link to your favorite <a href="https://www.dummies.com/">Web site</a>.
Break up your page with a horizontal rule or two.
</p>
<hr>
<p>Finally, link to <a href="page2.html">another page</a> in your own Web site.</p>
<!-- And add a copyright notice.-->
<p>&#169; Wiley Publishing, 2011</p>
</body>
</html>
```
::: warning 特别注意! 5. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的 http 访问定位到刚才建立的 `html` 页面上
如我在【第3步】中的提示所说请务必确保 `/home/vpsadmin/www/webpage` 改成你的实际文件路径。
:::
3. 让 `nginx` 重新载入配置使其生效 1. 修改 `nginx.conf`
```
$ sudo systemctl reload nginx
```
4. 完整的设置流程如下: ```
$ sudo nano /etc/nginx/nginx.conf
```
<img src="./ch05-img02-nginx-conf-full.gif" alt="网页设置演示"/> 2. 将下面一段,添加在 `http{}` 内,然后保存(`ctrl+o`)退出(`ctrl+x`)。(记得将域名替换为之前准备好的、包含二级域名的真实域名)
5. 此时如果你访问 `http://二级域名.你的域名.com`,你看到这样的页面则说明成功: ```
server {
listen 80;
server_name 二级域名.你的域名.com;
root /home/vpsadmin/www/webpage;
index index.html;
}
```
<img src="./ch05-img03-nginx-http-running.png" alt="http网页成功"/> ::: warning 特别注意!
如我在【第 3 步】中的提示所说,请务必确保 `/home/vpsadmin/www/webpage` 改成你的实际文件路径。
:::
3. 让 `nginx` 重新载入配置使其生效
```
$ sudo systemctl reload nginx
```
4. 完整的设置流程如下:
<img src="./ch05-img02-nginx-conf-full.gif" alt="网页设置演示"/>
5. 此时如果你访问 `http://二级域名.你的域名.com`,你看到这样的页面则说明成功:
<img src="./ch05-img03-nginx-http-running.png" alt="http网页成功"/>
## 5.4 常见错误的说明 ## 5.4 常见错误的说明
@ -136,7 +140,7 @@
- 使用了【非 `root` 用户】,但仍然直接拷贝文中的命令不加修改。(这基本就等于抄答案时把同学的名字一起抄过去了) - 使用了【非 `root` 用户】,但仍然直接拷贝文中的命令不加修改。(这基本就等于抄答案时把同学的名字一起抄过去了)
- 坚持使用【 `root` 用户】 - 坚持使用【 `root` 用户】
碰到错误的同学就回过头仔细看一下【5.3】中【第3步】和【第5-2步】的说明吧。 碰到错误的同学就回过头仔细看一下【5.3】中【第 3 步】和【第 5-2 步】的说明吧。
::: warning ::: warning
本文前期已经用了大量篇幅说明了使用【非 `root` 用户】对安全的重要性,全文也是基于此而写。所以,因使用【 `root` 用户】而导致的问题并不在本文的设计范围里。 本文前期已经用了大量篇幅说明了使用【非 `root` 用户】对安全的重要性,全文也是基于此而写。所以,因使用【 `root` 用户】而导致的问题并不在本文的设计范围里。
@ -144,10 +148,8 @@
但我相信,坚持使用【 `root` 用户】的同学应该是有主见、动手能力强、或者有一定 Linux 基础的同学。问题的症结我已经全部说明了,我相信你一定可以自行解决。 但我相信,坚持使用【 `root` 用户】的同学应该是有主见、动手能力强、或者有一定 Linux 基础的同学。问题的症结我已经全部说明了,我相信你一定可以自行解决。
::: :::
## 5.5 你的进度 ## 5.5 你的进度
至此Xray的第一个基础设施【网页】已经就位我们马上就进入第二个基础设施【证书】吧 至此Xray 的第一个基础设施【网页】已经就位,我们马上就进入第二个基础设施【证书】吧!
> ⬛⬛⬛⬛⬛⬜⬜⬜ 62.5% > ⬛⬛⬛⬛⬛⬜⬜⬜ 62.5%

View file

@ -1,8 +1,8 @@
# 【第6章】证书管理篇 # 【第 6 章】证书管理篇
## 6.1 申请TLS证书 ## 6.1 申请 TLS 证书
接下来我们要做的是为我们的域名申请一个真实的TLS证书使网站具备标准TLS加密的能力及HTTPS访问的能力。这就是Xray等现阶段安全代理工具确保流量充分加密最重要的工具。 接下来我们要做的,是为我们的域名申请一个真实的 TLS 证书,使网站具备标准 TLS 加密的能力及 HTTPS 访问的能力。这就是 Xray 等现阶段安全代理工具确保流量充分加密最重要的工具。
::: warning 注意 ::: warning 注意
请不要轻易使用自签证书。它并没有让操作简单太多,但增加了无谓的风险(如中间人攻击)。 请不要轻易使用自签证书。它并没有让操作简单太多,但增加了无谓的风险(如中间人攻击)。
@ -10,186 +10,188 @@
这里我会使用一个叫做 [`acme.sh`](https://github.com/acmesh-official/acme.sh) 的证书管理工具,它简单、轻量、高效,并可完成证书自动更新。 这里我会使用一个叫做 [`acme.sh`](https://github.com/acmesh-official/acme.sh) 的证书管理工具,它简单、轻量、高效,并可完成证书自动更新。
另外我相信现在你已经逐渐熟悉了Linux的基础操作所以已经多次出现的命令从本章开始不再重复截图、只做简单的描述。如果实在想不起来怎么用的话就稍微复习一下前面的章节吧。 另外,我相信,现在你已经逐渐熟悉了 Linux 的基础操作,所以已经多次出现的命令从本章开始不再重复截图、只做简单的描述。如果实在想不起来怎么用的话,就稍微复习一下前面的章节吧。
## 6.2 安装 `acme.sh` ## 6.2 安装 `acme.sh`
1. 小小白白Linux基础命令 1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 | | 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:| |:--:|:--:|:--:|
| `cmd-12` | `wget` | 访问(或下载)某个网页文件 | | `cmd-12` | `wget` | 访问(或下载)某个网页文件 |
| `cmd-13` | `acme.sh` | acme.sh证书管理相关的命令 | | `cmd-13` | `acme.sh` | acme.sh 证书管理相关的命令 |
2. 运行安装脚本 2. 运行安装脚本
```
$ wget -O - https://get.acme.sh | sh ```
``` $ wget -O - https://get.acme.sh | sh
```
3. 让 `acme.sh` 命令生效 3. 让 `acme.sh` 命令生效
```
$ . .bashrc ```
``` $ . .bashrc
```
4. 开启 `acme.sh` 的自动升级 4. 开启 `acme.sh` 的自动升级
```
$ acme.sh --upgrade --auto-upgrade ```
``` $ acme.sh --upgrade --auto-upgrade
```
5. 到这一步的完整流程如下图: 5. 到这一步的完整流程如下图:
<img src="./ch06-img01-acme-install.gif" alt="acme.sh安装演示"/> <img src="./ch06-img01-acme-install.gif" alt="acme.sh安装演示"/>
## 6.3 测试证书申请 ## 6.3 测试证书申请
在正式申请证书之前,我们先用测试命令(`--issue --test`)来验证是否可以成功申请,这样可以避免在本地配置有误时,反复申请证书失败,超过 Let's Encrypt 的频率上限(比如,每小时、每个域名、每个用户失败最多5次),导致后面的步骤无法进行。 在正式申请证书之前,我们先用测试命令(`--issue --test`)来验证是否可以成功申请,这样可以避免在本地配置有误时,反复申请证书失败,超过 Let's Encrypt 的频率上限(比如,每小时、每个域名、每个用户失败最多 5 次),导致后面的步骤无法进行。
1. 测试证书申请的命令如下(本文均以 `ECC` 证书为例,因为时至今日,实在没什么理由不用它): 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. 你最终应该看到类似这样的提示: 2. 你最终应该看到类似这样的提示:
``` log
[Wed 30 Dec 2022 04:25:12 AM EST] Using ACME_DIRECTORY: https://acme-staging-v02.api.letsencrypt.org/directory ```log
[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:12 AM EST] Using ACME_DIRECTORY: 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] Using CA: https://acme-staging-v02.api.letsencrypt.org/directory
[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] Create account key ok.
[Wed 30 Dec 2022 04:25:13 AM EST] Registered [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] ACCOUNT_THUMBPRINT='CU6qmPKuRqhyTAIrF4swosR375194z_1ddUlWef8xDc' [Wed 30 Dec 2022 04:25:13 AM EST] Registered
[Wed 30 Dec 2022 04:25:13 AM EST] Creating domain key [Wed 30 Dec 2022 04:25:13 AM EST] ACCOUNT_THUMBPRINT='CU6qmPKuRqhyTAIrF4swosR375194z_1ddUlWef8xDc'
[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] Creating domain key
[Wed 30 Dec 2022 04:25:13 AM EST] Single domain='二级域名.你的域名.com' [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] Getting domain auth token for each domain [Wed 30 Dec 2022 04:25:13 AM EST] Single domain='二级域名.你的域名.com'
[Wed 30 Dec 2022 04:25:14 AM EST] Getting webroot for 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] Verifying: 二级域名.你的域名.com [Wed 30 Dec 2022 04:25:14 AM EST] Getting webroot for domain='二级域名.你的域名.com'
[Wed 30 Dec 2022 04:25:23 AM EST] Pending [Wed 30 Dec 2022 04:25:14 AM EST] Verifying: 二级域名.你的域名.com
[Wed 30 Dec 2022 04:25:25 AM EST] Success [Wed 30 Dec 2022 04:25:23 AM EST] Pending
[Wed 30 Dec 2022 04:25:25 AM EST] Verify finished, start to sign. [Wed 30 Dec 2022 04:25:25 AM EST] Success
[Wed 30 Dec 2022 04:25:25 AM EST] Lets finalize the order. [Wed 30 Dec 2022 04:25:25 AM EST] Verify finished, start to sign.
[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] Lets finalize the order.
[Wed 30 Dec 2022 04:25:25 AM EST] Downloading cert. [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] Le_LinkCert='https://acme-staging-v02.api.letsencrypt.org/acme/cert/xujss5xt8i38waubafz2xujss5xt8i38waubz2' [Wed 30 Dec 2022 04:25:25 AM EST] Downloading cert.
[Wed 30 Dec 2022 15:21:52 AM EST] Cert success. [Wed 30 Dec 2022 04:25:25 AM EST] Le_LinkCert='https://acme-staging-v02.api.letsencrypt.org/acme/cert/xujss5xt8i38waubafz2xujss5xt8i38waubz2'
--BEGIN CERTIFICAT-- [Wed 30 Dec 2022 15:21:52 AM EST] Cert success.
sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtN --BEGIN CERTIFICAT--
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
--END CERTIFICAT-- yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPIjw9AKH=
[Wed 30 Dec 2022 15:21:52 AM EST] Your cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer --END CERTIFICAT--
[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] Your cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer
[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] Your cert key is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
[Wed 30 Dec 2022 15:21:52 AM EST] And the full chain certs is there: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer [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` 你就理解成【测试服】吧! 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. 这一步确定成功之后,就可以申请正式的证书了。(测试证书不需要删除,它会自动被正式证书覆盖) 5. 这一步确定成功之后,就可以申请正式的证书了。(测试证书不需要删除,它会自动被正式证书覆盖)
## 6.4 正式证书申请 ## 6.4 正式证书申请
1. 申请正式证书的命令如下(即删掉 `--test` 参数,并在最后加入 `--force`参数): 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. 你最终应该看到跟上面很像的提示: 2. 你最终应该看到跟上面很像的提示:
``` log
vpsadmin@vps-server:~$ acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 ```log
[Wed 30 Dec 2022 15:22:51 AM EST] Using CA: https://acme-v02.api.letsencrypt.org/directory 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] Creating domain key [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] The domain key is here: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key [Wed 30 Dec 2022 15:22:51 AM EST] Creating domain key
[Wed 30 Dec 2022 15:22:51 AM EST] Single domain='二级域名.你的域名.com' [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] Getting domain auth token for each domain [Wed 30 Dec 2022 15:22:51 AM EST] Single domain='二级域名.你的域名.com'
[Wed 30 Dec 2022 15:22:51 AM EST] Getting webroot for 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] Verifying: 二级域名.你的域名.com [Wed 30 Dec 2022 15:22:51 AM EST] Getting webroot for domain='二级域名.你的域名.com'
[Wed 30 Dec 2022 15:22:51 AM EST] Pending [Wed 30 Dec 2022 15:22:51 AM EST] Verifying: 二级域名.你的域名.com
[Wed 30 Dec 2022 15:22:51 AM EST] Success [Wed 30 Dec 2022 15:22:51 AM EST] Pending
[Wed 30 Dec 2022 15:22:51 AM EST] Verify finished, start to sign. [Wed 30 Dec 2022 15:22:51 AM EST] Success
[Wed 30 Dec 2022 15:22:51 AM EST] Lets finalize the order. [Wed 30 Dec 2022 15:22:51 AM EST] Verify finished, start to sign.
[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] Lets finalize the order.
[Wed 30 Dec 2022 15:22:51 AM EST] Downloading cert. [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] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/vsxvk0oldnuobe51ayxz4dms62sk2dwmw9zhuw' [Wed 30 Dec 2022 15:22:51 AM EST] Downloading cert.
[Wed 30 Dec 2022 15:22:51 AM EST] Cert success. [Wed 30 Dec 2022 15:22:51 AM EST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/vsxvk0oldnuobe51ayxz4dms62sk2dwmw9zhuw'
--BEGIN CERTIFICAT-- [Wed 30 Dec 2022 15:22:51 AM EST] Cert success.
sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtN --BEGIN CERTIFICAT--
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
yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPM= x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIp
--END CERTIFICAT-- yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPM=
[Wed 30 Dec 2022 15:22:52 AM EST] Your cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer --END CERTIFICAT--
[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] Your cert is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer
[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] Your cert key is in /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
[Wed 30 Dec 2022 15:22:52 AM EST] And the full chain certs is there: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer [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`,自然就是【正式服】了! 3. 仔细观察,你会发现这次给你发证书的域名是 `https://acme-v02.api.letsencrypt.org`,少了 `staging`,自然就是【正式服】了!
## 6.5 你的进度 ## 6.5 你的进度
至此Xray所需要的两个基础设施终于全部就位千呼万唤始出来的Xray马上就要揭开面纱我们终于要进入最激动人心章节啦 至此Xray 所需要的两个基础设施终于全部就位!千呼万唤始出来的 Xray 马上就要揭开面纱,我们终于要进入最激动人心章节啦!
> ⬛⬛⬛⬛⬛⬛⬜⬜ 75%
> ⬛⬛⬛⬛⬛⬛⬜⬜ 75%

View file

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

View file

@ -1,6 +1,6 @@
# 【第8章】Xray客户端篇 # 【第 8 章】Xray 客户端篇
## 8.1 Xray的工作原理简述 ## 8.1 Xray 的工作原理简述
要正确的配置和使用`Xray`,就需要正确的理解其工作原理,对于新人,可以先看看下面简化的示意图(省略了许多复杂的设置): 要正确的配置和使用`Xray`,就需要正确的理解其工作原理,对于新人,可以先看看下面简化的示意图(省略了许多复杂的设置):
@ -8,115 +8,118 @@
这其中的关键点是: 这其中的关键点是:
1. APP要主动或借助转发工具将数据【流入(`inbounds`)】`Xray` 客户端 1. APP 要主动或借助转发工具,将数据【流入(`inbounds`)】`Xray` 客户端
2. 流量进入客户端后,会被【客户端路由(`routing`)】按规则处理后,向不同方向【流出`(outbounds)``Xray` 客户端。比如: 2. 流量进入客户端后,会被【客户端路由(`routing`)】按规则处理后,向不同方向【流出`(outbounds)``Xray` 客户端。比如:
1. 国内流量直连(`direct` 1. 国内流量直连(`direct`
2. 国外流量转发VPS`proxy` 2. 国外流量转发 VPS`proxy`
3. 广告流量屏蔽(`block` 3. 广告流量屏蔽(`block`
3. 向VPS转发的国外流量会跨过防火墙【流入(`inbounds`)】 `Xray` 服务器端 3. 向 VPS 转发的国外流量,会跨过防火墙,【流入(`inbounds`)】 `Xray` 服务器端
4. 流量进入服务器端后,与客户端一样,会被【服务器端路由(`routing`)】按规则处理后,向不同方向【流出`(outbounds)`】: 4. 流量进入服务器端后,与客户端一样,会被【服务器端路由(`routing`)】按规则处理后,向不同方向【流出`(outbounds)`】:
1. 因为已经在防火墙之外,所以流量默认直连,你就可以访问到不存在网站们了(`direct` 1. 因为已经在防火墙之外,所以流量默认直连,你就可以访问到不存在网站们了(`direct`
2. 如果需要在不同的VPS之间做链式转发就可以继续配置转发规则`proxy` 2. 如果需要在不同的 VPS 之间做链式转发,就可以继续配置转发规则(`proxy`
3. 你可以在服务器端继续禁用各种你想禁用的流量如广告、BT下载等`block` 3. 你可以在服务器端继续禁用各种你想禁用的流量如广告、BT 下载等(`block`
:::warning 注意 :::warning 注意
**注意:** 请务必记得,`Xray` 的路由配置非常灵活,上面的说明只是无限可能性中的一种。 **注意:** 请务必记得,`Xray` 的路由配置非常灵活,上面的说明只是无限可能性中的一种。
借助 `geosite.dat``geoip.dat` 这两个文件可以很灵活的从【域名】和【IP】这两个角度、不留死角的控制流量流出的方向。这比曾经单一笼统的 `GFWList` 强大很多很多可以做到非常细致的微调比如可以指定Apple域名直连或转发、指定亚马逊域名代理或转发百度的域名屏蔽等等。。。 借助 `geosite.dat``geoip.dat` 这两个文件可以很灵活的从【域名】和【IP】这两个角度、不留死角的控制流量流出的方向。这比曾经单一笼统的 `GFWList` 强大很多很多,可以做到非常细致的微调:比如可以指定 Apple 域名直连或转发、指定亚马逊域名代理或转发,百度的域名屏蔽等等。。。)
现在,[《路由 (routing) 功能简析》](../../level-1/routing-lv1-part1) 已经上线,我建议对路由功能有兴趣的同学,先继续跟着本文完成客户端的基础配置,之后再去这里详细学习。 现在,[《路由 (routing) 功能简析》](../../level-1/routing-lv1-part1) 已经上线,我建议对路由功能有兴趣的同学,先继续跟着本文完成客户端的基础配置,之后再去这里详细学习。
::: :::
## 8.2 客户端与服务器端正确连接 ## 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` - 服务器【地址】: `a-name.yourdomain.com`
- 服务器【端口】: `443` - 服务器【端口】: `443`
- 连接的【协议】: `vless` - 连接的【协议】: `vless`
- 连接的【流控】: `xtls-rprx-direct` (direct模式适合全平台若是Linux/安卓用户,可改成 `xtls-rprx-splice` 性能全开) - 连接的【流控】: `xtls-rprx-direct` (direct 模式适合全平台,若是 Linux/安卓用户,可改成 `xtls-rprx-splice` 性能全开)
- 连接的【验证】: `uuiduuid-uuid-uuid-uuiduuiduuid` - 连接的【验证】: `uuiduuid-uuid-uuid-uuiduuiduuid`
- 连接的【安全】: `"allowInsecure": false` - 连接的【安全】: `"allowInsecure": false`
鉴于新人一般都会使用手机APP或者电脑的GUI客户端我就把常用的客户端罗列在下面。每个客户端都有自己独特的配置界面逐一截图展示并不现实所以请你务必仔细阅读这些客户端的说明、然后把上述要素填入合适的地方即可。 鉴于新人一般都会使用手机 APP 或者电脑的 GUI 客户端,我就把常用的客户端罗列在下面。每个客户端都有自己独特的配置界面,逐一截图展示并不现实,所以请你务必仔细阅读这些客户端的说明、然后把上述要素填入合适的地方即可。
:::warning 注意 :::warning 注意
许多工具其实是同时支持 `xray-core``v2fly-core` 的,但默认内置的不一定是哪个,所以别忘记检查一下是否是你想要的那个在工作哦! 许多工具其实是同时支持 `xray-core``v2fly-core` 的,但默认内置的不一定是哪个,所以别忘记检查一下是否是你想要的那个在工作哦!
::: :::
- **v2rayN - 适用于Windows平台** - **v2rayN - 适用于 Windows 平台**
- 请从它的[GitHub仓库Release页面](https://github.com/2dust/v2rayN/releases)获取最新版
- 请根据该客户端的说明进行设置
- **v2rayNG - 适用于Android平台** - 请从它的[GitHub 仓库 Release 页面](https://github.com/2dust/v2rayN/releases)获取最新版
- 请从它的[GitHub仓库Release页面](https://github.com/2dust/v2rayNG/releases)获取最新版 - 请根据该客户端的说明进行设置
- 请根据该客户端的说明进行设置
- **Shadowrocket - 适用于iOS, 基于苹果M芯片的macOS** - **v2rayNG - 适用于 Android 平台**
- 你需要注册一个【非中国区】的iCloud账户
- 你需要通过 App Store 搜索并购买
- 请根据该客户端的说明进行设置
- **Qv2ray - 跨平台图形界面适用于Linux, Windows, macOS** - 请从它的[GitHub 仓库 Release 页面](https://github.com/2dust/v2rayNG/releases)获取最新版
- 请从它的[GitHub仓库Release页面](https://github.com/Qv2ray/Qv2ray/releases)获取最新版(还可以从它的[GitHub自动构建仓库](https://github.com/Qv2ray/Qv2ray/actions)寻找更新的版本) - 请根据该客户端的说明进行设置
- 请从它的[项目主页](https://qv2ray.net/)学习文档
- 请根据该客户端的说明进行设置 - **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` 做客户端呢? 虽然到上面一步已经可以结束了,但是如果你是个好奇心强、记忆力好的的同学,一定会想起来我在上一章说过,你把`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` (自己常用平台下新建文件大家肯定都会,这就真不用啰嗦了) 2. 在合适的文件夹建立空白配置文件:`config.json` (自己常用平台下新建文件大家肯定都会,这就真不用啰嗦了)
3. 至于什么是“合适的文件夹”?这就取决于具体的平台了~ 3. 至于什么是“合适的文件夹”?这就取决于具体的平台了~
4. 填写客户端配置 4. 填写客户端配置
- 我就以 `8.1` 原理说明里展示的基本三类分流国内流量直连、国际流量转发VPS、广告流量屏蔽结合 `8.2` 的连接要素,写成一个配置文件 - 我就以 `8.1` 原理说明里展示的基本三类分流(国内流量直连、国际流量转发 VPS、广告流量屏蔽结合 `8.2` 的连接要素,写成一个配置文件
- 请将 `uuid` 替换成与你服务器一致的 `uuid` - 请将 `uuid` 替换成与你服务器一致的 `uuid`
- 请将 `address` 替换成你的真实域名 - 请将 `address` 替换成你的真实域名
- 请将 `serverName` 替换成你的真实域名 - 请将 `serverName` 替换成你的真实域名
- 各个配置模块的说明我都已经(很啰嗦的)放在对应的配置点上了 - 各个配置模块的说明我都已经(很啰嗦的)放在对应的配置点上了
``` ```
// REFERENCE: // REFERENCE:
// https://github.com/XTLS/Xray-examples // https://github.com/XTLS/Xray-examples
// https://xtls.github.io/config/ // https://xtls.github.io/config/
// 常用的config文件不论服务器端还是客户端都有5个部分。外加小小白解读 // 常用的config文件不论服务器端还是客户端都有5个部分。外加小小白解读
// ┌─ 1_log 日志设置 - 日志写什么,写哪里(出错时有据可查) // ┌─ 1_log 日志设置 - 日志写什么,写哪里(出错时有据可查)
// ├─ 2_dns DNS-设置 - DNS怎么查防DNS污染、防偷窥、避免国内外站匹配到国外服务器等 // ├─ 2_dns DNS-设置 - DNS怎么查防DNS污染、防偷窥、避免国内外站匹配到国外服务器等
// ├─ 3_routing 分流设置 - 流量怎么分类处理(是否过滤广告、是否国内外分流) // ├─ 3_routing 分流设置 - 流量怎么分类处理(是否过滤广告、是否国内外分流)
// ├─ 4_inbounds 入站设置 - 什么流量可以流入Xray // ├─ 4_inbounds 入站设置 - 什么流量可以流入Xray
// └─ 5_outbounds 出站设置 - 流出Xray的流量往哪里去 // └─ 5_outbounds 出站设置 - 流出Xray的流量往哪里去
{ {
// 1_日志设置 // 1_日志设置
// 注意本例中我默认注释掉了日志文件因为windows, macOS, Linux 需要写不同的路径,请自行配置 // 注意本例中我默认注释掉了日志文件因为windows, macOS, Linux 需要写不同的路径,请自行配置
"log": { "log": {
// "access": "/home/local/xray_log/access.log", // 访问记录 // "access": "/home/local/xray_log/access.log", // 访问记录
// "error": "/home/local/xray_log/error.log", // 错误记录 // "error": "/home/local/xray_log/error.log", // 错误记录
"loglevel": "warning" // 内容从少到多: "none", "error", "warning", "info", "debug" "loglevel": "warning" // 内容从少到多: "none", "error", "warning", "info", "debug"
}, },
// 2_DNS设置 // 2_DNS设置
"dns": { "dns": {
"servers": [ "servers": [
@ -148,7 +151,7 @@
"localhost" "localhost"
] ]
}, },
// 3_分流设置 // 3_分流设置
// 所谓分流,就是将符合否个条件的流量,用指定`tag`的出站协议去处理对应配置的5.x内容 // 所谓分流,就是将符合否个条件的流量,用指定`tag`的出站协议去处理对应配置的5.x内容
"routing": { "routing": {
@ -212,7 +215,7 @@
"port": 10801 // 这个是通过http协议做本地转发的端口 "port": 10801 // 这个是通过http协议做本地转发的端口
} }
], ],
// 5_出站设置 // 5_出站设置
"outbounds": [ "outbounds": [
// 5.1 默认转发VPS // 5.1 默认转发VPS
@ -256,44 +259,42 @@
"tag": "block", "tag": "block",
"protocol": "blackhole" "protocol": "blackhole"
} }
] ]
} }
``` ```
## 8.4 附加题 2在PC端手工运行 `xray-core` ## 8.4 附加题 2 PC 端手工运行 `xray-core`
写好了配置文件该,要怎么让 `xray-core` 运行起来呢?双击好像并没有反应啊? 写好了配置文件该,要怎么让 `xray-core` 运行起来呢?双击好像并没有反应啊?
首先,你要找到电脑上的【命令行界面】。 首先,你要找到电脑上的【命令行界面】。
1. Linux桌面、macOS系统的同学肯定已经比较熟悉了搜索 `Console` 或者 `Terminal` 就可以 1. Linux 桌面、macOS 系统的同学肯定已经比较熟悉了,搜索 `Console` 或者 `Terminal` 就可以
2. Windows就可以搜索使用 `Cmd` 或者 `Powershell` 等程序WSL的同学你坐下你的 `Console` 当然也可以) 2. Windows 就可以搜索使用 `Cmd` 或者 `Powershell` 等程序WSL 的同学你坐下,你的 `Console` 当然也可以)
其次,我们要做的事情是【让 `xray` 找到并读取配置文件 `config.json`,然后运行】,所以: 其次,我们要做的事情是【让 `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 说明 :::tip 说明
这里的 `-c` 就是指定配置文件路径的参数,告诉 `xray` 去后面的位置找配置文件 这里的 `-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 说明 :::tip 说明
每个系统都有系统路径变量,所以写 `Xray` 程序时不一定要写绝对路径。但是写了肯定没错,所以我就如此演示了。 每个系统都有系统路径变量,所以写 `Xray` 程序时不一定要写绝对路径。但是写了肯定没错,所以我就如此演示了。
::: :::
## 8.5 附加题 3在 PC 端开机自动运行 `xray-core`
## 8.5 附加题 3在PC端开机自动运行 `xray-core`
如果你真的尝试了手动运行 `xray-core`,你一定会发现这个方式还有点小问题: 如果你真的尝试了手动运行 `xray-core`,你一定会发现这个方式还有点小问题:
@ -302,34 +303,31 @@
我可以肯定的告诉你:**完全可以解决**。但是具体的解决方式,就当作课外作业留给大家吧!(友情提示,文档站的问答区有线索哦) 我可以肯定的告诉你:**完全可以解决**。但是具体的解决方式,就当作课外作业留给大家吧!(友情提示,文档站的问答区有线索哦)
## 8.6 圆满完成! ## 8.6 圆满完成!
我相信,有耐心看到这里的同学,都是兼具好奇心和行动力的学习派!我现在要郑重的恭喜你,因为到了这里,你已经完完整整的【**从第一条命令开始完成了VPS服务器部署并成功的在客户端配置使用Xray**】了!这毫无疑问是一个巨大的胜利! 我相信,有耐心看到这里的同学,都是兼具好奇心和行动力的学习派!我现在要郑重的恭喜你,因为到了这里,你已经完完整整的【**从第一条命令开始,完成了 VPS 服务器部署,并成功的在客户端配置使用 Xray**】了!这毫无疑问是一个巨大的胜利!
我相信,你现在一定对`Linux`不再恐惧,对`Xray`不再陌生了吧! 我相信,你现在一定对`Linux`不再恐惧,对`Xray`不再陌生了吧!
**至此,小小白白话文圆满结束!** **至此,小小白白话文圆满结束!**
> ⬛⬛⬛⬛⬛⬛⬛⬛ 100% > ⬛⬛⬛⬛⬛⬛⬛⬛ 100%
## 8.7 TO INFINITY AND BEYOND! ## 8.7 TO INFINITY AND BEYOND!
**但现在你看到的远远不是Xray的全貌。** **但现在你看到的,远远不是 Xray 的全貌。**
`Xray`是一个强大而丰富的网络工具集合,平台化的提供了众多模块,可以像瑞士军刀一样,通过灵活的配置组合解决各种不同的问题。而本文,仅仅蜻蜓点水的用了**最简单**、**最直观**的配置来做**基础演示**。 `Xray`是一个强大而丰富的网络工具集合,平台化的提供了众多模块,可以像瑞士军刀一样,通过灵活的配置组合解决各种不同的问题。而本文,仅仅蜻蜓点水的用了**最简单**、**最直观**的配置来做**基础演示**。
如果你觉得现在已经完全够用了,那就好好的享受它给你带来的信息自由。但如果你的好奇心依然不能停歇,那就去继续挖掘它无限的可能性吧! 如果你觉得现在已经完全够用了,那就好好的享受它给你带来的信息自由。但如果你的好奇心依然不能停歇,那就去继续挖掘它无限的可能性吧!
需要更多信息,可以到这里寻找: 需要更多信息,可以到这里寻找:
1. [xtls.github.io](https://xtls.github.io/) - 官方文档站 1. [xtls.github.io](https://xtls.github.io/) - 官方文档站
2. [官方Telegram群组](https://t.me/projectXray) - 活跃而友善的官方讨论社区 2. [官方 Telegram 群组](https://t.me/projectXray) - 活跃而友善的官方讨论社区
<img src="./ch08-img02-buzz.png" alt="TO INFINITY AND BEYOND!"/> <img src="./ch08-img02-buzz.png" alt="TO INFINITY AND BEYOND!"/>
:::tip 不算后记的后记 :::tip 不算后记的后记
希望我陪你走过的这一段小小的旅程,可以成为你网络生活中的一份小小助力。 希望我陪你走过的这一段小小的旅程,可以成为你网络生活中的一份小小助力。

View file

@ -1,50 +1,46 @@
# 【第9章】附录 # 【第 9 章】附录
## 1. 小小白白Linux基础命令索引 ## 1. 小小白白 Linux 基础命令索引
| 编号 | 命令名称 | 命令说明 | 出现篇章 | | 编号 | 命令名称 | 命令说明 | 出现篇章 |
|:--:|:--|:--|:--:| | :------: | :------------------ | :--------------------------- | :----------------------------------------: |
| `cmd-01` | `apt update` | 查询软件更新 | [《远程登录篇》](./ch03-ssh.md) | | `cmd-01` | `apt update` | 查询软件更新 | [《远程登录篇》](./ch03-ssh.md) |
| `cmd-02` | `apt upgrade` | 执行软件更新 | [《远程登录篇》](./ch03-ssh.md) | | `cmd-02` | `apt upgrade` | 执行软件更新 | [《远程登录篇》](./ch03-ssh.md) |
| `cmd-03` | `nano` | 文本编辑器 | [《安全防护篇》](./ch04-security.md) | | `cmd-03` | `nano` | 文本编辑器 | [《安全防护篇》](./ch04-security.md) |
| `cmd-04` | `systemctl restart` | 重启某个服务 | [《安全防护篇》](./ch04-security.md) | | `cmd-04` | `systemctl restart` | 重启某个服务 | [《安全防护篇》](./ch04-security.md) |
| `cmd-05` | `adduser` | 给系统新增用户 | [《安全防护篇》](./ch04-security.md) | | `cmd-05` | `adduser` | 给系统新增用户 | [《安全防护篇》](./ch04-security.md) |
| `cmd-06` | `apt install` | 安装某个软件 | [《安全防护篇》](./ch04-security.md) | | `cmd-06` | `apt install` | 安装某个软件 | [《安全防护篇》](./ch04-security.md) |
| `cmd-07` | `visudo` | 修改sudo权限设置专用编辑器 | [《安全防护篇》](./ch04-security.md) | | `cmd-07` | `visudo` | 修改 sudo 权限设置专用编辑器 | [《安全防护篇》](./ch04-security.md) |
| `cmd-08` | `sudo` | 用`root`权限运行某个命令 | [《安全防护篇》](./ch04-security.md) | | `cmd-08` | `sudo` | 用`root`权限运行某个命令 | [《安全防护篇》](./ch04-security.md) |
| `cmd-09` | `chmod` | 修改目标文件/文件夹的权限 | [《安全防护篇》](./ch04-security.md) | | `cmd-09` | `chmod` | 修改目标文件/文件夹的权限 | [《安全防护篇》](./ch04-security.md) |
| `cmd-10` | `mkdir` | 新建文件夹 | [《网站建设篇》](./ch05-webpage.md) | | `cmd-10` | `mkdir` | 新建文件夹 | [《网站建设篇》](./ch05-webpage.md) |
| `cmd-11` | `systemctl reload` | 重新加载某个服务 | [《网站建设篇》](./ch05-webpage.md) | | `cmd-11` | `systemctl reload` | 重新加载某个服务 | [《网站建设篇》](./ch05-webpage.md) |
| `cmd-12` | `wget` | 访问(或下载)某个网页文件 | [《证书管理篇》](./ch06-certificates.md) | | `cmd-12` | `wget` | 访问(或下载)某个网页文件 | [《证书管理篇》](./ch06-certificates.md) |
| `cmd-13` | `acme.sh` | acme.sh证书管理相关的命令 | [《证书管理篇》](./ch06-certificates.md) | | `cmd-13` | `acme.sh` | acme.sh 证书管理相关的命令 | [《证书管理篇》](./ch06-certificates.md) |
| `cmd-14` | `rm` | 删除命令 | [《Xray服务器篇》](./ch07-xray-server.md) | | `cmd-14` | `rm` | 删除命令 | [《Xray 服务器篇》](./ch07-xray-server.md) |
| `cmd-15` | `crontab -e` | 编辑当前用户的定时任务 | [《Xray服务器篇》](./ch07-xray-server.md) | | `cmd-15` | `crontab -e` | 编辑当前用户的定时任务 | [《Xray 服务器篇》](./ch07-xray-server.md) |
| `cmd-16` | `touch` | 建立空白文件 | [《Xray服务器篇》](./ch07-xray-server.md) | | `cmd-16` | `touch` | 建立空白文件 | [《Xray 服务器篇》](./ch07-xray-server.md) |
| `cmd-17` | `systemctl` | `systemd`基本服务管理命令 | [《Xray服务器篇》](./ch07-xray-server.md) | | `cmd-17` | `systemctl` | `systemd`基本服务管理命令 | [《Xray 服务器篇》](./ch07-xray-server.md) |
| `cmd-18` | `reboot` | 重启Linux系统 | [《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) |
| 编号 | 配置文件位置 | 文件说明 | 出现篇章 | ## 3. 小小白白 Xray 重要文件索引
|:--:|:--|:--|:--:|
| `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重要文件索引 | `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) |

View file

@ -1,18 +1,13 @@
# 入门技巧 # 入门技巧
**这个章节是入门级的Xray使用心得分享主要分享一些Xray常用功能模块的原理说明。** **这个章节是入门级的 Xray 使用心得分享,主要分享一些 Xray 常用功能模块的原理说明。**
[回落 (fallbacks) 功能简析](./fallbacks-lv1.md) [回落 (fallbacks) 功能简析](./fallbacks-lv1.md)
[路由 (routing) 功能简析(上)](./routing-lv1-part1.md) [路由 (routing) 功能简析(上)](./routing-lv1-part1.md)
[路由 (routing) 功能简析(下)](./routing-lv1-part2.md) [路由 (routing) 功能简析(下)](./routing-lv1-part2.md)
[Xray 的工作模式简析](./work.md)
[Xray的工作模式简析](./work.md)
[通过 SNI 回落功能实现伪装与按域名分流](./fallbacks-with-sni.md) [通过 SNI 回落功能实现伪装与按域名分流](./fallbacks-with-sni.md)

View file

@ -1,11 +1,10 @@
# 回落 (fallbacks) 功能简析 # 回落 (fallbacks) 功能简析
在使用Xray的过程中你一定无数次的听说了【回落】这个功能。本文就稍微说明一下这个功能的逻辑以及使用方式。 在使用 Xray 的过程中,你一定无数次的听说了【回落】这个功能。本文就稍微说明一下这个功能的逻辑以及使用方式。
## 1. 回顾《小小白白话文》中的回落 ## 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": [ "inbounds": [
@ -33,55 +32,54 @@
这一段配置用人话要怎么解释呢? 这一段配置用人话要怎么解释呢?
1. **`Xray` 的入站端口 `[inbound port]``443`** 1. **`Xray` 的入站端口 `[inbound port]``443`**
即由 `Xray` 负责监听 `443` 端口的 `HTTPS` 流量 即由 `Xray` 负责监听 `443` 端口的 `HTTPS` 流量
2. **`Xray` 的入站协议 `[inbound protocol]``vless`** 2. **`Xray` 的入站协议 `[inbound protocol]``vless`**
只有 `vless` 协议的流量才会流入 `Xray` 中做后续处理。
::: warning 只有 `vless` 协议的流量才会流入 `Xray` 中做后续处理。
**注:** `VLESS` 这个轻量协议开发的初衷就是给 `xray``v2fly` 等核心引入回落功能、并同时减少冗余校验/加密。(当然,到目前为止,`xray` 中的 `trojan` 协议也已完整支持回落功能。)
::: ::: warning
**注:** `VLESS` 这个轻量协议开发的初衷就是给 `xray``v2fly` 等核心引入回落功能、并同时减少冗余校验/加密。(当然,到目前为止,`xray` 中的 `trojan` 协议也已完整支持回落功能。)
:::
3. **回落目标端口 `[fallback dest]``8080`** 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` 端口的流量,由后续程序处理** 4. **回落给 `8080` 端口的流量,由后续程序处理**
小小白白话文中的示例,就是 `8080` 端口由 `Nginx` 处理,根据配置找到并展示小熊猫的网页。 小小白白话文中的示例,就是 `8080` 端口由 `Nginx` 处理,根据配置找到并展示小熊猫的网页。
5. **总结,小小白白话文示例中的最简单回落,完整数据路线如下:** 5. **总结,小小白白话文示例中的最简单回落,完整数据路线如下:**
``` mermaid ```mermaid
graph LR; graph LR;
W(外部 HTTP:80 请求) --> N80(HTTP:80) W(外部 HTTP:80 请求) --> N80(HTTP:80)
subgraph Nginx 外部监听 subgraph Nginx 外部监听
N80 -.- N301(301转写) -.- N443(HTTPS:443) N80 -.- N301(301转写) -.- N443(HTTPS:443)
end end
N443 --> X(Xray 监听 443) .- X1{入站判断} N443 --> X(Xray 监听 443) .- X1{入站判断}
X1 --> |接收 VLESS 流量| X2(Xray内部规则) X1 --> |接收 VLESS 流量| X2(Xray内部规则)
X2 --> O(Xray Outbounds 出站) X2 --> O(Xray Outbounds 出站)
X1 ==> |回落 非VLESS 流量| N8080(Nginx:8080) X1 ==> |回落 非VLESS 流量| N8080(Nginx:8080)
N8080:::nginxclass ==> H(index.html) N8080:::nginxclass ==> H(index.html)
H:::nginxclass H:::nginxclass
classDef nginxclass fill:#FFFFDE classDef nginxclass fill:#FFFFDE
```
```
## 2. 重新认识回落 (WHAT, HOW `v1`) ## 2. 重新认识回落 (WHAT, HOW `v1`)
@ -92,46 +90,42 @@
3. 回落的目标是某个 `端口` 3. 回落的目标是某个 `端口`
4. 被回落的流量由监听 `回落端口` 的后续程序接手 4. 被回落的流量由监听 `回落端口` 的后续程序接手
## 3. 为什么要回落 (WHY `v1`) ## 3. 为什么要回落 (WHY `v1`)
最初,是为了防御 **【主动探测】** (Active Probing) 最初,是为了防御 **【主动探测】** (Active Probing)
**主动探测:** 简单粗暴的理解,就是指外部通过发送特定的网络请求,并解读服务器的回应内容,来推测服务器端是否运行了 `xray`, `v2fly`, `shadowsocks` 等代理工具。一旦可以准确认定,则服务器可能受到干扰或阻断。 **主动探测:** 简单粗暴的理解,就是指外部通过发送特定的网络请求,并解读服务器的回应内容,来推测服务器端是否运行了 `xray`, `v2fly`, `shadowsocks` 等代理工具。一旦可以准确认定,则服务器可能受到干扰或阻断。
之所以可以根据服务器回应内容进行解读,就是因为一次完整的数据请求,其实有很多数据交换的步骤,每一个步骤,都会产生一些软件特征。用大白话说就是: 之所以可以根据服务器回应内容进行解读,就是因为一次完整的数据请求,其实有很多数据交换的步骤,每一个步骤,都会产生一些软件特征。用大白话说就是:
- 正常的网站的回应,一定【会有】类似 `Nginx`, `Apache`, `MySQL` 的Web服务、数据库等工具的特征 - 正常的网站的回应,一定【会有】类似 `Nginx`, `Apache`, `MySQL` Web 服务、数据库等工具的特征
- 正常的网站的回应,一定【不会有】类似 `xray`, `v2fly`, `shadowsocks` 等代理工具的特征 - 正常的网站的回应,一定【不会有】类似 `xray`, `v2fly`, `shadowsocks` 等代理工具的特征
于是,当我们给 `Xray` 提供了【回落】功能后(如上例,回落给 `Nginx`),面对任何用来探测的请求,产生的结果是: 于是,当我们给 `Xray` 提供了【回落】功能后(如上例,回落给 `Nginx`),面对任何用来探测的请求,产生的结果是:
- 探测流量无法掌握你的 `VLESS` 要素,故都会被回落至 `Nginx` - 探测流量无法掌握你的 `VLESS` 要素,故都会被回落至 `Nginx`
- 探测流量全都回落进入 `Nginx` 故VPS服务器的回应一定【会有】 `Nginx` 的特征 - 探测流量全都回落进入 `Nginx` ,故 VPS 服务器的回应一定【会有】 `Nginx` 的特征
- 因为 `Xray` 本身不对探测流量做任何回应 所以VPS的回应一定【不会有】 `Xray` 的特征 - 因为 `Xray` 本身不对探测流量做任何回应 ,所以 VPS 的回应一定【不会有】 `Xray` 的特征
至此,【回落】功能就从数据交互逻辑上解决了服务器被 **【主动探测】** 的安全隐患。 至此,【回落】功能就从数据交互逻辑上解决了服务器被 **【主动探测】** 的安全隐患。
## 4. 重新认识【回落の完全体】 (WHAT, WHY, HOW `v2`) ## 4. 重新认识【回落の完全体】 (WHAT, WHY, HOW `v2`)
为什么又要再次认识回落呢? 因为,上面仅仅说清楚了基于“协议”的、抵抗【主动探测】的初版回落。 为什么又要再次认识回落呢? 因为,上面仅仅说清楚了基于“协议”的、抵抗【主动探测】的初版回落。
在 [rprx](https://github.com/rprx) 不断开发迭代 `VLESS` 协议及 `fallback` 功能的过程种,逐渐发现,回落完全可以更加灵活强大,只要在保证抵抗【主动探测】的前提下,充分利用数据首包中的信息,其实可以做到多元素、多层次的回落。(如 `path`, `alpn` 等) 在 [rprx](https://github.com/rprx) 不断开发迭代 `VLESS` 协议及 `fallback` 功能的过程种,逐渐发现,回落完全可以更加灵活强大,只要在保证抵抗【主动探测】的前提下,充分利用数据首包中的信息,其实可以做到多元素、多层次的回落。(如 `path`, `alpn` 等)
基于这个开发理念,【回落】功能才逐渐成长为现在的完全体,即完成了 `纯伪装 --> ws分流 --> 多协议多特征分流` 的进化。最终版甚至完全替代了以前要用Web服务器、其他工具才能完成的分流的功能。且由于上述的【回落/分流】处理都在首包判断阶段以毫秒级的速度完成、不涉及任何数据操作,所以几乎没有任何过程损耗。 基于这个开发理念,【回落】功能才逐渐成长为现在的完全体,即完成了 `纯伪装 --> ws分流 --> 多协议多特征分流` 的进化。最终版甚至完全替代了以前要用 Web 服务器、其他工具才能完成的分流的功能。且由于上述的【回落/分流】处理都在首包判断阶段以毫秒级的速度完成、不涉及任何数据操作,所以几乎没有任何过程损耗。
**因此,现在 `Xray` 中【完整体的回落功能】,同时具备下述属性:** **因此,现在 `Xray` 中【完整体的回落功能】,同时具备下述属性:**
- **安全:** 充分抵御主动探测攻击 - **安全:** 充分抵御主动探测攻击
- **高效:** 几乎毫无性能损失 - **高效:** 几乎毫无性能损失
- **灵活:** 数据灵活分流、常用端口复用如443 - **灵活:** 数据灵活分流、常用端口复用(如 443
::: tip 啰嗦君 ::: tip 啰嗦君
这样多轮介绍虽然略显繁琐,但只有这样层层深入展开,才能充分的说明【回落の完全体】独有的强大! 这样多轮介绍虽然略显繁琐,但只有这样层层深入展开,才能充分的说明【回落の完全体】独有的强大!
::: :::
## 5. 多层回落示例及解读 ## 5. 多层回落示例及解读
@ -196,180 +190,182 @@
这一段配置用人话要怎么解释呢? 这一段配置用人话要怎么解释呢?
1. **`Xray` 的入站端口 (`inbound port`) 是 `443`** 1. **`Xray` 的入站端口 (`inbound port`) 是 `443`**
即由 `Xray` 负责监听 `443` 端口的 `HTTPS` 流量,并使用 `certificates` 项下设定的 `TLS` 证书来进行验证 即由 `Xray` 负责监听 `443` 端口的 `HTTPS` 流量,并使用 `certificates` 项下设定的 `TLS` 证书来进行验证
2. **`Xray` 的入站协议 (`inbound protocol`) 是 `vless`** 2. **`Xray` 的入站协议 (`inbound protocol`) 是 `vless`**
`vless` 协议流量直接流入 `Xray` 中做后续处理
3. **非 `VLESS` 协议流量有4个不同的回落目标** `vless` 协议流量直接流入 `Xray` 中做后续处理
1. `path``websocket` 的流量,回落给端口 `1234` 后续处理 3. **非 `VLESS` 协议流量有 4 个不同的回落目标:**
2. `path``vmesstcp` 的流量,回落给端口 `2345` 后续处理
3. `path``vmessws` 的流量,回落给端口 `3456` 后续处理
4. 其它所有流量,回落给端口 `1310` 后续处理
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. **上述回落结构如下图所示:** 5. **上述回落结构如下图所示:**
``` mermaid ```mermaid
graph LR; graph LR;
W443(外部 HTTP:443 请求) --> X443(Xray-inbound: 443) .- X1{入站判断} W443(外部 HTTP:443 请求) --> X443(Xray-inbound: 443) .- X1{入站判断}
X1 --> |协议 = VLESS 的流量| X2(Xray内部规则) X1 --> |协议 = VLESS 的流量| X2(Xray内部规则)
X2 --> O(Xray Outbounds 出站) 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)
``` 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. **网页回落不见了!** 6. **网页回落不见了!**
没错,聪明的同学应该发现了,防御【主动探测】的 `nginx回落` 不见了!!!这是为什么呢?会不会不安全?别急,我们继续分析: 没错,聪明的同学应该发现了,防御【主动探测】的 `nginx回落` 不见了!!!这是为什么呢?会不会不安全?别急,我们继续分析:
### 5.2 后续监听处理的配置段摘抄如下: ### 5.2 后续监听处理的配置段摘抄如下:
1. 后续处理回落至 `1310` 端口的流量,按照下面的配置验证、处理: 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` 中做后续处理 "port": 1310,
- 所有非 `trojan` 协议的流量,转发至 `80` 端口,【主动探测】的防御,完成! "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` 2. 后续处理回落至 `1234` 端口的流量,仔细看!它其实是 `vless+ws`
```
{ ```
"port": 1234, {
"listen": "127.0.0.1", "port": 1234,
"protocol": "vless", "listen": "127.0.0.1",
"settings": { "protocol": "vless",
"clients": [ "settings": {
{ "clients": [
"id": "", // 填写你的 UUID {
"level": 0, "id": "", // 填写你的 UUID
"email": "love@example.com" "level": 0,
} "email": "love@example.com"
], }
"decryption": "none" ],
}, "decryption": "none"
"streamSettings": { },
"network": "ws", "streamSettings": {
"security": "none", "network": "ws",
"wsSettings": { "security": "none",
"acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行 "wsSettings": {
"path": "/websocket" // 必须换成自定义的 PATH需要和分流的一致 "acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行
} "path": "/websocket" // 必须换成自定义的 PATH需要和分流的一致
} }
}, }
``` },
```
3. 后续处理回落至 `2345` 端口的流量,仔细看!它其实是 `vmess直连` 3. 后续处理回落至 `2345` 端口的流量,仔细看!它其实是 `vmess直连`
```
{ ```
"port": 2345, {
"listen": "127.0.0.1", "port": 2345,
"protocol": "vmess", "listen": "127.0.0.1",
"settings": { "protocol": "vmess",
"clients": [ "settings": {
{ "clients": [
"id": "", // 填写你的 UUID {
"level": 0, "id": "", // 填写你的 UUID
"email": "love@example.com" "level": 0,
} "email": "love@example.com"
] }
}, ]
"streamSettings": { },
"network": "tcp", "streamSettings": {
"security": "none", "network": "tcp",
"tcpSettings": { "security": "none",
"acceptProxyProtocol": true, "tcpSettings": {
"header": { "acceptProxyProtocol": true,
"type": "http", "header": {
"request": { "type": "http",
"path": [ "request": {
"/vmesstcp" // 必须换成自定义的 PATH需要和分流的一致 "path": [
] "/vmesstcp" // 必须换成自定义的 PATH需要和分流的一致
} ]
} }
} }
} }
}, }
``` },
```
4. 后续处理回落至 `3456` 端口的流量,再仔细看!它其实是是 `vmess+ws(+cdn)` 4. 后续处理回落至 `3456` 端口的流量,再仔细看!它其实是是 `vmess+ws(+cdn)`
::: warning ::: warning
**说明:** 你没看错,这就是 v2fly 曾经的推荐组合之一,并可完整支持 `CDN`。现已加入完美回落套餐哦! **说明:** 你没看错,这就是 v2fly 曾经的推荐组合之一,并可完整支持 `CDN`。现已加入完美回落套餐哦!
::: :::
``` ```
{ {
"port": 3456, "port": 3456,
"listen": "127.0.0.1", "listen": "127.0.0.1",
"protocol": "vmess", "protocol": "vmess",
"settings": { "settings": {
"clients": [ "clients": [
{ {
"id": "", // 填写你的 UUID "id": "", // 填写你的 UUID
"level": 0, "level": 0,
"email": "love@example.com" "email": "love@example.com"
} }
] ]
}, },
"streamSettings": { "streamSettings": {
"network": "ws", "network": "ws",
"security": "none", "security": "none",
"wsSettings": { "wsSettings": {
"acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行 "acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行
"path": "/vmessws" // 必须换成自定义的 PATH需要和分流的一致 "path": "/vmessws" // 必须换成自定义的 PATH需要和分流的一致
} }
} }
} }
``` ```
5. 至此,我们就能够完整的画出模板的回落路线了: 5. 至此,我们就能够完整的画出模板的回落路线了:
``` mermaid ```mermaid
graph LR; graph LR;
W443(外部 HTTP:443 请求) --> X443(Xray-inbound: 443) .- X1{入站判断} W443(外部 HTTP:443 请求) --> X443(Xray-inbound: 443) .- X1{入站判断}
X1 --> |协议 = VLESS 的流量| X2(Xray内部规则) X1 --> |协议 = VLESS 的流量| X2(Xray内部规则)
X2 --> XO(Xray Outbounds 出站) X2 --> XO(Xray Outbounds 出站)
X1 --> |path = /websocket 的流量| X1234(Xray-inbound:1234) X1 --> |path = /websocket 的流量| X1234(Xray-inbound:1234)
X1 --> |path = /vmesstcp 的流量| X2345(Xray-inbound:2345) X1 --> |path = /vmesstcp 的流量| X2345(Xray-inbound:2345)
X1 --> |path = /vmessws 的流量| X3456(Xray-inbound:3456) X1 --> |path = /vmessws 的流量| X3456(Xray-inbound:3456)
@ -388,14 +384,12 @@
classDef nginxclass fill:#FFFFDE classDef nginxclass fill:#FFFFDE
``` ```
## 6. 结语 ## 6. 结语
至此,`Xray` 的【回落】功能就介绍完了。希望本文能够对你理解 `Xray` 的强大有所帮助。 至此,`Xray` 的【回落】功能就介绍完了。希望本文能够对你理解 `Xray` 的强大有所帮助。
## 7. 附加题 ## 7. 附加题
我再无耻的留一个附加题:本文详解的 [VLESS-TCP-XTLS-WHATEVER](https://github.com/XTLS/Xray-examples/blob/main/VLESS-TCP-XTLS-WHATEVER/) 模板?是否有可以优化的地方? 我再无耻的留一个附加题:本文详解的 [VLESS-TCP-XTLS-WHATEVER](https://github.com/XTLS/Xray-examples/blob/main/VLESS-TCP-XTLS-WHATEVER/) 模板?是否有可以优化的地方?
提示HTTP自动跳转HTTPS 提示HTTP 自动跳转 HTTPS

View file

@ -72,92 +72,89 @@ acme.sh --install-cert -d example.com --fullchain-file /etc/ssl/xray/cert.pem --
```json ```json
{ {
"log": { "log": {
"loglevel": "warning" "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": [ {
{ "listen": "127.0.0.1",
"port": 443, "port": 5000,
"protocol": "vless", "protocol": "vmess",
"settings": { "settings": {
"clients": [ "clients": [
{ {
"id": "UUID", "id": "UUID"
"flow": "xtls-rprx-direct" }
} ]
], },
"decryption": "none", "streamSettings": {
"fallbacks": [ "network": "ws",
{ "wsSettings": {
"name": "example.com", "acceptProxyProtocol": true,
"path": "/vmessws", "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"
}
}
} }
], }
"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 update
sudo apt install nginx sudo apt install nginx
``` ```
删除 `/etc/nginx/conf.d/default.conf` 并创建 `/etc/nginx/conf.d/fallbacks.conf`,内容如下: 删除 `/etc/nginx/conf.d/default.conf` 并创建 `/etc/nginx/conf.d/fallbacks.conf`,内容如下:
```nginx ```nginx
@ -297,7 +295,7 @@ sudo chmod +x /usr/bin/caddy
:5001 { :5001 {
root * /srv/http/default root * /srv/http/default
file_server file_server
log log
bind 127.0.0.1 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/) [^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) [^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)

View file

@ -1,6 +1,6 @@
# 路由 (routing) 功能简析(上) # 路由 (routing) 功能简析(上)
如果说Xray的【强大】主要体现在它极致的速度和广泛的兼容性。那么Xray的【灵活】则主要应该归功于它巧妙的【路由】功能。本文就稍微说明一下这个功能的逻辑以及使用方式。 如果说 Xray 的【强大】主要体现在它极致的速度和广泛的兼容性。那么 Xray 的【灵活】,则主要应该归功于它巧妙的【路由】功能。本文就稍微说明一下这个功能的逻辑以及使用方式。
## 1. 初识【路由】三兄弟 ## 1. 初识【路由】三兄弟
@ -16,21 +16,19 @@
::: warning 啰嗦君 ::: warning 啰嗦君
路由功能实在过于灵活,所以本文的示例,都是为了讲解对应的概念,实际使用时请根据自己的需求进行调整。 路由功能实在过于灵活,所以本文的示例,都是为了讲解对应的概念,实际使用时请根据自己的需求进行调整。
::: :::
## 2. 基本功: “兄弟一条心” ## 2. 基本功: “兄弟一条心”
下图的示例,就是在客户端的 `Xray` 入站接收APP数据、在路由100%转发给出站并从出站流向VPS。 下图的示例,就是在客户端的 `Xray` 入站接收 APP 数据、在路由 100%转发给出站,并从出站流向 VPS。
```mermaid
``` mermaid
graph LR; graph LR;
S(APP数据) .-> I[入站] S(APP数据) .-> I[入站]
subgraph Xray subgraph Xray
I --> R[路由] --> O[出站] I --> R[路由] --> O[出站]
end end
O .-> V(VPS) O .-> V(VPS)
@ -48,8 +46,8 @@
### 2.1 入站 ### 2.1 入站
::: tip ::: tip
**入站:** 就是流量如何流入 `Xray` **入站:** 就是流量如何流入 `Xray`
::: :::
下面的入站配置示例,用大白话说就是:数据按照 `socks` 协议,通过 `10808` 端口,从本机 `127.0.0.1` 流入`Xray`。同时,`Xray` 将这个入站用 `[tag]` 命名为 `inbound-10808` 下面的入站配置示例,用大白话说就是:数据按照 `socks` 协议,通过 `10808` 端口,从本机 `127.0.0.1` 流入`Xray`。同时,`Xray` 将这个入站用 `[tag]` 命名为 `inbound-10808`
@ -70,10 +68,10 @@
**2.2 出站** **2.2 出站**
::: tip ::: tip
**出站:** 就是流量如何流出 `Xray` **出站:** 就是流量如何流出 `Xray`
::: :::
下面的出站配置示例,用大白话说就是:数据按照 `VLESS` 协议,以 `tcp + xtls (direct)` 的方式、及其他相关设置把流量发送给对应的VPS。同时`Xray` 将这个出站用 `[tag]` 命名为 `proxy-out-vless` 下面的出站配置示例,用大白话说就是:数据按照 `VLESS` 协议,以 `tcp + xtls (direct)` 的方式、及其他相关设置,把流量发送给对应的 VPS。同时`Xray` 将这个出站用 `[tag]` 命名为 `proxy-out-vless`
``` ```
"outbounds": [ "outbounds": [
@ -107,13 +105,11 @@
] ]
``` ```
### 2.3 路由 ### 2.3 路由
::: tip ::: tip
**路由:** 就是把【入站】和【出站】之间的通道,用某种【条件】串联起来 **路由:** 就是把【入站】和【出站】之间的通道,用某种【条件】串联起来
::: :::
下面的路由配置示例,用大白话说就是:把所有通过 `[tag]="inbound-10808"` 入站流入 `Xray` 的流量,`100%` 全部流转导入 `[tag]="proxy-out-vless"` 的出站,没有任何分流或其他操作。 下面的路由配置示例,用大白话说就是:把所有通过 `[tag]="inbound-10808"` 入站流入 `Xray` 的流量,`100%` 全部流转导入 `[tag]="proxy-out-vless"` 的出站,没有任何分流或其他操作。
@ -132,10 +128,7 @@
} }
``` ```
至此,我们最开始设计的极简规则【客户端的 `Xray` 入站接收APP数据、在路由100%转发给出站并从出站流向VPS】已经完成。 至此,我们最开始设计的极简规则【客户端的 `Xray` 入站接收 APP 数据、在路由 100%转发给出站,并从出站流向 VPS】已经完成。
### 2.4 路由配置项解析之一:流量筛选的依据 ### 2.4 路由配置项解析之一:流量筛选的依据
@ -143,32 +136,28 @@
1. `"domainStrategy": "AsIs"` 1. `"domainStrategy": "AsIs"`
2. `“rules”` 2. `“rules”`
3. `"type": "field"` 3. `"type": "field"`
4. `"inboundTag": ["inbound-10808"]` 4. `"inboundTag": ["inbound-10808"]`
5. `"outboundTag": "proxy-out-vless"` 5. `"outboundTag": "proxy-out-vless"`
其中 `domainStrategy` 我们暂且按下不表,先简单说明后面几个: 其中 `domainStrategy` 我们暂且按下不表,先简单说明后面几个:
| 配置名称 | 配置值 | 配置说明 | | 配置名称 | 配置值 | 配置说明 |
|:--:|:--:|:--| | :-------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------- |
| `“rules”` | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | 它的内层就是【路由规则】的明细设置 | | `“rules”` | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | 它的内层就是【路由规则】的明细设置 |
| `"type"` | `"field"` | 该项暂时没有特别定义,但是不能省略,所以记得写上就好 | | `"type"` | `"field"` | 该项暂时没有特别定义,但是不能省略,所以记得写上就好 |
| `"inboundTag"` | `["inbound-10808"]` | 筛选流量的 **【依据】** 是【入站Tag】具体 **【条件】** 现在只有一个:【入站来源是 `inbound-10808`】 | | `"inboundTag"` | `["inbound-10808"]` | 筛选流量的 **【依据】** 是【入站 Tag】具体 **【条件】** 现在只有一个:【入站来源是 `inbound-10808` |
| `"outboundTag"` | `"proxy-out-vless"` | 当上面的筛选条件成立时(即入站`[tag]="inbound-10808"``Xray` 会将流量导入 `[tag]="proxy-out-vless"` 的出站 | | `"outboundTag"` | `"proxy-out-vless"` | 当上面的筛选条件成立时(即入站`[tag]="inbound-10808"``Xray` 会将流量导入 `[tag]="proxy-out-vless"` 的出站 |
本例中,我们只有一个入站,它的`"inboundTag" = "inbound-10808"` 。我们也只有一个出站,它的 `[tag]="proxy-out-vless"`。所以根据上面这个路由规则,从唯一入站端口 `10808` 流入`Xray`的流量,`100%` 符合筛选条件、会被路由模块选中,然后转发给唯一的出站。 本例中,我们只有一个入站,它的`"inboundTag" = "inbound-10808"` 。我们也只有一个出站,它的 `[tag]="proxy-out-vless"`。所以根据上面这个路由规则,从唯一入站端口 `10808` 流入`Xray`的流量,`100%` 符合筛选条件、会被路由模块选中,然后转发给唯一的出站。
至此,**入站**、**路由**、**出站** 三兄弟就已经可以携手工作了。当然现在这个100%转发的工作并没有什么特别的意义。那么接下来,我们就看看这种分工合作的机制可以带来什么好处。 至此,**入站**、**路由**、**出站** 三兄弟就已经可以携手工作了。当然,现在这个 100%转发的工作并没有什么特别的意义。那么接下来,我们就看看这种分工合作的机制可以带来什么好处。
## 3. 小试牛刀: “三分天下” 之 “域名分流”
## 3. 小试牛刀: “三分天下” 之 “域名分流”
> `[geosite.dat]` > `[geosite.dat]`
```mermaid
``` mermaid
graph LR; graph LR;
S(APP数据) .-> I[入站] S(APP数据) .-> I[入站]
@ -194,23 +183,20 @@
``` ```
这个配置逻辑,其实就是最简单、最常用的(《小小白白话文》中也在用的)路由配置三件套: 这个配置逻辑,其实就是最简单、最常用的(《小小白白话文》中也在用的)路由配置三件套:
1. 广告流量屏蔽 `[block]` 1. 广告流量屏蔽 `[block]`
2. 国内流量直连 `[direct]` 2. 国内流量直连 `[direct]`
3. 国外流量转发VPS `[proxy]` 3. 国外流量转发 VPS `[proxy]`
::: warning 注意 ::: warning 注意
小小白白话文中的直连配置是包括【国内域名】、【国内IP】、【本机内部IP】的。这里先讲解【国内域名】。 小小白白话文中的直连配置是包括【国内域名】、【国内 IP】、【本机内部 IP】的。这里先讲解【国内域名】。
::: :::
### 3.1 入站 ### 3.1 入站
保持上例的 `inbound-10808` 不变。 保持上例的 `inbound-10808` 不变。
### 3.2 出站 ### 3.2 出站
在上例的基础上,我们已经有了 `[proxy]` 的出站 `"proxy-out-vless"`,所以它保持不变。显而易见,我们需要加入两个新的出站方式:`[block]``[direct]`,如下: 在上例的基础上,我们已经有了 `[proxy]` 的出站 `"proxy-out-vless"`,所以它保持不变。显而易见,我们需要加入两个新的出站方式:`[block]``[direct]`,如下:
@ -233,11 +219,11 @@
``` ```
上面的配置用大白话翻译如下: 上面的配置用大白话翻译如下:
1. 上例中的 `[proxy-out-vless]` 出站配置保持不变 1. 上例中的 `[proxy-out-vless]` 出站配置保持不变
2. 加入 **`blackhole` 黑洞协议**,通过这个协议出站的流量,其实都被发送到了 `Xray` 内部的黑洞里,再也无法逃脱,于是效果就是屏蔽 `[block]` 2. 加入 **`blackhole` 黑洞协议**,通过这个协议出站的流量,其实都被发送到了 `Xray` 内部的黑洞里,再也无法逃脱,于是效果就是屏蔽 `[block]`
3. 加入 **`freedom` 自由协议**,通过这个协议出站的流量,是自由的离开`Xray`去寻找原定的服务器,就像从没有来过,于是效果就是直连 `[direct]` (我这里起名叫做 `[direct-out]` 是为了强调它是一个出站) 3. 加入 **`freedom` 自由协议**,通过这个协议出站的流量,是自由的离开`Xray`去寻找原定的服务器,就像从没有来过,于是效果就是直连 `[direct]` (我这里起名叫做 `[direct-out]` 是为了强调它是一个出站)
### 3.3 路由 ### 3.3 路由
接下来就是见证奇迹的时刻了,我们可以用【路由】的配置把这些连接起来! 接下来就是见证奇迹的时刻了,我们可以用【路由】的配置把这些连接起来!
@ -277,29 +263,24 @@
- `"domain": ["geosite:cn"]` - `"domain": ["geosite:cn"]`
- `"domain": ["geosite:geolocation-!cn"]` - `"domain": ["geosite:geolocation-!cn"]`
### 3.4 简析域名文件: `geosite.dat` ### 3.4 简析域名文件: `geosite.dat`
其实,聪明的你大概可以通过这些配置项的名称猜出来个大概: 其实,聪明的你大概可以通过这些配置项的名称猜出来个大概:
- `"domain"`:就是这次筛选流量的 **【依据】** 是 **【域名】** 而不再是入站tag - `"domain"`:就是这次筛选流量的 **【依据】** 是 **【域名】** (而不再是入站 tag
- `"geosite"`:就是 `Xray` 会去 `geosite.dat` 文件中寻找 **【符合条件的域名】** - `"geosite"`:就是 `Xray` 会去 `geosite.dat` 文件中寻找 **【符合条件的域名】**
- `"category-ads-all"`:就是该文件中的 **【所有广告类域名】** - `"category-ads-all"`:就是该文件中的 **【所有广告类域名】**
- `"cn"`:就是该文件中的 **【中国域名】** - `"cn"`:就是该文件中的 **【中国域名】**
- `"geolocation-!cn"`:就是该文件中的 **【非中国域名】** - `"geolocation-!cn"`:就是该文件中的 **【非中国域名】**
结合这些说明3.3 中的配置用大白话翻译就是: 结合这些说明3.3 中的配置用大白话翻译就是:
1. APP试图访问国外域名 `"domain": "geolocation-!cn"` 的流量,通过 `[proxy-out-vless]` 出站转发至VPS 1. APP 试图访问国外域名 `"domain": "geolocation-!cn"` 的流量,通过 `[proxy-out-vless]` 出站,转发至 VPS
2. APP试图访问国外域名广告域名 `"domain": "geosite:category-ads-all"` 的流量,通过 `[block]` 出站,转发至黑洞进行屏蔽 2. APP 试图访问国外域名广告域名 `"domain": "geosite:category-ads-all"` 的流量,通过 `[block]` 出站,转发至黑洞进行屏蔽
3. APP试图访问国内域名 `"domain": "geosite:cn"` 的流量,通过 `[direct-out]` 出站,自由离开完成直连 3. APP 试图访问国内域名 `"domain": "geosite:cn"` 的流量,通过 `[direct-out]` 出站,自由离开完成直连
这时,才让【路由功能】的好处稍微得到了一些展现。 这时,才让【路由功能】的好处稍微得到了一些展现。
### 3.5 所以 `geosite.dat` 到底是什么?不是有个 `GFWList` 吗? ### 3.5 所以 `geosite.dat` 到底是什么?不是有个 `GFWList` 吗?
你想,这世界上的域名何止千万,如果我们每写一个基于【域名】匹配的路由规则,都要自己收集、手动输入域名,那效率将会何其低下! 你想,这世界上的域名何止千万,如果我们每写一个基于【域名】匹配的路由规则,都要自己收集、手动输入域名,那效率将会何其低下!
@ -308,14 +289,14 @@
就如关羽需要他的青龙偃月刀,`geosite.dat` 文件便作为【路由功能】驱使的神兵利器横空出世了,它致力于为用户提供成熟完善的【域名分类表】。让用户可以简单的通过 `geosite:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则。 就如关羽需要他的青龙偃月刀,`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 ::: warning
**注意:** 现在,`geosite.dat` 文件其实有多种选择: **注意:** 现在,`geosite.dat` 文件其实有多种选择:
最初,从 `Victoria Raymond` 主力维护 `Project V` 项目时期,便提供了最初的配套项目:[`domain-list-community`](https://github.com/v2ray/domain-list-community),用来收集、沉淀、分类各种常用的域名类型; 最初,从 `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),提供了诸多不同的选择和分类逻辑; 同时,[@Loyalsoldier](Loyalsoldier) 维护了其个人修改增强的路由规则文件 [v2ray-rules-dat](https://github.com/Loyalsoldier/v2ray-rules-dat),提供了诸多不同的选择和分类逻辑;
@ -325,9 +306,7 @@
如果你发现有些你遇到的域名没有被合理分类,请向上面的项目们提出 `issue` 甚至提交 `Pull Request` 吧!社区列表社区维护,人人为我我为人人! 如果你发现有些你遇到的域名没有被合理分类,请向上面的项目们提出 `issue` 甚至提交 `Pull Request` 吧!社区列表社区维护,人人为我我为人人!
::: :::
### 3.6 军师锦囊藏奇兵:一条隐藏的路由规则 ### 3.6 军师锦囊藏奇兵:一条隐藏的路由规则
@ -335,19 +314,17 @@
::: warning 注意 ::: warning 注意
如果你认为【不符合条件当然就无法连接啦!】的话,你可要重新思考一下哦。因为只有指定了 `[block]` 规则,才会被导入到 `blackhole` 黑洞协议从而阻断连接 如果你认为【不符合条件当然就无法连接啦!】的话,你可要重新思考一下哦。因为只有指定了 `[block]` 规则,才会被导入到 `blackhole` 黑洞协议从而阻断连接
::: :::
事实上,`Xray` 为了避免路由规则不完全导致的规则混乱,已经贴心的提供了一条隐藏的路由规则:【**当入站流量不符合任何条件时,转发给第一个出站** 】 事实上,`Xray` 为了避免路由规则不完全导致的规则混乱,已经贴心的提供了一条隐藏的路由规则:【**当入站流量不符合任何条件时,转发给第一个出站** 】
这样,就不会有任何流量被漏掉了。所以,你一定要把你最信赖的心腹大将放在【第一条出站】,让它为你守城护池。 这样,就不会有任何流量被漏掉了。所以,你一定要把你最信赖的心腹大将放在【第一条出站】,让它为你守城护池。
### 3.7 再看“三分天下”的大地图 ### 3.7 再看“三分天下”的大地图
因为我们在前面的示例中把 `[proxy-out-vless]` 放在了出站的第一位,所以隐藏规则生效时,流量会通过 `VLESS` 协议被转发至远端的VPS。因此`Xray` 此时的完整工作逻辑如下: 因为我们在前面的示例中把 `[proxy-out-vless]` 放在了出站的第一位,所以隐藏规则生效时,流量会通过 `VLESS` 协议被转发至远端的 VPS。因此`Xray` 此时的完整工作逻辑如下:
``` mermaid ```mermaid
graph LR; graph LR;
S(APP数据) .-> I[入站] S(APP数据) .-> I[入站]
@ -375,10 +352,8 @@
``` ```
事实上,这就是传统所谓的 **【默认科学上网、国内网站白名单直连】** 的配置。 事实上,这就是传统所谓的 **【默认科学上网、国内网站白名单直连】** 的配置。
## 4. “三分天下” 之 “蜀魏争雄” ## 4. “三分天下” 之 “蜀魏争雄”
现在,你已经知道了隐藏的默认路由规则:【**当入站流量不符合任何条件时,转发给第一个出站** 】。这时候,你应该能看出来,究竟是【科学上网】为王,还是【直连】称霸,全看你的第一条出站是什么! 现在,你已经知道了隐藏的默认路由规则:【**当入站流量不符合任何条件时,转发给第一个出站** 】。这时候,你应该能看出来,究竟是【科学上网】为王,还是【直连】称霸,全看你的第一条出站是什么!
@ -406,7 +381,7 @@
此时,路由规则其实变成了: 此时,路由规则其实变成了:
``` mermaid ```mermaid
graph LR; graph LR;
S(APP数据) .-> I[入站] S(APP数据) .-> I[入站]
@ -435,8 +410,7 @@
这就是路由功能的灵活之处了,你可以自由的改变它的顺序来实现不同的设计。 这就是路由功能的灵活之处了,你可以自由的改变它的顺序来实现不同的设计。
至此,我们已经解释完了 **【如何利用 `geosite.dat` 文件,通过路由规则,根据【域名】来分流网络流量】。** 至此,我们已经解释完了 **【如何利用 `geosite.dat` 文件,通过路由规则,根据【域名】来分流网络流量】。**
## 5. 攻城略池 - 多种路由匹配条件 ## 5. 攻城略池 - 多种路由匹配条件

View file

@ -6,30 +6,29 @@
如前面所说,域名分流仅仅是【路由】功能的牛刀小试而已。下面就让我们来看看除了域名之外,还什么可以用做分流依据的东西吧! 如前面所说,域名分流仅仅是【路由】功能的牛刀小试而已。下面就让我们来看看除了域名之外,还什么可以用做分流依据的东西吧!
## 5. 攻城略池 - 多种路由匹配条件 ## 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` 里面有吗? 2. 如果我还有个 `direct.yourdomain.com` 的域名,我希望它无论如何都直连, `geosite.dat` 里面有吗?
3. 本机 `127.0.0.1` 的内部流量,是否正确直连了?(比如 `docker` 等) 3. 本机 `127.0.0.1` 的内部流量,是否正确直连了?(比如 `docker` 等)
4. 路由器、本地局域网 `192.168.*.*` 的流量,是否正确直连了?(比如路由器、群晖等) 4. 路由器、本地局域网 `192.168.*.*` 的流量,是否正确直连了?(比如路由器、群晖等)
5. 我的国内DNS查询`223.5.5.5`)是否正确直连了? 5. 我的国内 DNS 查询(如 `223.5.5.5`)是否正确直连了?
6. 我的国外DNS查询`1.1.1.1`)是否正确代理了? 6. 我的国外 DNS 查询(如 `1.1.1.1`)是否正确代理了?
7. 其他类似国内公共DNS一样没有域名、只有IP地址的国内网站是否正确直连了 7. 其他类似国内公共 DNS 一样没有域名、只有 IP 地址的国内网站,是否正确直连了?
8. 其他类似国外公共DNS一样没有域名、只有IP地址的国外网站是否正确代理了 8. 其他类似国外公共 DNS 一样没有域名、只有 IP 地址的国外网站,是否正确代理了?
9. BT下载的流量虽然来源是国外但如果通过VPS下载很可能导致违规使用被封这该如何强制直连 9. BT 下载的流量,虽然来源是国外,但如果通过 VPS 下载很可能导致违规使用被封,这该如何强制直连?
10. ...... 10. ......
我之所以说只用【域名分流】会漏洞百出,是因为 `geosite.dat` 文件内只包含了一部分常用的域名。换言之,仅仅依赖它,则会: 我之所以说只用【域名分流】会漏洞百出,是因为 `geosite.dat` 文件内只包含了一部分常用的域名。换言之,仅仅依赖它,则会:
- 无法匹配文件里没有的新域名 - 无法匹配文件里没有的新域名
- 无法匹配基于IP地址的规则 - 无法匹配基于 IP 地址的规则
- 无法匹配基于网络协议的规则 - 无法匹配基于网络协议的规则
::: warning 啰嗦君 ::: warning 啰嗦君
@ -37,12 +36,10 @@
- 当你的第一个出站是 `[direct-out]` 时:**需要直连的都正确了,但需要代理的则都错误** - 当你的第一个出站是 `[direct-out]` 时:**需要直连的都正确了,但需要代理的则都错误**
- 当你的第一个出站是 `[proxy-out-vless]` 时:**需要代理的都正确了,但需要直连的则都错误** - 当你的第一个出站是 `[proxy-out-vless]` 时:**需要代理的都正确了,但需要直连的则都错误**
::: :::
所以,我们需要一个办法,让我们鱼与熊掌兼得。这样的办法是否存在呢?**当然存在!** 我们需要的只是【域名】之外更多的【**分流判断依据**】而已。 所以,我们需要一个办法,让我们鱼与熊掌兼得。这样的办法是否存在呢?**当然存在!** 我们需要的只是【域名】之外更多的【**分流判断依据**】而已。
### 5.1 基于指定域名分流:`[domain], [full]` ### 5.1 基于指定域名分流:`[domain], [full]`
1. 如果需要匹配某个子域名,如 `a-name.yourdomain.com`,我们使用 `full: "a-name.yourdomain.com"` 1. 如果需要匹配某个子域名,如 `a-name.yourdomain.com`,我们使用 `full: "a-name.yourdomain.com"`
@ -85,18 +82,16 @@
} }
``` ```
### 5.2 基于 IP 文件分流:`geoip.dat`
`geosite.dat` 规则文件十分类似的,我们还有 `geoip.dat` 这个规则文件它致力于为用户提供成熟完善的【IP 分类表】。让用户可以简单的通过 `geoip:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则 。
### 5.2 基于IP文件分流`geoip.dat`
`geosite.dat` 规则文件十分类似的,我们还有 `geoip.dat` 这个规则文件它致力于为用户提供成熟完善的【IP分类表】。让用户可以简单的通过 `geoip:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则 。
1. 解决前面的 `[问题3], [问题4]`,我们使用 `geoip:private` 类别来指定 `[direct-out]` 1. 解决前面的 `[问题3], [问题4]`,我们使用 `geoip:private` 类别来指定 `[direct-out]`
2. 解决前面的 `[问题7]`,我们使用 `geoip:cn` 类别来指定 `[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": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
@ -121,17 +116,15 @@
} }
``` ```
### 5.3 基于指定 IP 地址分流
`geosite.dat` 规则文件十分类似的,我们还有 `geoip.dat` 这个规则文件,它是供【路由功能】驱使的**第二个神兵利器**它致力于为用户提供成熟完善的【IP 分类表】。让用户可以简单的通过 `geoip:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则 。
### 5.3 基于指定IP地址分流
`geosite.dat` 规则文件十分类似的,我们还有 `geoip.dat` 这个规则文件,它是供【路由功能】驱使的**第二个神兵利器**它致力于为用户提供成熟完善的【IP分类表】。让用户可以简单的通过 `geoip:xxx` 这种格式方便的调用任何子类,定制符合自身需求的路由规则 。
1. 解决前面的 `[问题5]`,我们使用 `ip: "223.5.5.5"` 来指定 `[direct-out]` 1. 解决前面的 `[问题5]`,我们使用 `ip: "223.5.5.5"` 来指定 `[direct-out]`
2. 解决前面的 `[问题6]`,我们使用 `ip: "1.1.1.1"` 来指定 `[proxy-out-vless]` 2. 解决前面的 `[问题6]`,我们使用 `ip: "1.1.1.1"` 来指定 `[proxy-out-vless]`
上述配置如下: 上述配置如下:
``` ```
"routing": { "routing": {
"domainStrategy": "AsIs", "domainStrategy": "AsIs",
@ -156,13 +149,11 @@
} }
``` ```
### 5.4 基于协议类型分流:`[protocol]` ### 5.4 基于协议类型分流:`[protocol]`
1. 解决前面的 `[问题9]`,我们使用 `"protocol": ["bittorrent"]` 类别来指定 `[direct-out]` 1. 解决前面的 `[问题9]`,我们使用 `"protocol": ["bittorrent"]` 类别来指定 `[direct-out]`
::: tip ::: tip
你需要打开入站代理中的 `sniffing` 才能使用此种方式分流。 你需要打开入站代理中的 `sniffing` 才能使用此种方式分流。
::: :::
@ -182,19 +173,19 @@
} }
``` ```
### 5.5 基于更多条件的分流 ### 5.5 基于更多条件的分流
到目前位置,我们仍然只讲了【路由功能】分流能力的冰山一角!因为它还支持很多其他的判断条件!我在此简单罗列如下: 到目前位置,我们仍然只讲了【路由功能】分流能力的冰山一角!因为它还支持很多其他的判断条件!我在此简单罗列如下:
本文已经讲过的: 本文已经讲过的:
- `inboundTag` - `inboundTag`
- `domain` - `domain`
- `ip` - `ip`
- `protocol` - `protocol`
本文尚未讲到的: 本文尚未讲到的:
- `port` - `port`
- `sourcePort` - `sourcePort`
- `network` - `network`
@ -204,9 +195,6 @@
但这些内容实在是过多,全部展开就远远不是 `level-1` 的内容了,所以,需要这些复杂条件的朋友,请仔细阅读 [《基础配置模块 - 路由》文档](../../config/base/routing/) 自学哦!有问题就去 TG 群里面问问吧! 但这些内容实在是过多,全部展开就远远不是 `level-1` 的内容了,所以,需要这些复杂条件的朋友,请仔细阅读 [《基础配置模块 - 路由》文档](../../config/base/routing/) 自学哦!有问题就去 TG 群里面问问吧!
## 6. “霸业初定”:路由规则整体回顾 ## 6. “霸业初定”:路由规则整体回顾
到现在为止,我们已经累积出了一套战略雄伟、战术精准的路由规则,为了避免混乱,现在就对它进行一次完整的整理和回顾。 到现在为止,我们已经累积出了一套战略雄伟、战术精准的路由规则,为了避免混乱,现在就对它进行一次完整的整理和回顾。
@ -215,8 +203,7 @@
路由生效的顺序是:【从上往下,依次判断】,所以我一般推荐的规则顺序是: 路由生效的顺序是:【从上往下,依次判断】,所以我一般推荐的规则顺序是:
`[1-block] --> [2-direct] --> [3-proxy] --> [4-first-outbound]` `[1-block] --> [2-direct] --> [3-proxy] --> [4-first-outbound]`
::: :::
``` ```
"routing": { "routing": {
@ -284,10 +271,9 @@
} }
``` ```
此时,路由规则其实变成了: 此时,路由规则其实变成了:
``` mermaid ```mermaid
graph LR; graph LR;
S(APP数据) .-> I[入站] S(APP数据) .-> I[入站]
@ -326,18 +312,14 @@
至于第一条出站是 `[direct-out]` 还是 `[proxy-out-vless]`,这就全看你的需求了。 至于第一条出站是 `[direct-out]` 还是 `[proxy-out-vless]`,这就全看你的需求了。
## 7. 路由配置常见错误 ## 7. 路由配置常见错误
请大家注意看,我上面每一条路由规则,都是一个独立的匹配依据,只有这样才能确保生效。而新人在自定义路由规则时常犯的一个错误就是:**在一条规则内同时匹配了多种不同的匹配依据,造成匹配无效。** 请大家注意看,我上面每一条路由规则,都是一个独立的匹配依据,只有这样才能确保生效。而新人在自定义路由规则时常犯的一个错误就是:**在一条规则内同时匹配了多种不同的匹配依据,造成匹配无效。**
比如,他希望实现的配置是: 比如,他希望实现的配置是:
1. 自己的 `direct.yourdomain.com` 直连 1. 自己的 `direct.yourdomain.com` 直连
2. 国内DNS查询`223.5.5.5`)直连 2. 国内 DNS 查询(如 `223.5.5.5`)直连
### 7.1 错误示范 ### 7.1 错误示范
@ -365,14 +347,12 @@
::: warning 注意 ::: warning 注意
**同一个规则之内,各个依据需要同时成立,才会匹配成功**,逻辑关系是 `和`,而不是 `或` **同一个规则之内,各个依据需要同时成立,才会匹配成功**,逻辑关系是 `和`,而不是 `或`
::: :::
换言之,这条规则的意思是:【当你访问的 ` 目标 = direct.yourdomain.com`, **并且** 同时还满足 ` 目标 = 223.5.5.5` 时,`Xray` 才会将流量转发给 `[direct-out]` 直连出站】 换言之,这条规则的意思是:【当你访问的 `目标 = direct.yourdomain.com`, **并且** 同时还满足 `目标 = 223.5.5.5` 时,`Xray` 才会将流量转发给 `[direct-out]` 直连出站】
很显然,一个目标不可能同时等于两个不同的值,所以这不但是一个永远不可能实现的无效规则,更与原本的目标风马牛不相及。 很显然,一个目标不可能同时等于两个不同的值,所以这不但是一个永远不可能实现的无效规则,更与原本的目标风马牛不相及。
### 7.2 正确示范 ### 7.2 正确示范
正确示范,自然就是将不同的匹配依据独立出来: 正确示范,自然就是将不同的匹配依据独立出来:
@ -399,17 +379,15 @@
} }
``` ```
其实第6点已经是我整理过的规则了原则就是【相同的匹配依据可以合并不同的匹配依据保持独立】。 其实,第 6 点已经是我整理过的规则了,原则就是【相同的匹配依据可以合并,不同的匹配依据保持独立】。
## 8. 明修栈道、暗渡陈仓 ## 8. 明修栈道、暗渡陈仓
> `[domain]` 转化 `[ip]` 的密道:`domainStrategy` > `[domain]` 转化 `[ip]` 的密道:`domainStrategy`
我们在 5.4 中提交了多种流量判断的【依据】,其中一种是域名 `[domain]`、一种是 `[IP]` 我们在 5.4 中提交了多种流量判断的【依据】,其中一种是域名 `[domain]`、一种是 `[IP]`
如果你初步了解过DNS的运作过程就会知道我们对一个域名 `[domain]` 发起访问请求时,其实需要先向 `DNS` 发起请求来解析域名 `[domain]` 对应的 `[IP]`,在得到 `[IP]` 后再向它发起实际请求。 如果你初步了解过 DNS 的运作过程,就会知道,我们对一个域名 `[domain]` 发起访问请求时,其实需要先向 `DNS` 发起请求来解析域名 `[domain]` 对应的 `[IP]`,在得到 `[IP]` 后再向它发起实际请求。
所以,面对入站的一次域名请求,`Xray` 其实有两次机会去判断它的类型。那么,究竟是否要用这两次机会呢?这就是由 `domainStrategy` 这个配置来决定的。它有三个选项: 所以,面对入站的一次域名请求,`Xray` 其实有两次机会去判断它的类型。那么,究竟是否要用这两次机会呢?这就是由 `domainStrategy` 这个配置来决定的。它有三个选项:
@ -419,8 +397,6 @@
按么我们逐个来解释一下: 按么我们逐个来解释一下:
### 8.1 域名策略: `"AsIs"` ### 8.1 域名策略: `"AsIs"`
就是 "As Domain Is",也就是说 【域名什么样,就什么样,不多折腾】。 就是 "As Domain Is",也就是说 【域名什么样,就什么样,不多折腾】。
@ -428,13 +404,11 @@
简单粗暴理解就是说【仅用 `[domain]` 来匹配】。 简单粗暴理解就是说【仅用 `[domain]` 来匹配】。
::: tip ::: tip
`AsIs` 的实际意义为 【如原先所示,不加修改】,🍉老师这里描述的不是很恰当。 `AsIs` 的实际意义为 【如原先所示,不加修改】,🍉 老师这里描述的不是很恰当。
::: :::
这个方式的处理都在 `Xray` 内部完成,没有与外界的数据往来,所以速度最快。它的兜底策略也很清晰:即前面所说的、无法匹配的域名自动转入第一条出站处理。所以,对于常规使用路由功能这最推荐的策略。 这个方式的处理都在 `Xray` 内部完成,没有与外界的数据往来,所以速度最快。它的兜底策略也很清晰:即前面所说的、无法匹配的域名自动转入第一条出站处理。所以,对于常规使用路由功能这最推荐的策略。
### 8.2 域名策略: `"IPIfNonMatch"` ### 8.2 域名策略: `"IPIfNonMatch"`
就是 "lookup IP if (there's) no matching rule",也就是说【如果其他所有规则都匹配不上,那就转化成 `IP` 去匹配 `IP` 规则】。 就是 "lookup IP if (there's) no matching rule",也就是说【如果其他所有规则都匹配不上,那就转化成 `IP` 去匹配 `IP` 规则】。
@ -443,7 +417,6 @@
该策略下没有命中任何规则的这一部分域名,会需要再经历 `DNS` 查询过程、以及第二轮规则匹配的过程,其耗时会多于 `AsIs` 策略,所以并不是首选推荐的策略。 该策略下没有命中任何规则的这一部分域名,会需要再经历 `DNS` 查询过程、以及第二轮规则匹配的过程,其耗时会多于 `AsIs` 策略,所以并不是首选推荐的策略。
### 8.3 域名策略: `"IPOnDemand"` ### 8.3 域名策略: `"IPOnDemand"`
这里其实说 `Demand IP` 更准确些,也就是说【当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配】。 这里其实说 `Demand IP` 更准确些,也就是说【当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配】。
@ -454,9 +427,7 @@
::: warning 啰嗦君 ::: warning 啰嗦君
`domainStrategy` 仅对域名生效,不要搞混了哦~ `domainStrategy` 仅对域名生效,不要搞混了哦~
::: :::
## 9. 思考题 ## 9. 思考题
@ -464,10 +435,10 @@
但是,如你所知,`Xray` 本身是支持多端口,多协议的。那么,如果我问你: 但是,如你所知,`Xray` 本身是支持多端口,多协议的。那么,如果我问你:
1. 我希望 `VLESS` 协议将我日常的网页浏览和APP流量转发给美国的大流量服务器 1. 我希望 `VLESS` 协议将我日常的网页浏览和 APP 流量转发给美国的大流量服务器
2. 我希望 `trojan` 协议将我的所有Netflix流量转发给日本的服务器解锁各种二次元 2. 我希望 `trojan` 协议将我的所有 Netflix 流量转发给日本的服务器解锁各种二次元
3. 我希望 `shadowsocks` 协议将我所有的游戏流量转发给香港的服务器达到最低的延迟 3. 我希望 `shadowsocks` 协议将我所有的游戏流量转发给香港的服务器达到最低的延迟
4. 我希望有一个独立的端口,能够把 `telegram` 的流量全都转发给VPS 4. 我希望有一个独立的端口,能够把 `telegram` 的流量全都转发给 VPS
5. 我希望有一个独立的端口,能够把 `bittorrent` 下载流量全都转发给欧洲大盘鸡 5. 我希望有一个独立的端口,能够把 `bittorrent` 下载流量全都转发给欧洲大盘鸡
6. 我希望...... 6. 我希望......
@ -475,7 +446,6 @@
答案当然是 **【完全可以】** 啦! 但是这些对于 `level-1` 来说已经超纲了,就留给各位自由的探索吧! 答案当然是 **【完全可以】** 啦! 但是这些对于 `level-1` 来说已经超纲了,就留给各位自由的探索吧!
## 10. 结语 ## 10. 结语
至此,`Xray` 的【路由】功能就介绍完了。希望本文能够对你理解 `Xray` 的灵活有所帮助。 至此,`Xray` 的【路由】功能就介绍完了。希望本文能够对你理解 `Xray` 的灵活有所帮助。
@ -483,4 +453,4 @@
## 11. 尾注 ## 11. 尾注
- 现在你可以重新阅读一遍 [路由](../../config/routing.md),看看是否有更加深刻的理解。 - 现在你可以重新阅读一遍 [路由](../../config/routing.md),看看是否有更加深刻的理解。
- 🍉🍉🍉🍉🍉 :D - 🍉🍉🍉🍉🍉 :D

View file

@ -1,11 +1,10 @@
# Xray的工作模式 # Xray 的工作模式
## 单服务器模式 ## 单服务器模式
与其它的网络代理工具一样,你需要一台配置了 Xray 的服务器,然后在自己的设备上安装并配置 Xray 客户端,然后即可流畅地访问互联网。 与其它的网络代理工具一样,你需要一台配置了 Xray 的服务器,然后在自己的设备上安装并配置 Xray 客户端,然后即可流畅地访问互联网。
``` mermaid ```mermaid
graph LR; graph LR;
A(PC) -.- B(防火墙); A(PC) -.- B(防火墙);
B -.-> C(墙外网站); B -.-> C(墙外网站);
@ -16,13 +15,11 @@ A --> E(墙内网站);
一个 Xray 服务器可同时支持多台设备使用不同的代理协议访问。同时经过合理的配置Xray 可以识别并区分需要代理以及不需要代理的流量,直连的流量不需要绕路。 一个 Xray 服务器可同时支持多台设备使用不同的代理协议访问。同时经过合理的配置Xray 可以识别并区分需要代理以及不需要代理的流量,直连的流量不需要绕路。
## 桥接模式 ## 桥接模式
如果你不想在每一台设备上都配置路由,你也可以设置一台中转服务器,用于接收客户端发来的所有流量,然后在服务器中进行转发判断。 如果你不想在每一台设备上都配置路由,你也可以设置一台中转服务器,用于接收客户端发来的所有流量,然后在服务器中进行转发判断。
``` mermaid ```mermaid
graph LR; graph LR;
A(PC) -.-> B(防火墙); A(PC) -.-> B(防火墙);
B -.-> C(墙外网站); B -.-> C(墙外网站);
@ -32,12 +29,11 @@ E --> C;
D --> F(墙内网站); D --> F(墙内网站);
``` ```
## 工作原理 ## 工作原理
在配置 Xray 之前,不妨先来看一下 Xray 的工作原理,以下是单个 Xray 进程的内部结构示意图。多个 Xray 之间相互独立,互不影响。 在配置 Xray 之前,不妨先来看一下 Xray 的工作原理,以下是单个 Xray 进程的内部结构示意图。多个 Xray 之间相互独立,互不影响。
``` mermaid ```mermaid
graph LR; graph LR;
A1(inbound) --> D(Dispatcher / Router / DNS); A1(inbound) --> D(Dispatcher / Router / DNS);
A2(inbound) --> D; A2(inbound) --> D;

View file

@ -23,170 +23,148 @@ sudo curl -oL /usr/local/share/xray/geosite.dat https://github.com/Loyalsoldier/
```json ```json
{ {
"log": { "log": {
"loglevel": "warning", "loglevel": "warning",
"error": "/var/log/xray/error.log", "error": "/var/log/xray/error.log",
"access": "/var/log/xray/access.log" "access": "/var/log/xray/access.log"
}, },
"inbounds": [ "inbounds": [
{ {
"tag": "all-in", "tag": "all-in",
"port": 12345, "port": 12345,
"protocol": "dokodemo-door", "protocol": "dokodemo-door",
"settings": { "settings": {
"network": "tcp,udp", "network": "tcp,udp",
"followRedirect": true "followRedirect": true
}, },
"sniffing": { "sniffing": {
"enabled": true, "enabled": true,
"destOverride": [ "destOverride": ["http", "tls"]
"http", },
"tls" "streamSettings": {
] "sockopt": {
}, "tproxy": "tproxy"
"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 ::: tip
**使用方法** **使用方法**
@ -297,7 +276,6 @@ iptables -t mangle -A OUTPUT -j XRAY_SELF
</Tabs> </Tabs>
配置完成后,将局域网内其它设备的默认网关改为该设备 IP就可以直接翻墙了。在其它主机和本机皆测试成功后可进行下一步配置。 配置完成后,将局域网内其它设备的默认网关改为该设备 IP就可以直接翻墙了。在其它主机和本机皆测试成功后可进行下一步配置。
## 配置永久化与开机自启 ## 配置永久化与开机自启
@ -308,10 +286,9 @@ iptables -t mangle -A OUTPUT -j XRAY_SELF
<Tab title="nftables"> <Tab title="nftables">
首先将已经编辑好的 nftables 配置文件移动到 `/etc` 目录下,并重命名为 `nftables.conf`。然后编辑 `/lib/systemd/system/nftables.service` 首先将已经编辑好的 nftables 配置文件移动到 `/etc` 目录下,并重命名为 `nftables.conf`。然后编辑 `/lib/systemd/system/nftables.service`
``` ini ```ini
[Unit] [Unit]
Description=nftables Description=nftables
Documentation=man:nft(8) http://wiki.nftables.org Documentation=man:nft(8) http://wiki.nftables.org
@ -346,7 +323,7 @@ WantedBy=sysinit.target
之后编辑 `/lib/systemd/system/netfilter-persistent.service` 之后编辑 `/lib/systemd/system/netfilter-persistent.service`
``` ini ```ini
[Unit] [Unit]
Description=netfilter persistent configuration Description=netfilter persistent configuration
DefaultDependencies=no DefaultDependencies=no

View file

@ -4,27 +4,26 @@
- Linux Script - Linux Script
- [Xray-install](https://github.com/XTLS/Xray-install) - [Xray-install](https://github.com/XTLS/Xray-install)
- [Xray-script](https://github.com/kirin10000/Xray-script) 感谢[@kirin](https://github.com/kirin10000) - [Xray-script](https://github.com/kirin10000/Xray-script) 感谢[@kirin](https://github.com/kirin10000)
- Docker - Docker
- [teddysun/xray](https://hub.docker.com/r/teddysun/xray) 感谢[@秋水逸冰](https://hub.docker.com/u/teddysun) - [teddysun/xray](https://hub.docker.com/r/teddysun/xray) 感谢[@秋水逸冰](https://hub.docker.com/u/teddysun)
- Xray-docker <Badge text="WIP" type="warning"/> - Xray-docker <Badge text="WIP" type="warning"/>
- One Click - One Click
- [ProxySU](https://github.com/proxysu/ProxySU) 感谢[@ProxySu](https://github.com/proxysu) - [ProxySU](https://github.com/proxysu/ProxySU) 感谢[@ProxySu](https://github.com/proxysu)
- [Xray-agent](https://github.com/mack-a/Xray-agent) 感谢[@mack-a](https://github.com/mack-a) - [Xray-agent](https://github.com/mack-a/Xray-agent) 感谢[@mack-a](https://github.com/mack-a)
- Magisk - Magisk
- [Xray4Magisk](https://github.com/CerteKim/Xray4Magisk) 感谢[@子曦曦](https://github.com/CerteKim) - [Xray4Magisk](https://github.com/CerteKim/Xray4Magisk) 感谢[@子曦曦](https://github.com/CerteKim)
- [Xray_For_Magisk](https://github.com/E7KMbb/Xray_For_Magisk) 感谢[@E7KMbb](https://github.com/E7KMbb) - [Xray_For_Magisk](https://github.com/E7KMbb/Xray_For_Magisk) 感谢[@E7KMbb](https://github.com/E7KMbb)
- Homebrew - Homebrew
- [Repository 0](https://github.com/N4FA/homebrew-xray) 感谢[@N4FA](https://github.com/N4FA) - [Repository 0](https://github.com/N4FA/homebrew-xray) 感谢[@N4FA](https://github.com/N4FA)
- [Repository 1](https://github.com/xiruizhao/homebrew-xray) 感谢[@Xirui Zhao](https://github.com/xiruizhao) - [Repository 1](https://github.com/xiruizhao/homebrew-xray) 感谢[@Xirui Zhao](https://github.com/xiruizhao)
## 配置模板 ## 配置模板
所有的模板请传送至: [Xray-examples](https://github.com/XTLS/Xray-examples) 所有的模板请传送至: [Xray-examples](https://github.com/XTLS/Xray-examples)
包含了各种用法示范的**终极配置**: [VLESS-TCP-XTLS-WHATEVER](https://github.com/XTLS/Xray-examples/tree/main/VLESS-TCP-XTLS-WHATEVER) 包含了各种用法示范的**终极配置**: [VLESS-TCP-XTLS-WHATEVER](https://github.com/XTLS/Xray-examples/tree/main/VLESS-TCP-XTLS-WHATEVER)
## 图形化客户端 ## 图形化客户端
- OpenWrt - OpenWrt
@ -44,4 +43,3 @@
## UUID 生成器 ## UUID 生成器
第三方的 UUID 生成器 [uuidgenerator.net](https://www.uuidgenerator.net) 第三方的 UUID 生成器 [uuidgenerator.net](https://www.uuidgenerator.net)