手把手教你搭建家用NAS

本文属于穷人新手向教程,不是成品NAS使用说明(买群晖的话直接看它说明书就行了)。不在乎溢价几百上千买成品NAS的壕请不要嘲讽,老手们发现我说的不对请尽管指出,我一定修改。

硬件准备:

  • 台式或笔记本电脑一台。(用于下载系统镜像、制作U盘启动盘、远程配置NAS等。下文简称“电脑”)

  • 8G以上空白U盘一个。(作为系统安装盘)

  • 淘汰下来且主板、CPU、内存、电源没有故障的家用电脑主机一台(可以用自家淘汰的或者亲友那儿吃灰的机器,显卡可以拔掉。下文简称“NAS主机”)

  • 同容量硬盘若干(根据你自己的需求,或者原来主机里的硬盘没坏你也不需要加容量那就继续用也行)

  • 键盘、显示器、有线网络。(键盘和显示器在安装配置好后可以拔掉仅留电源网线连接,后续的访问配置通过远程用电脑甚至手机操作)

本文默认您有以下前置知识或技能:

  • 你能看懂计算机相关的英语单词或者熟练使用各种翻译工具
  • 你能熟练使用Windows系统和互联网浏览器
  • 你能在NAS主机上拆装硬盘

安装步骤目录:

  1. 制作Linux系统盘
  2. 安装系统并组好你需要的磁盘阵列
  3. 通过ssh远程连接NAS主机
  4. 安装需要的服务
  5. 安装web面板(可选)
  6. 配置服务
  7. 设置网络端口
  8. 设置防火墙
  9. 从客户端连接NAS

以下是详细教程:

1、制作Linux系统盘

NAS上的系统以稳定、省资源为第一要求,因此请尽量选择Linux的各个发行版本(Debian/ubuntu/centOS/Fedora/Arch linux),本教程以ubuntu server 20.04 LTS作为演示,其他系统下包管理命令会有所不同,注意区分。

从各家的官网下载系统ISO镜像,你可以自行搜索想要使用的系统,或者我列出一些常用的系统下载地址如下(仅列出适用x86_64架构CPU的系统,其他架构请至官网自行下载):

Debian 10.7
Ubuntu Server 20.04 LTS
CentOS 8.3
Arch Linux
openSUSE Leap 15.2

注1:CentOS和Arch Linux我给出的是TUNA清华源的镜像地址,因为官方网站的建议下载是使用BT下载,也没有给官方HTTP下载。而其他发行版系统虽然可以在官网直接下,但同样推荐去清华源镜像或其他国内镜像下载,因为快。下载后请自行校验MD5。
注2:某些发行版自带桌面系统,譬如openSUSE Leap。因此只有你的确在某些时候需要把NAS主机作为桌面电脑操作的时候才考虑装它们,不然还是推荐安装那些不带GUI的,省得装完还得手动删。

系统镜像下载完成后是制作系统盘。自己装过windows系统的应该都对U盘启动盘不陌生。
如果你的电脑装有Linux操作系统,可以直接通过cp命令来制作启动盘:
cp ubuntu-20.04.1-live-server-amd64.iso /dev/sda
其中ubuntu-20.04.1-live-server-amd64.iso是系统镜像文件名,*/dev/sda*是U盘插上后的目录

如果你的电脑是Windows操作系统,请使用启动盘制作工具将系统镜像写入U盘。这里推荐Rufus,不用安装,下载完即可运行制作:选好系统镜像文件和格式化方法后点击开始即可,非常绿色方便。

注3:制作系统盘会清除U盘上原有的所有文件,请务必使用空U盘或者事先备份迁移走U盘原有资料。
注4:在Linux系统下制作启动盘也可以用ddcat命令,语法不同底层实现方法不同但对于新手来说效果是一样的,不要过多纠结。


2、安装系统并组好你需要的磁盘阵列

一般自组NAS主机都会对存储的安全性和读取性能有所要求,因此选择多块同容量硬盘组成独立磁盘冗余阵列(英文缩写RAID)是一项基本操作。RAID有多种不同的类别,用RAID+数字0~6表示。不同的数字没有优劣之分而是表示不同的需求方向。对于普通家庭用户,常用的RAID类型是RAID0、RAID1、RAID5、RAID6。RAID0会成倍提高硬盘的读写性能但坏一块硬盘等于数据全挂,RAID1等于将所有存储备份了一遍以最大化数据安全性,但也会成倍占用磁盘空间。RAID5和RAID6兼顾性能和安全性不过需要更多块硬盘。你可以根据自己的实际需要来选择RAID类别。

同安装Windows一样,我们需要先插上新制作完成的系统安装U盘,然后启动NAS主机,通过键盘上的ESC、F2或Delete键进入UEFI/BIOS系统,将磁盘读取优先级调整为U盘启动。改好后重启NAS主机,进入系统安装界面。

依次选择语言(language)、键盘布局(keyboard layout)、安装系统(Install Ubuntu)、网络连接(Network)、代理(Proxy)、镜像(Mirror) 进入存储配置界面(Storage Configuration)后,勾选Custom storage layout进入如图存储配置主界面:

StorageConfigurationMain

图中我用黄圈数字标注出了各主要显示项,以下由我逐个讲解:

