自建API服务器实现阿里云DDNS(动态域名)更新

服务端 Docker阿里云
Zyao89 2021年3月29日星期一 13:06

DDNS(Dynamic Domain Name Server)是动态域名服务的缩写,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人们更方便的访问互联网;

# DDNS相关介绍

# DNS

域名系统,是因特网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人们更方便的用数字英文组合甚至中文访问互联网,而不需要用IPv4、IPv6 复杂的数字字符组合;

# DDNS

动态域名系统,是域名系统(DNS)中的一种自动更新名称服务器内容的技术。在传统的DNS中,域名必须和固定的IP绑定,当IP变化时,必须手动更新IP与域名的映射关系,才能保证变化后的IP仍与域名相对应,其他用户才可访问。DDNS的作用就是将这更新过程自动化

# 搭建服务

alicloud-api-server

docker run -d --name alicloud-api-server \
    -p 7899:7899 \
    -e TZ="Asia/Shanghai" \
    -e ACCESS_KEY_ID=$ACCESS_KEY_ID \
    -e ACCESS_KEY_SECRET=$ACCESS_KEY_SECRET \
    --restart unless-stopped \
    zyao89/alicloud-api-server
1
2
3
4
5
6
7

其中,

$ACCESS_KEY_ID 为阿里云的 AccessKey ID
$ACCESS_KEY_SECRET 为阿里云的 AccessKey Secret

详细获取方式参考官方文档 如何获取AccessKey ID和AccessKey Secret

# 调用服务接口动态更新

通过如下接口,可以快速实现查询更新

    /**
     * @swagger
     * /api/v1/aliyun/AddDomainRecord:
     *   post:
     *     summary: 根据传入参数添加解析记录
     *     description: 根据传入参数添加解析记录
     *     parameters:
     *          - name: params
     *            in: body
     *            required: true
     *            schema:
     *              type: object
     *              example: {
                            RR: '',
                            DomainName: '',
                            Type: '',
                            Value: '',
                        }
     *     responses:
     *       200:
     *         description: 成功
     */

    /**
     * @swagger
     * /api/v1/aliyun/UpdateDomainRecord:
     *   post:
     *     summary: 根据传入参数修改解析记录
     *     description: 根据传入参数修改解析记录
     *     parameters:
     *          - name: params
     *            in: body
     *            required: true
     *            schema:
     *              type: object
     *              example: {
                                RR: '',
                                RecordId: '',
                                Type: '',
                                Value: '',
                            }
     *     responses:
     *       200:
     *         description: 成功
     */

    /**
     * @swagger
     * /api/v1/aliyun/DescribeDomainRecords:
     *   post:
     *     summary: 根据传入参数获取指定主域名的所有解析记录列表
     *     description: 根据传入参数获取指定主域名的所有解析记录列表
     *     parameters:
     *          - name: params
     *            in: body
     *            required: true
     *            schema:
     *              type: object
     *              example: { DomainName: "baidu.com" }
     *     responses:
     *       200:
     *         description: 成功
     */

    /**
     * @swagger
     * /api/v1/aliyun/DescribeSubDomainRecords:
     *   post:
     *     summary: 根据传入参数获取某个固定子域名的所有解析记录列表
     *     description: 根据传入参数获取某个固定子域名的所有解析记录列表
     *     parameters:
     *          - name: params
     *            in: body
     *            required: true
     *            schema:
     *              type: object
     *              example: { SubDomain: "a.b.baidu.com" }
     *     responses:
     *       200:
     *         description: 成功
     */

    /**
     * @swagger
     * /api/v1/aliyun/DescribeDomainRecordInfo:
     *   post:
     *     summary: 根据传入参数获取某个固定子域名下的解析记录信息
     *     description: 根据传入参数获取某个固定子域名下的解析记录信息
     *     parameters:
     *          - name: params
     *            in: body
     *            required: true
     *            schema:
     *              type: object
     *              example: { RecordId: "xxxx" }
     *     responses:
     *       200:
     *         description: 成功
     */

    /**
     * @swagger
     * /api/v1/aliyun/CheckupAndUpdateDomainRecord:
     *   post:
     *     summary: 根据传入参数先校验,后修改解析记录
     *     description: 根据传入参数先校验,后修改解析记录
     *     parameters:
     *          - name: params
     *            in: body
     *            required: true
     *            schema:
     *              type: object
     *              example: {
                                RR: '',
                                RecordId: '',
                                Type: '',
                                Value: '',
                            }
     *     responses:
     *       200:
     *         description: 成功
     */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122

# ROS 配置脚本

此操作可以进行定时更新,具体配置自由发挥

# url

:local URL "http://x.x.x.x:7899/api/v1/aliyun/CheckupAndUpdateDomainRecord"

# 拨号的接口名称

:local ddnsinterface "pppoe-out1"

:delay 3;

:local ipssfn [ /ip address get [/ip address find interface=$ddnsinterface ] address ]

:local ipss [:pick $ipssfn 0 [:find $ipssfn "/" ] ]

# 上传的 json 文本 http-data,具体配置请进行相应修改

:local httpdata "{\"RecordId\":\"xxxx\",\"RR\":\"yyyy\",\"Type\":\"A\",\"DomainName\":\"zzzz.com\",\"Value\":\"$ipss\"}"

/tool fetch http-method=post http-data=$httpdata http-header-field="Content-Type: application/json" url=$URL

:delay 10;
:log info ("更新IP = " ."$ipss")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
作者: Zyao89; 转载请保留
版权声明: 自由转载-非商用-非衍生-保持署名
上次编辑时间: 2023年11月27日星期一 11:18