前言
- 本文主要讲述frp结合nginx进行内网穿透,并实现多子域名转发以及https访问
环境准备
- 带公网IP的云服务器1台(我这里使用的是阿里云轻量应用服务器)
- 已备案域名1个
- 软路由 or 待穿透设备
- frp
- nginx
服务端frps
- 我们首先在服务器下载frp(下载速度慢的话可以手动从GitHub上下载,然后上传到服务器)
wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz
- 进行解压
tar -zxvf frp_0.48.0_linux_amd64.tar.gz
- frp 服务端配置
vim frps.ini
[common]
# 服务器端监听客户端连接请求的端口
bind_port = 17000
token = mytoken
# 服务器端监听http请求的端口(由于80端口被nginx占用,因此指定其他端口)
vhost_http_port = 17080
# 服务器用以显示连接状态的站点端口,以下配置中可以通过访问IP:17500登录查看frp服务端状态等信息
dashboard_addr = 0.0.0.0
dashboard_port = 17500
# dashboard对应的用户名/密码
dashboard_user = user
dashboard_pwd = pwd
# 二级frp域名 三级sub子域名做saas
# 如果 frps 配置了 subdomain_host,则frpc中想自定义custom_domains 中不能是属于 subdomain_host 的子域名或者泛域名。
subdomain_host = frp.xxxx.com
# 日志文件路径
log_file = ./frps.log
# 日志记录错误级别,分为:trace, debug, info, warn, erro
log_level = warn
# 日志保存最大天数
log_max_days = 3
这里配置文件要注意以下几点
bind_port
: frp绑定端口,默认是7000,我这里改为了17000token
: 客户端连接时的token,建议添加(后面客户端配置会用到)vhost_http_port
: http监听端口,默认80,我这里改为了17080dashboard相关配置
: 可设置可不设置,访问对应端口会有一个frp的看板页面subdomain_host
: 二级frp域名,后面我们可以将多个需要穿透的服务映射到三级域名
- 配置启动命令
vim /lib/systemd/system/frps.service
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/root/frp/frps -c /root/frp/frps.ini
[Install]
WanteBy=multi-user.target
- 这里需要注意的是
ExecStart
命令中frps的路径和frps.ini的路径要修改成自己的 - 配置完成后,我们运行
systemctl start frps
命令即可启动frps,再执行systemctl enable frps
实现开机自启
nginx配置(实现多子域名转发)
在配置nginx之前我们还有两件事需要做
- 一是域名DNS解析,我们要添加两条解析记录
| 主机记录 | 记录类型 | 记录值 |
| - | - | - |
| frp | A | 服务器IP |
| *.frp | A | 服务器IP |
- 二是服务器防火墙端口开放:17000端口、17500端口、17022端口(后面配置ssh会用到),17080端口不必开放,我们下面会通过nginx进行反代
- nginx的下载安装我这里就不做演示了,我们直接进行nginx配置
- 不需要https访问话直接用下面配置就可以
server {
listen 80;
server_name *.frp.xxx.com frp.xxx.com;
location / {
proxy_pass http://127.0.0.1:17080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- 接下来讲https访问如何配置(不需要可跳过此部分)
- 首先我们要申请通配符域名ssl证书,这里我用的是 ohttps 网站,网址是 ohttps.com,大家也可以自行选择,输入域名(*.frp.xxx.com) 进行证书申请即可,申请成功后,会生成一个cer文件和一个key文件,下载后上传到服务器即可
- nginx配置如下
server {
listen 80;
server_name ql.frp.xxx.com;
rewrite ^(.*) https://ql.frp.xxx.com$1 permanent;
}
server {
listen 80;
server_name openwrt.frp.xxx.com;
rewrite ^(.*) https://openwrt.frp.xxx.com$1 permanent;
}
server {
listen 443;
server_name *.frp.xxx.com;
ssl on;
root html;
index index.html index.htm;
ssl_certificate conf.d/cert/*.frp.xxx.com/*.frp.xxx.com_chain.cer;
ssl_certificate_key conf.d/cert/*.frp.xxx.com/*.frp.xxx.com_key.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:17080;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}
}
- 上面两个80端口的监听是为了跳转到443,这里我使用
*.frp.xxx.com
通配跳转会将三级域名编码,所以只能分开写了 - 另外还需要注意
ssl_certificate
和ssl_certificate_key
对应的是你的cer和key文件的存放地址 - 配置完成后重载配置文件或者重启nginx即可
客户端frpc
- 我使用的openwrt是默认有安装frp的,没有的话安装方式同服务器端,或者也可以使用docker安装: https://hub.docker.com/r/chenhw2/frp
- 安装过程我就不演示了,我们直接编写
frpc.ini
配置文件
[common]
server_addr=xxx.xxx.xxx.xxx
server_port=17000
token=mytoken
user=ruochen
log_level=info
log_max_days=3
protocol=tcp
log_file=/var/etc/frp/frpc.log
tcp_mux=true
tls_enable=false
login_fail_exit=false
[ssh]
type=tcp
remote_port=17022
local_ip=192.168.11.1
local_port=22
use_encryption=true
use_compression=true
[openwrt]
type=http
subdomain=openwrt
local_ip=192.168.11.1
local_port=80
use_encryption=true
use_compression=true
[ql]
type=http
subdomain=ql
local_ip=192.168.11.1
local_port=5700
use_encryption=true
use_compression=true
[common]
参数要注意以下几点server_addr
: 填写你服务器的ip即可server_port
: 对应frps的bind_port
token
: 对应frps的token
user
: 用户标识,加不加都无所谓
[common]
下面就是每个服务的配置,要注意服务名称是唯一的,不能重复我们看一下
[ssh]
的配置type
: 协议类型remote_port
: 远程端口,也就是frps所在服务器端口local_ip
: 需要穿透的本地iplocal_port
: 本地端口use_encryption
: 开启数据加密,将frpc与frps之间的通信内容加密传输,将会有效防止流量被拦截use_compression
: 使用压缩,压缩传输内容,加快流量转发速度,会额外消耗CPU资源- 通过上述配置后,我们就可以通过
服务器ip+17022
访问到我们的本地设备终端
然后我们再讲一下
[openwrt]
配置subdomain
: 三级子域名- 其他配置同
[ssh]
- 这里我配置了三级子域名,由于我们前面使用nginx反代了17080端口,我们就可以直接通过
openwrt.frp.xxx.com
访问我们的网站
[ql]
的配置类似,这里就不过多阐述了
总结
- 通过以上配置,我们就实现了frp与nginx结合的多子域名内网穿透,大家如果有更多的设备(nas之类的)想要内网穿透,继续在frpc配置文件中添加配置即可