/ 表示Linux系统的根目录。在存储配置界面中这一项意为Linux系统文件的所在位置。
/boot表示系统启动文件所挂载的位置,即GRUB、EFI这些系统文件所在目录。(主机启动后BIOS先读取GRUB启动记录再把Linux-kernal写进内存,然后机器就交给Linux系统接管。普通人知道需要划一个分区给启动文件即可不必深究原理。)
③ 方框内是目前可用设备列表,也就是还没有完成配置,待分区、待分配的硬盘。
④ 该项即为创建软件RAID,也就是我们等下配置RAID时需要用到的选项。
⑤ 这一项是创建逻辑分区(Logical Volume Manager)。逻辑分区跟RAID类似是用目录或文件的形式管理多个磁盘的工具。譬如Linux系统的虚拟内存文件swap,我们就可以给每块硬盘都划一块出来用于同一个swap文件,又或者将每块硬盘都划出一部分分配给Linux系统文件目录如/root /tmp /var 等等。
⑥ 方块内为
已配置硬盘及分区
列表。这项列表不光列出分好区的硬盘,同样也会列出创建好的RAID和LVM组。我们可以非常直观的在这里看出是否已经将所需要用到的硬盘分区分配到RAID阵列。

要制作RAID阵列我们首先要取消所有的已配置分区,也就是将列表⑥中的分区删除。对每个逻辑分区卷使用Remove from RAID/LVM选项,再对硬盘使用Format选项。直到列表⑥中不存在已使用设备,并且在可用设备列表(方框③)中已经正确列出你的所有硬盘。

在列表③中选中一块硬盘,使用选项Use As Boot Device。该选项会为这块硬盘自动添加一个512MB大小的EFI系统分区(Extensible Firmware Interface System Partition,简称ESP),用于系统启动引导。对每块硬盘都做相同的操作,即为每一块硬盘都添加这么一个512MB的EFI分区。系统安装时会自动往这些分区里写入启动引导文件。这么做的原因是amd64和arm64架构的系统支持多盘引导,即在某块硬盘的引导启动失败时可以自动寻找另一块硬盘里的启动文件。(有些Linux版本需要你手动设置该分区,那就只要手动创建512MB大小,挂载给/boot/efi即可。)

选择④创建软件RAID。勾选所有硬盘,RAID LEVEL根据前文介绍选择你需要的等级选择。注意,RAID0和RAID1需要至少2块硬盘,RAID5、RAID6和RAID10需要3块硬盘(这里RAID10指RAID1+RAID0混用而不是RAID十)。输入需要的Size大小,点Create。每种Raid level需要的硬盘大小有所不同,安全性高的RAID1你输入1T则每块硬盘都会占掉1T,而重性能的RAID0则输入1T只需要每块硬盘占用1/n T,n为硬盘数量。创建好RAID后同样会在列表③中。选择刚创建的RAID(md0),Add GPT Partition,Size留空(表示全用),格式ext4,Mount输/,Create。(注:你可以选择在创建/分区前在md0中创建一个swap也就是虚拟内存的分区,大小根据你现有内存的情况选择,不知道怎么填可以填实体内存的两倍大小。)

在你将所有可用设备分区完毕,即列表③清空而列表⑥显示无误之后,点击Done进入用户设置(Profile Setup)。输入姓名、主机名、用户名、密码,注意尽量全英文小写,不要空格,名字都别起太长不然以后可能会有额外的麻烦,全输完点Done。勾选Install OpenSSH Server,Done。Snaps这里不用管,直接Done。之后就是静静等待系统安装完成后重启。


3、通过ssh远程连接NAS主机

NAS主机在系统安装完成后一般就不再需要连接显示器和键盘,而是通过网络连接利用ssh(secure shell)远程操作。

系统安装完成重启以后,我们就可以输入安装时设置的用户名和密码进行登录了。(有些发行版本可以直接使用root用户,也就是超级管理员用户进行登录。Ubuntu禁用了root用户,因此在使用系统管理命令的时候需要输入sudo表示运用超级权限操作,不然会提示访问被拒绝。)

刚开始看到全黑背景的命令行界面可以先用那些最常用的系统查看命令练练手熟悉一下。譬如ls看一眼根目录下的文件,lsblk看看RAID阵列有没有正常工作,ps aux看看系统进程和用户,netstat -tunlp看看网络端口等等。Linux系统下一切都是文件,查看命令其实就是查看文件内容,跟Word里的Ctrl+F一个性质,因此以上的这些查看命令很多时候都是可以换着用的,反正都是输出文本,只要调好命令选项参数总能查到你想看的内容。另外还有一个特别有用的命令是grep,用法是在查看命令后加上| grep 字符 表示在结果里过滤出含有“字符”关键字的内容。如ls /bin | grep ssh 表示查找ssh相关的命令。

现在我们需要进行下一步也就是从远程连接NAS主机,因为之后的所有操作都将通过ssh远程操作。由于我们在安装系统时已经安装了openssh服务,因此这里我们先用命令查看一下sshd服务是否正常运行:

systemctl status sshd

如果显示Active:active(running),则说明ssh服务正常运行,我们已经可以通过默认配置和当前用户登录了。查看一下由DHCP服务器(通常是你家里的路由器)分配给NAS主机的IP地址:
ip a

ifconfig
找到网卡的inet地址,如192.168.1.x/24。

回到电脑上操作,先确认是否已经安装了OpenSSH客户端。右键开始菜单->设置->应用->可选特性,如果没有OpenSSH Client则点添加特性->OpenSSH Client->安装。

