【Frp内网穿透】基于Frp实现群晖的远程访问(ssh、DSM、DS file、WebDAV Server、emby)
本文以群晖系统为例,通过Frp,实现Nas各大服务(包括但不限于ssh服务、DSM服务、移动端DS file、WebDAV Server磁盘映射、emby)的远程访问。这里简要回顾下frp服务原理,如下图:
当外部用户(client)请求访问服务端VPS的时候,服务端VPS是下图中的客户端(实质上是上图中的server)的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器(下图中的客户端)那里去。这样就实现了内网穿透。
即:
Client = 外部用户
proxy = 公网服务器(需要在服务器上搭建FRP服务端)
Server = 内网服务器(需要在服务器上搭建FRP客户端)
准备与规划:
梳理规划公网与内网端口
首先梳理出公网想要访问的服务,自定义清楚访问端口:
【ssh】(本地默认端口:22)
公网自定义访问端口:2222
【DSM服务】(本地默认端口:5000-http 5001-https)
公网自定义访问端口:1443
【DS file】(本地默认端口:5000-http 5001-https)
公网自定义访问端口:5001
【WebDAV Server】(本地默认端口:5005-http 5006-https)
公网自定义访问端口:5007【使用https】
公网自定义访问端口:5005【使用http】
#用https的5007访问WebDAV Server的https的5006端口;用https的5005访问WebDAV Server的http的5005端口
【emby】(本地默认端口:8096-http 不支持-https)
公网自定义访问端口:8096【https双重反代以访问http】
【web项目1】(本地默认端口:http 87 https 88)
公网自定义访问端口:443、80
【通过公网服务器http的80端口访问内网web1站点的http的87端口】
【通过公网服务器https的443端口访问内网web1站点的https的88端口】
【web项目2】(本地默认端口:http 89 https 90)
公网自定义访问端口:443、80
【通过公网服务器http的80端口访问内网web1站点的http的89端口】
【通过公网服务器https的443端口访问内网web1站点的https的90端口】
提前准备的材料:
- 一台公网服务器,域名解析至公网服务器IP(作为FRPS,实现内网穿透);
- NAS一台(我这里使用群晖7.0+系统演示)(作为FRPS) ;
- 为域名申请证书,并上传至NAS 。
根据访问需求,我们需要用到443端口即https服务,因此域名需要申请到https证书。这里以腾讯云为例,我们申请一个免费ssl证书。
如何使用腾讯云申请免费SSL证书,不再赘述。
群晖中web Station设置需要注意的两个地方如下:(这两个需要根据你网站相关设置来设置)
证书上传绑定NAS
证书申请完毕后,将证书导入nas中,“控制面板”——“安全性”——“证书”——“新增”——“添加新证书”——“导入证书”,将下载下来的证书Apache目录内三项分别上传
在群辉7.x版本中,可以指定对应服务使用对应域名证书,设置如下:(群辉6.x只能设置默认证书才能为服务提供https访问)
在完成上述准备工作后,可以正式开始了。
FRP配置
公网服务器端配置
1. 防火墙开放相应端口:
使用命令进行端口开放,同时需要注意公网服务器安全组也需要开放,不然会影响正常访问和连接报错。
防火墙开放自定义访问端口以及客户端与服务端进行通信的9527端口、服务器端控制台7500端口。开放端口命令:(这里示例给出的是开放443端口)
firewall-cmd --add-port=2222/tcp --permanent 添加【ssh】自定义访问端口2222
firewall-cmd --add-port=1433/tcp --permanent 添加【DSM服务】自定义访问端口1433
firewall-cmd --add-port=5001/tcp --permanent 添加【DS file】自定义访问端口1433
firewall-cmd --add-port=5007/tcp --add-port=5005/tcp --permanent 添加【WebDAV Server】自定义访问端口5005、5007
firewall-cmd --add-port=8096/tcp --permanent 添加【emby】自定义访问端口8096
firewall-cmd --add-port=80/tcp --permanent 添加【web项目】自定义访问端口80
firewall-cmd --add-port=443/tcp --permanent 添加【web项目】自定义访问端口443口
firewall-cmd --add-port=9527/tcp --add-port=7500/tcp --permanent 【必添规则】添加FRP监听端口9527和管理端口7500
firewall-cmd --reload 重载规则生效
总结一下:你需要使用哪个端口开通什么服务根据你的规划选择:必开项:
定义的FRP监听端口,我这里开的是9527(FRP程序默认的是7000端口);web服务器端控制台使用FRP默认的7500端口;
定义了web项目使用http和https,这里我设置的公网监听端口80和443,所以这两个端口需要开放。
2、服务端frps配置:
服务端(frps)和客户端(frpc)需要相同版本,安装包是同一个,版本过低会导致一些新特性无法使用。因此在部署前,需要慎重决定下载的版本号。这里我们用最新的v0.41.0 这一版本进行部署。
最新版访问下载地址:https://github.com/fatedier/frp/releases
1、下载并解压
(解压后记得重命名文件夹并移动,可以重命名为frp_0.41.0,记得要和下面的ExecStart里的frp程序路径要对的上。
)
wget https://github.com/fatedier/frp/releases/download/v0.41.0/frp_0.41.0_linux_amd64.tar.gz tar -zxvf frp_0.41.0_linux_amd64.tar.gz #解压缩:tar xvf 文件名 mv frp_0.41.0_linux_amd64 /usr/local/frp_0.41.0 #解压后记得重命名文件夹并移动 cd /usr/local/frp_0.41.0 #进入解压目录
#测试启动命令(需要在 /usr/local/frp_0.41.0 目录下操作)
nohup ./frps -c ./frps.ini &
你也可以使用下面配置服务文件frps.service文件写成服务开机自启
2、配置服务文件
vim /usr/lib/systemd/system/frps.service
[Unit]
Description=frps service
After=network.target remote-fs.target nss-lookup.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/frp_0.41.0/frps -c /usr/local/frp_0.41.0/frps.ini
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
StandardOutput=syslog
StandardError=inherit
[Install]
WantedBy=multi-user.target
其中ExecStart=/usr/local/frp_0.41.0/frps -c /usr/local/frp_0.41.0群晖docker配置frpc/frps.ini改成了解压文件存放的文件路径。
3、重新加载服务的配置文件
systemctl daemon-reload
4、frps服务管理命令
systemctl start frps
systemctl stop frps
systemctl restart frps
systemctl status frps
systemctl enable frps
systemctl disable frps
5、服务端 frps.ini配置
vim ./frps.ini
注意:配置时需要删除注释内容,不然会导致配置内容不生效,或者程序显示乱码问题。
[common]
bind_port = 9527 # 监听端口,客户端与服务端进行通信的端口,即frp服务端口,需与客户端server_port一致
vhost_http_port = 80 # 当客户端配置type为http时使用这个端口访问
vhost_https_port = 443 # 当客户端配置type为https时使用这个端口访问
authentication_method = token # 默认认证方式token
token = waterbeartoken # 认证token,客户端配置对应相同的token
dashboard_port = 7500
#控制台端口 通过 Dashboard 可以方便的查看 FRP 的状态以及代理统计信息展示 通过 http://[server_addr]:7500 访问 Dashboard 界面。
dashboard_user = waterbear # dashboard的用户名
dashboard_pwd = waterbear # dashboard的密码
tcp_mux=true
#默认启用,开启客户端和服务器端之间的连接支持多路复用,不再需要为每一个用户请求创建一个连接,使连接建立的延迟降低,并且避免了大量文件描述符的占用,使 frp 可以承载更高的并发数。
max_pool_count =100 #设置每个代理可以创建的连接池上限,默认为5
log_file = ./frps.log # 日志文件记录位置
log_level = info # 日志级别
log_max_days = 7 # 记录日志天数
群晖docker配置frpc
1、使用docker 启动frpc客户端
docker【注册表】搜frp,现在更新到了0.42.0了,我这里使用0.41.0版本演示。如果遇到搜不到的问题,可以试试在【注册表】中【设置】里【新增】,新增随便一个源,再【使用】,再切回【使用】原来的源,再回去搜索就能搜到最新的了。
2、配置frpc.ini
这里放的路径是我自己新建的文件夹docker/frp
注意:配置时需要删除注释内容,不然会导致配置内容不生效,或者程序显示乱码问题,以下有些是示例,仅供参考。
[ssh]
type = tcp #tcp方式
local_ip = 192.168.199.199 #群晖在内网使用的ip
local_port = 22 #本地端口
remote_port = 2222 #远程端口,也是是外网访问端口
[nas80]
type = http #http方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 5000 #本地端口
custom_domains = 119.29.29.29 #如解析对应域名到公网IP这里填写解析域名,如无域名配置公网服务器ip
[nas443]
type = https #https方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 5001 #本地端口
custom_domains = 119.29.29.29 #如解析对应域名到公网IP这里填写解析域名,如无域名配置公网服务器ip
[DSfile5000]
type = tcp #tcp方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 5000 #本地端口
remote_port = 5001 #远程端口,也就是外网访问端口
custom_domains = 119.29.29.29 #绑定域名,无域名配置服务器ip
[DSfile5001]
type = tcp #tcp方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 5001 #本地端口
remote_port = 5001 #远程端口,也就是外网访问端口
custom_domains = 119.29.29.29 #绑定域名,无域名配置服务器ip
[WebDAV5006]
type = tcp #tcp方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 5006 #本地端口
remote_port = 5007 #远程端口,也就是外网访问端口
custom_domains = 119.29.29.29 #绑定域名,无域名配置服务器ip
[WebDAV5005]
type = tcp #tcp方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 5005 #本地端口
remote_port = 5005 #远程端口,也就是外网访问端口
custom_domains = 119.29.29.29 #绑定域名,无域名配置服务器ip
[emby8096]
type = tcp #tcp方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 8096 #本地端口
remote_port = 8096 #远程端口,也就是外网访问端口
custom_domains = 119.29.29.29 #绑定域名,无域名配置服务器ip
# 以下这种配置方式与frps.ini中配置的vhost_http_port与vhost_https_port相关联,访问绑定域名时使用http://web.l-t.top和https://web.l-t.top访问
[web87]
type = http #http方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 87 #本地端口
custom_domains = web.l-t.top #如解析对应域名到公网IP这里填写解析域名,如无域名配置公网服务器ip
[web88]
type = https #https方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 88 #本地端口
custom_domains = web.l-t.top #如解析对应域名到公网IP这里填写解析域名,如无域名配置公网服务器ip
# 以下这种配置方式与frps.ini中配置的vhost_http_port和vhost_https_port无关,访问绑定域名,如果没有域名使用119.29.29.29:80和119.29.29.29:443访问,
[web89]
type = tcp #tcp方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 89 #本地端口
remote_port = 80 #远程端口,也就是外网访问端口
custom_domains = 119.29.29.29 #绑定域名,无域名配置服务器ip
[web90]
type = tcp #tcp方式
local_ip = 192.168.1.104 #群晖在内网使用的ip
local_port = 90 #本地端口
remote_port = 443 #远程端口,也就是外网访问端口
custom_domains = 119.29.29.29 #绑定域名,无域名配置服务器ip
3、去【映像】里启动,勾上【使用高权限执行容器】,进入【高级设置】。
4、【存储空间】里【添加文件】,选中刚配置好的frpc.ini,装载路径按图中配置/etc/frp/frpc.ini
。
5、【网络】里【使用与 Docker Host 相同的网络】打勾
6、启动容器,便可以在刚才配置的控制台dashboard里按刚配置HTTP或者TCP选项里看到此客户端,至此利用frp实现内网穿透。
检测URL是否正常,否则自动重启frps服务已恢复代理站点访问:具体代码如下:
vim /shell/check_frps.sh
#!/bin/bash
frps_status=200
frps=`curl -I -m 10 -o /dev/null -s -w %{http_code} https://soft.longtao.vip`
if [ $frps -ne $frps_status ];then
systemctl restart frps
echo " $(date '+%T') https://soft.longtao.vip 访问异常,状态码:$frps" >> /shell/check_frps_$(date +%F).log
else
echo " $(date '+%T') https://soft.longtao.vip 访问正常,状态码:$frps" >> /shell/check_frps_$(date +%F).log
fi
定时计划每10分钟检测一次:
*/10 * * * * bash /shell/check_frps.sh
参考文章:
https://gofrp.org/
https://zhuanlan.zhihu.com/p/129076009
https://post.smzdm.com/p/aoowo2kn/
https://blog.csdn.net/iduzy/article/details/122632819