myqnapcloud & ddns
需求
先说说我的网络情况:
移动宽带
没有公网v4地
有公网v6地址
所以,只能使用v6地址来维护一个ddns域名
myqnapcloud连接不稳定
qnapcloud
myqnapcloud提供了ddns域名以便访问nas,也提供了v4到v6的隧道
但是,实际测试不管是.com还是.cn连接速度都不怎么给力,甚至连不上……
网络与虚拟交换机不提供DDNS的AAAA记录更新
qnap的网络与虚拟交换机功能虽然有一个ddns更新功能,但是只会收集和更新v4的地址……无法满足需求
选型
ddns服务又很多,这里选了noip ,无它,只是因为能 白嫖
noip配置
注册什么的不多说,完成后,新建一个域名即可
免费账号提供三个子域名,而且会邮件通知你需要定时激活,过期没激活的会被删掉
创建域名
A记录对应v4地址,如果你有公网v4地址填入即可
AAAA记录对应v6地址,填入单播地址
注意fe80:开头的是链路本地地址 ,并不是全球单播地址 ,并不能在公网上使用,这种需要你检查一下上级设备的配置
确认后,一般一两分钟就可以广播出去,你就可以直接使用刚才的域名登录nas了
简单验证-WEB登录
直接登录即可
web管理端url
这里只需要注意一个地方,web端的端口是5000 ,留意一下自己的配置
web管理端端口
简单验证-SSH登录
如果你也打开了ssh登录,测试一下,也是可以使用该域名登录的
ssh登录
noip的ddns域名更新
noip的更新接口
最后只剩下一个问题,ddns怎样更新
首先,我们准备一下noip的更新api说明,参考noip update api
参考下面提供的更新示例说明,其实很简单
http://username:password@dynupdate.no-ip.com/nic/update?hostname=mytest.example.com&myip=192.0.2.25
发送一个带 BasicAuth 的 GET 请求
请求的参数包括需要更新的域名hostname和地址myip (A记录和AAAA记录可一起更新,v4和v6地址用英文,分割即可)
其他可选参数请继续参考文档底部的参数列表
1
2
3
4
5
// 对应的请求http请求原文
GET /nic/update?hostname=mytest.example.com&myip=192.0.2.25 HTTP/1.1
Host: dynupdate.no-ip.com
Authorization: Basic base64-encoded-auth-string
User-Agent: Company DeviceName-Model/FirmwareVersionNumber maintainer-contact@example.com
更新脚本/程序
接下来我们就可以做一个脚本或者更新程序进行ddns更新,这里是我一个写好的更新脚本 ,可以使用发行版或自行编译后使用
noip-updator 脚本包含:
公网IP提取器,根据配置提取对应端口的公网IP ,私网IP会被过滤
ddns更新器,根据IP提取器的结果发送ddns更新请求
通知器,发送本次任务的提取结果和ddns更新结果
1
2
3
4
5
6
7
8
9
10
11
// 示例日志
2022-10-13T10:24:46.505+0800 INFO ip service init...
2022-10-13T10:24:46.505+0800 INFO update service init...
2022-10-13T10:24:46.505+0800 INFO mail service init...
2022-10-13T10:24:46.506+0800 INFO update service filter interface by [name:eth1]
2022-10-13T10:24:46.507+0800 INFO update service found 1 ips
2022-10-13T10:24:47.361+0800 INFO update request sent
2022-10-13T10:24:47.361+0800 INFO ddns update succeed
2022-10-13T10:24:47.362+0800 INFO mail service actived
2022-10-13T10:24:47.768+0800 INFO notify mail sent
2022-10-13T10:25:17.769+0800 INFO notify mail sleep
更新通知邮件
拉取项目
下载对应系统和架构的发行版
首先,ssh登录到nas,然后把发行版解压出来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 这里千万注意脚本保存的位置
cd /share/Public
# 先新建一个文件夹用于部署程序
mkdir -p Projects/noip
cd Projects
# 我机器是linux-arm64,因此下载的是arm64版本
unzip -d noip noip-updator-linux-arm64.zip
# 下载发行版内容到文件夹内,添加执行权限
chmod +x noip-updator
# 准备配置文件
cp config/application.yml.sample config/application.yml
# 完成后目录结构如下
- config/
- application.yml // 配置文件
- log/ // 日志保存路径
- noip-updator // 更新程序
这里千万注意一点,保存程序的文件夹 不能 是 /share/homes/用户名 ,否则在使用下面autorun.sh部署的时候,会发现设备重启时,路径不存在,无法执行
/share/homes/XXXX: No such file or directory
配置application.yml
根据 配置说明 进行填写即可
部署启动
setsid放到后台执行
qnap系统没有nohup
命令,但是有setsid
命令
1
setsid /share/Public/Projects/noip/noip-updator >/dev/null &
使用autorun.sh设置开机启动
qnap提供了一个autorun脚本,可以开机启动对应脚本,配置参考qnap wiki
这时,又来了一个坑,文档前面说了一大堆,这个型号应该执行xxx之类,发现没找对自己机器型号……需要挂载的路径也没找到……
然而,其实只需要看文档最后一part Using "init" script to mount the flash
,为啥文档要把最简单的方法放最后…
1
2
3
4
5
6
7
8
# 挂载
/etc/init.d/init_disk.sh mount_flash_config
# 挂载后执行df看到多了一个挂载点/tmp/nasconfig_tmp
# 所以其实上面挂载是把/dev/mmcblk0p5挂载到了/tmp/nasconfig_tmp路径上了
df -h
...
/dev/mmcblk0p5 7.7M 61.0K 7.7M 1% /tmp/nasconfig_tmp
然后,新建autorun.sh或者修改这个autorun.sh即可
1
2
# 注意需要sudo权限
sudo vim /tmp/nasconfig_tmp/autorun.sh
添加以下脚本到autorun.sh后保存退出
1
2
#!/bin/sh
setsid /share/Public/Projects/noip/noip-updator >/dev/null &
修改权限、取消挂载
1
2
3
4
# 注意添加执行权限
sudo chmod +x /tmp/nasconfig_tmp/autorun.sh
# 取消挂载
/etc/init.d/init_disk.sh umount_flash_config
最后,在nas的控制面板中启用autorun.sh,应用后重启即可
开启autorun.sh脚本
重启后可以通过ps验证进程是否启动,当然你也会收到通知邮件
1
2
ps -a | grep noip
26242 admin 10856 S /share/Public/Projects/noip/noip-updator
其他指令
停止或者重启noip-updator,直接kill掉即可
1
2
3
4
ps -a | grep noip
26242 admin 10856 S /share/Public/Projects/noip/noip-updator
kill 26242
需要注意的几点
不能 把脚本保存在 /share/homes/用户名 路径,因为每次重启后,这个路径都会被清空
autorun.sh内的脚本和nas启动的初始化程序是顺序关系 ,如果不把noip-updator
放到后台,会一直阻塞,导致nas无法正常启动完成,
下面就是错误的脚本
1
2
3
#!/bin/sh
/share/Public/Projects/noip/noip-updator >/dev/null
# noip-updator会一直阻塞导致nas无法正常启动