之前我发过一篇文章“家里云”没有公网IP?来试试内网穿透+反向代理吧,当时提到了通过frp的tcp隧道实现端口暴露在公网,按照当时的写法搭建完成后的网络应该是这样的
嫌我画的或写的字丑的请见谅
可以看到Frp客户端与服务端之间的通信是未加密的,这大大降低了网站的安全性,虽然可以在两个Frp上部署自签名证书实现不安全的https加密,但是仍然无法防范中间人攻击
中间人攻击(Man-in-the-Middle Attack,简称MITM),是一种会话劫持攻击。攻击者作为中间人,劫持通信双方会话并操纵通信过程,而通信双方并不知情,从而达到窃取信息或冒充访问的目的。
在那之后我想了很久,以前网站部署在云服务器上的时候这样 是可行的,因为根本没有③⑥步,后面我查阅了Frp的文档后发现Frp还可以实现https请求转发(以前我以为frp只能创建tcp隧道),于是我开始重新部署整个系统。
在上图可以发现,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
Comments NOTHING