如何搭建一个可以远程开机、挂下载、读写文件、云备份或是搭个数据库玩查询的NAS

关键词:nas主机、智能开关、ZeroTier、内网穿透

以下内容主要讲,如何在公司调用家里的NAS。
不需要通过VPS或FRP,而是使用ZeroTier虚拟局域网的方法。

这里的NAS指的基于Linux内核的系统(文中是用的U-nas系统基于DebianLinux 。用它因为省事,一键安装)。
如果你的NAS是Windows系统,或者也可以直接用TeamViewer实现远程。

远程开关机

没有公网IP,内网过于艰深。
家里路由器就是普通TP-LINK。
尝试过免费花生壳+路由器+端口映射的方案,实测无效。
所以最终也只实现了局域网内远程开机(MAC地址远程开机代码,附在全文最下方

为了实现从单位开启家里机器的愿望,花了20元买了个智能开关。
1、机器设置为通电自动开机
2、使用远程智能开关(小米、阿里、公牛挺多种随便哪个)
手机上下载APP,绑定智能开关,远程开启。
结束(⊙﹏⊙b汗,目前也就是只能这样了)。

远程挂下载

这里折腾过一些东西,包括Aria2、迅雷远程、百度云bypy

  • 百度云bypy。是相当于做一个同步盘,NAS安装程序上绑定账号后,将百度云的东西同步下来,实测bypy只有80k左右的速度,70M的文件用了16分钟下完。不清楚开了vip会怎么样(bypy安装及测试代码附在全文最下方)。
  • docker迅雷远程。试过nas上装docker用迅雷远程,但是远程迅雷的下载速度也是一般,所以也不常用(迅雷Docker部署步骤附在全文最下方
  • Aria2&AriaNG。比较常用的就是Aria2了,主要用来下载最新的美剧,比如神秘法医2,这种国内没有资源的,会找一些国外站点种子质量好一点的BT然后挂着下载,晚上到家了再看。安装部分不再细说(由于U-nas控件直接集成Aria2及管理界面AriaNG所以没什么可说的。其他系统安装这个也比较简单,网上教程很多可以自行查找),远程到家里用的是ZeroTier搭建虚拟局域网来实现(ZeroTier搭建步骤附在全文最下方

远程访问家里的NAS(ZeroTier的运用,虚拟局域网实现内网穿透)

对于已经处于同一虚拟局域网的设备,可以直接通过ip互访。在网页设备列表中可以看到U-nas的IP,比如10.133.13.33
如何搭建一个可以远程开机、挂下载、读写文件、云备份或是搭个数据库玩查询的NAS_第1张图片
远程ssh
使用putty之类的工具,直接访问ZeroTier中NAS的地址10.133.13.33端口22,就行了

远程AriaNG
在家里路由器上设置端口映射(虚拟服务器)
填写端口号(比如6800)支持内外网不同端口号的路由器填两个端口号(比如68006800)。
IP地址填U-nas的局域网IP(比如192.168.1.103
然后可以远程直接通过 http://10.133.13.33/apps/aria2/aria2_web 访问AriaNG了
想要下载什么,打开网址,创建下载即可。
如何搭建一个可以远程开机、挂下载、读写文件、云备份或是搭个数据库玩查询的NAS_第2张图片

远程访问NAS上的磁盘

更确切的说,把NAS上的文件夹设置为共享,其他电脑创建映射。速度还不错,从NAS上拷贝文件到单位电脑能达到2M/s,可以当远程磁盘用用了。

功能

  • 用来保存一些常用的编程工具、加水印、PDF处理、音频视频编辑软件、装机工具等等,可以随时整理更新,需要用的时候直接从NAS上下载。
  • 单位里没弄完的东西,也可以直接拖拽扔到文件夹里面,到家接着弄。

原理

  • 上文说过的ZeroTier虚拟局域网,公司的电脑和家里的NAS实际上可以看做是在同一个局域网下。

步骤

  1. 将NAS上的文件夹开启共享,这样才能被网络发现
  2. 打开我的电脑,空白处右键,点击添加一个网络位置
  3. 点击下一步,直到填写Internet地址或网络地址(A):,点击输入框右侧下拉三角,选择NAS上的共享文件夹,然后一直点下一步,直到完成。
  4. 在我的电脑中,可以直接 看到这个文件夹,双击访问就行了,复制粘贴和普通磁盘一样。
    如何搭建一个可以远程开机、挂下载、读写文件、云备份或是搭个数据库玩查询的NAS_第3张图片

NAS文件云盘存储备份

NAS由于只是玩玩,并没有保存什么重要东西。所以并没有做RAID磁盘阵列。
唯一担心的就是,NAS上保存常用软件工具,某一天磁盘挂掉就白整理了。
而这些常用工具又经常变动更新,每次手动拷贝出去备份也不是个事。
于是想到了云盘备份。

工具
Rclone。
可以同步很多网盘,比如Mega、Dropbox、BackblazeB2、OpenDrive、QingCloud、Amazon S3、box、OneDrive、Pcloud、YandexDisk。
这里用到的YandexDisk,YandexDisk免费上限10G,所以注意要同步的文件夹不要超过10G。其实更好的选择是OneDrive,但是NAS上没挂代理,所以无法被创建同步。

步骤(以U-nas为例,其他系统请自行查找安装方法)

  1. 注册YandexDisk。网盘中创建文件夹比如NAS_backup
  2. 申请授权。PC端下载RcloneWin版,解压后的目录中运行cmd,然后输入rclone authorize "yandex",打开网页中点击授权,复制生成结果。
  3. NAS上安装Rclone。U-nas上是控件直接安装。。
  4. 配置存储源。输入名称和token。token就是之前生成 Json字符串
  5. 创建同步任务。输入名称和两个文件夹:一个是NAS本地文件夹,另一个网盘文件夹。
  6. 设置自动同步时间,至此完成。

OneDrive方法一致,网上有如何申请5T的方法,申请试过,也可以创建数据源。但是在创建同步的时候,在Rclone中看不到OneDrive的文件夹,估计只能挂代理才能用了。

NAS上安装一个MariaDB,远程访问

最后这个只能说是个人需求了。可能很多人用不到,用到的可以看看。

在NAS上搭了个数据库,没用MySQL而是装了MariaDB,两个其实很相似,系统基于Debian更偏好开源工具。

安装步骤

  • dpkg -l,管理软件包,确认一下机器上都装了啥
  • su切换到root下
  • apt-get update更新一下源
  • apt-get install mariadb-server执行安装

配置数据库

$ sudo mysql_secure_installation
> - Enter current password for root (enter for none)(第一次没有密码)
> - Set root password? [Y/n] y (设置 root 密码)
> - Remove anonymous users? [Y/n] y (移除匿名账户)
> - Disallow root login remotely? [Y/n] y (禁用 root 远程登录)
> - Remove test database and access to it? [Y/n] y (删除 test 数据库和访问权限)
> - Reload privilege tables now? [Y/n] y (刷新权限)

让非root用户(admin下)也能用mariadb

$ mysql -u root # root下MariaDB默认不用密码直接进
MariaDB [(none)]> update mysql.user set plugin='mysql_native_password' where user='root';  # 修改认证插件,这样就可以在任何用户下访问MariaDB了
MariaDB [(none)]> update mysql.user set password=password("你的密码") where user='root'; 
MariaDB [(none)]> update mysql.user set host = '%' where user = 'root'; # 避免Host 'IP' is not allowed to connect to this MariaDB server的问题
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> \q;

这样在非root用户下,也可以通过mysql -u root -p输入密码连接数据库了

配置外网访问
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]块下修改bind-address = 0.0.0.0
[mysqld]块下增加一句skip-name-resolve,用来解决Navicat链接报错waiting for initial communication packet问题
然后重启数据库
启动:systemctl start mariadb.service
停止:systemctl stop mariadb.service
查看状态:systemctl status mariadb.service

连接数据库查询
可以用HeidiSQL (轻量级很方便,但是没有自动补全不习惯,后续还是用Navicat了)之类的工具,输入NAS的ZeroTier对应IP、端口(MariaDB一般是3306)、用户名root和数据库密码,就能远程访问查询了

用telmnet测试端口是否可被访问(可以忽略)
中间测试外网访问的时候,远程连不上,也不清楚接口能不能用,所以开了telmnet测试,这里只是记录一下。

  1. 打开telnet功能(Windows>控制面板>程序>打开或关闭Windows功能>勾选Telnet客户端)
  2. 打开cmd,输入telnet ip 端口,如果能进入黑页面,说明端口可以访问

==========================================================

正文结束,以下为一些代码

==========================================================

远程开机代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import socket
import struct

# WakeOnLine,Python控制远程开机代码(目前代码只适合局域网)
# 原代码作者kawayime,出处:https://blog.csdn.net/kawayime/article/details/84406356 
# 在此基础上修改成Python3代码

def wake_on_lan(macaddress):

    # 格式化mac地址到12位字符串
    macaddress = macaddress.strip()
    if len(macaddress) == 12:
        pass
    elif len(macaddress) == 12 + 5:
        sep = macaddress[2]
        macaddress = macaddress.replace(sep, '')
    else:
        raise ValueError('Incorrect MAC address format')

    # 构造开机数据
    data = 'FFFFFFFFFFFF'+macaddress*20
    send_data = b'' 

    # 转换成二进制码
    for i in range(0, len(data), 2):
        part = data[i: i + 2] # 每次取两个字符
        part_ten = int(part, 16) # 16进制转10进制数
        part_hex = struct.pack('B',part_ten) # 转换成二进制码
        #print(part,part_ten,part_hex)  # 输出结果是 FF 255 b'\xff'
        send_data += part_hex
    #print(send_data)  # b'\xff\xff\xf……'

    # Broadcast it to the LAN.
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    sock.sendto(send_data, ('', 7))


if __name__ == '__main__':
    # 输入MAC地址,MAC间字符无间隔,或用":"或"-"间隔均可。
    wake_on_lan('00:00:00:00:00:00')  # 你NAS的MAC地址

百度云Python实现工具——bypy

https://github.com/houtianze/bypy

  1. pip install bypy
  2. bypy info。显示“Please visit:“https://openapi.baidu.com/~esponse_type=code” And authorize this app”。复制地址到网页打开,授权,然后将授权码粘贴回命令行中,提示Successfully authorized绑定成功。
  3. 在百度网盘我的应用/bypy下新建文件夹test,回到命令行输入bypy list,获取网盘目录,能够看到刚创建的文件夹。
  4. 如果显示“ [16:19:00] *** WARNING *** Hash Cache file”,运行rm /root/.bypy/bypy.hashcache.json,执行删除,按提示删除缓存
  5. 如果显示“InsecureRequestWarning: Unverified HTTPS request is being made.”,安装和更新以下模块后,可以解决此问题
    $ pip install cryptography
    $ pip install pyOpenSSL
    $ pip install certifi
    $ pip install --upgrade requests
    
  6. 常见命令:
    • bypy syncupbypy upload:把当前目录同步到云盘
    • bypy syncdownbypy downdir /mnt/nas/data/Others/bypy:把云盘内容同步到本地来
    • cd /mnt/nas/data/Others/bypy然后
      bypy compare:比较本地当前目录和云盘(程序的)根目录
    • 运行时添加-v参数,会显示进度详情
# 实测记录
    root@U-NAS:/# bypy info
    Quota: 2.015TB
    Used: 1.579TB
    root@U-NAS:/# cd /mnt/nas/data/Others/bypy
    root@U-NAS:/mnt/nas/data/Others/bypy# bypy compare
    ==== Same files ===
    ==== Different files ===
    ==== Local only ====
    ==== Remote only ====
    F - test/大数据架构详解:从数据获取到深度学习.pdf
    F - test/心理治疗中的依恋.pdf
    D - test
    F - test/[精通正则表达式(第三版)].(美)佛瑞德.扫描中文版.pdf
    F - test/实用数学手册(第2版)扫描版.pdf
    
    Statistics:
    --------------------------------
    Same: 0
    Different: 0
    Local only: 0
    Remote only: 8
    root@U-NAS:/mnt/nas/data/Others/bypy# bypy syncdown -v
    Loading Hash Cache File '/root/.bypy/bypy.hashcache.json'...
    Hash Cache File loaded.
    Gathering local directory ...
    Done
    Gathering remote directory ...
    Done
    Comparing ...
    Done
    <E> [16:21:55] Error accessing 'https://pcs.baidu.com/rest/2.0/pcs/file'
    <E> [16:21:55] Function: __get_file_info_act
    <E> [16:21:55] Website parameters: {'path': '/apps/bypy/test', 'by': 'name', 'method': 'list', 'order': 'asc'}
    <E> [16:21:55] Waiting 10 seconds before retrying...
    <E> [16:22:05] Request Try #2 / 5
    Creating local directory 'test'
    [====================] 100% (72.8MB/72.8MB) ETA:  (76kB/s, 16m16s gone) 'test/大数据架构详解:从数据获取到深度学习.pdf' <== '/apps/bypy/test/大数据架构详解:从数据获取到深度学习.pdf' OK
    ^CSignal 2 received, Abort
    Skip saving Hash Cache since it has not been updated.
    Skip saving Hash Cache since it has not been updated.
    root@U-NAS:/mnt/nas/data/Others/bypy# 

Docker配置迅雷远程

下面流程是以U-nas上安装docker控件为例,参照设置已经成功完成,整理整个流程精简成文字。
重点在于说明如何部署迅雷和绑定远程,其他系统如何安装docker请自行查找教程。

安装流程:

  1. 从APP列表中,选择docker控件安装。
  2. 共享目录里面新建个目录、不共享、名称为docker
  3. 打开,勾选Portainer,目录 mnt/u-nas/docker,应用
  4. 管理docker
  5. 输入密码创建账号、选择local。
  6. 进入控制台,左侧选image,拉取镜像,name处输入:yinheli/docker-thunder-xware:latest,点拉去
  7. 等待(国内可能比较慢10-20分钟,镜像大概228.6 MB)
  8. 控制台,左侧选Containers,add container。上面name:thunder,下面name:yinheli/docker-thunder-xware:latest,Restart policy:always,点deploy the container
    8. 进入ssh、root账户下运行:docker run -it --shm-size=“8g” --name=“thunder” --restart=always yinheli/docker-thunder-xware:latest
  9. 部署完成后,勾选Thunder,点Start,然后列表Thuder所在行一排小图标里的第一个叹号。
  10. 生成激活码。看 log里面,有一句THE ACTIVE CODE IS: xxxxxx,如果没有,全是失败,就回到上一页,勾选Thunder,点Restart(我就是restart很多次然后才拿到激活码)
  11. 打开 http://yuancheng.xunlei.com ,输入账号迅雷密码登陆,然后输入激活码绑定。
  12. 然后就能用迅雷下载了

用Zerotier实现虚拟局域网(代替内网穿透)

由于没有VPS,所以所以没有去尝试搭建内网穿透,而是从网上发现了一个创建虚拟局域网的工具Zerotier,这里说一下实现流程。

创建虚拟局域网

  1. zerotier.com 注册账号
  2. 访问 https://my.zerotier.com/network ,创建一个虚拟局域网,然后打开可以看到NetworkID

NAS上安装Zerotier

  1. 切换到root账号下
  2. 输入apt install curl,安装curl(机器上没有,所以这里顺手装了一个)
  3. 输入curl -s https://install.zerotier.com/ | bash,安装zerotier
  4. 输入zerotier-cli join <你的NetworkID>,加入到之前创建的虚拟局域网,出现200 join OK字样就说明成功连上虚拟局域网了。刷新之前打开过的页面 https://my.zerotier.com/network ,滚动网页向下找到Members一项,里面应该已经有一个设备了,将改设备前面的复选框勾选,开启,然后备注一个短名称比如HomeNas
  5. 安装后默认自启动无需额外设置

配置要与U-nas建立连接的非局域网设备

  1. 访问 http://www.zerotier.com/download.shtml ,下载对应版本ZeroTier,Win或Android各种版本都有,安装
  2. 打开安好软件,登录zerotier账号,输入NetworkID,加入虚拟局域网
  3. 回到网页,勾选,备注短名称比如PhoneOffice
  4. 打开命令行(Debain要root下或sudo 提权运行,Win标注管理员权限的CMD),输入zerotier-cli listpeers,查看当前虚拟网络中的设备,检查是否设备正常显示。因为当前配置了两台机器,输出结果应包含2个参数齐全的LEAF节点,说明加入成功;如果只有一个或部分参数缺失,就稍等1分钟再刷新看看。
    # 返回结果示例
    C:\Windows\system32>zerotier-cli listpeers
    200 listpeers <ztaddr> <path> <latency> <version> <role>
    200 listpeers 159xxxxxxx 35.235.xx.xx/xxxxx;xxx;xxx 473 1.2.13 LEAF
    200 listpeers 884xxxxxxx 45.32.xx.xx/xxxx;xxx;xxxxx 335 1.1.5 PLANET
    200 listpeers 9d2xxxxxxx 188.166.xx.xx/xxxx;xxxxx;xxxxx 348 1.1.5 PLANET
    200 listpeers bb2xxxxxxx 115.183.xx.xx/xxxxx;xxx;xxxx 85 1.2.12 LEAF
    

曾出现过一次连不上的问题,打开电脑中ZeroTier客户端发现Node ID为空,尝试在Join Network中输入NetworkID,提交返回“Error Joining Network:Cannot connect to ZeroTier service”问题。解决方法是:下载安装包,安装选择修复,可以解决。

2019-08-26补充,之前的时候还是1.2现在都已经1.4了。
Win端,可以直接下载安装
NAS上,可以执行更新

sudo apt update
sudo apt install zerotier-one

你可能感兴趣的:(NAS)