打开Windows PowerShell(或者你也可以用ssh专用远程登录工具putty来连接),输入
ssh <用户名>@192.168.1.x
出现提示输入密码。输密码时看不到字符显示是正常的不要以为键盘坏了。输完回车可能提示未知连接是否继续(yes/no),输yes就能成功连入NAS主机,也就是在PowerShell里打的命令等于直接在NAS主机上直接打命令。之后的一切操作就都可以在电脑上完成,也可以拔掉NAS主机的显示器和键盘了。

有一些常用的Linux命令建议记一下,对以后使用系统很有用:
ls显示文件/文件夹,cd切换当前目录,rm删除,mv移动/重命名,cp复制,chown更换用户,chmod修改权限,ps查看进程,kill结束进程。这些命令都有各自的选项参数,用命令man 命令可以查看指定命令的参数设置。
另外还有一个很重要的快捷键^C,^在Linux里表示Ctrl,因此^C就是Ctrl+C。当然跟Windows里不同这里的^C并不是复制粘贴那个复制,而是结束当前前台进程,譬如在你使用ping命令检查网络连接时候需要通过该快捷键结束ping进程。同理在任何你发现打不了命令的时候都可以按一下^C回到命令行界面。

以上命令和快捷键基本都是从unix时代沿用到现在,因此适用于几乎所有Linux发行版本。之后还会有一些命令,譬如sudo apt install就是debian系发行版专用,Red Hat系使用的命令会有所区别,请自行注意。


4、安装需要的服务

Linux各发行版本都自带包管理工具和软件安装源。源是一个或多个网络地址,各家Linux将各自打包好的软件放在这些网址所在的服务器上,通过全球CDN供全世界的用户下载安装。显然,不同地区的用户在访问同一个软件源时由于种种原因必然会有不同的响应速度,因此Linux版本发布者们同样在全世界都建立了不同的软件源镜像(Mirror)。我们应该尽量选择离自己所在地更近的镜像站作为软件源地址。

与Windows不同,Linux下装软件只需要打一行命令即可,不需要访问网站下载文件也不需要自己指定安装目录点下一步。无数用爱发电的志愿者们在各个发行社区没日没夜地归总整理全世界同样用爱发电的开发者们写出的开源软件并打包上传到软件源。向这些为开源事业做出伟大贡献的志愿者和开发者们致以最崇高的敬意。另外也同样欢迎希望贡献出自己一份力量的你加入这些社区,不论是debian系社区还是红帽系社区,哪怕只是翻译手册文档也是为伟大的开源事业添砖加瓦。

Linux的目录树结构是事先设计好的,像是/bin下都是执行文件,/etc下都是配置文件等等,有兴趣的可以去了解一下根目录/下各个文件夹的作用,这里不多展开介绍。

家用NAS大约需要用到以下的软件包,有些包已经预装在某些发行版本中,请自行根据现有的软件包安装情况补充缺少的软件。
nano: 终端文本编辑器(可用vim代替)
nfs-kernel-server: NFS文件共享服务
samba: Samba(SMB)文件共享服务
apache2: Web网页服务,包含httpd等重要服务包(可用nginx替换)
minidlna: DLNA/UPnP家庭流媒体服务 (可用kodi代替)
mysql-server: 数据库服务,某些网页工具需要用到(可用mariadb-server代替)
php: PHP语言环境,某些web网页工具是用php写的,需要该服务包才能生效
python3:python环境,很多脚本用到。还能自己没事写程序玩….
transmission-daemon:远程BT下载工具(可用aria2代替)

在安装这些软件包之前,强烈建议先调整软件源镜像地址,尤其是国内用户,否则下载速度会非常感人。我这里演示替换成清华大学的开源镜像,你也可以选择其他国内源譬如阿里源或中科大源。
先将现有软件源备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
再编辑软件源文本
sudo nano /etc/apt/sources.list
(如果还没有装nano的话就先sudo apt install nano装一下。)

将以下文本输入或复制粘贴到文件中

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

输入或粘贴完成后按组合键ctrl+O(^O)保存,回车确认。^X退出编辑。

其他发行版的替换方法和替换文本都可以在镜像站上查到,我列了几个常用镜像站的帮助地址方便大家自行选择。
清华源
中科大源
北外源 (吐槽一下,北外源的帮助文档和站点结构是照着清华复制粘贴的…你们好歹把文本里的TUNA给替换掉呀…)

软件源镜像设置好之后就可以开始装装软件了。安装命令前面已经提到了,是
sudo apt udpate ——这条命令意思是刷新一下apt软件包列表
sudo apt install nano
该命令可以批量安装,譬如对于我上述列出的所有软件包,你可以一次性全输进去:
sudo apt install nano nfs-kernel-server samba apache2 minidlna mysql-server php libapache2-mod-php python3 transmission-daemon

或者一次输几个防止输错了要全部重来。
不同的包名之间用空格分开即可。
安装命令输完之后会提示你磁盘空间占用,询问是否继续?Y/N。输Y回车静待安装完成。
在以后你遇到软件包版本更新的时候只需要使用命令
sudo apt update
sudo apt upgrade
不过,除非的确有重要功能更新或重大bug漏洞修复,不然Linux下的软件一般也不用去更新它,能用就行了。

如果你的发行版本用的不是debian系而是红帽系、SUSE系或别的什么系,那么安装命令是不一样的,请自行查询各自版本的安装方式。(软件包的打包、管理、安装方式的不同是Linux各发行版的主要区别,系统运行和各个软件本身其实都一样。)


5、安装web面板(可选)

