为什么写这篇文章
因为有在外面访问家里 NAS 的需求,群晖自带的动态域名解析访问又太慢(因为群晖自带动态域名的 DNS 服务器在国外)。所以需要用内网穿透技术来实现通过其他公网 IP 来访问家里的 NAS 设备的需求。所以才有了这篇文章。
概念解释
- NAS - 简单的说就是一个存储中心。
- Frp - 一种内网穿透技术。
- 内网穿透 - 就是通过其他公网 IP 来访问本地没有公网 IP 网络环境的一个技术。
内网穿透技术比较
内网穿透技术众多,比如花生壳内网穿透、Ngrok、Frp 都是现在主流的内网穿透技术。但我个人认为 Frp 是目前最好用配置最简单的(经过测试)。
花生壳
配置简单方便,比较傻瓜化。但要收费。虽然也有免费版,但由于免费版的流量限制,基本上没有什么实际作用。
Ngrok
发布时间相对较长,对象较为成熟的一种内网穿透技术。但由于功能的强大。配置较为繁琐。因为折腾许久没有成功过,最后放弃。
Frp
配置简单,第一次用就配置成功了。并且适用于各大主流平台设备。
具体过程
准备工作
- 一台有公网 IP 的服务器 (VPS、云主机)- 推荐使用阿里云 ECS
- NAS (客户端)- 群晖 DS 416 play
服务器端配置
1. 登录服务器,在 Release 页面下载自己服务器对应版本的 Frp:
wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz
2. 解压 tar.gz 文件:
tar -zxvf frp_0.12.0_linux_amd64.tar.gz
3. 进入 frp 目录:
cd frp_0.12.0_linux_amd64
4. 删除不必要的客户端文件:
rm -f frpc frpc_full.ini frpc.ini
说明:frpc 为客户端文件,frps 为服务器端文件
5. 配置服务器端文件:
vi 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 - 用户身份认证
6. 保存配置文件,启动 Frp 服务器:
./frps -c ./frps.ini
服务端配置结束。
客户端配置
客户端就是您本地需要做外网服务的设备,可以是 PC、Mac、NAS、路由器、或者虚拟机里的 Linux 系统。
1. SSH 登录群晖 NAS(群晖必须开启 SSH):
ssh user@ip
2. 下载 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
3. 编辑 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 - 服务器端公网 IP
- 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 端口
- [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。
4. 保存并运行:
./frpc -c ./frpc.ini
此时在服务端会看到"start proxy success"字样,即连接成功。
测试运行
SSH 测试
ssh -p 6000 user@服务器ip
user 为你登录群晖 NAS 的用户名
NAS 界面
打开浏览器输入 nas.lekee.cc:8080,显示群晖登录界面即成功。
NAS Web Station
打开浏览器输入 web.lekee.cc:8080,显示 Web Station 页面即成功。
扩展应用
后台运行
后台运行服务的方法有很多,这里推荐使用 nohup 指令,可以在服务器端(Linux)和客户端(NAS)都可以使用:
服务器端:
nohup ./frps -c ./frps.ini &
客户端:
nohup ./frpc -c ./frpc.ini &
隐藏 8080 端口
可以通过配置 Nginx 反向代理来隐藏 8080 端口,使用标准 80 端口访问。
自动启动
可以配置为系统服务实现开机自动启动。
总结
使用状态
目前使用一切正常,能满足日常需求。在外面需要访问 NAS 里的文件的时候速度还比较满意。在外面看 NAS 里的视频也一点都不卡。
展望
这个技术伟大之处就是,只要设备能上网。不管有没有公网 IP,都可以让任何一个能上网的机子访问该设备。该设备可能是一台 PC,一个服务器,一个路由器,一个 NAS,一个摄像头,一个... 无限扩展无限衍生,无限可能...
希望本文能给您带来帮助!
常见问题解决
连接被拒绝(connection refused)
检查服务器端防火墙,确保相关端口已开启:7000、8080、7500、6000
连接超时(connection timed out)
检查服务器安全组规则和防火墙设置,确保相关端口已开放。
子域名不支持('.' and '*' is not supported in subdomain)
服务器端的域名应设置为根域名(如 lekee.cc),客户端只需要设置子域名前缀(如 nas、web),不需要包含完整域名。
授权失败(authorization failed)
需要使用 root 用户执行 frpc 命令。

发表评论 取消回复