­

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