1. 程式人生 > 其它 >Routeros中使用CLoudflare—DDNS來解決自帶的IP-CLOUD解析無效附帶指令碼解析動態域名

Routeros中使用CLoudflare—DDNS來解決自帶的IP-CLOUD解析無效附帶指令碼解析動態域名

前言

配合我之前提供的Cloudflare api講解https://www.cnblogs.com/uwiu/p/15794986.html

獲取zone id

獲取域名id

注意域名id有二級域名分類,分辨需要那個域名id

建立指令碼和定時任務



附上指令碼請手動修改

#########################################################################
#         ==================================================            #
#         $ Mikrotik RouterOS update script for CloudFlare $            #
#         ==================================================            #
#              Credits for Samuel Tegenfeldt, CC BY-SA 3.0              #
#                        Modified by kiler129                           #
#                        Modified by viritt                             #
#                        Modified by hscpro                             #
#########################################################################

################# 程式配置資訊 #################
#除錯資訊 true/false
:local CFDebug "false"
#IPV4使用的介面
:global WANInterface4 "pppoe-out1"  
#IPV6使用的介面
:global WANInterface6 "pppoe-out1"  
#IPV6字尾("::"解析到RouterOS;可填寫區域網內LAN固定字尾解析到內網某個裝置,)
:local LANipv6end ":xxxx:xxxx:xxxx:xxxx"
#TTL
:local CFttl "120"
#主域名
:local CFzone "name.com"
#IPv4子域名
:local CFdomain "4.name.com"
:local CFdomainid "2be73022be73022be73022be73022be7"
#雙棧IPv6域名ID
:local CFdomainid46 "2be73022be73022be73022be73022be7"
#IPv6子域名 true/false
:local switchv6 "true"
:local CFdomain6 "6.name.com"
:local CFdomainid6 "2be73022be73022be73022be73022be7"
#CloudFlare賬號與APIKEY
:local CFemail "[email protected]"
#這個CFtkn就是 Global API Key
:local CFtkn "fad44cfad44cfad44cfad44cvfad44cfad44C"
:local CFzoneid "00e3500e3500e3500e3500e3500e3511"

################# 內部變數 #################
#ipv4
:local currentIP ""
:local resolvedIP ""
:global WANip ""
#ipv6
:local currentIP6 ""
:local resolvedIP6 ""
:global WANip6 ""

################# 解析和設定IP變數 #################
#獲取公網IPv4
:set currentIP [/ip address get [/ip address find interface=$WANInterface4 ] address];
:set WANip [:pick $currentIP 0 [:find $currentIP "/"]];
#獲取域名IPv4
:set resolvedIP [:resolve $CFdomain];
#獲取公網IPv6(DHCP方式)以及域名IPv6
:if ([/ipv6 dhcp-client get [find interface=$WANInterface6] status] = "bound") do={
    :if ([/ipv6 dhcp-client get [find interface=$WANInterface6 status=bound] prefix] != "true") do={
        :set currentIP6 [/ipv6 dhcp-client get [find interface=$WANInterface6 status=bound] prefix];
        #IPv6地址=公網IPv6字首+設定的字尾
        :set WANip6 ([:pick $currentIP6 0 [:find $currentIP6 "::/"]] . $LANipv6end);
        :set resolvedIP6 [:resolve $CFdomain6];
    };
} else={
    :log info ("CF: 本機沒有啟用IPv6或配置不正確")
    :set switchv6 "false"
}
################# 生成 CloudFlare API 連結 (v4) #################
#IPv4
:local CFurl4 "https://api.cloudflare.com/client/v4/zones/"
:set CFurl4 ($CFurl4 . "$CFzoneid/dns_records/$CFdomainid");
#IPv6
:local CFurl46 "https://api.cloudflare.com/client/v4/zones/"
:local CFurl6 "https://api.cloudflare.com/client/v4/zones/"
:if ($switchv6 = "true") do={
    :set CFurl46 ($CFurl46 . "$CFzoneid/dns_records/$CFdomainid46");
    :set CFurl6 ($CFurl6 . "$CFzoneid/dns_records/$CFdomainid6");
};

################# 將除錯資訊寫入日誌 #################
:if ($CFDebug = "true") do={
    :log info ("CF: 除錯模式開啟")
    :log info ("CF: 解析域名 $CFdomain")
    :log info ("CF: 域名解析IPv4 $resolvedIP")
    :log info ("CF: 當前公網IPv4 $WANip")
    :log info ("CF: 使用的API地址v4 $CFurl4&content=$WANip")
    :if ($switchv6 = "true") do={
        :log info ("CF: 域名解析IPv6 $resolvedIP6")
        :log info ("CF: 當前公網IPv6 $WANip6")
        :log info ("CF: 使用的API地址v6 $CFurl6&content=$WANip")
    };
    :put "Get CFdomainid: curl -X GET \"https://api.cloudflare.com/client/v4/zones/$CFzoneid/dns_records\" -H \"X-Auth-Email: $CFemail\" -H \"X-Auth-Key: $CFtkn\" -H \"Content-Type: application/json\" | python -mjson.tool"
};
 
################# IPv4比較和更新域名記錄 #################
:if ($resolvedIP != $WANip) do={
    :log info ("CF: 正在更新 IPv4 解析地址 $CFdomain = $WANip")
    /tool fetch http-method=put mode=https url="$CFurl4" http-header-field="X-Auth-Email:$CFemail,X-Auth-Key:$CFtkn,content-type:application/json" as-value output=user http-data="{\"type\":\"A\",\"name\":\"$CFdomain\",\"content\":\"$WANip\",\"ttl\":$CFttl,\"proxied\":false}"
    #/ip dns cache flush 執行間隔時大於TTS一倍可免於清理dns(TTS120->5m TTS300->10m)
} else={
    :log info "CF: IPv4公網地址與解析的地址匹配無需更新!"
}

################# IPv6比較和更新域名記錄 #################
:if ($switchv6 = "true") do={
    :if ($resolvedIP6 != $WANip6) do={
        #雙棧
        :log info ("CF: 正在更新 IPv6 解析地址 $CFdomain = $WANip6")
        /tool fetch http-method=put mode=https url="$CFurl46" http-header-field="X-Auth-Email:$CFemail,X-Auth-Key:$CFtkn,content-type:application/json" as-value output=user http-data="{\"type\":\"AAAA\",\"name\":\"$CFdomain\",\"content\":\"$WANip6\",\"ttl\":$CFttl,\"proxied\":false}"
        #單IPv6域名
        :log info ("CF: 正在更新 IPv6 解析地址 $CFdomain6 = $WANip6")
        /tool fetch http-method=put mode=https url="$CFurl6" http-header-field="X-Auth-Email:$CFemail,X-Auth-Key:$CFtkn,content-type:application/json" as-value output=user http-data="{\"type\":\"AAAA\",\"name\":\"$CFdomain6\",\"content\":\"$WANip6\",\"ttl\":$CFttl,\"proxied\":false}"
        #/ip dns cache flush
    } else={
        :log info "CF: IPv6公網地址與解析的地址匹配無需更新!"
    }
}

效果