[2020.02.14]从零开始的低功耗网络存储搭建(NAS)

零 序言

疫情在外,肥宅困家。想起有几部从高中时一直欠下来的番剧,无奈某粉站对其百般删减,遂寻新径。同时,家中设备数与日俱增,几日前又得友赠惠普垃圾板一张,欲入 PT 大坑与赵国奠信一战高下。

一 硬件选择

硬件类型 参数 价格 备注
主板 * 惠普 Godstow R1-C-同学那儿 PY 来的
内存条 三星 DDR3 4G 1333MHz-单条,随主板一起捡来的
处理器 牙膏厂 N3050-功耗约 4 -6W,主板集成
电源 祖传全汉 230W估值 20 大洋 无 SATA 电源接口,需备转接线
硬盘 3TB 容量日立监控盘180 元 / 块 咸鱼捞上水,X2
阵列卡 LSI 9207-8i 推友价 $0已刷 IT 模式
系统盘 32GB SSD40 包邮 国产杂牌
  • 此板大小 17X17,具有千兆网卡、PCI 16x 插槽、俩 SATA 接口,可玩性较高。

硬盘下单后第二天下午就到了,在此感谢疫情中维护城市正常运行的顺丰小哥。纸箱内有减震气垫,两块硬盘装在独立的防静电袋中,硬盘上表面有少许划痕,标签与网图一致,整体感觉较新。上电后坏道扫描全绿飘过,检查通电时间约有 4.5 年(灵车警告)
正面少许划痕
硬盘正面有几道不明显划痕

主板部分安装完毕后的样子↓ 日后再找个可爱点的箱子装起来。
photo_2020-03-01_00-43-17.jpg

二 系统环境安装

系统选用 Ubuntu Server 18.04 LTS ,安装前将软件源修改为 阿里开源镜像站。安装后为 ROOT 用户添加 SSH 登录公钥。PHP选用当前最新的 7.4 版本可提高执行效率,减少 CPU 一定量的工作负担。分别添加 nginx php transmission软件源,并安装它们。

add-apt-repository ppa:ondrej/php
add-apt-repository ppa:nginx/stable
add-apt-repository ppa:transmissionbt/ppa
apt install wget unzip python3 nginx certbot transmission-daemon syslinux sysstat php7.4-fpm
apt install php7.4-gd php7.4-json php7.4-mysql php7.4-curl php7.4-mbstring #安装一些常用的PHP组件
apt install php7.4-intl php-imagick php7.4-xml php7.4-zip

三 设置存储空间

因为家中网络只有千兆,暂时没有双栈 / 升级光纤的想法,单块硬盘的读写速度也有近 100MB/s,所以呢不需要再组什么阵列了,简单地合并两块硬盘空间,建立一个超大(其实也没多大)的逻辑卷即可。因为单块硬盘的大小已经超过了 2T,使用 MBR 分区表不能充分地使用空间,需要更换为 GPT 分区表。

  1. 使用parted建立 GPT 分区表并标记 LVM
root@mynasrbq:~# parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt    #创建GPT分区表
(parted) mkpart
Partition name?  []?
File system type?  [ext2]?    #默认
Start? 2048KiB    #保留一部分扇区,并保证4K对齐
End? 100%    #使用剩下的全部空间
(parted) toggle 1 lvm    #标记LVM
(parted) p    #检查操作是否正确
Model: HITACHI HUS723030ALS640 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number  Start   End     Size    File system  Name  Flags
1      2097kB  3001GB  3001GB  ext2               lvm
(parted) quit
Information: You may need to update /etc/fstab.
  1. 对 sdc 也进行相同操作创建分区并标记为 LVM
  2. 建立 LVM,此步骤需依次创建 PV, VG, LVM

①. 建立 PV

 root@mynasrbq:~# pvcreate /dev/sdb1 /dev/sdc1
   Physical volume "/dev/sdb1" successfully created.
   Physical volume "/dev/sdc1" successfully created.

②. 建立 VG,并命名为 "vg0"

 root@mynasrbq:~# vgcreate vg0 /dev/sdb1 /dev/sdc1
   Volume group "vg0" successfully created

③. 建立 LVM,并命名为 "lvm0"

