用frp内网穿透https网站
- 2019 年 11 月 20 日
- 筆記
frp是一个非常好用的内网穿透工具,实际使用发现其比ngrok稳定,比p2p vpn如zerotier,n2n可用性高。所谓可用性高,在使用上的体现是指ssh连接时不会突然卡住。如果ssh都会不顺畅,更别提网站与vnc了。
平时用frp都只用http反向代理和端口暴露两个功能,可由于打算将所有网站放到本地,通过frp暴露到公网上。这就要求我研究一下如何用frp穿透https网站。
其实替代方案也很直接,就是用frp穿透一个端口或者http,公网服务器用nginx再反向代理一下就行。但是考虑到frp本身就支持https,可以尝试下。
方式1:使用https2http
首先要注意https2http插件是最近支持的,在v0.26.0
增加了https2http
插件。我的理解是该插件类似于一个nginx功能,访问本地服务器时用http,对外暴露https。

以我自己的nextcloud为例,客户端的配置如下:
[nextcloud_https] type = https subdomain = icloud use_encryption = true use_compression = true plugin = https2http plugin_local_addr = 127.0.0.1:80 plugin_crt_path = /home/wenfeng/conf/woniu/all_stackoverflow.club.fullchain.cer plugin_key_path = /home/wenfeng/conf/woniu/all_stackoverflow.club.key plugin_host_header_rewrite = icloud.stackoverflow.club [nextcloud_http] type = http local_port = 80 subdomain = icloud use_encryption = true use_compression = true
目前存在的问题:
ERR_ABORTED 400 (Bad Request)
导致部分资源无法加载(我的网站是nextcloud)- 不支持从http跳转到https
方式2:直接使用https
几经波折后,在issue中看到了较为原始的https实现方案,就是frp本身不做任何请求改写工作,只是解析域名,然后转发。
服务端不需要修改配置,客户端的配置如下:
[nextcloud_https] type = https local_port = 443 subdomain = icloud # custom_domains = icloud.stackoverflow.club use_encryption = true use_compression = true [nextcloud_http] type = http local_port = 80 subdomain = icloud # custom_domains = icloud.stackoverflow.club use_encryption = true use_compression = true
可以看到穿透的方式与http完全相同,只是改了type
和本地端口,https的实际实现由本地服务器的nginx完成。