如你所见,例行的《我的2019最爱》与《2020新年贺词》迟到了半个多月。BLOG也2个多月没有更新。主要原因是因为一直在进行的https技术受阻,以至于产生畏难拖延情绪。
经过近半月的高强度科研,参考诸多教程,终于攻克相关难题。现进行技术总结以飨读者。本文主要面向技术水平较低的读者。
一、服务内容
域名解析至VPS,VPS(80端口被其他脚本占据)通过nginx反代至frps。
客户端(树莓派)frpc连接vps端frps,树莓派通过nginx搭建网盘及博客。
二、技术难点
域名解析、http通过frp进行内网穿透在网络上教程很多,即使通过官方文档也极易习得。不再赘述。
本文主要介绍https通过frp进行内网穿透。
VPS端:
1、域名解析至vps后,我使用了lnmp一键包搭建nginx环境。(教程 https://wzfou.com/lnmp-1-6/)通过脚本命令直接添加虚拟主机。期间,通过Letsencrypt获得自动续期的免费SSL证书(若中间卡住,需升级acme.sh脚本)。
2、编辑对应虚拟主机的conf文件。
server
{
listen 80;
listen 443 ssl http2;
server_name aaa.aaa.aaa #这里填写你的域名
charset utf-8;
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}#通过这段将http全部转为https
ssl_certificate /usr/local/nginx/conf/ssl/aaa/aaa;#这里填写对应cer文件路径,在原有文件中有相关字段
ssl_certificate_key /usr/local/nginx/conf/ssl/aaa/aaa;#这里填写对应cer文件路径,在原有文件中有相关字段
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
location / {
resolver 8.8.8.8;
proxy_ssl_server_name on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass https://$host:aaaa;
}#通过这段将相关请求转发至主机的aaaa端口
}
重启lnmp服务
3、下载最新版frp脚本(https://github.com/fatedier/frp/releases)。解压、设置自动运行不赘述。
删去frpc相关内容,只留下frps相关。编辑frps.ini。
[common]
bind_addr = vps ip地址
dashboard_addr = vps ip地址
bind_port = 任意非占用端口
kcp_bind_port = 同上端口
token = 任意密码(用于frp连接)
vhost_http_port = eeee(任意非占用端口)
vhost_https_port = aaaa(同2、中的aaaa)
tcp_mux=true
dashboard_port = 任意非占用端口
dashboard_user = 任意用户名
dashboard_pwd = 任意密码(用于登录面板)
载入frps.ini文件,启动frps服务。可通过访问vps ip:面板端口来获知frps服务运行状态。
客户端:
1、lnmp一键包搭建nginx环境。通过脚本命令直接添加虚拟主机。期间,通过Letsencrypt获得自动续期的免费SSL证书。
当然,因为域名未解析至此,故证书申请必定失败。
2、将vps端的证书复制到相应目录。(因证书到期会失效,此处可通过计划任务使客户端自动从vps端获取证书,此处不赘言)
3、编辑对应虚拟主机的conf文件。
server
{
listen cccc ssl http2; #cccc是任意没有被占用的端口
#listen [::]:443 ssl http2;
server_name cccc.cccc.cccc; #你的域名
index.html ;
root /????/????/????; #虚拟主机路径
ssl_certificate /usr/local/nginx/conf/ssl/????/????; #从vps复制过来的证书文件,注意权限
ssl_certificate_key /usr/local/nginx/conf/ssl/????/????; #从vps复制过来的证书文件,注意权限
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_session_cache builtin:1000 shared:SSL:10m;
include rewrite/none.conf;
include enable-php-pathinfo.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/????; #log路径,可有可无
}
4、下载最新版frp脚本(版本需与vps端一致)。解压、设置自动运行不赘述。
删去frps相关内容,只留下frpc相关。编辑frpc.ini。
[common]
server_addr = vps ip地址
server_port = 任意非占用端口,同vps端的bind_port
log_max_days = 3
token = 任意密码,同VPS端
tcp_mux = true
protocol = tcp
[任意服务名]
type = https
local_ip = 127.0.0.1
local_port = cccc (同客户端conf文件中的)
use_encryption = false
use_compression = true
custom_domains = cccc.cccc.cccc; #你的域名
[其他任意服务名]
type = https
local_ip = 127.0.0.1
local_port = dddd(客户端nginx也可以再增加其他的虚拟主机)
use_encryption = false
use_compression = true
custom_domains = dddd.dddd.ddd
至此,主要技术节点总结完毕。
补遗:
1、安装lnmp前务必apt-get update,否则较大几率安装失败
2、在服务无法正常运行时,可通过观察frp面板内的连接状况分析frp是否连通,进而排除frp故障。
3、通过systemctl设置树莓派自动运行frpc时出现network unreachable。可通过
Service下加
Restart=0n-failure
RestartSec=5s
尝试解决。
另外也可以通过选中树莓派桌面中的设置首选项中的网络连通后完成启动选项尝试解决(未验证)。
4、树莓派搭建的wordpress使用了腾讯cos插件,在从http转为https后需要将路径全部更新一遍。另外自定义主题与其他插件中的部分相关连接有可能需要手动更新才能正常使用。
5、frp、nginx修改后注意重启相关服务
特别鸣谢:
fatedier (https://github.com/fatedier)
Raymond Zhou(https://blog.ray8.cc/archives/frpc-frps-nginx-real-ip-https-rewrite-ssl-cert-pure-code.html)
↑ 这位大佬的教程极为详细专业,但不知为何我照此执行下来,会出现502错误,或者资源文件无法载入的问题。
鸣谢:
Tony Chyi Φ 坐等《我为歌狂2》
Lwrless(网绿 t.me/LWRLESS_FANS)
寒雪