root@mynasrbq:~# lvcreate -n lvm0 -l 100%FREE vg0
  Logical volume "lvm0" created.
  1. 将这个大卷格式化为 ext4
root@mynasrbq:~# mkfs.ext4 /dev/vg0/lvm0
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 1465131008 4k blocks and 183144448 inodes
Filesystem UUID: 92be7340-6475-4f12-b242-6e5680c2c592
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
  1. 添加挂载点

个人比较喜欢挂载到/var/www

root@mynasrbq:/var# mount /dev/vg0/lvm0 /var/www
root@mynasrbq:/var# df -h
Filesystem            Size  Used Avail Use% Mounted on
udev                  1.9G     0  1.9G   0% /dev
tmpfs                 386M  1.1M  385M   1% /run
/dev/sda2              29G  6.8G   20G  26% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm
tmpfs                 5.0M     0  5.0M   0% /run/lock
tmpfs                 1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/loop0             90M   90M     0 100% /snap/core/8268
/dev/loop1             92M   92M     0 100% /snap/core/8592
/dev/sda1             511M  6.1M  505M   2% /boot/efi
tmpfs                 386M     0  386M   0% /run/user/1000
/dev/sdd2             293G  254G   24G  92% /mnt/hda
tmpfs                 386M     0  386M   0% /run/user/0
/dev/mapper/vg0-lvm0  5.5T   89M  5.2T   1% /var/www    #挂载成功,总空间5.5T

添加开机自动挂载,修改/etc/fstab,在最后添加一行

/dev/vg0/lvm0 /var/www/ ext4 defaults 0 0

四 配置 Certbot 证书

因为 NAS 是不直接暴露在公网上的,联通和电信也不允许家宽在未备案的情况下开放 80 端口,所以在 NAS 上撸 Certbot 证书不适合常规的验证方法,需要通过 DNS 记录验证域名合法。之前写过的 一篇文章 里面有提到过具体操作。

五 安装在线文件管理程序

在线文件管理程序可以让咱们通过浏览器方便地访问和修改 NAS 中的文件,类似于搭建一个私人云盘。目前风评比较好的有Nextcloud, owncloud, h5ai, KodExplorer, etc。考虑到 N3050 那可怜的 1.6GHz 主频,轻量的 KodExplorer 是不错的选择。

root@mynasrbq:/var# mkdir /var/www/kodcloud
root@mynasrbq:/var# cd /var/www/kodcloud
root@mynasrbq:/var/www/kodcloud# wget -q "http://static.kodcloud.com/update/download/kodexplorer4.40.zip"
root@mynasrbq:/var/www/kodcloud# unzip -q kodexplorer4.40.zip
root@mynasrbq:/var/www/kodcloud# rm kodexplorer4.40.zip
root@mynasrbq:/var/www/kodcloud# chown -R www-data ./    #设置权限

然后新建一个 Nginx 站点,配置如下:

server {
    listen 80;
    listen [::]:80;
    root /var/www/kodcloud;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html index.php;

    server_name yourdomain.xxx IP;    #主机名,加上内网IP地址方便内网通过IP直接连接

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

    # pass PHP scripts to FastCGI server
    #
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
    
        # With php-fpm (or other unix sockets):
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    #    # With php-cgi (or other tcp sockets):
    #    fastcgi_pass 127.0.0.1:9000;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny all;
    }

    location /web/ {    #代理 Transmission 网页管理
        proxy_pass http://127.0.0.1:8080;    #Transmission远程管理监听端口,与下文Transmission配置文件保持相同
    }
    
    location /rpc {    #代理 Transmission RPC 服务
        proxy_pass http://127.0.0.1:8080;
    }
    
}

