当前位置:首页 > 程序开发 > RouterOS通过脚本实现cloudflare的DDNS动态解析

RouterOS通过脚本实现cloudflare的DDNS动态解析

程序开发 / 星之宇 / 2025-4-12 13:23 / 浏览:120 / 评论:0

RouterOS(以下简称ROS)的原生脚本来实现域名的动态解析。


版本说明

1、该脚本只在RouterOS v7.x测试通过,其他版本Ros请自行测试。

2、不存在的记录,不会自动添加,需要手动在cloudflare添加记录,默认了解析A记录,TTL=60秒,不开启代理模式。为什么不加自动了添加域名之类的,因为一次添加永久有效,所以脚本中不添加自动了。节省ROS性能(我懒)

3、只支持IPv4,不支持IPv6

4、脚本中需要自己修改的信息


Token令牌脚本代码

#PPPoE
:local pppoe "宽带拨号名称"

#cloudflare
:local token "cloudflare令牌"

#域名
:local record "@"
:local domain "77bx.com"

#以下非专业人士请勿修改
#获取本地IPv4地址
:global ipold
:local ipnew [/ip address get [/ip address find interface=$pppoe] address]
:set ipnew [:pick $ipnew 0 ([len $ipnew] -3)]

#本地判断IP变化
:if ($ipold != $ipnew) do={
#获取zoneid
:local zoneid
:local result [/tool fetch http-method=get url="https://api.cloudflare.com/client/v4/zones/\?name=$domain" mode=https http-header-field="Content-Type: application/json,Authorization:Bearer $token" http-data="" as-value output=user]
:local response ($result->"data")
:if ([:find $response "\"id\":\""] > 0) do={
:set zoneid [:pick $response ([:find $response "\"id\":\""] + 6) [:find $response "\",\"" [:find $response "\"id\":\""]]]
}

#获取recordid
:local recordid
:local name
:if ($record != "@") do={
:set name ($record.".".$domain)
} else={
:set name $domain
}
:local result [/tool fetch http-method=get url="https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/\?type=A&name=$name" mode=https http-header-field="Content-Type: application/json,Authorization:Bearer $token" http-data="" as-value output=user]
:local response ($result->"data")
:if ([:find $response "\"id\":\""] > 0) do={
:set recordid [:pick $response ([:find $response "\"id\":\""] + 6) [:find $response "\",\"" [:find $response "\"id\":\""]]]
}
:local content
:if ([:find $response "\"content\":\""] > 0) do={
:set content [:pick $response ([:find $response "\"content\":\""] + 11) [:find $response "\"" ([:find $response "\"content\":\""] + 11)]]
}

#远程判断IP变化
:if ($content != $ipnew) do={
#更新记录
:local result [/tool fetch http-method=put url="https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$recordid" mode=https http-header-field="Content-Type: application/json,Authorization:Bearer $token" http-data="{\"type\":\"A\",\"name\":\"$name\",\"content\":\"$ipnew\",\"ttl\":60,\"proxied\":false}" as-value output=user]
:local response ($result->"data")
:if ([:find $response "\"success\":true"] > 0) do={
:set ipold $ipnew
:log info "DDNS: changed $ipold to $ipnew"
} else={
:log warning "DDNS update error"
} 
} else={
:set ipold $ipnew
}
}

修改以上参数

pppoe:宽带拨号名称

token:cloudflare API令牌

record:主机记录

domain:域名


API全局key脚本代码

#PPPoE
:local pppoe "宽带拨号名称"

#cloudflare
:local email "cloudflare账号邮箱"
:local key "cloudflare Global API key"

#域名
:local record "@"
:local domain "77bx.com"

#以下非专业人士请勿修改
#获取本地IPv4地址
:global ipold
:local ipnew [/ip address get [/ip address find interface=$pppoe] address]
:set ipnew [:pick $ipnew 0 ([len $ipnew] -3)]

#本地判断IP变化
:if ($ipold != $ipnew) do={
#获取zoneid
:local zoneid
:local result [/tool fetch http-method=get url="https://api.cloudflare.com/client/v4/zones/\?name=$domain" mode=https http-header-field="Content-Type: application/json,X-Auth-Email:$email,X-Auth-Key:$key" http-data="" as-value output=user]
:local response ($result->"data")
:if ([:find $response "\"id\":\""] > 0) do={
:set zoneid [:pick $response ([:find $response "\"id\":\""] + 6) [:find $response "\",\"" [:find $response "\"id\":\""]]]
}

#获取recordid
:local recordid
:local name
:if ($record != "@") do={
:set name ($record.".".$domain)
} else={
:set name $domain
}
:local result [/tool fetch http-method=get url="https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/\?type=A&name=$name" mode=https http-header-field="Content-Type: application/json,X-Auth-Email:$email,X-Auth-Key:$key" http-data="" as-value output=user]
:local response ($result->"data")
:if ([:find $response "\"id\":\""] > 0) do={
:set recordid [:pick $response ([:find $response "\"id\":\""] + 6) [:find $response "\",\"" [:find $response "\"id\":\""]]]
}
:local content
:if ([:find $response "\"content\":\""] > 0) do={
:set content [:pick $response ([:find $response "\"content\":\""] + 11) [:find $response "\"" ([:find $response "\"content\":\""] + 11)]]
}

#远程判断IP变化
:if ($content != $ipnew) do={
#更新记录
:local result [/tool fetch http-method=put url="https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$recordid" mode=https http-header-field="Content-Type: application/json,X-Auth-Email:$email,X-Auth-Key:$key" http-data="{\"type\":\"A\",\"name\":\"$name\",\"content\":\"$ipnew\",\"ttl\":60,\"proxied\":false}" as-value output=user]
:local response ($result->"data")
:if ([:find $response "\"success\":true"] > 0) do={
:set ipold $ipnew
:log info "DDNS: changed $ipold to $ipnew"
} else={
:log warning "DDNS update error"
} 
} else={
:set ipold $ipnew
}
}

修改以上参数

pppoe:宽带拨号名称

email:cloudflare账号邮箱

key:cloudflare Global API key

record:主机记录

domain:域名

目前有 0 条评论

    • 昵称
    • 邮箱
    • 网址