frp 内网穿透和 HTTPS 踩坑记

前言

因为 NAS 搭建之旅 —— 软件篇 太长了,所以把其中 使用 frp 实现内网穿透、HTTPS 反向代理踩的坑记录在本文。

内网穿透

用 frp 实现内网穿透,操作上其实很简单。frp 程序分为 frps 和 frpc,frpc 运行在真正提供服务的内网服务器上,frps 运行在具有独立 IP 的公网服务器上,具体的安装程序和安装说明建议参考 官方 Repo

HTTPS 踩坑

一开始,我在公网服务器和内网服务器上都装了 nginx,也同时部署了 SSL 证书。所有的请求都先经过公网服务器的 nginx 转发给 frps,再到内网服务器。这种场景下,http 的请求是有正常返回的,而 https 的就总是有证书错误之类的反馈。

网上一搜可以看到很多人遇到类似的问题,不少人在 frp 的官方 repo 下提 issue。作者似乎对这种问题很无语,称不是 frp 的问题,直接让提问人给 nginx 开发提 issue。

后来仔细想了下,应该是公网服务器在转发 https 请求给 frps 时,已经对请求数据做了处理。所以当 frps 把请求转发给内网服务器的时候,请求的内容已经变了。

一种可能的解决方法是让 nginx 直接 TCP 转发,数据原封不动。另外一种是去掉 nginx 这一层,让 frps 直接监听 443 端口。两种方法中,我选择了后者,在 Vultr 上租了个 2.5 刀每月的 VPS(或在 搬瓦工 买个 CN2 线路的便宜 VPS),专门用来科学上网 & 内网穿透,问题完美解决。