Skip to content

Commit

Permalink
update docs for v0.50.0
Browse files Browse the repository at this point in the history
  • Loading branch information
fatedier committed Jun 26, 2023
1 parent 96bfbb2 commit 00fd746
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 27 deletions.
21 changes: 6 additions & 15 deletions content/zh-cn/docs/Features/common/network/network-tls.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -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`。如果不存在可以使用下面的命令来创建。
Expand Down
33 changes: 33 additions & 0 deletions content/zh-cn/docs/Features/xtcp/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 的连接即可。
4 changes: 2 additions & 2 deletions content/zh-cn/docs/Reference/client-configures.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 | | |
Expand Down
14 changes: 4 additions & 10 deletions content/zh-cn/docs/Reference/proxy.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,31 +83,25 @@ description: >

| 参数 | 类型 | 说明 | 是否必须 | 默认值 | 可选值 | 备注 |
| :--- | :---: | :--- | :---: | :---: | :--- | :--- |
| role | string | 角色 || server | server,visitor | server 表示服务端,visitor 表示访问端 |
| role | string | 角色 || server | server | server 表示服务端 |
| sk | string | 密钥 || | | 服务端和访问端的密钥需要一致,访问端才能访问到服务端 |
| allow_users | []string | 允许访问的 visitor 用户 || | | 默认只允许同一用户下的 visitor 访问,配置为 * 则允许任何 visitor 访问 |

## SUDP

| 参数 | 类型 | 说明 | 是否必须 | 默认值 | 可选值 | 备注 |
| :--- | :---: | :--- | :---: | :---: | :--- | :--- |
| role | string | 角色 || server | server,visitor | server 表示服务端,visitor 表示访问端 |
| sk | string | 密钥 || | | 服务端和访问端的密钥需要一致,访问端才能访问到服务端 |
| allow_users | []string | 允许访问的 visitor 用户 || | | 默认只允许同一用户下的 visitor 访问,配置为 * 则允许任何 visitor 访问 |

## XTCP

| 参数 | 类型 | 说明 | 是否必须 | 默认值 | 可选值 | 备注 |
| :--- | :---: | :--- | :---: | :---: | :--- | :--- |
| 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

Expand Down
35 changes: 35 additions & 0 deletions content/zh-cn/docs/Reference/visitor.md
Original file line number Diff line number Diff line change
@@ -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 || | | |
8 changes: 8 additions & 0 deletions content/zh-cn/release/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 类型。
Expand Down

0 comments on commit 00fd746

Please sign in to comment.