很多成品NAS就是利用了用户不熟悉命令行或是觉得自己打命令太麻烦的心理,给Linux系统套上一层WEB管理的皮,再预设好几个参数就大摇大摆的往外卖成百上千块。我前文写了那么些命令行使用可能也会劝退不少不想接触命令行的用户。但其实web面板这种东西真的到处都是,还都开源免费又好用。真的只想用GUI完全可以自己为自家的NAS系统披上外皮而不需要买别人做好的。再强调一句:web面板非必须,也不一定就方便,仅仅是提供可视化操作。

由于NAS本质跟服务器大同小异,因此很多好用的Linux网页端系统管理工具其实就是网站运维面板,当然家用NAS和对外运营的网站侧重点还是完全不同的,譬如IP流量统计这样的功能对于家用NAS来说就完全用不到。

web管理面板由于必然用到网页服务可以从浏览器访问,因此请务必只在家庭局域网中使用,不要将端口开放给公网。因为根据《互联网信息服务管理办法》第四条和第十九条的规定,任何互联网信息服务都必须向主管部门备案,任何违规提供互联网信息服务的,都会收到电信管理机构的警告和处罚。具体到实际情况中就是你一旦部署了网页服务并且将端口开放给公网访问,那么你就成为了“任何提供互联网信息服务”的人之一,哪怕你没绑域名只能用IP访问。国内网络运营商(电信、联通)会定期扫描自己管辖下所有公网IP的各个端口,一旦发现有这样未经备案却开启了网页服务的IP就会采取措施,哪怕只有一个需要登录的系统管理面板。最普遍的措施是断网。如果你还恰好挂了点不该挂的在上面,那么罚款甚至上报公安机关介入都是有可能的。不要心存侥幸觉得自己开了端口也没事,那只是端口扫描工具还没扫到你或者运营商比较忙你又没挂什么不该挂的懒得管你,一旦政策有所收紧或者你尝到甜头决定多挂点东西,那铁拳砸脸的那一刻你肯定是没有后悔药吃的。这是无数NAS使用者的血泪教训,也是我推荐各位无论如何学一下命令行使用的重要原因。

请输入图片描述

cockpit是一个非常常用的web管理面板,也被相当多的发行版收到了软件源中(Fedora干脆随系统自带)。安装也非常简单:
sudo apt install cockpit
装好后不需要任何设置,直接在电脑浏览器的地址栏输入主机名或IP:9090就能立刻访问。登录用户名密码就是你用于登录Linux系统的用户名密码。登录后的网页界面提供了系统状态检测、服务进程监控、硬盘分区状态等等一系列的信息汇总功能,也可以直接启动或结束服务进程。由于cockpit本身开源,因此有很多第一方和第三方插件可以安装,用于扩展该网页面板的功能。不过cockpit没有图形化的文件编辑管理功能,只有一个集成在网页中的终端工具,你要改配置文件还是得打命令行,我也并没有找到很好的第三方工具提供了文件管理功能(也许有大神可以自己写一个?)。因此需要配合WinSCP来管理文件。WinSCP用SSH协议来连接NAS主机、用SCP或SFTP协议来传输文件,因此用户名密码和端口都跟你在PowerShell里用ssh连NAS主机是一样的。

请输入图片描述

webmin是另一个选择。它的功能强大,模块众多(110多个,包含系统、服务、网络、硬件等多个方面),也同样有很多第三方扩展可以使用。安装方法也很简单:
mkdir ~/downloads && cd ~/downloads
sudo apt install wget && wget http://prdownloads.sourceforge.net/webadmin/webmin_1.970_all.deb
sudo dpkg –install webmin_1.970_all.deb

简单讲解以下这三条命令就是

  1. 在用户个人目录下创建downloads文件夹并进入;
  2. 安装wget网络文件下载工具并下载webmin到当前文件夹;
  3. 安装下载好的deb文件包。

执行完毕后如果提示缺少依赖的库文件,可以执行一下这一行:
sudo apt install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions unzip
把库文件都装上。

装完后就可以在电脑浏览器上输主机名或IP:10000访问了,用户名密码同样是NAS系统用户密码。


6、配置服务

上上章我们用sudo apt install命令安装完服务软件包之后并不等于马上能用,还需要根据自己的环境和需求进行配置。Linux的配置文件一般都放在/etc/目录下。拿我们最熟悉的ssh服务举例,它的配置文件位于/etc/ssh/sshd_config(注:Linux服务名称中往往多带一个d,如httpd,sshd,mysqld,这里的d表示daemon,意指后台运行服务,用于跟前台客户端应用区分。不过命名这东西都是看开发者自己乐意,没有强制规定,所以看到不符合这条规律的情况也很正常)

配置服务其实就是编辑配置文件的文本内容。修改文本一般有两种方法:一种是直接在终端通过cat命令将文本信息直接写入或替换进文件;另一种是通过文本编辑工具——如nano,vim等——直接编辑修改文本文件。后一种类似Windows的记事本修改,也是一般人更习惯的方式。本文主要介绍文本编辑工具修改配置文件的方式。

