frp可以为没有公网地址(ipv4或ipv6)的主机提供外网访问的能力。本文记录了为web服务添加https支持的方法。

ssl证书申请

可通过lucky万吉-SSL/TLS证书模块为域名申请Let’s Encrypt证书,完成后下载证书并解压,得到.crt,.key(还有.pem和_issuerCertificate.crt,这里用不上)。

服务端frps.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# frps.toml
bindPort = 7000
#绑定7000端口
auth.method = "token"
auth.token = "yourtoken"
#token方式验证
vhostHTTPSPort = 443
#ssl端口
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
webServer.tls.certFile = "/root/ssl/_.qs100371.vip.crt"
webServer.tls.keyFile = "/root/ssl/_.qs100371.vip.key"
#服务状态面板地址,端口及访问帐号密码
#enablePrometheus = true
#allowPorts = [{start = 20000 , end = 50000}]
#可用端口范围20000-50000,以防和本地端口冲突
log.to = "./frps.log"

ssl证书文件放在公网主机/root/ssl目录下。

客户端frpc.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
serverAddr = "公网主机ip"
serverPort = 7000
auth.method = "token"
auth.token = "yourtoken" #和frps中的token一致
webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"
#frpc面板设置及访问帐号密码
[[proxies]]
name = "fnos" # 名称
type = "https"
customDomains = ["media.qs100371.vip"] # 需要指向的域名,后面运行后使用这个域名访问
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:5666" # 需要穿透的本地web服务
crtPath = "/root/ssl/_.qs100371.vip.crt" # 对应域名的 crt 证书
keyPath = "/root/ssl/_.qs100371.vip.key" # 对应域名的 key 证书
hostHeaderRewrite = "127.0.0.1" # 与 localAddr 的 ip 对应即可
requestHeaders.set.x-from-where = "frp"
[[proxies]]
name = "fnos1"
type = "tcp"
localIP = "192.168.0.4"
localPort = 5666
remotePort = 5666

ssl证书文件放在内网主机/root/ssl目录下。

域名解析设置

把设置https访问的域名(本文中media.qs100371.vip)的A记录指向公网主机ip。

https访问

重启服务端frps和客户端frpc服务后就可在浏览器上用https://media.qs100371.vip访问内网的飞牛服务器。
服务端面板通过https://f.qs100371.vip:7500访问。


客户端面板通过http://192.168.0.4:7400访问。


最近申请了腾讯云一个月2C2G带宽3M主机试用,配置了一个frps服务器,能够正常使用内网穿透,只有在穿透视频播放有时会有点卡,毕竟最大带宽只有3Mbps(375kb/s)。相对STUN内网穿透能用满最大上传带宽(一般家用宽带上传10M-50M或更高),frp严重受制于公网主机的带宽(低价主机一般带宽1M-5M)。

详细设置过程需配合frp内网穿透的使用方法使用。