用frpc将内网http流量转发为外网可访问的https ERR SSL PROTOCOL ERROR解决

试错过程简述

我搭建博客使用的是onepannel后台管理系统+halo来完成的。全程跟着官方手册和教学视频进行,然而为了安全,http流量需要转发为https公布到公网,起初一直在onepannel的Nginx上折腾ssl证书和反向代理,但是无论怎么配置都会导致代理后打不开网页,报错为:

9fb0671c028aed2c1bd291e500f9919

此网站无法提供安全连接 ERR SSL PROTOCOL ERROR。这个报错导致我一度认为是ssl证书的问题。浪费了我很多时间。

然而无论直到在onepannel的github issue发现了了类似的问题,才发现不能通过onepannel内置的Nginx服务来进行配置,而是要通过frpc内网穿透客户端的配置来解决问题。

域名申请与DNS解析,SSL申请

我申请了腾讯云的DNSPOD域名,因为要做内网穿透,所以要把域名解析到内网穿透服务商的地址上。

image-20230723122918276

DNSPOD:记录值填写内网穿透服务商提供的服务器地址(如果自己的服务器有公网IP则写自己的公网ip即可,本文主要针对的是没有公网IP的自建服务器)。

点击SSL可以为域名申请SSL证书,这是进行https配置的前提条件,申请后将Nginx的ssl证书压缩包下载到个人服务器上并且解压备用。

onepannel配置(可选)

我的halo博客使用了本地的2085端口转发流量,但是我不想直接把这个端口暴露在公网上,所以我使用了halo的Nginx反向代理服务把2085的http流量转发到了本地的2086端口上,后续对2086端口的服务进行公网映射即可。

onepanel配置方法可以参考官方教程【1Panel功能演示视频】2. 网站管理_哔哩哔哩_bilibili

我生成的配置:

server {
    listen 80 ; 
    listen 2086 ; #把来自2085的流量转发到127.0.0.1的2086端口上
    server_name blog.starfall.love 127.0.0.1; #这里的网址其实是凑数的,ip地址写本地很重要。
    index index.php index.html index.htm default.php default.htm default.html; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Host $server_name; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    access_log /www/sites/blog.starfall.love/log/access.log; 
    error_log /www/sites/blog.starfall.love/log/error.log; 
    access_by_lua_file /www/common/waf/access.lua; 
    set $RulePath /www/sites/blog.starfall.love/waf/rules; 
    set $logdir /www/sites/blog.starfall.love/log; 
    set $redirect on; 
    set $attackLog on; 
    set $CCDeny off; 
    set $urlWhiteAllow off; 
    set $urlBlockDeny off; 
    set $argsDeny off; 
    set $postDeny off; 
    set $cookieDeny off; 
    set $fileExtDeny off; 
    set $ipBlockDeny off; 
    set $ipWhiteAllow off; 
    location ~ /.well-known/acme-challenge {
        allow all; 
        root /usr/share/nginx/html; 
    }
    include /www/sites/blog.starfall.love/proxy/*.conf; 
}

frpc转发

本文基于openFRP的香港线路,因为个人服务器难以通过大陆的备案,域名备案也很麻烦。首页 | OpenFrp管理面板

首先在首页 | OpenFrp管理面板开通两个香港线路,都对应这本地的2086端口(即放置halo博客的端口),两个线路分别穿透http和https流量。

image-20230723124551066

下载openfrp的linux客户端,写一个frpc.ini文件,和下载的客户端放在一个目录中,frpc.ini的内容如下:

[common]
#这部分的配置需要根据自己开通的隧道在openfrp的配置面板获取
[http_blog]
type = http
local_ip = 127.0.0.1
local_port = 2086 #被转发到公网的http端口
custom_domains = blog.starfall.love
use_encryption = true #frp加密算法
use_compression = true #frp压缩算法

[https_blog] #将http转发为https
type = https
local_ip = 127.0.0.1
local_port = 2086 
custom_domains = blog.starfall.love
plugin = https2http #FRP的http转https服务
plugin_local_addr = 127.0.0.1:2086
plugin_host_header_rewrite = 127.0.0.1
plugin_crt_path  = /home/yxl/frp_server/blog/blog.starfall.love_bundle.pem
plugin_key_path = /home/yxl/frp_server/blog/blog.starfall.love.key #上面下载的Nginx证书文件里面解压出来的pem和key文件的路径
plugin_header_X-From_Where = frp
use_encryption = true

随后启动frpc

./frpc_linux_amd64

image-20230723131521425

看到隧道启动成功即可链接https://blog.starfall.love/

frpc强制跳转https

也很简单,在https的设置里加一句即可

force_https = true

全https配置:

[https]
type = https
local_ip = 127.0.0.1
local_port = 2086
custom_domains = blog.starfall.love
plugin = https2http
plugin_local_addr = 127.0.0.1:2086
plugin_host_header_rewrite = 127.0.0.1
plugin_crt_path  = /home/yxl/frp_server/blog/blog.starfall.love_bundle.pem
plugin_key_path = /home/yxl/frp_server/blog/blog.starfall.love.key
plugin_header_X-From_Where = frp
use_encryption = true
force_https = true

如果这么配置的话,把http隧道删了也不会影响访问。所以总结来说,如果服务器没有公网ip,最好直接用frpc发布https的网站,同样可以正常使用证书来进行加密。如果没有证书,启用auto_tlspx也可以打开https加密。

将网站加入baidu和google收录

首先在腾讯云dnspod打开搜索优化:点击域名名称-高级选项-搜索优化

百度和谷歌申请教程:

Hexo 博客提交百度、谷歌搜索引擎收录 - 知乎 (zhihu.com)

html标签注入位置:

image-20230723150548647 还想要更多代码?不知道怎么搭建?想让别人帮忙生信分析?欢迎来我的闲鱼咨询!价格绝对全网最低

IMG_20230725_170507

文章作者: 星落
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 星落_Blog
实用工具 服务器 博客 web 内网穿透
喜欢就支持一下吧