家用NAS+公网下载搭建

2022-08-17

需求

为了随时随地的可以在家里的任何设备上播放自己想看的视频,家用nas是一个非常不错的解决方案,但是每次下载视频都要等很久,如果可以随时随地的访问家用nas,或者至少随时随地的向家里下载东西,那这样的nas将会是一个不错的方案。

硬件方案

出于捡垃圾的习惯,家里一直有一套梅捷H61板子和4G DDR3 1333的内存在,当然SDD和HDD也是有的,但是不巧的是CPU是G860,如果是65W的TDP,做服务器的话总是有些得不偿失的感觉,因此查了下数据,淘宝入了个i3 2120T。这样服务器的硬件就算整理完成了。

CPU: i3 2120T
主板: 梅捷H61
内存: 2G DDR3 1333 两根
硬盘:128G影驰 SSD + 512G WD HDD
电源:垃圾堆里翻的

软件方案

首先是操作系统,既然是服务器系统,就选择了Centos 9 Stream。 然后是NAS的协议,NAS可用协议有很多种,什么NFS、WebRTC、FTP、SMB。由于是家庭内文件共享,显然NFS不太适合、FTP和WebRTC感觉又不够分量,首当其冲的选择了SMB。 然后是下载的方案,这个下载工具并没有太多好选择的,因为是跑在Linux上而且要支持magnet,wget或者curl都并不合适,只有aria2c可以使用,并且它提供了jsonrpc,可以使用web端来进行访问。 最后,最重要的,是要实现aria2c的公网访问,这样才可以随时随地的往服务器下载东西,鉴于我已经有一台公网服务器,那么现在要做的就是把家里的服务使用公网服务器代理起来,这里又有两个选择,一个是ngrok,另一个是frp,前者部署方便,后者功能强大,鉴于我想代理的可能不止http协议,所以选用frp。

软件实现

操作系统安装。

1、去Centos的官网下载Stream 9的ISO文件,然后使用Ultra ISO刻录到U盘上,插入服务器,选择从U盘启动,就可以进行安装,当然这里会遇到Centos找不到U盘的问题,这里应当参照这篇博客来解决问题。 2、然后就进去了安装界面,这时候设置一下挂载点,比如"/boot/efi"和"/",当然我是没有设置"/swap"的,然后把我的HDD挂载到了"/storage"来作为数据盘。同样需要设置的有安装后的系统后的软件,这里选择最普通的服务器,不需要图形界面的就可以了。 3、到这里安装系统之后,从路由器看下系统的IP,就可以从其他电脑ssh访问这个服务器了。

SMB配置

RHEL安装非常优雅,如果之前安装系统的时候已经选用了SMB服务,那么这个服务就是装好了的。具体安装实现可以参考这篇博客。 这里贴出我的配置:

[global]
        workgroup = SAMBA
        security = user
        passdb backend = tdbsam
        aio read size = 0
[nas]
        comment = Public Nas
        path = /storage
        public = yes
        writeable = yes
        browseable = yes
        guest ok = yes

Aria2c配置

老实说,Centos 9配置这东西有点麻烦,需要编译安装,具体过程不赘述,但是Centos 8是有package的,一键安装就可以了。具体教程可以参考这篇博文。配置文件我也不贴了,只是修改了下文件存储位置到 /storage/Download 而已。 当然这里还有Aria2c完美配置一键脚本在github上,功能更加强大,需要可以自行搜索。

FRP配置

这个是没有一键安装的,需要到github下载一下frp的release,分别放到公网服务器和内网服务器上。 但是配置这个也非常简单,参考官方文档简单配置一下就可以了,注意设置加密和授权。这里贴一下我的配置: 客户端:

[common]
server_addr = 请填写自己的服务器地址
server_port = xxxx

use_encryption = true

token = 请填写自己的密码

tls_enable = true
tls_cert_file = /root/frp/frpc.crt
tls_key_file = /root/frp/frpc.key
tls_trusted_ca_file = /root/frp/rootCA.crt

[aria2]
type = tcp
local_ip = 127.0.0.1
local_port = 6800
remote_port = 6800

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7002

服务器:

[common]
bind_port = xxxx

authentication_method = token
token = xxxxx

tls_only = false
tls_cert_file = /root/ca/servername.crt
tls_key_file = /root/ca/servername.key
tls_trusted_ca_file = /root/ca/rootCA.crt

需要注意的是,这里是配置了TLS加密的,关于如何自建CA并签发证书,可以参考frp的readme的TLS段落,也可以参考Google,这个过程算蛮麻烦的,可以多找几篇博客。

服务应当是开机自启动的

显然SMB只需要systemctl enable smb就可以了,但是frpc和aria2c需要我们自己配置service文件然后enable,那么详细配置service的方法可以参考这篇博文。这里简单贴出我的frpc的service文件,其他的只需要类似就可以了。

[Unit]
Description = frp client
After = network.target network-online.target syslog.target
Wants = network.target
Requires=network-online.target
[Service]
Type = simple
ExecStart = /root/frp/frpc -c /root/frp/frpc.ini

[Install]
WantedBy = multi-user.target

反代后的反代

现在我们可以通过我们服务器的6800端口访问aria2c的jsonrpc来向家里的服务器下载任何东西了,但是这个协议是基于http的,我们将它反代到服务器域名的443下面,这样就实现了aria2c服务的加密。

方案总结

优点:实现简单、成本低,这一套下来除了服务器一共只需要250块左右,可以说是垃圾服务器了,但是确实非常好用。 缺点:我的板子的网卡是百兆的,所以nas速度只有10M每秒,但是问题不大,看个4K也是没问题的。没有容灾策略,很容易爆炸,不过都这个成本了,爆炸也是理所应当把。