浅析Frp的https转发

发布于 1 天前  15 次阅读


之前我发过一篇文章“家里云”没有公网IP?来试试内网穿透+反向代理吧,当时提到了通过frp的tcp隧道实现端口暴露在公网,按照当时的写法搭建完成后的网络应该是这样的

嫌我画的或写的字丑的请见谅bili_smilies

可以看到Frp客户端与服务端之间的通信是未加密的,这大大降低了网站的安全性,虽然可以在两个Frp上部署自签名证书实现不安全的https加密,但是仍然无法防范中间人攻击

中间人攻击(Man-in-the-Middle Attack,简称MITM),是一种会话劫持攻击。攻击者作为中间人,劫持通信双方会话并操纵通信过程,而通信双方并不知情,从而达到窃取信息或冒充访问的目的。

在那之后我想了很久,以前网站部署在云服务器上的时候这样 是可行的,因为根本没有③⑥步,后面我查阅了Frp的文档后发现Frp还可以实现https请求转发(以前我以为frp只能创建tcp隧道bili_smilies),于是我开始重新部署整个系统。

在上图可以发现,Nginx后面的所有请求都是http类型的,加解密在Nginx处完成,那么把Nginx部署到home server上就可以实现全https了

但是cloud server没了Nginx怎么监听端口呢,翻阅了Frp文档后我发现Frp也可以监控80和443端口,并且Frp的https代理是单纯的https转发,并不会进行TLS加解密和再请求,下面是官方文档的说明

HTTP 类型的代理非常适合将内网的 Web 服务通过自定义域名提供给外部用户。相比于 TCP 类型代理,HTTP 代理不仅可以复用端口,还提供了基于 HTTP 协议的许多功能。

HTTPS 与此类似,但是需要注意,frp 的 https 代理需要本地服务是 HTTPS 服务,frps 端不会做 TLS 终止。

实现只需要在frps.toml加入下面的代码

#frps.toml
vhostHTTPPort = 80    #监听来自80端口的HTTP
vhostHTTPSPort = 443    #监听来自443端口的HTTPS

cloud server上只保留Frps(又可以少一笔在云服务器上的开销),在home server上部署反向代理就能实现全公网https访问,修改后的网络如下

相应的frpc.toml的每个隧道也需要修改

#frpc.toml
[[proxies]]
name = "frpc"    #隧道名
type = "https"    #传输类型
localPort = 443    #本地端口,https默认为443
customDomains = ["test.example.com"]    #绑定域名

文档中还有一种frps写顶级域名frpc只写二级域名的写法

# frps.toml
vhostHTTPPort = 80    #监听来自80端口的HTTP
vhostHTTPSPort = 443    #监听来自443端口的HTTPS
subdomainHost = "example.com"    #你的顶级域名
#frpc.toml
[[proxies]]
name = "frpc"    #隧道名
type = "https"    #传输类型
localPort = 443    #本地端口,https默认为443
subdomain = "frpc"    #二级域名

这样的话等效在customDomains里写frpc.example.com