部署frp服务器发布内网服务并获取免费ssl证书

本文适用对象

  • 不想花冤枉钱搭建一个自己的服务器
  • 能够在本地搭建好服务并且能够通过 localhost 访问
  • 有一台可以访问互联网的服务器 (例如腾讯云、阿里云)(如果没有建议花点小钱买一个)
  • 有一个自己的域名(必需品,可以在各种云上买到,记得备案哦)

云端搭建frps服务

基础配置

这里建议云服务器安装linux系统,操作更简单

frp github发布页找到对应的架构,右键复制链接地址

在云服务器上执行(这里以amd64为例)

1
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz

下载完成后解压

1
tar -zxvf frp_0.51.3_linux_amd64.tar.gz

然后进入解压后的文件夹,修改配置文件 frps.ini ,在里面输入一下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[common]
bind_port = 7000
vhost_http_port = 80
vhost_https_port = 443
token = your_token
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = user_name
dashboard_pwd = your_password
enable_prometheus = true

# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3

记得修改 your_tokenuser_nameyour_password 为自己的相关信息,注意token和password要长一点,保密性能更好,然后保存退出。

如果你对于安全性有更高的要求,可以把端口也自定义一下

配置systemd启动服务

参考文章:frp官网示例

没什么坑所以跳过,在完成之后使用命令

1
sudo systemctl status frps.service

查看一下服务状态,如果是active(running)就说明启动成功了

开放云服务器对应端口

记得去云服务器的控制面板修改防火墙设置,把你上面配置的端口bind_portvhost_http_portvhost_https_portdashboard_port 都开放出来,不然外网是访问不了的

开放完之后可以考虑用本地的浏览器访问一下 http://你的云服务器ip:dashboard_port(注意,这里要把你的dashboard_port换成你自己填的值) ,如果能够正常访问就说明配置成功了

使用let’s encrypt申请证书

这里不建议在windows下面运行certbot,建议在windows下面运行

如果你是ubuntu系统,参考官网教程certbot官网教程安装

其他的系统也可以在官网找到相关命令

然后运行命令

1
sudo certbot certonly -d your_domain --manual --preferred-challenges dns

回车之后输入对应的信息,然后会提示你添加一条txt记录到你的域名解析里面(添加的时候记得类型为txt),添加完之后等待一会儿,然后回车,如果成功了就会在 /etc/letsencrypt/live/your_domain/ 下面生成证书文件

本地搭建frpc服务

同理,在本地下载对应架构的frp软件包,解压,此处以windows为例windows下载地址

建议在解压完之后的文件夹里面新建一个文件夹,用来存放证书文件

把上一步生成的证书文件复制到文件夹下面,注意,虽然生效的证书在 /etc/letsencrypt/live/your_domain/ 下面,但是那里面的文件只是一个软链接,所以要把软链接指向的文件复制过来,不要复制软链接,查看指向的文件的方式ls -l

解压后进入文件夹,修改配置文件 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
24
25
26
27
28
29
[common]
server_addr = server_ip_address
server_port = 7000
token = your_token

[sd_http]
# 依然支持 http 访问
type = http
# 本地 web 服务的端口
local_port = your_local_port
# 需要反向代理的域名(当访客通过此域名访问 a 机器时,才会将请求反向代理到此 web 服务)
custom_domains = your_domain

[sd_https]
type = https
local_ip = 127.0.0.1
local_port = your_local_port
custom_domains = your_domain

plugin = https2http
plugin_local_addr = 127.0.0.1:your_local_port

# 可能是 frp 的 bug?这里必须写成 127.0.0.1,稍后解释
plugin_host_header_rewrite = 127.0.0.1
# https 证书相关的配置
plugin_crt_path = ./certificate/your_domain/fullchain1.pem
plugin_key_path = ./certificate/your_domain/privkey1.pem
plugin_host_header_rewrite = 127.0.0.1
plugin_header_x-from-where = frp

然后用命令行运行 ./frpc.exe -c frpc.ini ,如果没有报错就说明配置成功了

向域名添加解析

在控制面板添加一个指向你云服务器地址的解析,类型为a,主机记录自己看着办

在浏览器里面测试一下就完结撒花咯

错误排查

  • 如果你的隧道启动成功,本地服务也正常,但是显示502错误或者重定向错误,可能是你的域名没有备案,运营商ban了你的80端口或者443端口,你可以考虑先把端口改掉,改成8080之类的,然后再访问。正规解决方案是去备案,这里就不做过多介绍了