server {
    listen 4154 ssl;    # 外网端口
    ssl_certificate /etc/letsencrypt/live/yourdomain.xxx/fullchain.pem; # 证书
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.xxx/privkey.pem; # 证书私钥
    include /etc/letsencrypt/options-ssl-nginx.conf; # Certbot配置,如果没有这个文件,运行一次certbot生成即可
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Certbot配置
    root /var/www/kodcloud;

    # Add index.php to the list if you are using PHP
    index index.php;

    server_name **********; #为保护当事人隐私

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

    # pass PHP scripts to FastCGI server
    #
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
    
        # With php-fpm (or other unix sockets):
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    #    # With php-cgi (or other tcp sockets):
    #    fastcgi_pass 127.0.0.1:9000;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny all;
    }

    location /web/ {
        proxy_pass http://127.0.0.1:8080;
    }

    location /rpc {
        proxy_pass http://127.0.0.1:8080;
    }

    location ^~ /data {    # 安全起见禁止外网直接访问 data 目录,但会造成外网浏览器不能在线播放视频的错误
        deny all;
    }

    server_tokens off;    # 隐藏版本号提升安全性

}

为获得更佳体验,可以开启 TLS 1.3。方法:修改/etc/letsencrypt/options-ssl-nginx.conf,将ssl_protocols那一行改为ssl_protocols TLSv1.3;
Chrome 中查看到的加密详情(TLS 1.3)

最后保存并重启nginx

六 安装Transmission作为 BT, PT 工具

root@mynasrbq:~# apt install transmission-daemon -y

进度条爬到头后需要配置一下Transmission
先选择一个下载目录,个人比较喜欢放在可道云的管理员主目录里

root@mynasrbq:~# mkdir /var/www/kodcloud/data/User/admin/home/transmission
root@mynasrbq:~# chown -R www-data /var/www/kodcloud/data/User/admin/home/transmission
root@mynasrbq:~# setfacl -d -m u:www-data:rwx /var/www/kodcloud/data/User/admin/home/transmission    #授予 www-data 用户权限

然后修改Transmission 配置文件,必须先停止Transmission Daemon服务,否则修改后的配置会被覆盖!

root@mynasrbq:~# service transmission-daemon stop
root@mynasrbq:~# vi /etc/transmission-daemon/settings.json

主要修改几个地方:

"download-dir"     →  "/var/www/kodcloud/data/User/admin/home/transmission"
"rpc-enabled"      →  true    # 启用远程管理
"rpc-password"     →  RPC 口令
"peer-port"        →  BT 监听端口

修改完毕后保存,启动Transmission Daemon服务:

root@mynasrbq:~# service transmission-daemon start

现在访问http://NAS内网IP/web/,输入 RPC 用户名和口令,应该可以看到Transmission自带的管理界面了(是不是很丑?是不是??)

七 设置 SMB 共享,方便家中的设备访问

root@mynasrbq:~# apt install samba -y

修改samba配置文件, 位于 /etc/samba/smb.conf
[global]增加下面几项作为性能优化:

aio read size = 16384
aio write size = 16384
aio write behind = true
read raw = Yes
write raw = Yes
write cache size = 2097152
max xmit = 65536
large readwrite = yes
follow symlinks = yes
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072

增加一个共享项目(kodcloud):

[kodcloud]
comment = share folder
browseable = yes
writeable=yes
path = /var/www/kodcloud/data/User/admin/home/
create mask = 0766
directory mask = 0766
guest ok = no    # 禁止guest访问

保存,重启samba服务:

root@mynasrbq:~# service smbd restart

添加一个smb用户,与www目录的所有者相同,否则无法上传 / 修改文件。
(此处的密码与系统登陆密码互不影响)

root@mynasrbq:~# smbpasswd -a www-data
New SMB password:
Retype new SMB password:
Added user www-data.

八 路由器配置静态 IP 以及端口转发

先看看网卡 MAC 地址

root@mynasrbq:~# ifconfig -a |grep ether
        ether 11:22:33:44:55:66  txqueuelen 1000  (Ethernet)

运行在路由器上的操作系统是OpenWrt 19.07.1,不同路由器设置界面可能不同。
捕获 3.PNG
捕获 4.PNG
添加一个内网 HOST,否则内网中的访问流量会绕外网一圈,不安全且效率极低。使用内网 HOST 需将客户端 DNS 设置为路由器 IP,否则可能需要逐一修改客户端系统的 HOST 记录,因为只有向路由器查询 NAS 的主机名,路由器才可返回 NAS 的内网 IP。
捕获 5.PNG

九 桌面端配置远程访问

桌面端运行着Windows 10 x64,配合Chrome浏览器。

