Routeros中使用CLoudflare—DDNS來解決自帶的IP-CLOUD解析無效附帶指令碼解析動態域名
阿新 • • 發佈:2022-01-29
前言
配合我之前提供的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公網地址與解析的地址匹配無需更新!" } }