目录

Qnap使用ipv6进行NOIP的DDNS域名更新

myqnapcloud & ddns

需求

先说说我的网络情况:

  1. 移动宽带
  2. 没有公网v4地
  3. 公网v6地址

所以,只能使用v6地址来维护一个ddns域名

myqnapcloud连接不稳定

./qnapcloud.png
qnapcloud
myqnapcloud提供了ddns域名以便访问nas,也提供了v4到v6的隧道

但是,实际测试不管是.com还是.cn连接速度都不怎么给力,甚至连不上……

网络与虚拟交换机不提供DDNS的AAAA记录更新

qnap的网络与虚拟交换机功能虽然有一个ddns更新功能,但是只会收集和更新v4的地址……无法满足需求

选型

ddns服务又很多,这里选了noip,无它,只是因为能 白嫖

noip配置

注册什么的不多说,完成后,新建一个域名即可

免费账号提供三个子域名,而且会邮件通知你需要定时激活,过期没激活的会被删掉

./create-noip-host.png
创建域名

  • A记录对应v4地址,如果你有公网v4地址填入即可
  • AAAA记录对应v6地址,填入单播地址

注意fe80:开头的是链路本地地址,并不是全球单播地址,并不能在公网上使用,这种需要你检查一下上级设备的配置

确认后,一般一两分钟就可以广播出去,你就可以直接使用刚才的域名登录nas了

简单验证-WEB登录

直接登录即可

./url.png
web管理端url

这里只需要注意一个地方,web端的端口是5000,留意一下自己的配置

./port.png
web管理端端口

简单验证-SSH登录

如果你也打开了ssh登录,测试一下,也是可以使用该域名登录的

./ssh.png
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

  1. 发送一个带 BasicAuthGET 请求
  2. 请求的参数包括需要更新的域名hostname和地址myip (A记录和AAAA记录可一起更新,v4和v6地址用英文,分割即可)
  3. 其他可选参数请继续参考文档底部的参数列表
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脚本包含:

  1. 公网IP提取器,根据配置提取对应端口的公网IP,私网IP会被过滤
  2. ddns更新器,根据IP提取器的结果发送ddns更新请求
  3. 通知器,发送本次任务的提取结果和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

./update-notify.png
更新通知邮件

拉取项目

下载对应系统和架构的发行版

首先,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部署的时候,会发现设备重启时,路径不存在,无法执行

./nohomeerror.png
/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.png
开启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

需要注意的几点

  1. 不能 把脚本保存在 /share/homes/用户名 路径,因为每次重启后,这个路径都会被清空
  2. autorun.sh内的脚本和nas启动的初始化程序是顺序关系,如果不把noip-updator放到后台,会一直阻塞,导致nas无法正常启动完成,

下面就是错误的脚本

1
2
3
#!/bin/sh
/share/Public/Projects/noip/noip-updator >/dev/null
# noip-updator会一直阻塞导致nas无法正常启动