先使用浏览器登录可道云,网址为http://nasip或主机名/,初次登录需要设置管理员密码。点击右上角用户名(默认为 admin), 系统设置,禁用guest账户自动登录
捕获 8.PNG
彻底禁用guest账户和demo账户
捕获 9.PNG

接下来创建一个Transmission网页管理界面的快捷方式,方便管理。进入desktop文件夹,右键 → 新建文件 → 轻应用 → 右上角【创建应用】,像这样填入基本信息,链接填入/web/( 注意斜杠方向),保存即可,下一次双击图标可以进入Transmission网页管理。
捕获 7.PNG

更改云桌面壁纸:上传一张瑟图(划掉),左上方切换到【桌面】选项卡,右键空白处 → 设置壁纸
捕获 10.PNG

最后 PO 一张效果图(桌面壁纸 PID 79043826),最右的探针可以在 这里 下载,放入网站目录并做好轻应用的链接。
(效果图与探针皆为转载,侵删)
If infringement is involved, please contact to delete
捕获 11.jpg

然后设置smb访问,打开计算机,映射网络驱动器,路径\\NAS的IP或主机名\kodcloud\(注意斜杠方向),用户名及密码均为上文创建的smb用户,登录后可以看到可道云中的文件了。
捕获 13.PNG
还可以像操作本地文件那样右键通过其它播放器播放视频、加载字幕:
捕获 31.JPG

关于Transmission,除了网页端外还有 桌面客户端 可供食用,带有如【效验文件】【Trackers 添加 / 修改】等网页端没有的功能。
捕获 14.PNG
transgui-5.18.0-x86_64-win64.zip下载后解压安装,右上角文件 → 连接到 Transmission → 新建 ,远程主机为 NAS 内网 IP 或主机名,端口 80,勾上【需要认证】并填写 RPC 用户名 & 密码,勾上高级选项,RPC 路径为/rpc

十 移动端配置远程访问

移动端咱使用的是Android Pie操作系统。配置smb访问与计算机大体相同,Android Pie平台上支持SMB访问和串流的文件管理器有 ES 文件浏览器 Solid Explorer 等,支持串流播放的播放器有 VLC 等。
Screenshot_20200214-221649_Solid_Explorer.png
Solid_Explorer 通过 SMB 访问主目录

Screenshot_20200214-221739_VLC.png
VLC 通过串流在线播放视频

移动端也有 管理工具 ,同样比网页端强大得多

Screenshot_20200214-222219_Transmission_Remote (2).png

再说一些可选操作

十一 * 防止外网端口扫描(增加安全性)

此操作 适用于完全防止 运营商方面 WEB 探测 ,因运营商可在链路上抓包并得到您使用的主机头,而此处介绍的方法以 对方未知您使用的主机名 为前提,固不可完全规避运营商方面的 WEB 检测。在未使用此方法配置的条件下,一般路过们直接访问https://公网IP:4433可以获得主机名以及进入可道云的登陆界面。为防止一般通过的端口扫描,咱们可以让nginx自动切断他们的对端口直接连接。编辑nginx默认站点配置/etc/nginx/sites-available/default, 新增一项网页服务器

server {

    # SSL configuration
    #
    listen 4433 ssl default_server;    #default_server标记用于匹配端口扫描发送的主机名
    
    ssl_certificate /root/pub.crt;    #自签一张证书,证书通用名应与NAS外网访问使用的真实主机名不同
    ssl_certificate_key /root/pri.key;    #自签证书的私钥
    include /etc/letsencrypt/options-ssl-nginx.conf;

    server_name _;
    return 444;    #直接切断连接
    error_page 497 /shut;    #通过HTTP访问也直接切断连接,避免暴露nginx作为网页服务器的身份
    error_page 400 /shut;    #非标准的HTTP请求也直接切断连接
    
    location /shut {
        return 444;
    }

}

配置完毕后需要重启nginx服务。处于外网的任何人(包括爬虫)在未知主机名的情况下通过 HTTPS 协议访问 NAS 时,只能得到自签证书,甚至不能判断是否为nginx服务。浏览器访问则会给出【未发送任何数据】的提示(在 Chrome 80 上测试)
捕获 2121.JPG

捕获 1212121.JPG