前言
因为有在外面访问家里 NAS 的需求,白群晖自带QuickConnect速度也不快,黑群不能用。如果有公网IP(动态),则可以通过设置DDNS来访问。如果没有公网IP,则需要用内网穿透技术来实现通过其他公网 IP 来访问家里的 NAS 设备的需求。所以才有了这篇文章。内容均来自于网络,这里只是整理、记录。
概念解释
- NAS - 简单的说就是一个存储中心。
- Frp - 一种内网穿透技术。
- 内网穿透 - 就是通过其他公网 IP 来访问本地没有公网 IP 网络环境的一个技术。
内网穿透
内网穿透技术众多,比如花生壳内网穿透、Ngrok、Frp 都是现在主流的内网穿透技术。
不少网友认为 Frp 是目前最好用、配置最简单的。
- 花生壳
配置简单方便,比较傻瓜化。但要收费。虽然也有免费版,但由于免费版的流量限制,基本上没有什么实际作用。 - Ngrok
发布时间相对较长,是较为成熟的一种内网穿透技术。这是一个国外的穿透工具,1.0版本是开源的,目前2.0以上版本已经闭源,并且提供免费和收费的服务。由于功能的强大。配置较为繁琐。 - Frp
这是一个国内的开源工具,目前最新版本为0.29.0,有比较详尽的中文文档,并且一直在维护更新。由于frp一直开源,并且维护积极、更新频繁,再加上中文文档加持,本文最终选择了frp作为搭建工具。配置简单,并且适用于各大主流平台设备。
具体过程
- 准备工作
一台有公网 IP 的服务器 (VPS、云主机),这里我的VPS是ubuntu 16.04
NAS (客户端) - 基本步骤
Frp 官网说明文档比较详细,可以参考。 - 服务器端配置
- 登录服务器,在 Release页面 下载自己服务器对应版本 Frp。(这里选择v0.26.0,最新版v0.29.0启动时报错:segmentfault,尚不清楚原因)
wget https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_linux_amd64.tar.gz
- 使用 tar 指令解压 tar.gz 文件
tar -zxvf frp_0.26.0_linux_amd64.tar.gz
解压后都包含以下文件和一个systemd文件夹:
rpc —— 客户端可执行二进制文件
frpc_full.ini —— 包含全部配置项的客户端配置文件
frpc.ini —— 客户端使用的配置文件,包含最简配置
frps —— 服务端可执行二进制文件
frps_full.ini —— 包含全部配置项的服务端配置文件
frps.ini —— 服务端使用的配置文件,包含最简配置
systemd —— 文件夹,用于将frpc和frps添加为服务的配置,linux下使用systemd作为守护程序
注:服务器端只需用到 frps 相关文件,客户端只需用到 frpc 相关文件。
- 进入 frp 目录
cd frp_0.26.0_linux_amd64
- 删除不必要的客户端文件
rm -f frpc frpc_full.ini frpc.ini
rm -f frpc* //会把所有以frpc开始的文件都删除
- 配置服务器端文件
vim frps.ini
- 编辑配置文件
[common]
bind_port = 7000
vhost_http_port = 5000
dashboard_port = 7500
dashboard_user = 用户名
dashboard_pwd = 密码
max_pool_count = 5
authentication_timeout = 900
简单解释如下:点击官方
[common] 必填的
bind_port Frp 服务端口(可自定义)
vhost_http_port http 访问端口(可自定义)
dashboard_port dashboard 界面端口
dashboard_user 登录 dashboard 用户名
dashboard_pwd 登录 dashboard 密码
max_pool_count 最大连接池数量
authentication_timeout 超时验证时间
- 保存上面配置文件,启动 frp 服务器
./frps -c ./frps.ini
如果要后台运行:
nohup ./frps -c ./frps.ini &
- 客户端配置
客户端就是您本地需要做外网服务的设备,可以是 PC、Mac、NAS、路由器、或者虚拟机里的 liunx 系统。
这篇文章主要是利用 Frp 技术访问在群晖 NAS 服务的应用。实例也是 NAS 系统
- 下载frp,删除服务端文件
sudo -i // 切换 root 用户
wget https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_linux_386.tar.gz
tar -zxvf frp_0.26.0_linux_386.tar.gz
cd frp_0.26.0_linux_386
rm -f frps*
2 .编辑 frpc.ini 文件(客户端配置文件)
vim frpc.ini
3. 编辑配置文件如下
[common]
server_addr = ip
server_port = 7000
auth_token = 和服务器端对应
pool_count = 1
[ssh]
type = tcp
local_ip = NAS 局域网ip
local_port = 6000
remote_port = 6000
[nas_dsm]
type = http
local_ip = NAS 局域网ip
local_port = 5000
custom_domains = dsm.yourdomain
[nas_photo]
type = http
local_ip = NAS 局域网ip
local_port = 80
remote_port = 80
custom_domains = photo.yourdomain
简单解释:
[common] 必填的
server_addr 服务器端公网
server_port frp 服务端口,和服务器端 bind_port 一致
auth_token 和前面服务器端 [ssh] auth_token 一致
pool_count 连接池数量
[ssh]
type 服务类型(tcp、http、https、udp)
local_ip NAS 本地局域网内网 ip
local_port NAS 开启 ssh 服务端口号,默认 22,我改为6000
remote_port 服务器端 ssh 端口,和服务器端 [ssh] listen_port 配置一致
[nas_dsm] NAS DSM管理界面
custom_domains = dsm.yourdomain 二级域名,可通过dsm.yourdomain 访问 NAS
type = http 服务类型为 http
local_port NAS 默认端口 5000
[nas_photo] 使用手机DS Photo 访问,没用可以不用设置
type = http 类型为 http
local_ip NAS 本地局域网内网 ip
local_port = 80 NAS web 服务端口
remote_port=80 需要做一个端口转发才可以实现APP登陆,端口自定义
custom_domains = photo.yourdomain 二级域名,手机app ds photo 可通过 photo.yourdomain:remote_port访问
使用自定义二级域名的时候,域名 *.yourdomain 要解析到服务器 IP
- 保存,运行
./frpc -c ./frpc.ini
如果要后台运行:
nohup ./frpc -c ./frpc.ini &
注意:此时frpc会通过7000端口尝试与frps建立通信连接,如果一切顺利,则终端会提示连接成功(start proxy sucess);但实际情况却显示连接失败,因为还少了两个步骤:
- 阿里云、腾讯云需要登陆控制台将
6000
、7000
、80
、5000
端口加入安全组规则放行。 - 检查服务器防火墙是否打开,防火墙要允许
6000
、7000
、80
、5000
这几个端口放行。
扩展
通过上面在终端直接启动frps的方式,会占用终端,并且停止和重启等管理操作也不方便。
为了方便管理frps的启动、停止、重启和开机自启,我们需要将frps添加为系统service,通过systemd守护程序来管理。
在frp_0.26.0_linux_amd64目录里的systemd目录下,已经为我们准备好了添加service的模板:
frpc.service
frpc@.service
frps.service —— 服务端使用此模板
frps@.service
- 进入目录/root/frp_0.26.0_linux_amd64/systemd,编辑frps.service:
cd /root/frp_0.26.0_linux_amd64/systemd
vim frps.service
- 将
user=nobody
改为user=root
,并保存
注:root
表示运行frps
的用户 - 其中服务运行配置项为:
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
,我们需要将二进制文件frps
复制或移动到到/usr/bin
目录,配置文件frps.ini
复制或移动到/etc/frp
目录,而/etc/frp
目录不存在,需要手动创建一个。
3.1. 复制frps
到/usr/bin
目录
cp ~root/frp_0.26.0_linux_amd64/frps /usr/bin
3.2. 创建frp目录,并复制frps.ini
到/etc/frp
目录
cd /etc
mkdir frp
cp ~root/frp_0.26.0_linux_amd64/frps.ini /etc/frp
- 将frps.service移动到/etc/systemd/system目录
mv ~root/frp_0.26.0_linux_amd64/systemd/frps.service /etc/systemd/system
- 完成以上步骤,我们就可以愉快使用systemctl管理frps了:
启动frps:systemctl start frps
停止frps:systemctl stop frps
重启frps:systemctl restart frps
查看frps状态:systemctl status frps
开机启动frps:systemctl enable frps
同样地本机也可以通过这种方式将客户端程序frpc添加为service进行管理。 - windows下使用
winsw
使frp
注册为服务,即可以开机启动。
参考资料
【1】如何用 Frp 实现外网访问群晖 NAS
【2】frp官方中文说明
【3】使用frp搭建内网穿透
【4】群晖 Docker版的frp客户端配置详解