RouterOS CloudFlare DDNS配置(保姆级教程)

是的没错,冤大头的我支持完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配置(保姆级教程)

赞 (3) 打赏

相关推荐

    暂无内容!