自运营商提供IPv6公网地址以来,一直通过阿里云域名解析服务访问和管理家里的Synology NAS,IPv6下移动端APP连接迟滞和频繁变动的IPv4公网地址使得在群晖部署的邮件系统等依赖IPv4环境的服务体检极差,不胜其烦;同时一直有一个心结,希望能够根据需要,实现群晖远程随用随开(自用NAS多数时间都是在空挂),一直找不到合适的解决方案。近期在捣鼓树莓派及DNS解析时发现通过树莓派及阿里云CLI能够较完美实现相应需求,且不引入第三方,索性记录下来与大家分享。
一、软硬件环境
- NAS:群晖1621+
- 光猫:华为8145xr
- UPS:APC BK650M2
- 树莓派5(其他版本应该都可以,毕竟没有什么大负载)
- 联通千兆宽带
- 阿里云域名及云解析DNS
二、基本思路
- 通过SSH登录树莓派唤醒处于同一局域网的Synology NAS主机;
- 编写脚本,利用阿里云解析DNS和CLI命令定期更新域名解析记录。
三、准备工作
1.开启树莓派SSH访问。
建议在烧录树莓派系统时设置用户名及密码,开启SSH支持。
系统启动后即可在局域网内使用终端工具通过SSH登录树莓派。
ssh 用户名@树莓派内网IP
2.取得域名
相信玩NAS的小伙伴为方便NAS的管理都已申请了域名,本文要用到阿里云的域名和云解析服务,还没有域名的小伙伴可到阿里云了解并申请注册自己的域名。
3.设置阿里云用户AccessKey
阿里云命令行工具 CLI(Alibaba Cloud CLI)是基于阿里云开放 API 建立的管理工具,可以通过调用阿里云开放 API 来管理阿里云产品。在安装配置阿里云CLI工具时需要提供AccessKey信息,需提前设置并获取。
以下是简要步骤,简尔言之就是创建一个专用的用户,取得AccessKey,分配相应权限。
进入阿里云,点击右上角 控制台 ;
完成登录后,点击右上角用户头像区域,点击 AccessKey管理 ;
建议按照官方安全提示使用子用户AccessKey;
在 RAM访问控制 —— 用户 页面点击 创建用户 ;
填入 登录名称 ,勾选 OpenAPI调用访问 ,点击 确定 。
用户创建成功后,在 创建用户 确认页面,点击 下载CSV文件 保存用户信息(该页面关闭后将无法再次获取 “AccessKey ID” 及 “AccessKey Secret” 信息)。点击 添加权限 ,在 系统策略中搜索“dns”,选择 管理HTTPDNS、云解析DNS、公共DNS(PubDNS)的权限 ,点击 确定 ,完成用户创建及权限添加。
阿里云官方文档很详尽和完善,在页面内就可以找到页面内容的帮助文档,可自行查看设置契合自身需求的功能。
4.取得群晖MAC地址
登录群晖,打开 控制面板 ,进入 信息中心 —— 网络 ,查看记录相应网络端口的 网络物理地址(MAC address) 。
5.开启群晖内网唤醒
打开 控制面板——硬件和电源——常规——电源自动恢复:选中 修复电源问题后自动重新启动 与 启用相应端口的 网络唤醒
修复电源问题后自动重新启动:局域网唤醒的前提是系统正常关机,网卡正常加电,因意外断电导致的系统关机、网卡掉电是无法实现唤醒。选中该选项可让群晖系统因意外断电关机情况下,在电源恢复后自动开机。
6.设置端口转发
根据自身网络及硬件情况,通过光猫或路由器设置树莓派SSH端口相应的IPv4及IPv6转发规则,使外网能够通过SSH访问树莓派,默认端口为22。
四、外网访问树莓派
1.获得树莓派公网IP
方式有很多,使用curl工具,简单直接:
#SSH登录树莓派
ssh 用户名@树莓派内网IP
#获取公网IPv6地址
curl ifconfig.me -ipv6
#获取公网IPv4地址
curl ifconfig.me -ipv4
* Trying 34.117.118.44:80...
* Connected to ifconfig.me (34.117.118.44) port 80 (#0)
> GET / HTTP/1.1
> Host: ifconfig.me
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< server: fasthttp
server: fasthttp
< date: Tue, 20 Feb 2024 07:16:07 GMT
date: Tue, 20 Feb 2024 07:16:07 GMT
< content-type: text/plain
content-type: text/plain
< Content-Length: 13
Content-Length: 13
< access-control-allow-origin: *
access-control-allow-origin: *
< via: 1.1 google
via: 1.1 google
<
* Connection #0 to host ifconfig.me left intact
222.333.444.555
#输出的的最后一行即为相应的公网IP。将IPv4及IPv6地址记录下来。
2.设置域名解析
进入阿里云,点击右上角 控制台 。
完成登录后,点击左上角图标,在 产品与服务 中选择 云解析DNS 。
在 域名解析 —— 权威域名 页签单击目标域名 解析设置 。
单击 添加记录 按钮。分别添加IPv4和IPv6记录。
- 记录类型:ipv4选择: A | ipv6选择: AAAA ;
- 主机记录:@。一般是指子域名的前缀(如需创建子域名为www.cloud-example.com, 主机记录 输入 www;如需设置主域名本身dns-example.com,主机记录 输入 @);
- 解析请求来源:默认;
- 记录值:记录值为IP地址,填写之前取得的树莓派公网 IPv4|IPv6 地址;
- TTL:默认。为缓存时间,数值越小,修改记录理论上各地生效时间越短。
如端口转发设置正确,在解析记录生效后即可在外网通过域名使用终端工具访问登录树莓派。
ssh 用户名@域名
五、通过树莓派唤醒群晖
以下均在终端命令行下操作:
#使用SSH连接登录树莓派。
ssh 用户名@域名
#输入密码,完成登录
#安装wakeonlan工具
sudo apt install wakeonlan
#向局域网发送魔术包,唤醒对应MAC地址的网络设备
#填写之前记录的群晖网络端口的MAC地址,以 *:* 分隔
wakeonlan 00:00:00...
#可以将命令写入一个脚本文件,减少每次的输入操作
touch wake.sh
vi wake.sh
#!/bin/bash
wakeonlan 00:00:00...
#记得添加执行权限
chmod +x wake.sh
#之后就可以通过执行这个脚本文件唤醒群晖
./wake.sh
六、使用阿里云动态更新域名解析
因使用的联通宽带IPv6公网地址是固定的(使用了一年多没有变过),IPv4公网地址三天左右动态更新,所以仅给出了IPv4的更新示例,如果需要更新IPv6仅需添加一条相应的阿里云CLI命令。
以下均在终端操作:
1.安装阿里云CLI
#使用SSH连接登录树莓派。
ssh 用户名@域名
#输入密码,完成登录
#下载阿里云CLI,树莓派下载arm64
curl -O https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-arm64.tgz
#解压,会在当前目录下生成可执行文件——aliyun
tar xzvf aliyun-cli-linux-latest-arm64.tgz
#依照官方文档建议,将aliyun可执行文件复制到/usr/local/bin目录中
sudo cp aliyun /usr/local/bin
#另:要确保PATH系统变量值中存在/usr/local/bin路径
#查看PATH系统变量的值
$PATH
#如果/usr/local/bin不在其中,则添加
export PATH=$PATH:/usr/local/bin
2.配置阿里云CLI凭证
#执行配置命令
aliyun configure --profile akProfile
#根据提示,分别在 Access Key Id 和 Access Key Secret 处填写之前保存的用户 Access Key Id 和 Access Key Secret 。
Configuring profile 'akProfile' in '' authenticate mode...
Access Key Id []: Accesskey ID
Access Key Secret []: AccessKey Secret
Default Region Id []: cn-hangzhou
Default Output Format [json]: json (Only support json))
Default Language [zh|en] en:
Saving profile[akProfile] ...Done.
#配置完成后,若配置凭证有效,显示如下信息:
Configure Done!!! …………..888888888888888888888 ……..=8888888888888888888D=………….. ………..88888888888888888888888 ……….D8888888888888888888888I……….. ………,8888888888888ZI: ………………………=Z88D8888888888D………. ………+88888888 ……………………………………88888888D………. ………+88888888 …….Welcome to use Alibaba Cloud…….O8888888D………. ………+88888888 …………. ************* …………..O8888888D………. ………+88888888 …. Command Line Interface(Reloaded) ….O8888888D………. ………+88888888…………………………………….88888888D………. ……….D888888888888DO+. ……………………..?ND888888888888D………. ………..O8888888888888888888888………..D8888888888888888888888=……….. ………… .:D8888888888888888888………78888888888888888888O …………..
阿里云CLI工具的下载安装及配置等,具体可参考阿里云CLI 产品文档。
3.获取和更新域名解析记录
#通过 aliyun alidns Describedomainrecords 获取解析记录列表
aliyun alidns DescribeDomainRecords --region cn-beijing --DomainName 域名
#在返回数据中查找之前设置的IPv4(及IPv6)解析记录,记录 RecordId 值。
#通过 aliyun alidns UpdateDomainRecord 设置修改域名解析记录
aliyun alidns UpdateDomainRecord --region cn-beijing --RR "@" --RecordId "之前记录的要修改解析记录的RecordId" --Type "A" --Value "新的IPv4地址"
--RR:主机记录
--Type:记录类型
其他API命令可以通过阿里云官网云解析API调试页面查看Cli示例。
4.编写更新脚本
综合介绍相关内容,将相关操作写入脚本文件,以下是示例:
#新建ipv4.txt文件,记录获取的公网IPv4地址,通过比较新旧值判断是否更新解析记录
touch ipv4.txt
#脚本文件udns.sh
touch udns.sh
vi udns.sh
#!/bin/bash
#udns.log为日志文件,将当前时间写入日志文件
date >> 绝对路径/udns.log
#将原ipv4.txt文件记录的地址赋值给oldip变量
oldip=$(cat "绝对路径/ipv4.txt")
#获取公网IP,通过grep命令仅记录最后一行IP地址信息, > 覆盖之前的记录
curl ifconfig.me -ipv4 |grep -E '^[0-9]' > "绝对路径/ipv4.txt"
newip=$(cat "绝对路径/ipv4.txt")
if [ "$newip" != "$oldip" ];
then
#修改域名解析记录
/usr/local/bin/aliyun alidns UpdateDomainRecord --region cn-beijing --RR "@" --RecordId "要修改解析记录的RecordId" --Type "A" --Value $newip >> 绝对路径/udns.log
echo IPv4地址 $oldip 更新为 $newip >> 绝对路径/udns.log
echo "-------------------------------------------------------" >> 绝对路径/udns.log
else
echo IPv4地址 $oldip 没有变更 >> 绝对路径/udns.log
echo "-------------------------------------------------------" >> 绝对路径/udns.log
fi
#将脚本文件设置为可执行
chmod +x udns.sh
#通过执行udns.sh文件更新阿里云DNS解析记录
./udns.sh
#将脚本设置为定期任务
crontab -e
#添加新的任务,每小时执行一次
0 * * * * 绝对路径/udns.sh
以上就是利用树莓派及阿里云CLI远程唤醒群晖及动态更新解析公网IP的简要实现,抛砖引玉。因是事后整理,流程和手工录入难免有疏漏和错误之处,请大家批评指正。