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 之后,流量会被全局加密,不再需要配置单个代理上的加密,新版本中已经默认启用。