还是拿ssh服务举例。我们先通过nano指令进入sshd_config文件的修改界面:
sudo nano /etc/ssh/sshd_config
该界面其实就是配置文件的文本内容。通过上下左右方向键将光标移到你要修改的部分,直接通过键盘输入添加或删除内容即可。未修改过的sshd_config文件下的大部分内容都是被#号注释的状态,被注释的内容也是默认的配置,譬如除去开头介绍部分的第一行
#Port 22
表示ssh服务默认监听22端口。所有客户端在通过ssh命令连接远程服务器时,在未指定端口的情况下也都是默认访问22端口。为了以后可以放心地从公网访问NAS主机,我们可以将该默认端口修改掉,你可以在1024-65535之间任挑一个数字(注意不要跟其他服务端口冲突),这里我随便挑一个36222地端口,修改配置文本如下:
#Port 22
Port 36222
修改完毕后按^O保存,^X退出。这样你下次登录NAS主机的时候就需要指定端口来访问而不是走默认端口了。
ssh <用户名>@192.168.1.x -p 36222

注:由于家用NAS通常处于网关之内,因此修改公网访问端口一般通过在网关(也就是你家里路由器)处设置端口转发来实现而不需要修改NAS主机上的服务端口。直接修改配置文件来修改端口的方法通常用于本身拥有固定公网IP的机器,如VPS主机。这里只是大致演示一下如何修改配置文件。

学会修改文本并保存后,sshd_config配置文件中的其他内容也都是通过类似的方法修改。该配置文件内容较多,这里不一一讲解。其实相关的配置名英文已经很清楚地表达了关联的配置内容,有心了解的话稍微搜一下应该都能搞懂。如果你希望进一步修改配置文件,建议先备份原文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
然后再开始根据自己的需求修改配置文件。

家用NAS一般需要优先配置好
nfs-kernel-server
samba
minidlna
transmission-daemon
这几样常用服务。(nfs-kernel-serversamba可以二选一,也可以都装。)

在修改配置之前,由于软件安装完成后会自动运行,因此我们最好先把后台的这些服务进程停掉,以免某些服务在运行中无法使修改生效。使用systemctl命令
sudo systemctl stop nfs-server
sudo systemctl stop smbd
sudo systemctl stop minidlna
sudo systemctl stop transmission-daemon
这几项服务的配置文件对应修改命令如下
sudo nano /etc/exports
sudo nano /etc/samba/smb.conf
sudo nano /etc/minidlna.conf
sudo nano /etc/transmission-daemon/settings.json
接下来我会逐个讲解怎么修改这四项服务的配置文件。


NFS(Network File System)是最传统的文件分享工具。它的原理通俗解释一下就是:在服务器端规定一下哪些本地目录要被共享、分享给哪些接入IP以及接入的IP具体有哪些权限。NFS不支持用户名密码登录,也就是你如果不是确实对网络足够了解的话尽量只在局域网内使用NFS。
/etc/exports文件就是前面说的“规定哪些目录共享、哪些IP允许接入以及接入后拥有的具体权限”的文件。它的格式写法一目了然:
目录 IP(权限,参数)
具体例子就是
/home 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
括号里的参数表示允许读写权限,文件修改保存后同步,允许root访问,允许访问该目录的子目录。IP地址的格式表示你整个192.168.1.x的局域网内都可以用NFS协议访问/home目录。
保存退出,重启nfs-server
sudo systemctl start nfs-server
NFS文件夹共享的服务器端就设置好了。

Windows系统下要使用NFS需要先开启NFS客户端。进入控制面板->程序和功能->打开或关闭Windows功能->NFS服务->NFS客户端,勾选,确定。
打开注册表Win+R->regedit,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default目录内新建两个DWORD(32bit)键值,名字分别叫AnonymousUidAnonymousGid,值为0。新建完退出注册表并重启电脑。

回到PowerShell,在本地Windows路径,也就是C:\Users\Administrators>下输入
New-PSDrive -Persist -Name “Z” -PSProvider “FileSystem” -Root “\<NAS主机IP>/home”
就可以将设置好的NFS共享文件夹挂载成Z盘。注意自行替换NAS主机地址。


Samba是Windows系统下使用的文件共享协议。Samba的配置文件就要比NFS的复杂一些,主要是因为samba共享需要设置连入的用户名和密码。我们同样将/home文件夹共享给局域网,但是只能用你的专用账户登录。同时新建一个/home/public目录供游客使用。先用以下命令设置samba用户:
sudo smbpasswd -a <用户名>
输入两遍密码后回车,你的smb共享用户名密码就创建好了。新建公共文件夹
sudo mkdir /home/public
将公共文件夹设置为任何用户全部权限
sudo chmod 0777 /home/public && chown -R nobody:nogroup /home/public
打开samba配置文件
sudo nano /etc/samba/smb.conf
将以下内容粘贴或手输到文件最后
[home]
comment = Home Directory
path = /home
browseable = yes
read only = no
create mask = 0700
directory mask = 0700
valid users = <用户名>

[public]
path = /home/public
writable = yes
guest ok = yes
guest only = yes
read only = no
create mask = 0777
directory mask = 0777
force user = nobody

注意手动替换所有的<用户名>,其他设置基本都用默认就好不用改,保存退出。重启samba服务
sudo systemctl start smbd
至此samba共享文件服务器设置完毕。


