内网穿透系列文章索引:
内网穿透话题 实际上已经写过很多了,从服务器,到路由器,从硬盘,到计算机、自制监控,穿透应用场景基本覆盖了包括组网、存储、下载、开机在内的各大情形,基本上能够替代Nas的大部份功能。但是没有Nas穿透的系列始终是不完整的,今天将以群晖系统为例,通过Frp,实现Nas各大服务(包括但不限于ssh服务、DSM服务、移动端DS file、WebDAV Server磁盘映射)的远程访问。
【ssh】(本地默认端口:22)
自定义访问端口:2222
【DSM服务】(本地默认端口:5000-http 5001-https)
自定义访问端口:443
【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端口
【举一反三:http项目】(本地默认端口:x)
自定义访问端口:x【通过https的x端口访问http的x端口】
根据访问需求,我们需要用到443端口即https服务,因此域名需要申请到https证书。这里以腾讯云为例,我们申请一个免费ssl证书。
证书申请完毕后,将证书导入nas中,“控制面板”——“安全性”——“证书”——“新增”——“添加新证书”——“导入证书”同时设置为“默认证书”,将下载下来的证书Apache目录内三项分别上传
确认后点击配置
,确保全部成为默认证书。
防火墙开放自定义访问端口以及客户端与服务端进行通信的7000端口、控制台7500端口。
服务端(frps)和客户端(frpc)需要相同版本,因此在部署前,需要慎重决定下载的版本号。这里我们用0.35.1这一版本进行部署。
wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_amd64.tar.gz
tar -zxvf frp_0.35.1_linux_amd64.tar.gz #解压缩:tar xvf 文件名
cd frp_0.35.1_linux_amd64 #进入解压目录
#修改frps.ini文件
sudo vim ./frps.ini
添加以下内容:
[common]
bind_port = 7000 # 客户端与服务端进行通信的端口,即frp服务端口,需与客户端server_port一致
dashboard_port = 7500 # 控制台端口 通过 Dashboard 可以方便的查看 FRP 的状态以及代理统计信息展示 通过 http://[server_addr]:7500 访问 Dashboard 界面,用户名密码默认都为 admin。
#后台保持启动 需要在frp_0.35.1_linux_amd64目录下操作
nohup ./frps -c ./frps.ini &
返回:nohup: ignoring input and appending output to ‘nohup.out’ 代表执行成功,ctrl+c关闭即可;用ps -ef 会在进程中看见frp工作进程。
ps -ef |grep frpc
kill -9 [进程号]
设置为开机自动启动
sudo vi /lib/systemd/system/frps.service
[Unit]
Description=frps daemon
After=syslog.target network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/root/frp_0.35.1_linux_amd64/frps -c /root/frp_0.35.1_linux_amd64/frps.ini
Restart= always
RestartSec=1min
[Install]
WantedBy=multi-user.target
ExecStart中要配置成自己的路径
#启动frps
systemctl start frps
#将frps设置为开机启动
systemctl enable frps
sudo vi /lib/systemd/system/frps.service 实际上lib或者etc目录皆可。
创建frpc.ini文件添加以下内容(后文会详细说明):
[common]
server_addr = nas.dengxj.net
server_port = 7000
[ssh]
type = tcp
local_ip = 必须填内网地址,不能填127.0.0.1
local_port = 22
remote_port = 2222
[dsm]
type = tcp
local_ip = 192.168.1.208(内网地址)
local_port = 5001
remote_port = 443
[ds_file]
type = tcp
local_ip = 192.168.1.208(内网地址)
local_port = 5001
remote_port = 5001
[https_webdav]
type = tcp
local_ip = 192.168.1.208(内网地址)
local_port = 5006
remote_port = 5007
[http_webdav]
type = tcp
local_ip = 192.168.1.208(内网地址)
local_port = 5004
remote_port = 5005
用docker下载与服务端版本一致(0.35.1)的frpc。“docker”——“注册表”——“frpc”——选择合适版本安装
下载完成后——“映像”——双击安装——自定义名称——高级设置——卷——导入frpc.ini,装载路径:/etc/frp/frpc.ini ——应用
【终端机和 SNMP】>【启动ssh功能】>勾选
【用户账号】>【开启admin】
通过内网ip+22端口
,admin用户身份ssh登陆,sudo -i提权至root
进行穿透后:对应frpc文档中:
[ssh]
type = tcp
local_ip = 192.168.1.208
local_port = 22
remote_port = 2222
通过公网ip+2222端口
,admin用户身份ssh登陆,sudo -i提权至root
【网络】>【DSM设置】>勾选“将HTTP连接自动重新导向到HTTPS”
进行穿透后:对应frpc文档中:
[dsm]
type = tcp
local_ip = 192.168.1.208
local_port = 5001
remote_port = 443
通过https://域名
形式直接访问,测试:
DS file远程访问要求格式为域名+端口
的形式,当前nas的5001端口穿透为了服务器的443端口,由于443是https的默认端口,正常登陆将隐藏443的显示,这将导致DS file无法实现远程访问。因此我们可以为nas的5001端口再穿透一个服务器端口,以解决443端口被隐藏的问题。
具体而言,对应frpc文档中:
[ds_file]
type = tcp
local_ip = 192.168.1.208
local_port = 5001
remote_port = 5001
保存后重启【frpc】docker,服务器开放5001端口。
远程磁盘映射至本地,能够远程通过磁盘访问的方式访问nas,方便文件的管理。首先前往WebDAV Server套件开启https端口5006
其次修改frpc.ini(对应frpc文档中[https_webdav]),新增穿透;重启docker;服务器放行remote_port端口
[https_webdav]
type = tcp
local_ip = 192.168.1.208
local_port = 5006
remote_port = 5007
开启admin账号,安装NetDrive2,用服务器ip+5007
的admin权限连接WebDAV,并将其映射至驱动。
Jellyfin等项目强制http协议访问,双重反向代理可以解决这一问题,这里还是以免费套件WebDAV Server远程访问为例,我们只开放http端口5005。
修改frpc.ini(对应frpc文档中[http_webdav]),新增穿透;重启docker;服务器放行remote_port端口
[http_webdav]
type = tcp
local_ip = 192.168.1.208
local_port = 5004
remote_port = 5005
【Synology 应用程序门户】>【反向代理服务器】>“如图填写”。
这意味着在通过https协议采用“域名+5005端口”的方式访问https协议下nas的5004端口后,nas中的反向代理规则又将https协议下nas的5004这一端口转为http协议下nas的5005端口,换言之,即通过https协议采用“域名+5005端口”的方式最终访问的是http协议下nas的5005端口内容。
安装NetDrive2,用https协议+服务器ip+5005
的admin权限连接WebDAV,并将其映射至驱动。
迁移网络环境后,服务端无需修改,nas端只需在固定内网ip后,修改frpc.ini文件中local_ip
为新局域网下内网ip,并重启docker即可。
至此,本文也就进入尾声了。希望本文能够起到抛砖引玉之效,也欢迎大家的批评交流。新年即将到来,在此也祝各位新年快乐,健康如意!
如果您有任何疑问或者好的建议,期待你的留言、评论与关注!