FRP 配置双向认证

使用openssl生成自签名证书

1、生成默认CA证书

openssl genrsa -out ca.key 2048

openssl req -x509 -new -nodes -key ca.key -subj "/C=CN/ST=XXX/L=XXX/O=Conrad Inc./OU=XXX IT" -days 3650 -out ca.crt

2、生成服务端证书

openssl genrsa -out server.key 2048

openssl req -new -sha256 -key server.key \
    -subj "/C=CN/ST=XXX/L=XXX/O=Conrad Inc./OU=XXX IT"\
    -out server.csr

openssl x509 -req -days 3650 -sha256 \
    -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile <(echo -e "[SAN]\nsubjectAltName=DNS:localhost,IP:{{ipaddress}},DNS:xxx.com") \
    -extensions SAN -out server.crt

其中{{ipaddress}}需要替换为服务端ip地址,若服务端有域名可将dns改为服务端的域名。

可使用下行命令查看是否将扩展信息写入证书内

openssl x509 -in server.crt -noout -text

若有如下输出则证书生成正常

X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:localhost, IP Address:{{ipaddress}}, DNS:xxx.com

3、生成客户端证书

openssl genrsa -out client.key 2048

openssl req -new -sha256 -key client.key \
    -subj "/C=CN/ST=XXX/L=XXX/O=Conrad Inc./OU=XXX IT" \
    -out client.csr

openssl x509 -req -days 3650 -sha256 \
    -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
	-extfile <(echo -e "[SAN]\nsubjectAltName=DNS:localhost,DNS:xxx.com") \
	-out client.crt

配置frp双向认证

将生成的ca.crt server.key server.crt 上传到服务端,ca.crt client.crt client.key 上传到客户端。配置文件修改如下

# frpc.toml
transport.tls.certFile = "/to/cert/path/client.crt"
transport.tls.keyFile = "/to/key/path/client.key"
transport.tls.trustedCaFile = "/to/ca/path/ca.crt"

# frps.toml
transport.tls.certFile = "/to/cert/path/server.crt"
transport.tls.keyFile = "/to/key/path/server.key"
transport.tls.trustedCaFile = "/to/ca/path/ca.crt"

启动加密与压缩

每一个代理都可以选择是否启用加密和压缩的功能。

加密算法采用 aes-128-cfb,压缩算法采用 snappy。

在每一个代理的配置中使用如下参数指定:

[[proxies]]
name = "ssh"
type = "tcp"
localPort = 22
remotePort = 6000
transport.useEncryption = true
transport.useCompression = true

通过设置 transport.useEncryption = true,将 frpc 与 frps 之间的通信内容加密传输,将会有效防止传输内容被截取。

如果传输的报文长度较长,通过设置 transport.useCompression = true 对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 CPU 资源。

注: 当 frpc 和 frps 之间启用了 TLS 之后,流量会被全局加密,不再需要配置单个代理上的加密,新版本中已经默认启用。