关键词: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
对于已经处于同一虚拟局域网的设备,可以直接通过ip互访。在网页设备列表中可以看到U-nas的IP,比如10.133.13.33
远程ssh
使用putty之类的工具,直接访问ZeroTier中NAS的地址10.133.13.33
端口22
,就行了
远程AriaNG
在家里路由器上设置端口映射(虚拟服务器)
填写端口号(比如6800
)支持内外网不同端口号的路由器填两个端口号(比如6800
、6800
)。
IP地址填U-nas的局域网IP(比如192.168.1.103
)
然后可以远程直接通过 http://10.133.13.33/apps/aria2/aria2_web 访问AriaNG了
想要下载什么,打开网址,创建下载即可。
更确切的说,把NAS上的文件夹设置为共享,其他电脑创建映射。速度还不错,从NAS上拷贝文件到单位电脑能达到2M/s,可以当远程磁盘用用了。
功能
原理
步骤
NAS由于只是玩玩,并没有保存什么重要东西。所以并没有做RAID磁盘阵列。
唯一担心的就是,NAS上保存常用软件工具,某一天磁盘挂掉就白整理了。
而这些常用工具又经常变动更新,每次手动拷贝出去备份也不是个事。
于是想到了云盘备份。
工具
Rclone。
可以同步很多网盘,比如Mega、Dropbox、BackblazeB2、OpenDrive、QingCloud、Amazon S3、box、OneDrive、Pcloud、YandexDisk。
这里用到的YandexDisk,YandexDisk免费上限10G,所以注意要同步的文件夹不要超过10G。其实更好的选择是OneDrive,但是NAS上没挂代理,所以无法被创建同步。
步骤(以U-nas为例,其他系统请自行查找安装方法)
rclone authorize "yandex"
,打开网页中点击授权,复制生成结果。OneDrive方法一致,网上有如何申请5T的方法,申请试过,也可以创建数据源。但是在创建同步的时候,在Rclone中看不到OneDrive的文件夹,估计只能挂代理才能用了。
最后这个只能说是个人需求了。可能很多人用不到,用到的可以看看。
在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测试,这里只是记录一下。
telnet
功能(Windows>控制面板>程序>打开或关闭Windows功能>勾选Telnet客户端)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地址
https://github.com/houtianze/bypy
pip install bypy
bypy info
。显示“Please visit:“https://openapi.baidu.com/~esponse_type=code” And authorize this app”。复制地址到网页打开,授权,然后将授权码粘贴回命令行中,提示Successfully authorized绑定成功。我的应用/bypy
下新建文件夹test
,回到命令行输入bypy list
,获取网盘目录,能够看到刚创建的文件夹。rm /root/.bypy/bypy.hashcache.json
,执行删除,按提示删除缓存$ pip install cryptography
$ pip install pyOpenSSL
$ pip install certifi
$ pip install --upgrade requests
bypy syncup
或bypy upload
:把当前目录同步到云盘bypy syncdown
或bypy 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#
下面流程是以U-nas上安装docker控件为例,参照设置已经成功完成,整理整个流程精简成文字。
重点在于说明如何部署迅雷和绑定远程,其他系统如何安装docker请自行查找教程。
安装流程:
由于没有VPS,所以所以没有去尝试搭建内网穿透,而是从网上发现了一个创建虚拟局域网的工具Zerotier,这里说一下实现流程。
创建虚拟局域网
NAS上安装Zerotier
apt install curl
,安装curl(机器上没有,所以这里顺手装了一个)curl -s https://install.zerotier.com/ | bash
,安装zerotierzerotier-cli join <你的NetworkID>
,加入到之前创建的虚拟局域网,出现200 join OK
字样就说明成功连上虚拟局域网了。刷新之前打开过的页面 https://my.zerotier.com/network ,滚动网页向下找到Members一项,里面应该已经有一个设备了,将改设备前面的复选框勾选,开启,然后备注一个短名称比如HomeNas。配置要与U-nas建立连接的非局域网设备
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