用frp内网穿透https网站

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。

image.png

以我自己的nextcloud为例,客户端的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[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本身不做任何请求改写工作,只是解析域名,然后转发。

服务端不需要修改配置,客户端的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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完成。

0%