用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完成。