用Frp实现外网访问NAS

前言

因为有在外面访问家里 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 官网说明文档比较详细,可以参考。
  • 服务器端配置
  1. 登录服务器,在 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
  2. 使用 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 相关文件。
  1. 进入 frp 目录
    cd frp_0.26.0_linux_amd64
  2. 删除不必要的客户端文件
    rm -f frpc frpc_full.ini frpc.ini
    rm -f frpc* //会把所有以frpc开始的文件都删除
  3. 配置服务器端文件
    vim frps.ini
  4. 编辑配置文件
bind_port = 7000
vhost_http_port = 5000
dashboard_port = 7500
dashboard_user = 用户名
dashboard_pwd = 密码
max_pool_count = 5
authentication_timeout = 900

[ssh]
listen_port = 6000
auth_token = 和客服端 token 对应

简单解释如下:点击官方

[common] 必填的
bind_port Frp 服务端口(可自定义)
vhost_http_port http 访问端口(可自定义)
dashboard_port dashboard 界面端口
dashboard_user 登录 dashboard 用户名
dashboard_pwd 登录 dashboard 密码
max_pool_count 最大连接池数量
authentication_timeout 超时验证时间

[ssh]       服务器不设置也可以用
listen_port ssh 访问端口
auth_token 用户身份认证
  1. 保存上面配置文件,启动 frp 服务器
    ./frps -c ./frps.ini
    如果要后台运行:
    nohup ./frps -c ./frps.ini &
  • 客户端配置
    客户端就是您本地需要做外网服务的设备,可以是 PC、Mac、NAS、路由器、或者虚拟机里的 liunx 系统。
    这篇文章主要是利用 Frp 技术访问在群晖 NAS 服务的应用。实例也是 NAS 系统
  1. 下载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
  1. 保存,运行
    ./frpc -c ./frpc.ini
    如果要后台运行:
    nohup ./frpc -c ./frpc.ini &
    注意:此时frpc会通过7000端口尝试与frps建立通信连接,如果一切顺利,则终端会提示连接成功(start proxy sucess);但实际情况却显示连接失败,因为还少了两个步骤:
  • 阿里云、腾讯云需要登陆控制台将60007000805000端口加入安全组规则放行。
  • 检查服务器防火墙是否打开,防火墙要允许60007000805000这几个端口放行。

扩展

通过上面在终端直接启动frps的方式,会占用终端,并且停止和重启等管理操作也不方便。

为了方便管理frps的启动、停止、重启和开机自启,我们需要将frps添加为系统service,通过systemd守护程序来管理。

在frp_0.26.0_linux_amd64目录里的systemd目录下,已经为我们准备好了添加service的模板:

frpc.service
[email protected]
frps.service —— 服务端使用此模板
[email protected]
  1. 进入目录/root/frp_0.26.0_linux_amd64/systemd,编辑frps.service:
cd /root/frp_0.26.0_linux_amd64/systemd
vim frps.service
  1. user=nobody改为user=root,并保存
    注:root表示运行frps的用户
  2. 其中服务运行配置项为: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
  1. 将frps.service移动到/etc/systemd/system目录
    mv ~root/frp_0.26.0_linux_amd64/systemd/frps.service /etc/systemd/system
  2. 完成以上步骤,我们就可以愉快使用systemctl管理frps了:
    启动frps:systemctl start frps
    停止frps:systemctl stop frps
    重启frps:systemctl restart frps
    查看frps状态:systemctl status frps
    开机启动frps:systemctl enable frps
    同样地本机也可以通过这种方式将客户端程序frpc添加为service进行管理。

参考资料

【1】如何用 Frp 实现外网访问群晖 NAS
【2】frp官方中文说明
【3】使用frp搭建内网穿透
【4】群晖 Docker版的frp客户端配置详解

你可能感兴趣的:(用Frp实现外网访问NAS)