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