最近注册了一个新域名,开始用Cloudflare的DNS了,在网上找到了一个DDNS脚本。
脚本为了防止频繁调用,会在本地记录上一次的IP地址,但是我有多个接口需要做DDNS,而原脚本中的在本地记录上一次IP地址的文件名是写死的
而且每次运行脚本都会产生log,由于我设置的一分钟运行一次,不一会便被log刷屏了
所以我稍微修改了一下 把文件名修改为一个可配置的变量 并且改成了只有更新了IP地址才会记录log 避免了log刷屏
脚本在RouterOS 7.15测试通过
原脚本来自: https://www.51it.wang/ll/1921
################# 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 如下
/system script run "修改成你设置的脚本名字"