为 frp 提供 https 支持

这里我们通过申请 let’t encrypt 的证书并自动更新,实现使用 https 来通过外网访问群辉 nas.

1 准备工具

  • 有固定 ip 的云主机(我选的是阿里云的 ecs)
  • 备案的域名(我选择的是万网上购买的域名,经过实名登记和备案两个步骤)
  • ssh 工具
  • 群辉(ds218+)

2 域名注册/备案

这一步网上有很多教程,我这里就不详细说了,但是如果你是从阿里云或者其他国内大型云服务商购买的域名的话,通过他们来提交备案信息可以加快备案的流程以及成功率,我从发起备案到备案完成一共也就花了不到一天时间.

3.ssl 证书申请/自动续期

用到的工具在这里https://github.com/andyzhshg/syno-acme,大佬的文档也写的很清楚http://www.up4dev.com/2018/05/29/synology-ssl-wildcard-cert-update/
原理就是获取免费证书,然后自动续期,在这个过程中需要验证域名有效性,所以需要为你提供 dns 解析服务的服务商提供的 api key 和 screct 用来修改 dns 解析记录来实现证书验证,需要填写的 ttl 根据自己服务商提供的 ttl 填写即可.自动续期则使用的群辉的定时任务功能,每个月执行一次证书的续期工作.

4.配置

关于 frp 的简单配置可以看https://h123.cf/2019/09/12/2019.09.12.frp/#more
这里我们主要介绍下 frp 上 https 的配置

官方文档:
https://github.com/fatedier/frp/blob/master/README_zh.md

客户端配置

配置 frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; frpc.ini
[common]
; 你的frps 的 ip
server_addr = xxxx
; frps 服务端口
server_port = 7000

#[http_ip]
#type = http
#local_port = 5000
#custom_domains = 你的域名

[https_ip]
type = https
custom_domains = 你的域名
plugin = https2http
plugin_local_addr = 127.0.0.1:5000

# HTTPS 证书相关的配置
plugin_crt_path = crt 文件位置
plugin_key_path = key 文件位置
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp

证书文件格式转换

这里需要注意的是使用上面的方法申请的证书文件为 cer 格式,需要我们手动转变为 crt 格式:

1
openssl x509 -inform PEM -in certificate.cer -out certificate.crt

服务端配置

配置 frps.ini

1
2
3
4
5
6
; frps.ini
[common]
bind_port = 7000
; vhost_https_port为 https 端口
vhost_https_port = 443
dashboard_port = 7500

配置 nginx

配置 nginx 转发 80 端口到 443 端口,实现全站 https

1
2
3
4
5
6
; nginx.conf
server {
listen 80;
server_name www.test.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}

tips

使frpc/frps 在后台运行:

1
2
3
4
5
nohup ./frps -c ./frps.ini &



nohup ./frpc -c ./frpc.ini &

这样日志文件都会保存在同目录下的 nohup.out 文件中,可以在日志文件中查看服务的状态.

同时在修改了配置文件以后,需要把已经运行的进程 kill 掉,再执行上面的命令.

1
2
3
4

ps -ef | grep frpc | grep -v grep | cut -c 9-15 | xargs kill -s 9

# 查找所有 frpc 进程并终止...
thank u !