DLNA/UPNP家庭流媒体服务是家用NAS最常用的一项功能,毕竟自家NAS存得最多的还是电影音乐和照片。在电视机上直接看NAS上下载好的电影是一个非常重要的应用场景。Linux上的DLNA/UPNP服务应用很多,我个人习惯用miniDLNA这个软件,稳定小巧设置简单。它的配置文件为
sudo nano /etc/minidlna.conf
里面的内容也是非常直观
#媒体文件目录,从上到下分别为音乐、照片、视频
media_dir=A,/home/<用户名>/Music
media_dir=P,/home/<用户名>/Pictures
media_dir=V,/home/<用户名>/Videos
#显示在客户端上的服务器名称
friendly_name=My NAS
#数据缓存目录,用于存放专辑封面之类的内容
db_dir=/var/cache/minidlna
#日志文件
log_dir=/var/log
#服务端口
port=8200
以上内容有些文件默认就有,有些需要修改,有些处于注释状态,需要把最前面的#删除来取消注释,使之生效。设置完成后保存退出,启动miniDLNA服务
sudo systemctl start minidlna
到这儿你家的流媒体服务器就搭建完毕了,是不是超简单?


作为24小时开机的大容量存储设备,NAS主机不用来挂BT下载简直天理难容。Transmission就是Linux平台最常用的BT下载工具之一。它可以远程通过网页UI添加下载任务,几个种子一挂,该上班上班该游戏游戏。隔天收割一大波资源简直跟老农丰收一样嗨皮,真是成了字面意义的种子。由于NAS主机24小时开机加上BT的特性,上传量常常会远超下载量,因此对于BT资源的传播分享非常有利,你作为做种者也完全不会有任何不便,现在很流行的PT下载(Private Tracker)社区中大多数人就都是用的NAS+Transmission。你要是也对高清电影或冷门资源感兴趣,在看完教程搭好NAS后完全可以挑一个社区捐个邀请码成为其中一员。

Transmission的网页后台服务就是transmission-daemon。该服务开启后能从远程客户端的浏览器上访问NAS主机的transmission后台,添加或删除下载任务。transmission-daemon的配置文件使用了json格式,初看会比较复杂,内容较多,但其实也就其中几个词条是需要特别注意的。在配置之前我们先创建两个目录用来存放下载文件
mkdir ~/downloads/completed ~/downloads/incompleted
将这两个文件夹的所属用户组调整成transmission-daemon的默认用户组debian-transmission并且让当前<用户名>加入该组:
sudo usermod -G -a debian-transmission <用户名>
sudo chown -R <用户名>:debian-transmission ~/downloads/completed
sudo chown -R <用户名>:debian-transmission ~/downloads/incompleted
(或者你也可以直接编辑/lib/systemd/system/transmission-daemon.service这个文件把User=debian-transmission改成User=<用户名>,这样就不用改文件夹权限和用户组了。)

再打开配置文件(可以先备份)
sudo nano /etc/transmission-daemon/settings.json
找出以下几项并修改成你自己的实际配置内容
“download-dir”:”/home/<用户名>/downloads/completed”,
“incomplete-dir”:”/home/<用户名>/downloads/incompleted”,
“incomplete-dir-enabled”:true,
“rpc-bind-address”:”<NAS主机IP>”,
“rpc-port”:9091,
“rpc-username”:”<用户名(可与系统用户名不同)>”,
“rpc-password”:”<自定义密码>”,
这几项配置从上到下的意思分别是:下载文件保存目录、临时下载缓存目录、启用断点传续、网页端管理地址、网页端端口、网页端登录用户名、网页端密码。修改完毕后保存退出,启动tansmission-daemon服务
sudo systemctl start transmission-daemon
此时在电脑浏览器地址栏输入http://<NAS主机IP>:9091就会出现登录界面,输入刚才在配置文件里输好的用户名密码就能进入Transmission的网页端管理界面了。你可以先随便挂一个种子上去看看是不是能正常下载,能下载则表示配置成功。


7、设置网络端口

端口是远程数据包进入你的主机后找到正确服务应用所需要的标识。原理上来讲就是数据包从TCP协议的第二层传输层进入第一层应用层的包头标识。每个网络服务都需要开放一个或若干个端口使得远程连接能够找到这个应用,这个开放端口的动作叫做“监听(LISTEN)”。(理论上一个服务只能对应一个端口,某些程序需要同时监听几个端口其实是每个端口有不同用途,或者是几个不同的副本进程。)

在上一章我们已经接触过了服务端口的概念。只要你在NAS主机上启用了一项服务,那这项服务必然需要监听一个网络端口才能保证远程连接能够找到该服务。网络应用所监听的端口都是可以自行设置的,在065535这个范围内的数字都可以被作为端口号来使用(一般来说01024的端口会被用于系统服务,我们自己设置的时候尽量不要去占用掉这些端口)。之前我们已经知道SSH服务默认监听的端口号是22,你可以在设置文件里改掉这个端口。另外上一章我提到的4个NAS常用服务也都有各自的默认端口,分别是:
nfs-server —— 2049
samba —— 445, 139
minidlna —— 8200
transmission-daemon ——9091
注:samba之所以有两个端口是Windows的历史遗留问题。139是以前用的,445是新版本用的,本来只需要一个445端口就够了,但因为Windows这个新smb设计的太烂漏洞太多只好把以前稳定安全的基于NetBIOS协议的版本也一起用上,甚至在某些情况下还要禁用445只允许连139

这些端口除了NFS默认的2049以外全都可以在配置文件中自行修改。有些是配置文件中直接就有这一项,譬如minidlna中改port=8200这一项就行;有些像samba默认文件里可能没有,但你只要在[global]里手动加上smb ports = 445 139并且把445 139改成自己想要的数字即可。

