【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证书。15.png

如何使用腾讯云申请免费SSL证书,不再赘述。

16.png

群晖中web Station设置需要注意的两个地方如下:(这两个需要根据你网站相关设置来设置)

5.png

证书上传绑定NAS

证书申请完毕后,将证书导入nas中,“控制面板”——“安全性”——“证书”——“新增”——“添加新证书”——“导入证书”,将下载下来的证书Apache目录内三项分别上传

17.png

群辉7.x版本中,可以指定对应服务使用对应域名证书,设置如下:(群辉6.x只能设置默认证书才能为服务提供https访问)

2022-04-20_005103.png

在完成上述准备工作后,可以正式开始了。

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版本演示。如果遇到搜不到的问题,可以试试在【注册表】中【设置】里【新增】,新增随便一个源,再【使用】,再切回【使用】原来的源,再回去搜索就能搜到最新的了。6.png

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

7.png

5、【网络】里【使用与 Docker Host 相同的网络】打勾

6、启动容器,便可以在刚才配置的控制台dashboard里按刚配置HTTP或者TCP选项里看到此客户端,至此利用frp实现内网穿透。8.png

 

检测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

版权声明:
作者:WaterBear
链接:https://l-t.top/2199.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录