RouterOS DDNS 配置 (Cloudflare)

最近注册了一个新域名,开始用Cloudflare的DNS了,在网上找到了一个DDNS脚本。

脚本为了防止频繁调用,会在本地记录上一次的IP地址,但是我有多个接口需要做DDNS,而原脚本中的在本地记录上一次IP地址的文件名是写死的

而且每次运行脚本都会产生log,由于我设置的一分钟运行一次,不一会便被log刷屏了

所以我稍微修改了一下 把文件名修改为一个可配置的变量 并且改成了只有更新了IP地址才会记录log 避免了log刷屏

脚本在RouterOS 7.15测试通过

原脚本来自: https://www.51it.wang/ll/1921

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
################# CloudFlare 变量 #################
# 是否开启debug调试模式
:local CFDebug "false"
# 是否开启CFcloud功能
:local CFcloud "false"

# 修改为有公网IP的接口名称
:global WANInterface "修改成你需要做DDNS的接口"

# 修改为你要ddns的域名,若是二级域名,这里填写完整的二级域名
:local CFdomain "修改成你的域名 如114514.abc.xyz"

# CloudFlare 全局密钥token或者有权限操作解析域名的token
:local CFtkn "这里请新建一个有权限操作域名的token"


# 域名zoneId
:local CFzoneid "Cloudflare面板里面有"
# 要ddns的域名记录id
:local CFid "Cloudflare面板里面F12,下面有教程"

# 记录类型 一般无需修改
:local CFrecordType ""
:set CFrecordType "A"

# 记录ttl值,一般无需修改
:local CFrecordTTL ""
:set CFrecordTTL "120"

# 若你有多个IP需要做DDNS 请为每个脚本修改记录IP的文件名
:local ddnsFileName "ddns1.tmp.txt"

#########################################################################
######################## 下面的内容请勿修改 ############################
#########################################################################

################# 内部变量 variables #################
:local previousIP ""
:global WANip ""

################# 构建 CF API Url (v4) #################
:local CFurl "https://api.cloudflare.com/client/v4/zones/"
:set CFurl ($CFurl . "$CFzoneid/dns_records/$CFid");

################# 获取或设置以前的ip变量 #################
:if ($CFcloud = "true") do={
:set WANip [/ip cloud get public-address]
};

:if ($CFcloud = "false") do={
:local currentIP [/ip address get [/ip address find interface=$WANInterface ] address];
:set WANip [:pick $currentIP 0 [:find $currentIP "/"]];
};

:if ([/file find name=$ddnsFileName] = "") do={
:log error "没有找到记录前一个公网IP地址的文件, 自动创建..."
:set previousIP $WANip;
:execute script=":put $WANip" file=$ddnsFileName;
:log info ("CF: 开始更新解析记录, 设置 $CFDomain = $WANip")
/tool fetch http-method=put mode=https output=none url="$CFurl" http-header-field="Authorization:Bearer $CFtkn,content-type:application/json" http-data="{"type":"$CFrecordType","name":"$CFdomain","ttl":$CFrecordTTL,"content":"$WANip"}"
:error message="没有找到前一个公网IP地址的文件."
} else={
:if ( [/file get [/file find name=$ddnsFileName] size] > 0 ) do={
:global content [/file get [/file find name="$ddnsFileName"] contents] ;
:global contentLen [ :len $content ] ;
:global lineEnd 0;
:global line "";
:global lastEnd 0;
:set lineEnd [:find $content "n" $lastEnd ] ;
:set line [:pick $content $lastEnd $lineEnd] ;
:set lastEnd ( $lineEnd + 1 ) ;
:if ( [:pick $line 0 1] != "#" ) do={
#:local previousIP [:pick $line 0 $lineEnd ]
:set previousIP [:pick $line 0 $lineEnd ];
:set previousIP [:pick $previousIP 0 [:find $previousIP "r"]];
}
}
}

######## 将调试信息写入日志 #################
:if ($CFDebug = "true") do={
:log info ("CF: 域名 = $CFdomain")
:log info ("CF: 前一个解析IP地址 = $previousIP")
:log info ("CF: 当前IP地址 = $currentIP")
:log info ("CF: 公网IP = $WANip")
:log info ("CF: 请求CFurl = $CFurl&content=$WANip")
:log info ("CF: 执行命令 = "/tool fetch http-method=put mode=https url="$CFurl" http-header-field="Authorization:Bearer $CFtkn,content-type:application/json" output=none http-data="{"type":"$CFrecordType","name":"$CFdomain","ttl":$CFrecordTTL,"content":"$WANip"}"")
};

######## 比较并更新记录 #####
:if ($previousIP != $WANip) do={
:log info "开始更新解析记录 $CFDomain ..."
:log info ("CF: 开始更新解析记录, 设置 $CFDomain = $WANip")
/tool fetch http-method=put mode=https url="$CFurl" http-header-field="Authorization:Bearer $CFtkn,content-type:application/json" output=none http-data="{"type":"$CFrecordType","name":"$CFdomain","ttl":$CFrecordTTL,"content":"$WANip"}"
/ip dns cache flush
:if ( [/file get [/file find name=$ddnsFileName] size] > 0 ) do={
/file remove $ddnsFileName
:execute script=":put $WANip" file=$ddnsFileName
}
}

获取Token

登录后右上角 点击 我的个人资料

API令牌 -> 创建令牌 -> 编辑区域DNS

这里需要先选择你用来DDNS的域名 然后再继续

完成后直接创建令牌 就会直接生成 生成的API令牌只会显示一次 记得及时保存

然后是获取域名记录id的操作步骤

进入DNS记录界面后 右键点击编辑 并选择检查

aria-controls后面 -dns-edit-row前面 这一部分就是域名记录id


以上步骤完成后 就可以在Winbox里面打开Scheduler了

System -> Scheduler

Interval 我自己设置成了 00:01:00 你也可以根据你的实际需要修改

On Event 如下

1
/system script run "修改成你设置的脚本名字"

The post [RouterOS DDNS 配置 (Cloudflare)](https://jeffz.page/routeros/129.html) first appeared on [JeffZ blog](https://jeffz.page).

作者

JeffZ

发布于

2024-06-12

更新于

2024-11-18

许可协议

评论