0. 背景知识
NAS
是什么?NAS
的全称是Network Attached Storage
,网络附加存储,说白了就是一个低性能高容量的私有云服务器
NAS
能干什么用?NAS
可以作为家庭影院数据中心,NAS
+ 局域网文件传输协议 + 智能电视 + 家庭影院软件可以实现非常好的家庭观影体验NAS
可以作为私有云服务器,承担例如图床/视频床等功能,也可以建网站
- 怎么做一个
NAS
?- 通常情况下,直接买一个成品
NAS
是一个省心的选择,外观看通常是一个可以插硬盘的盒子,本质是一个PC
- 我更喜欢自己手搓
- 通常情况下,直接买一个成品
1. 手搓 NAS
方案
NAS
手搓需要搞定NAS
本体和网络两大块NAS
本体负责下载数据,保存数据和局域网内数据共享- 网络部分负责让
NAS
本体成为一个公网可访问的设备
NAS
本体用树莓派5
实现是一个不错的选择- 网络部分用光猫桥接 +
DDNS
+ 端口转发方案
2. NAS
本体
硬件
NAS
本体是一个4GB
版本树莓派5
- 一个
32GB
的SD
卡作为系统盘 - 一块
1TB
的USB 3.0
的移动机械硬盘(后续根据需求扩容)
软件
- 操作系统:
Ubuntu 24.04 Desktop arm64
,下载地址- 用
Ubuntu
的好处:社区活跃,遇到问题容易解决 - 坏处:预安装软件很多,比较大
- 用
- 其他软件:根据需求安装,例如:
Samba
局域网共享软件RDP
远程桌面软件Transmission
磁力链接下载器
3. 网络
和 NAS
本体比起来,网络才是手搓 NAS
最难的部分,主要包含如下几个部分
公网 IP
- 选择的宽带运营商是电信,电信的入户光纤是动态公网
IPv4
地址(这一点还是比较良心的) - 光猫默认开启了路由模式,因此路由器的输入已经变成了局域网,为了简化网络拓扑,需要给电信客服打电话要求将光猫改成桥接模式,即光猫只承担光电转换功能,输出端口
IP
和输入端口IP
一致 - 光猫开启桥接模式之后,路由器输入端口变成了公网
IP
,通过PPPoE
拨号上网,同时实测发现,光猫桥接模式下,下载速度更快
DDNS
- 虽然路由器的输入已经变成公网
IP
,但是动态的,几乎每天都在发生变化 - 因此需要用到
DDNS
服务,让动态IP
绑定到静态的域名上,域名之前已购买,只需要在顶级域名之前加上一个A
记录的子域名 - 由于家里用的路由器是小米
be6500 pro
型号,这个路由器本身并不支持腾讯云(dnspod
)的DDNS
服务,所以有两条路可以选:- 刷机到
Openwrt
路由器固件,这个开源固件功能十分强大,但坏处是路由器无法再绑定到米家APP
实现远程控制的一些官方功能 - 另外一种方法是通过某种方法开启路由器的
ssh
权限,登录到路由器内部,在内部开启dnspod DDNS
- 刷机到
- 这里选择了第二种方法,
ssh
开启教程在 这里 - 开启
ssh
后,就可以登录到路由器terminal
,然而路由器使用的是小米自己魔改的XiaoQiang Linux
操作系统,包管理工具以及软件源什么的完全搞不懂,也很难查到相关资料,所以常用的DDNS
服务软件例如ddns-go
什么的也无法正常安装和配置 - 在仔细了解了
DDNS
服务的基本原理之后,决定用SHELL
手写一个DDNS
服务DDNS
的原理(仅在dnspod
服务商上测试过):客户端(路由器)定期检查输入端口IP
,当发现和dnspod
服务商记录的这个域名绑定的IP
不一致时,就给dnspod
发一条修改绑定关系的请求,dnspod
更改后,新的 “域名——IP
” 绑定关系就建立了- 这里涉及到几个关键:
API Token
:上面这个修改过程显然不是任何人都可以改的,你只能修改自己名下的域名绑定的IP
,所以需要一个密钥来和dnspod
服务器交互,这个密钥在https://console.dnspod.cn/account/token/token
创建- 查找域名和记录对应的
ID
:由于dnspod
的DDNS API
要求域名和对应的记录是以ID
的方式描述的,所以需要查到域名ID
和记录ID
- 域名
ID
:curl -s "https://dnsapi.cn/Domain.List" -d "login_token=<your_token>&format=json"
得到输出查询结果- 然后在查询结果中找到名下多个域名中想要查询域名的
ID
- 记录
ID
:curl -s "https://dnsapi.cn/Record.List" -d "login_token=<your_token>&format=json&domain_id=<your_domain_id>&sub_domain=<your_sub_domain>"
得到查询结果- 在查询到的此域名下多条记录中,找到关注的记录
ID
- 域名
- 查询当前
IP
:curl -s http://ipinfo.io/ip
- 更新
DNS
记录:curl -s -X POST "https://dnsapi.cn/Record.Modify" -d "login_token=${API_TOKEN}" -d "format=json" -d "domain_id=${DOMAIN_ID}" -d "record_id=${RECORD_ID}" -d "sub_domain=${SUB_DOMAIN}" -d "record_line=${RECORD_LINE}" -d "record_type=${RECORD_TYPE}" -d "value=${CURRENT_IP}"
- 然后将此
DDNS_update.sh
文件注册到crontab
中,每5
分钟更新一次
- 确实可以正常更新
DNS
,不过忙完之后才发现可以在树莓派上实现,不用自己写SHELL
…
端口转发
- 外网只能访问到路由器,如果想要通过
ssh
实现外网直连树莓派,那么需要在路由器上配置端口转发 - 由于目前只有
SSH
和RDP
两个远程访问需求,所以只开了22
和3389
的TCP
端口转发(开的越少内网设备越安全)
4. 使用体验和后续计划
使用体验
- 用外网可以直连树莓派,可以用
SSH
远程给树莓派下发一些下载任务,也可以用RDP
处理一些需要GUI
的需求 - 设置了移动硬盘开机自动挂载,索尼电视安装
KODI
通过Samba
协议看4K
电影体验很震撼
后续计划
- 开放
http
协议端口,在树莓派上用Nginx
等引擎让树莓派作为个人博客的图床和视频床 - 扩展硬盘架,树莓派外接
16 pin PCIE
转多口SATA
扩展板 ,连接机械硬盘架