发布于 

FRP内网穿透,搭配Nginx实现https代理

环境需要

偷懒直接使用宝塔面板,或者mdserver-web,面板主要是方便配置Nginx

域名解析到服务端IP

面板搭建

这里演示我搭建的是开源的mdserver-web

一键安装脚本

1
curl -fsSL https://cdn.jsdelivr.net/gh/midoks/mdserver-web@latest/scripts/install.sh | bash

安装成功后会显示登录信息,登录后及时修改登录信息

安装OpenResty,OpenResty是基于 Nginx 与 Lua 的高性能 Web 平台,宝塔直接安装Nginx就行。

域名解析

配置例如*.abc.com的泛域名,记录*指向frp 服务器地址.其含义是指访问任何二级域名都是访问到frp 服务器,由frp 服务器转发到内网群晖反向代理服务器.

FRPs服务器搭建

下载服务端

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

解压frps到/usr/local/frp目录下

1
tar -zxvf frp_0.45.0_linux_amd64.tar.gz -C /usr/local/

重命名解压后目录

1
cd /usr/local&mv frp_0.45.0_linux_amd64 frp

启动frps

使用systemd控制frps开机自启动

新建frps.service文件

1
nano /etc/systemd/system/frps.service

写入内容

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /usr/local/frp/frps -c /usr/local/frp/frps.ini

[Install]
WantedBy = multi-user.target

使用 systemd 命令,启动并管理 frps。

1
2
3
4
5
6
7
8
# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps

配置 frps 开机自启。

1
systemctl enable frps

配置服务端frps.ini nano /usr/local/frp/frps.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[common]
#服务监听的ip
bind_addr = 0.0.0.0
#服务监听端口
bind_port = 4439
#访问web服务需要用到的端口
vhost_http_port = 8001
#https需要用到的端口
vhost_https_port = 4438

####web界面配置###
# 指定 Dashboard 的监听的 IP 地址
dashboard_addr = 0.0.0.0
#指定 Dashboard 的监听的端口
dashboard_port = 8000
# 指定访问 Dashboard 的用户名
dashboard_user = admin
# 指定访问 Dashboard 的端口
dashboard_pwd = admin

#防止被随意注册
token = 123456

# 日志的记录级别,分为debug, info, warn, error四级,日志保存的天数,默认3天
log_file = ./frps.log
log_level = info
log_max_days = 3

# 心跳配置,默认的心跳配置时间是30
heartbeat_timeout = 30
#frp内网穿透服务端监听的端口,如果不设置的话,所有端口都可以连接使用,但为为了不占用系统使用的端口号,建议设置允许的监听端口,比如www.abc.com提供的内网穿透服务器就是开放50000-60000端口
#privilege_allow_ports = 2000-3000,3001,3003,4000-50000

#连接池的数量,如果frp内网穿透客户端设置的连接池的数量大于下面的数值,就会修改frp客户端的连接池为下面的数值
max_pool_count = 100
# 每个客户端最大可以使用的端口,0表示无限制
max_ports_per_client = 0

# frp内网穿透服务端frps和frp内网穿透的客户端frpc两台电脑的时间差,如果设置为0的话,不校验时间差异,默认校验时间差为900秒。
authentication_timeout = 900

# 是否使用tcp复用,默认为true;
# frp只对同意客户端的连接进行复用;
tcp_mux = true

配置完成后systemctl restart frps重启服务器

至此服务端搭建完毕

FRPc客户端搭建

还是偷懒直接使用套件源安装,群晖套件中心添加社区套件来源。其他安装方式推荐参考此文章客户端 frpc 安装教程汇总 - 思有云 - IOIOX

1
https://spk7.imnks.com/

搜索frpc安装好

打开套件配置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
[common]
server_addr = 0.0.0.0 #服务端ip,也可填写解析好的域名
server_port = 7007 #服务端的bind_port一致
token = 12345678 #与服务端一致

#[xxx]内的备注内容不能重复
[tcp-xxxx]
type = tcp #tcp的代理方式
local_ip = 192.168.1.110 #内网主机ip
local_port = 6690 #内网主机端口
remote_port = 6690 #外网映射端口

[http_xxxxxxx]
type = http #http的代理方式
local_ip = 192.168.1.4 #内网主机ip
local_port = 80 #内网主机端口
custom_domains = *.abc.com #任意二级域名

##使用服务端nginx强制http跳转https这里可以直接不配置https##
#[https_xxxxxxx]
#type = https #https的代理方式
#local_ip = 192.168.1.4 #内网主机ip
#local_port = 443 #内网主机端口
#custom_domains = *.abc.com #任意二级域名

至此客户端配置完成,点击保存frpc套件会自动重启生效

浏览器登录服务端web后台ip:6443可以看到已经代理生效了

image-20221118192329579

服务端面板配置https代理

前面环境确认已安装好nginx或OpenResty运行环境

配置ssl证书

新建一个站点

面板不支持泛域名证书申请,建议参考此文章部署acme.sh,申请免费SSL证书 - ZM Blog (b-log.ga)申请一个泛域名SSL证书

cat部署好的证书cer、key

查看到的证书内容复制cer、key到面板站点ssl配置并部署

查看面板站点配置文件,找到ssl配置后存放的路径

使用下面acme.sh部署命令,部署刚刚申请的证书,这样证书到期了acme.sh就会自动续签并更新到该路径下

注意替换自己的域名、路径

1
2
3
acme.sh --install-cert -d *.abc.com \
--key-file /etc/letsencrypt/live/*.abc.com/privkey.pem \
--fullchain-file /etc/letsencrypt/live/*.abc.com/fullchain.pem \

域名匹配到frps服务

配置文件在server块插入以下location块,表示该域名匹配代理到本机的8010端口8010端口即frps的http访问端口

1
2
3
4
location / {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8010;
}

在配置文件中找到以下两个location块删除,不然网页会显示不正常

重启会重载nginx后
至此访问一个frp代理的http网页,就会自动成功跳转到htpps。