为什么写这篇文章
因为有在外面访问家里 NAS 的需求,群晖自带的动态域名解析访问又太慢(因为群晖自带动态域名的 DNS 服务器在国外)。所以需要用内网穿透技术来实现通过其他公网 IP 来访问家里的 NAS 设备的需求。所以才有了这篇文章。
概念解释
- NAS – 简单的说就是一个存储中心。
- Frp – 一种内网穿透技术。
- 内网穿透 – 就是通过其他公网 IP 来访问本地没有公网 IP 网络环境的一个技术。
内网穿透
内网穿透技术众多,比如花生壳内网穿透、Ngrok、Frp 都是现在主流的内网穿透技术。
但我个人认为 Frp 是目前最好用配置最简单的(经过测试)。
- 花生壳
配置简单方便,比较傻瓜化。但要收费。虽然也有免费版,但由于免费版的流量限制,基本上没有什么实际作用。 - Ngrok
发布时间相对较长,对象较为成熟的一种内网穿透技术。但由于功能的强大。配置较为繁琐。因为折腾许久没有成功过,最后放弃。 - Frp
配置简单,第一次用就配置成功了。并且适用于各大主流平台设备。
具体过程
准备工作
- 一台有公网 IP 的服务器 (VPS、云主机)之前注册了一个国外的 VPS, 准备做内网穿透和 vpn 用,但由于访问速度。果断放弃,最后换成了自己阿里云 ECS。
- NAS (客户端)群晖 DS 416 play
基本步骤
由于 Frp 官网说明文档还是比较详细。我不过多做解释。
服务器端配置:
- 登录服务器,在 Release页面 下载自己服务器对应版本 Frp
wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz
实例中:我的阿里云 ECS 用的 centos7 所以我选择 linux_amd64 64位的
Frp 0.12.0 最新测试版的 - 使用 tar 指令解压 tar.gz 文件
tar -zxvf frp_0.12.0_linux_amd64.tar.gz
- 进入 frp 目录
cd frp_0.12.0_linux_amd64
- 删除不必要的客户端文件
rm -f frpc frpc_full.ini frpc.ini
版本不同可能稍有差异,
frpc 为客户端文件
frps 为服务器端文件 - 配置服务器端文件
vi frps.ini
frps.ini 为服务器配置文件
- 编辑配置文件
[common] bind_port = 7000 vhost_http_port = 8080 dashboard_port = 7500 dashboard_user = 用户名 dashboard_pwd = 密码 max_pool_count = 5 authentication_timeout = 900 subdomain_host = lekee.cc [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
超时验证时间
subdomain_host
自定义二级域名[ssh]
listen_port
ssh 访问端口
auth_token
用户身份认证详细配置
- 保存上面配置文件吗,启动 frp 服务器
./frps -c ./frps.ini
需要后台运行,请看下面
服务端配置结束。
客户端配置
客户端就是您本地需要做外网服务的设备,可以是 PC、Mac、NAS、路由器、或者虚拟机里的 liunx 系统。
这篇文章主要是利用 Frp 技术访问在群晖 NAS 服务的应用。实例也是 NAS 系统。
- SSH 登录群晖 NAS (群晖必须开启 ssh)
ssh nas
我设置过别名,详情查看我的另一篇文章MAC 终端 SSH 别名代替 IP 的方法
ssh nas = ssh user@ip - 下载 Frp, 删除服务端文件。(因为和服务端配置一样,不再一一赘述。)
sudo -i // 切换 root 用户 wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_386.tar.gz tar -zxvf frp_0.12.0_linux_386.tar.gz cd frp_0.12.0_linux_386 rm -f frps frps_full.ini frps.ini
- 编辑 frpc.ini 文件(客户端配置文件)
vi frpc.ini
- 编辑配置文件如下
[common] server_addr = ip server_port = 7000 auth_token = 和服务器端对应 pool_count = 1 [ssh] type = tcp local_ip = NAS 局域网ip local_port = 22 remote_port = 6000 [nas] type = http local_port = 5000 subdomain = nas [web] type = http local_port = 80 subdomain = web
简单解释:
[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
remote_port
服务器端 ssh 端口,和服务器端[ssh] listen_port
配置一致[nas] NAS 管理界面
subdomain
二级域名 nas.lekee.cc 访问 NAS
type = http
服务类型为 http
local_port
NAS 默认端口 5000[web] NAS web Station 服务,没用可以不用设置
type = http
类型为 http
local_port = 80
NAS web 服务端口
subdomain = web
二级域名 web.lekee.cc
使用自定义二级域名的时候,域名 *.lekee.cc 要解析到服务器 IP详细配置
- 保存,运行。(后台运行,请看下面)
./frpc -c ./frpc.ini
此时在服务端会看到”start proxy sucess”字样,即连接成功。
测试运行
ssh 测试
ssh -p 6000 user@服务器ip
user 为你登录群晖 NAS 的用户名
nas 界面
打开浏览器输入 nas.lekee.cc.com:8080
, 显示群晖登录界面成功。
NAS web Station
打开浏览器输入 web.lekee.cc.com:8080
, 显示下面页面成功。
域名后面 8080 端口可以隐藏,下面介绍如何隐藏 8080 端口。
扩展应用
后台运行
后台运行服务的方法有很多,这里只说一种可以在服务器端(Linux)和客户端(NAS)都可以用的 nohup指令
服务器端
nohup ./frps -c ./frps.ini &
客户端
nohup ./frpc -c ./frpc.ini &
自动启动
我的另一篇文章 《frp 自动启动》
隐藏 8080 端口
总结疑问
使用状态
目前使用一切正常,能满足我的日常需求。
在外面需要访问 NAS 里的的文件的时候速度还比较满意。
今天还测试在外面看 NAS 里的视频,也一点都不卡。
我的担心
但我的担心就是在外面观看 NAS 里的视频的时候,流量有点害怕。
因为我现在使用阿里云 ECS 计费方式是按流量计费的。
不知道这样在外面看视频,用阿里云做中转。流量到底是怎么计算的。
还需要进一步探究。不过之前阿里云上预存1000元,都好几个月了。还有999.78元。
展望
这个技术伟大之处就是,只要设备能上网。不管有没有公网 IP,都可以让任何一个能上网的机子访问该设备。该设备可能是一台 PC,一个服务器,一个路由器,一个NAS,一个摄像头,一个… 无限扩展无限衍生,无限可能…
希望本文能您带来帮助!