由于家里设备及服务较多,网络较为复杂,很难记住所有细节,容易造成服务中断。因此考虑整理成文档的形式进行保存。
网络
目前家庭网络根据物理层不同,大致分为四种:有线局域网(lan)/无线局域网(wlan)/蓝牙Mesh/Zigbee。
局域网
家庭局域网使用 ASUS AC86U 作为入户网关,前置电信&联通光猫。其中电信200Mbps/联通100Mbps。
路由器上设置双线接入,电信作为主宽带,使用PPPoE拨号,并带有动态公网IP,支持IPv6;联通使用DHCP模式。双宽带做2:1负载均衡,总下行带宽可跑满300Mbps。
网关
必备功能:
- 双线双拨:用于支持双线接入
- VPN:用于外部连接内网
- Instant Guard:可以使用 AUSU Router APP 一键接入。
- IPSec:手机配之后直接接入
- ~~ ZeroTier:就是个垃圾,连接实在太慢了,已经删除。~~
- 阿里DDNS:由于我的域名阿里和腾讯都有,但阿里的API做的实在是太好了,就用阿里的了
- Let’s Encrypt:帮我保证回家网址具备HTTPS。
- Clash:华硕路由器上Clash用着还算稳定,仅提供以下设备代理:
- NAS/手机/iPad/机顶盒/电视机
有线局域网
鉴于有线实在是太香了,家里能连网线的设备都连了网线。目前在弱电箱有一个总交换机,用于解决路由器LAN口不够的问题,另外在电视柜这边有一个电视柜交换机,给电视机/机顶盒/NAS提供有线网络。
无线局域网
目前无线局域网提供了 2.4G/5G 两种模式,WIFI6由于设备不多,暂未升级。
2.4G目前还是比较重要的,几乎所有IoT都仅支持2.4G,目前由于怕麻烦暂时没做网络隔离。
目前卧室的无线网稍微有些差,后续寻找解决方案。
蓝牙Mesh
蓝牙Mesh主要为一系列 IoT 设备服务。蓝牙技术目前能覆盖Zigbee所有功能,因为所有商家都在主推蓝牙连接。
蓝牙Mesh: 卧室:小米米家智能闹钟 客厅:小米开关/小米音箱Play增强版
Zigbee网络
目前家里Zigbee网关仅有绿米网关2,下辖。。。人体感应器 * 1
NAS
NAS 是买的二手蜗牛星际,300块,真香。 虽然叫NAS,但实际上并没有对存储做特殊处理,并且安装的还是Manjaro系统,方便滚动升级。
其中的服务大概就这么些:
- 存储
- avahi
- netatalk
- smb
- 下载
- aria2
- transmission
- 网页服务
- caddy
- ariang
- flood
- 自制服务聚合网站
- 内容服务
- plex media server
- 应用及管理
- grafana
- vncserver
- sshd
NAS上的服务已经比我之前独居时少多了,那时候还有AirPlay和HomeAssisant
硬盘挂载: 当然是fstab自动挂载咯
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a device; this may
# be used with UUID= as a more robust way to name devices that works even if
# disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=D05C-FA8F /boot/efi vfat umask=0077 0 2
UUID=7f289ccb-bad6-402f-b671-b6a5426b1586 / ext4 defaults,noatime,discard 0 1
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
UUID=2e398f6e-9ec6-4661-b7cc-cb88f09ff41b /storage ext4 defaults,noatime,discard 0 0
UUID=dd85e415-35c5-4b3f-851b-ca1bb940f6df /treasure ext4 defaults,noatime,discard 0 0
存储
既然都叫NAS了,那就从存储说起。
SMB
必备功能,不用多说了吧。
配置位于 /etc/samba/smb.conf
我的配置较为简单:
[global]
workgroup = WORKGROUP
netbios name = MorningServerSmb
server string = MorningServer SMB
security = user
server max protocol = SMB3_11
server min protocol = NT1
server multi channel support = yes
[storage]
path = /storage
writeable = yes
browseable = yes
[treasure]
path = /treasure
writeable = yes
browseable = yes
create mask = 0777
#客户端上传文件的默认权限
directory mask = 0777
#客户端创建目录的默认权限
Avahi
Avahi是一个mDNS服务,多播DNS,主要用于局域网内组播DNS信息的作用。
Netatalk
用于提供 AFP 服务。这是一项古老的苹果协议,AppleTalk 是由 Apple 公司推出的一种多层协议,支持网络路由选择、事务服务、数据流服务以及域名服务,并且通过 Apple 硬件中的 LocalTalk 接口全面实现 Apple 系统间的文件和打印共享服务。
当前的兼容性主要为:
- Mac OS X v10.4及之后版本取消了依赖AppleTalk进行通信的AFP服务。
- 使用经典Mac OS的计算机可以连接到AFP 3.x服务,但有一些限制,例如:Mac OS 8中的最大文件大小为2吉字节。通常来说,Mac OS 9.1或更高版本建议连接到AFP 3.x服务;对9.1版之前的原始Mac OS版本,需要安装AppleShare客户端3.8.8版。
- 网络主目录需要AFP 3.0及更高版本,从Mac OS X需要用户主目录上的POSIX权限开始。使用Kerberos的单点登录需要AFP 3.1。
- APFS:AFP目前在苹果文件系统(APFS)中已弃用。
— WikiPadia
当然我们在NAS上仍然支持这项古老的服务主要是为了macOS 提供 TimeMachine 备份,需提供至少1.5倍的电脑硬盘容量用于备份,对我目前的macbook pro来说就是 512GBytes * 1.5。
配置位于 /etc/afp.conf
[Global]
mimic model = TimeCapsule6,106 #这个是指定让机器在你Mac系统中显示为什么的图标,这儿显示成TM
log level = default:warn
log file = /var/log/afpd.log
hosts allow = 192.168.31.0/24 #允许访问的主机地址
hostname = MorningServer #主机名,随你喜欢
uam list = uams_dhx.so uams_dhx2.so #认证方式,这玩意我是不太懂,懒得折腾了
[Storage]
path = /storage
rwlist = morningtzh
force user = morningtzh
[Treasure]
path = /treasure
rwlist = morningtzh
force user = morningtzh
[PlashSpeed]
path = /plashspeed
rwlist = morningtzh
force user = morningtzh
[TimeMachine]
path = /treasure/TimeMachine #数据目录
time machine = yes #yes才支持TimeMachine
spotlight = no #关闭spotlight索引,这个在Centos6上是不能开的,缺依赖,7上面可以开,但是不建议,吃资源
rwlist = morningtzh #指定某用户有读写权限
force user = morningtzh #强制指定用户
vol size limit = 700000 #限制TM存储容量,单位为MB。
下载
下载就比较简单了,一个是经典的 aria2,支持rpc远程调用,另一个是transmission,用于bt下载。
Aria2
目前我暂时美告成 systemd 服务,懒得写,用的也不多,调用命令:
aria2c --conf-path=/storage/.aria2/aria2.conf -D
配置:
## '#'开头为注释内容, 选项都有相应的注释说明, 根据需要修改 ##
## 被注释的选项填写的是默认值, 建议在需要修改时再取消注释 ##
## 进度保存相关 ##
# 从会话文件中读取下载任务
input-file=/storage/.aria2/aria2.session
# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
save-session=/storage/.aria2/aria2.session
# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
save-session-interval=60
## 文件保存相关 ##
# 文件的保存路径, 默认: 当前启动位置
dir=/storage/downloads
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
disk-cache=32M
# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: none < falloc ? trunc < prealloc
# falloc和trunc则需要文件系统和内核支持
# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
file-allocation=trunc
# 断点续传
continue=true
## 下载连接相关 ##
# 最大同时下载任务数, 运行时可修改, 默认:5
max-concurrent-downloads=5
# 同一服务器连接数, 添加时可指定, 默认:1
max-connection-per-server=5
# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=10M
# 单个任务最大线程数, 添加时可指定, 默认:5
split=15
# 整体下载速度限制, 运行时可修改, 默认:0
max-overall-download-limit=0
# 单个任务下载速度限制, 默认:0
max-download-limit=0
# 整体上传速度限制, 运行时可修改, 默认:0
max-overall-upload-limit=0
# 单个任务上传速度限制, 默认:0
max-upload-limit=0
# 禁用IPv6, 默认:false
#disable-ipv6=true
# 连接超时时间, 默认:60
timeout=60
# 最大重试次数, 设置为0表示不限制重试次数, 默认:5
max-tries=5
# 设置重试等待的秒数, 默认:0
retry-wait=0
## RPC相关设置 ##
# 启用RPC, 默认:false
enable-rpc=true
# 允许所有来源, 默认:false
rpc-allow-origin-all=true
# 允许非外部访问, 默认:false
rpc-listen-all=true
# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
event-poll=epoll
# RPC监听端口, 端口被占用时可以修改, 默认:6800
rpc-listen-port=6800
# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
#rpc-secret=<TOKEN>
# 设置的RPC访问用户名, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-user=<USER>
# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-passwd=<PASSWD>
# 是否启用 RPC 服务的 SSL/TLS 加密,
# 启用加密后 RPC 服务需要使用 https 或者 wss 协议连接
#rpc-secure=true
# 在 RPC 服务中启用 SSL/TLS 加密时的证书文件,
# 使用 PEM 格式时,您必须通过 --rpc-private-key 指定私钥
#rpc-certificate=/path/to/certificate.pem
# 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件
#rpc-private-key=/path/to/certificate.key
## BT/PT下载相关 ##
# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
follow-torrent=true
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
listen-port=51413
# 单个种子最大连接数, 默认:55
#bt-max-peers=55
# 打开DHT功能, PT需要禁用, 默认:true
enable-dht=true
# 打开IPv6 DHT功能, PT需要禁用
#enable-dht6=false
# DHT网络监听端口, 默认:6881-6999
#dht-listen-port=6881-6999
# 本地节点查找, PT需要禁用, 默认:false
#bt-enable-lpd=false
# 种子交换, PT需要禁用, 默认:true
enable-peer-exchange=false
# 每个种子限速, 对少种的PT很有用, 默认:50K
#bt-request-peer-speed-limit=50K
# 客户端伪装, PT需要
peer-id-prefix=-TR2770-
user-agent=Transmission/2.77
# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
seed-ratio=1.0
# 强制保存会话, 即使任务已经完成, 默认:false
# 较新的版本开启后会在任务完成后依然保留.aria2文件
#force-save=false
# BT校验相关, 默认:true
bt-hash-check-seed=true
# 继续之前的BT任务时, 无需再次校验, 默认:false
bt-seed-unverified=true
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
bt-save-metadata=true
aria2 虽然里面配置了bt,但并不会使用,因为有transmission在。另外还有aria2gui,会在网页服务中讲。
Transmission
BT下载器,目前是3.0,最近升级丢失了好多配置信息,之前一直保活的种子也没了,好气。
新版本增加了rpc白名单,转为root用户到配置下去关掉即可,其他倒也没什么要配置的。
配置位于:/var/lib/transmission/.config/transmission-daemon/settings.json
详细配置见ArchWiki:Transmission
网页服务
作为一个Server自然是要有一些网页服务的。主要是针对Caddy的配置。
Caddy 是一款轻量级的网页服务器,他比较特别的功能是可以自动从 Let’s Encrypt 更新域名证书,当然针对内网的管理页面就不用了。
主要提供了:
ariang和flood分别是aria2和transmission的前端,非常简单好用。
配置位于/etc/caddy/Caddyfile
,需要注意,此处是caddy2
# The Caddyfile is an easy way to configure your Caddy web server.
#
# https://caddyserver.com/docs/caddyfile
#
# The configuration below serves a welcome page over HTTP on port 80.
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace the line below with your
# domain name.
#
# https://caddyserver.com/docs/caddyfile/concepts#addresses
{
# Restrict the admin interface to a local unix file socket whose directory
# is restricted to caddy:caddy. By default the TCP socket allows arbitrary
# modification for any process and user that has access to the local
# interface. If admin over TCP is turned on one should make sure
# implications are well understood.
#admin "unix//run/caddy/admin.socket"
debug
}
http://, home.gangjing.online {
# Set this path to your site's directory.
#root /index.html /storage/wwwroot/index.html
# Enable the static file server.
root * /storage/wwwroot/morninghome/build
file_server
# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000
# Refer to the directive documentation for more options.
# https://caddyserver.com/docs/caddyfile/directives
file_server /ariang/* {
root /storage/wwwroot/
index index.html
}
file_server /media/* {
root /storage/
browse
}
file_server /downloads/* {
root /storage/
browse
}
file_server /storage/* {
root /
browse
}
file_server /treasure/* {
root /
browse
}
reverse_proxy /grafana/* 127.0.0.1:10198
reverse_proxy /flood/* 127.0.0.1:10199
php_fastcgi /phpmyadmin/* unix//run/php-fpm/php-fpm.sock
}
# Import additional caddy config files in /etc/caddy/conf.d/
#import ./caddy.conf
自制聚合网站
我自己写的,当然要有一章说明啦。其实很简单,用react+antd搭了一个架子,针对内网各个网址都做了一次iframe,再来一个href可以跳转到相应网站。
IoT
我得把家里所有IoT列出来,自动化策略主要会在后面的解决方案部分。
当前设备
位置 | 设备名称 | 网络类型 | 网关 | 型号 |
---|---|---|---|---|
客厅 | 鱼缸 | WIFI/蓝牙 | 蓝牙网关 | chuangmi.plug.212a01 |
客厅 | Aqara网关 | WIFI/Zigbee | Zigbee网关 | lumi.gateway.aqhm01 |
客厅 | 小爱音箱 | WIFI/蓝牙 | 蓝牙Mesh网关 | xiaomi.wifispeaker.l05c |
房间 | 闹钟 | WIFI/蓝牙 | 蓝牙Mesh网关 | zimi.clock.myk01 |
客厅 | Aqara Motion Sensor | Zigbee | lumi.sensor_motion.aq2 | |
房间 | 台灯 | 蓝牙 | yeelink.light.mbulb3 | |
书房 | 台灯 | 蓝牙 | yeelink.light.mbulb3 | |
客厅 | 筒灯中 | 蓝牙 | yeelink.light.ml1 | |
客厅 | 筒灯左 | 蓝牙 | yeelink.light.ml1 | |
客厅 | 筒灯右 | 蓝牙 | yeelink.light.ml1 | |
房间 | 夜灯 | 蓝牙 | yeelink.light.nl1 | |
门口 | 门 | 蓝牙 | loock.lock.cc2s | |
房间 | 主灯 | 蓝牙 | lemesh.light.wy0c07 | |
房间 | 风扇 | WIFI | dmaker.fan.p10 | |
客厅 | 摄像机 | WIFI | mijia.camera.v3 | |
房间 | 空调 | WIFI | lumi.acpartner.mcn02 | |
门口 | 门铃 | WIFI | madv.cateye.miowlv2l | |
书房 | 空调 | WIFI | lumi.acpartner.mcn02 | |
房间 | 电暖器 | WIFI | leshow.heater.bs1s | |
客厅 | 风扇 | WIFI | dmaker.fan.p10 | |
厨房 | 净水器 | WIFI | yunmi.waterpuri.lx3 | |
房间 | 蚊香 | 蓝牙 | zimi.mosq.v1 | |
客厅 | 蚊香 | 蓝牙 | zimi.mosq.v1 | |
客厅 | 米家蓝牙温湿度计 | 蓝牙 | cleargrass.sensor_ht.dk1 | |
客厅 | 电视 | WIFI | miir.tv.ir01 | |
房间 | 房间温湿度 | Zigbee | lumi.sensor_ht.v1 |