diff --git a/content/zh-cn/docs/Features/common/network/network-tls.md b/content/zh-cn/docs/Features/common/network/network-tls.md index b419b7e..305c382 100644 --- a/content/zh-cn/docs/Features/common/network/network-tls.md +++ b/content/zh-cn/docs/Features/common/network/network-tls.md @@ -3,30 +3,25 @@ title: "自定义 TLS 协议加密" weight: 2 --- -`use_encryption` 和 `STCP` 等功能能有效防止流量内容在通信过程中被盗取,但是无法判断对方的身份是否合法,存在被中间人攻击的威胁。为此 frp 支持 frpc 和 frps 之间的流量通过 TLS 协议加密,并且支持客户端或服务端单向验证,双向验证等功能。 - -当 `frpc.ini` 的 `common` 中 `tls_enable = true` 时,表示开启 TLS 协议加密。 +`use_encryption` 和 `STCP` 等功能能有效防止流量内容在通信过程中被盗取,但是无法判断对方的身份是否合法,存在被中间人攻击的风险。为此 frp 支持 frpc 和 frps 之间的流量通过 TLS 协议加密,并且支持客户端或服务端单向验证,双向验证等功能。 当 `frps.ini` 的 `common` 中 `tls_only = true` 时,表示 server 端只接受 TLS 连接的客户端,这也是 frps 验证 frpc 身份的前提条件。如果 `frps.ini` 的 `common` 中 `tls_trusted_ca_file` 内容是有效的话,那么默认就会开启 `tls_only = true`。 -**注意:启用此功能后除 xtcp 外,可以不用再设置 use_encryption 重复加密** +**注意:启用此功能后除 xtcp 且 xtcp 的 protocol 配置为 kcp 外,可以不用再设置 use_encryption 重复加密** ## TLS 默认开启方式 -```ini -# frpc.ini -[common] -tls_enable = true -``` +从 v0.50.0 开始,`tls_enable` 的默认值将会为 true,默认开启 TLS 协议加密。 + +如果 frps 端没有配置证书,则会使用随机生成的证书来加密流量。 -frpc 开启 TLS 加密功能,但是默认不校验 frps 的证书。 +默认情况下,frpc 开启 TLS 加密功能,但是不校验 frps 的证书。 ## frpc 单向校验 frps 身份 ```ini # frpc.ini [common] -tls_enable = true tls_trusted_ca_file = /to/ca/path/ca.crt # frps.ini @@ -45,7 +40,6 @@ frpc 需要额外加载 ca 证书,frps 需要额外指定 TLS 配置。frpc ```ini # frpc.ini [common] -tls_enable = true tls_cert_file = /to/cert/path/client.crt tls_key_file = /to/key/path/client.key @@ -61,7 +55,6 @@ frpc 需要额外加载 TLS 配置,frps 需要额外加载 ca 证书。frps ```ini # frpc.ini [common] -tls_enable = true tls_cert_file = /to/cert/path/client.crt tls_key_file = /to/key/path/client.key tls_trusted_ca_file = /to/ca/path/ca.crt @@ -81,11 +74,9 @@ tls_trusted_ca_file = /to/ca/path/ca.crt enable Common Name matching with GODEBUG=x509ignoreCN=0` 如果出现上述报错,是因为 go 1.15 版本开始[废弃 CommonName](https://golang.org/doc/go1.15#commonname),因此推荐使用 SAN 证书。 -如果想兼容之前的方式,需要设置环境变量 **GODEBUG** 为 `x509ignoreCN=0`。 下面简单示例如何用 openssl 生成 ca 和双方 SAN 证书。 - 准备默认 OpenSSL 配置文件于当前目录。此配置文件在 linux 系统下通常位于 `/etc/pki/tls/openssl.cnf`,在 mac 系统下通常位于 `/System/Library/OpenSSL/openssl.cnf`。 如果存在,则直接拷贝到当前目录,例如 `cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf`。如果不存在可以使用下面的命令来创建。 diff --git a/content/zh-cn/docs/Features/xtcp/_index.md b/content/zh-cn/docs/Features/xtcp/_index.md index 992be1e..cf1dad3 100644 --- a/content/zh-cn/docs/Features/xtcp/_index.md +++ b/content/zh-cn/docs/Features/xtcp/_index.md @@ -12,3 +12,36 @@ XTCP 的配置方式和 STCP 很类似。但是会采用 P2P 的方式进行打 当 visitor 配置了 `keep_tunnel_open = true` 时,frpc 会定期检测隧道是否打开,如果没有,则会尝试打洞建立隧道,这样可以始终保持隧道打开,在需要连接对端服务时,可以避免延迟。 默认情况下,visitor 会在接收到用户连接后尝试打洞,如果打洞失败,可以尝试多次建立连接,程序会尝试其他的打洞策略,有可能在多次重试后成功打洞。一旦打洞成功,后续新增连接不必重复打洞,而是可以复用隧道。 + +## Fallback 机制 + +可以通过配置 fallback 到 stcp visitor 实现在打洞失败时,回退到 stcp 建立连接。 + +示例配置: + +```ini +[stcp-visitor] +role = visitor +type = stcp +server_name = stcp-test +sk = abc +bind_port = -1 + +[xtcp-visitor] +role = visitor +type = xtcp +server_name = xtcp-test +sk = abc +bind_addr = 127.0.0.1 +bind_port = 9002 +fallback_to = stcp-visitor +fallback_timeout_ms = 200 +``` + +当连接 `127.0.0.1:9002` 超过 200ms p2p 打洞还未成功的话,会回退到使用 stcp-visitor 建立连接。fallback 后,之前触发的打洞操作仍然会继续,一般来说打洞完成需要的耗时会比较长。 + +如果打洞成功,下次建立新的连接时,将不需要再次打洞,会很快完成连接建立,不会触发 fallback。 + +需要注意根据访问端和被访问端的延迟情况来合理设置超时时间,以避免超时时间太短,即使打洞成功连接也来不及建立,而一直触发 fallback。 + +stcp-visitor 的 `bind_port` 设置为 -1 表示不需要监听物理端口,只接受 fallback 的连接即可。 diff --git a/content/zh-cn/docs/Reference/client-configures.md b/content/zh-cn/docs/Reference/client-configures.md index 72fdde7..ea3e281 100644 --- a/content/zh-cn/docs/Reference/client-configures.md +++ b/content/zh-cn/docs/Reference/client-configures.md @@ -28,12 +28,12 @@ description: > | quic_keepalive_period | int | quic 协议 keepalive 间隔,单位: 秒 | 10 | | | | quic_max_idle_timeout | int | quic 协议的最大空闲超时时间,单位: 秒 | 30 | | | | quic_max_incoming_streams | int | quic 协议最大并发 stream 数 | 100000 | | | -| tls_enable | bool | 启用 TLS 协议加密连接 | false | | | +| tls_enable | bool | 启用 TLS 协议加密连接 | true | | | | tls_cert_file | string | TLS 客户端证书文件路径 | | | | | tls_key_file | string | TLS 客户端密钥文件路径 | | | | | tls_trusted_ca_file | string | TLS CA 证书路径 | | | | | tls_server_name | string | TLS Server 名称 | | | 为空则使用 server_addr | -| disable_custom_tls_first_byte | bool | TLS 不发送 0x17 | false | | 当为 true 时,不能端口复用 | +| disable_custom_tls_first_byte | bool | TLS 不发送 0x17 | true | | 当为 true 时,不能端口复用 | | tcp_mux_keepalive_interval | int | tcp_mux 的心跳检查间隔时间 | 60 | | 单位:秒 | | heartbeat_interval | int | 向服务端发送心跳包的间隔时间 | 30 | | 建议启用 tcp_mux_keepalive_interval,将此值设置为 -1 | | heartbeat_timeout | int | 和服务端心跳的超时时间 | 90 | | | diff --git a/content/zh-cn/docs/Reference/proxy.md b/content/zh-cn/docs/Reference/proxy.md index 27017c5..34fc6c2 100644 --- a/content/zh-cn/docs/Reference/proxy.md +++ b/content/zh-cn/docs/Reference/proxy.md @@ -83,8 +83,9 @@ description: > | 参数 | 类型 | 说明 | 是否必须 | 默认值 | 可选值 | 备注 | | :--- | :---: | :--- | :---: | :---: | :--- | :--- | -| role | string | 角色 | 是 | server | server,visitor | server 表示服务端,visitor 表示访问端 | +| role | string | 角色 | 是 | server | server | server 表示服务端 | | sk | string | 密钥 | 是 | | | 服务端和访问端的密钥需要一致,访问端才能访问到服务端 | +| allow_users | []string | 允许访问的 visitor 用户 | 否 | | | 默认只允许同一用户下的 visitor 访问,配置为 * 则允许任何 visitor 访问 | ## SUDP @@ -92,6 +93,7 @@ description: > | :--- | :---: | :--- | :---: | :---: | :--- | :--- | | role | string | 角色 | 是 | server | server,visitor | server 表示服务端,visitor 表示访问端 | | sk | string | 密钥 | 是 | | | 服务端和访问端的密钥需要一致,访问端才能访问到服务端 | +| allow_users | []string | 允许访问的 visitor 用户 | 否 | | | 默认只允许同一用户下的 visitor 访问,配置为 * 则允许任何 visitor 访问 | ## XTCP @@ -99,15 +101,7 @@ description: > | :--- | :---: | :--- | :---: | :---: | :--- | :--- | | role | string | 角色 | 是 | server | server,visitor | server 表示服务端,visitor 表示访问端 | | sk | string | 密钥 | 是 | | | 服务端和访问端的密钥需要一致,访问端才能访问到服务端 | - -## XTCP visitor - -| 参数 | 类型 | 说明 | 是否必须 | 默认值 | 可选值 | 备注 | -| :--- | :---: | :--- | :---: | :---: | :--- | :--- | -| keep_tunnel_open | bool | 是否保持隧道打开 | 否 | false | | 如果开启,会定期检查隧道状态并尝试保持打开 | -| max_retries_an_hour | int | 每小时尝试打开隧道的次数 | 否 | 8 | | 仅在 keep_tunnel_open 为 true 时有效 | -| min_retry_interval | int | 重试打开隧道的最小间隔时间,单位: 秒 | 否 | 90 | | 仅在 keep_tunnel_open 为 true 时有效 | -| protocol | string | 隧道底层通信协议 | 否 | quic | quic, kcp | | +| allow_users | []string | 允许访问的 visitor 用户 | 否 | | | 默认只允许同一用户下的 visitor 访问,配置为 * 则允许任何 visitor 访问 | ## TCPMUX diff --git a/content/zh-cn/docs/Reference/visitor.md b/content/zh-cn/docs/Reference/visitor.md new file mode 100644 index 0000000..271b539 --- /dev/null +++ b/content/zh-cn/docs/Reference/visitor.md @@ -0,0 +1,35 @@ +--- +title: "visitor 配置" +weight: 4 +description: > + frp visitor 的详细配置说明。 +--- + +## 通用配置 + +通用配置是指不同类型的 visitor 共同使用的一些配置参数。 + +### 基础配置 + +| 参数 | 类型 | 说明 | 是否必须 | 默认值 | 可选值 | 备注 | +| :--- | :--- | :--- | :--- | :--- | :--- | :---| +| role | string | 角色 | 是 | visitor | visitor | visitor 表示访问端 | +| server_user | string | 要访问的 proxy 所属的用户名 | 否 | 当前用户 | | 如果为空,则默认为当前用户 | +| server_name | string | 要访问的 proxy 名称 | 是 | | | | +| type | string | visitor 类型 | 是 | | stcp, sudp, xtcp | | +| sk | string | 密钥 | 是 | | | 服务端和访问端的密钥需要一致,访问端才能访问到服务端 | +| use_encryption | bool | 是否启用加密功能 | 否 | false | | 启用后该代理和服务端之间的通信内容都会被加密传输 | +| use_compression | bool | 是否启用压缩功能 | 否 | false | | 启用后该代理和服务端之间的通信内容都会被压缩传输 | +| bind_addr | string | visitor 监听的本地地址 | 否 | 127.0.0.1 | | 通过访问监听的地址和端口,连接到远端代理的服务 | +| bind_port | int | visitor 监听的本地端口 | 否 | | | 如果为 -1,表示不需要监听物理端口,通常可以用于作为其他 visitor 的 fallback | + +## XTCP + +| 参数 | 类型 | 说明 | 是否必须 | 默认值 | 可选值 | 备注 | +| :--- | :---: | :--- | :---: | :---: | :--- | :--- | +| keep_tunnel_open | bool | 是否保持隧道打开 | 否 | false | | 如果开启,会定期检查隧道状态并尝试保持打开 | +| max_retries_an_hour | int | 每小时尝试打开隧道的次数 | 否 | 8 | | 仅在 keep_tunnel_open 为 true 时有效 | +| min_retry_interval | int | 重试打开隧道的最小间隔时间,单位: 秒 | 否 | 90 | | 仅在 keep_tunnel_open 为 true 时有效 | +| protocol | string | 隧道底层通信协议 | 否 | quic | quic, kcp | | +| fallback_to | string | 回退到的其他 visitor 名称 | 否 | | | | +| fallback_timeout_ms | int | 连接建立超过多长时间后回退到其他 visitor | 否 | | | | diff --git a/content/zh-cn/release/_index.md b/content/zh-cn/release/_index.md index c6e3476..77aca24 100644 --- a/content/zh-cn/release/_index.md +++ b/content/zh-cn/release/_index.md @@ -8,6 +8,14 @@ cascade: - type: "docs" --- +#### v0.50.0 + + * [new] stcp, sudp, xtcp 支持 `allow_users`,默认只允许同 user 访问,`*` 表示允许任何用户访问,visitor 配置支持 `server_user`,以支持连接到其他用户的代理。 + * [new] xtcp 连接失败时支持 fallback 到指定的其他 visitor。 + * [improve] 提高 yamux `MaxStreamWindowSize` 的默认值到 6MB,以提升高延迟场景下的流量转发速率。 + * [fix] xtcp: 修复同名的 proxy 会导致之前正常运行的 proxy 失效的问题。 + * [change] 为了提高安全性,`tls_enable` 和 `disable_custom_tls_first_byte` 的默认值将会设置为 true。如果希望恢复之前的默认值,你需要主动将这两个参数的值设置为 false。 + #### v0.49.0 * [new] frpc 新增 nathole discover 命令用于测试当前网络的 NAT 类型。