是的没错,冤大头的我支持完RouterOS正版,发现这玩意儿破解版,硬盘版复制版满天飞,我真是佛了。好了,闲话少说,废了很大功夫终于把ROS连上网了,家里刚好有动态公网IP,然后又洋垃圾上面跑了点小程序,刚好不折腾下DDNS实在对不住我支持的正版- -!
先来说下环境吧:
平台:PVE虚拟化
ROS版本:V7.8
网络:联通千兆
CloudFlare账号一枚,域名一个
就这折腾了很久才成功,水一篇博客记录一下,理论上V7版本应该都能用这个方法和脚本执行成功。下列脚本来源于https://www.51it.wang/ll/1921,请给大佬点个赞。
脚本如下:
################# CloudFlare 变量 #################
# 是否开启debug调试模式
:local CFDebug "false"
# 是否开启CFcloud功能
:local CFcloud "false"
# 修改为有公网IP的接口名称
:global WANInterface "修改成你的外网接口"
# 修改为你要ddns的域名,若是二级域名,这里填写完整的二级域名
:local CFdomain "修改成你的域名,这里我用的二级域名"
# CloudFlare 全局密钥token或者有权限操作解析域名的token
:local CFtkn "这里不要用全局token,新建一个,新建方法见下文"
# 域名zoneId
:local CFzoneid "CloudFlare面板中可以找到"
# 要ddns的域名记录id
:local CFid "这个ID可以通过脚本获取,脚本见下文"
# 记录类型 一般无需修改
:local CFrecordType ""
:set CFrecordType "A"
# 记录ttl值,一般无需修改
:local CFrecordTTL ""
:set CFrecordTTL "120"
#########################################################################
######################## 下面的内容请勿修改 ############################
#########################################################################
:log info "开始更新解析记录 $CFDomain ..."
################# 内部变量 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=ddns.tmp.txt] = "") do={
:log error "没有找到记录前一个公网IP地址的文件, 自动创建..."
:set previousIP $WANip;
:execute script=":put $WANip" file="ddns.tmp";
: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=ddns.tmp.txt] size] > 0 ) do={
:global content [/file get [/file find name="ddns.tmp.txt"] 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 ("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=ddns.tmp.txt] size] > 0 ) do={
/file remove ddns.tmp.txt
:execute script=":put $WANip" file="ddns.tmp"
}
} else={
:log info "CF: 未发生改变,无需更新!"
}
脚本基本只要获取几个参数就可以了,代码中的CFID为”local CFdomain“这个域名的ID,获取脚本如下(需要在linux终端中执行):
curl -X GET "https://api.cloudflare.com/client/v4/zones/这里填入zoneID/dns_records" -H "X-Auth-Email: 这里填入CF的用户名" -H "X-Auth-Key: 这里填入CF的全局token" -H "Content-Type: application/json" | python -mjson.tool
如下图中红框为域名CFID
创建CF token,我之前一直用CF的全局token,一直都没有成功,我一度认为是上面脚本有问题,直到看了个外国老头如何创建CF token,抱着试试看的想法试试,结果这回试试没逝世,居然成功了。
1.登陆CF后台
2.选择用户—-my profile
3.API Tokens
4.create token—-custom token—-Get started
好了,token创建完成。下面到ROS配置好脚本以及运行计划
winbox中:System—-Scripts创建一条:我这里创建的是“ddns_cloudflare”可以自定义
最后创建一个运行计划:winbox中:System—-Scheduler,脚本如下:(引号中内容为上一步创建的脚本名称)
/system script run "ddns_cloudflare"
最后做了断线测试,拨号成功后自动获取了最新IP,结束。
未经允许不得转载:小毛子的记录站 » RouterOS CloudFlare DDNS配置(保姆级教程)