不过正如前文提到过,由于家用NAS往往都是位于网关之后,因此并不需要通过修改服务端口来提防端口扫描和黑客攻击。局域网内一律使用默认端口就好,不需要折腾这些花里胡哨的。但如果你需要从公网访问家里的NAS主机,那么端口设置就很重要了。不过在这种情况下,我们一般是通过在网关处设置端口转发来达到改变默认端口的效果,因此也不太需要在NAS主机上修改默认的服务端口。

(关于端口转发和服务端口的一些详细解释可以参考我之前的文章 用最简单的语言解释NAS的一些基本原理

端口转发的设置方法非常简单:只要通过网页进入你家路由器的设置界面,找到端口转发(Port Forwarding)的页面,将需要转发的内网地址端口和公网IP端口分别填到相应方块内即可。以我用的华硕系路由来举例:
RouterPortForwarding.png

现在我要把启用公网对于NAS主机的SSH连接。进入路由设置页后点击左侧导航栏WAN->虚拟服务器,启用端口转发切换成ON,点击最下方新增设定,在外部端口方框内填入监听的公网IP端口,譬如36222,协议选TCP,内部端口填22,内网IP地址填<NAS主机IP>,OK。

这样一条关于SSH端口转发就设置好了,其他路由器上的设置也都大同小异。你可以把你所有想要面向公网开放的服务端口都这样设置好,但是注意尽量不要把网页服务相关的端口写进去,原因前文已经说过,像是web管理面板(如webmin的10000端口)或者transmission的网页端管理页(9091)最好都只在内网用。还有最一般的80和443端口,除非你正儿八经去备过案,否则不要手贱填上去。

在填好端口转发后理论上已经可以在公网访问NAS主机的服务了。但实际操作中我们还需要解决若干个必然存在的问题,譬如家里网关没有公网IP,网关防火墙没有设置,NAS主机防火墙没有设置,权限没有全调对等等。防火墙和权限的问题我在下文会说,至于公网IP,在你没要求的情况下运营商(ISP)一般都是不会给你公网IP的,你的路由器其实也就是处在一个大局域网下,所以从公网没法访问家里网关,也就没法访问NAS主机。判断自己有没有公网IP可以用电脑浏览器访问https://ip.cn/,把获取到的地址跟路由器的WAN口地址对比就知道了,不一样就是没有公网IP。

正常情况下我们只需要打电话给你自己的宽带运营商(电信、联通),要求他们给你分配一个公网IP,大部分地区都会很爽快的给你分配好。某些奇葩地区的奇葩运营商则可能无视你这个请求,这就不是我能解决的问题了,请发动自己的人脉想办法或者用中间服务器反代(关于反代的方法本文暂时就不多涉及了)。

需要注意的是运营商分配给个人家庭宽带的一般只是一个动态IP列表,你每次重启路由器都会变的那种。固定IP往往只属于交了大钱的企业用户。对于动态IP我们也不是没有办法,首先你路由器的WAN口IP地址是可以直接访问的,每次重启完路由看一眼也是一个办法。更普遍的解决方法是利用DDNS(动态域名系统)给你自家的网关绑一个动态域名,每次重启路由就会把新地址绑到域名上,这样你只需要记住自己的域名,不用每次重启都去看IP了。

有一些路由器自带DDNS功能或者可以通过插件安装DDNS应用。譬如我用的华硕路由器,只要在WAN->DDNS页面里选一家DDNS服务商,设置一个没被占用的域名并验证后,就可以通过这个DDNS域名访问自家网关以及NAS主机。如果你的路由不自带DDNS,则是需要刷一个你能获取root权限的固件(如openwrt等),安装DDNS服务,并根据你选择的DDNS服务商提供的教程设置好你的动态域名。


8、设置防火墙

防火墙是保护用户免受黑客和病毒攻击的坚强护盾,但对于新手用户来说,防火墙的存在往往也会成为使用NAS的重大阻碍。很多新手明明设置好了所有服务和网关但就是连不上NAS主机,一怒之下就把防火墙全关了完事。这一点非常不可取,缺少了防火墙保护的主机等于剥光了衣服任君采撷的肉鸡,尤其你作为一个小白还开放了端口。所以想要放心地从公网访问NAS主机就请无论如何学会设置防火墙,不然还是只在局域网内使用。

防火墙的原理其实一点都不复杂:由于网络数据包一律遵循TCP协议逐层传递并打上报头,因此只要像安检一样在底层物理传输口收到数据包的环节设立关卡,检查这些数据包的报头,符合条件的放行,不符合的拦截即可。防火墙检查的报头通常就两种:地址和端口。来自受信任地址的包放行,发往规则中允许的端口放行。

Linux系统中其实有“自带”的防火墙,也就是iptables规则表。不过这个规则原本不是作为防火墙来设计的,而是作为所有通过该系统所在主机的网络通讯进行转发的一个规则表。因此该表里包含的不光有“拒绝来自[host]地址的数据包”、“放行通往xx端口的数据包”这样的防火墙规则语句,还包括“将通往xx端口的数据包转发到[host]地址的[yy]端口”这样的路由规则语句。对的,上一章里在网关路由器那里设置的端口转发正是用了iptables规则表。

不同发行版本的Linux对于自己的iptables有不一样的默认规则。有些默认拦截一切非本地数据连接,有些默认放行局域网连接,有些则默认开放公网连接。所以有时候同样的服务应用,你在debian上设置好能正常连接,同样配置放到archlinux上可能就连不上,就是因为iptables的默认规则不同。

由于iptables的设置规则语句较为复杂,而且涉及到其他转发或路由功能,因此最新的各个发行版一般不用它来实现防火墙功能,而是默认放行所有数据包,然后另外用一个专门的防火墙应用来拦截非法连接。譬如ufwfirewalld都是这样的功能。当然你乐意的话还是可以手动把拦截来自某地址的语句写进iptables规则表,或者如果遇到服务设置正常但连不上的情况很可能就是你的系统里默认拦截不在iptables里允许放行的数据包,需要你去手动把放行规则加进去,命令语法类似
iptables -A INPUT -p tcp -s 0.0.0.0 –dport 22 -j ACCEPT
-A指添加(Append)规则,INPUT指从外部进入主机内部的数据包连接,-p是协议(protocol),tcp都懂,-s是数据包来源地址(source),0.0.0.0指任意地址,--dport 22是数据包指向的内部端口,-j是对数据包的处理方式,ACCEPT是放行。(是不是感觉超复杂的,我也觉得。)

在设置家用NAS的时候除非你直接把网关当NAS来用(譬如直接用软路由,或者硬路由刷自制固件,再挂上硬盘),否则一般需要设置两道防火墙:一道是你的网关,一道是你的NAS主机。我的建议是把两道防火墙都设好,不要偷懒关掉其中任何一道。

ubuntu的自带防火墙应用是ufw。它的设置比起iptables来可简单太多了。先启用防火墙
sudo ufw enable
(它提示启用ufw可能会导致远程ssh连接断开,没关系选y,ufw默认放行22/tcp端口,但要保证你之前没在sshd_config理把ssh默认端口改掉)。

先输入下面两条语句,表示默认放行一切出口流量,拦截一切进口流量
sudo ufw default deny incoming
sudo ufw default allow outgoing

再放行所有局域网内的连接请求
sudo ufw allow from 192.168.1.0/24
或者可以指定某个端口进行开放,这样会允许来自公网的访问请求
sudo ufw allow 9091
更加细致的设置规则可以参考ufw -h命令或man ufw,暂时就不细讲了。
在网关路由器部分的设置同样以华硕路由器举例:

firewall.png

左侧导航栏选防火墙->通用。启用防火墙选框选择,处理类型选Accepted。下方的Inbound规则按照你自己的实际需要把对外开放的端口都填在Port Range那个框里。另外三个框可以选填,第一栏是自己给规则起个名字,第二栏是只针对来自某个特定IP的连接请求放行,第三个是放行某个局域网IP的连接。填好后点添加,等所有的端口都添加完毕再点最下面的Apply启用就完成了。

注:路由器的防火墙规则其实就是用的iptables,你的路由器如果是自刷固件,你本人也比较熟练的话可以ssh进路由器的系统用iptables添加规则。


9、从客户端连接NAS

到此为止你在NAS主机和网关处需要设置的内容就全部完成了,剩下的就是尽情享受NAS带来的便利。选择一个合适的客户端或者优秀的客户端应用可以使你访问NAS的体验更加轻松愉悦。

由于我们已经设置好了SSH、NFS、SMB、DLNA/UPNP这几项几乎囊括了目前所有主流连接方式的服务,因此对于客户端的选择就变得非常灵活。不管是电脑、手机、电视还是平板,你都能相当方便地访问到NAS主机。在第6节配置NFS服务时候我已经提到过如何在Windows电脑上访问NFS服务。但其实Windows系统连NAS主机当然是首选SMB:直接在网上邻居或者网络位置里就可以看到NAS主机的图标,点击访问即可。

如果你想在家庭局域网内从手机平板或电视上连接NAS主机并且串流播放各种媒体,那么你需要选择一个合适的应用。本地局域网播放流媒体首选的还是DLNA/UPNP协议。DLNA客户端可以用汗牛充栋来形容,在wiki上有一个专门的页面列举了各个系统平台的常用客户端,我个人使用是iOS系统,选择用nPlayer来播放流媒体。客户端设置方法也十分简单,因为在局域网内添加DLNA/UPNP服务器的时候一般都是自动检测,点添加->DLNA就能看到媒体文件列表,直接点进去就能看了。(如果连不上NAS那就是没设置好,请检查NAS主机上的服务端口、文件夹权限和防火墙。)

如果是要从外网访问家里的NAS,除了我在第7节讲到的要有公网IP并设置好端口转发,还需要能支持ssh连接方式的客户端(其实更加方便的当然是http访问方式,但前文已经提到过了,不怕断网的请尽管尝试,后果自负)。我个人尝试过不少客户端应用(iOS系统),目前用下来公网访问串流功能最完善的应用是nPlayer,4G网络下使用SFTP访问跟局域网播放没有差别,其他的应用或多或少会有些拉跨。

如果是用平板或手机躺床上看漫画可以选择ComicShare,可以直接读取zip压缩文件。不过ComicShare什么都好就是不能从公网访问,那个sftp连接就是个摆设。

电视连接NAS主机看电影和电视剧一般都原生支持DLNA/UPNP或SMB,直接搜索添加就好。当然,如果你想流畅播放4K高清电影,那除了大容量的NAS存储硬盘以外还需要功能强劲且信号覆盖稳定的路由器,这方面我就不专业了,请自行从市面上挑选。


结语:本来想稍微写一下搭建流程的没想到一下写了这么长…嫌啰嗦没看完的只能说声对不起了。如果你对于文中的部分还有什么疑问的可以看一下博客内的其他文章,或者添加我的联系方式,我尽量解答。