最近注册了一个新域名,开始用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).