Это обновлённый скрипт для обновления динамического ip на сервисе Cloudflare. Прошлую версию можно посмотреть тут
Суть обновления в том, что сервис Cloudflare начал требовать в новой версии API авторизацию через заголовки.
На ранних версиях ROS, нельзя было их передавать вовсе. После баталий на форуме прикрутили возможность отправлять один заголовок, но нам нужно минимум 3. На версии RouterOS 7.1 доступна возможность отправлять несколько заголовков одновременно.
Для начала нам нужно воспользоваться любой линуксовой машиной с териминалом, чтобы получить необходимые записи.
Нам нужен Global API Key, получить его можно тут
После чего, в терминале выполняем запрос к API
[bash title=»код»]curl -X GET "https://api.cloudflare.com/client/v4/zones?name=hd.zp.ua" -H "X-Auth-Email: ваша почта" -H "X-Auth-Key: ваш apikey" -H "Content-Type: application/json"[/bash]
Вы получите ответ, где нужно найти ваш «id«:»824d6c45707d99340fa03b0a04ea9664»
Далее, подставляем наш id в следующий запрос и получаем записи зоны
[bash title=»код»]curl -X GET "https://api.cloudflare.com/client/v4/zones/824d6c45707d99340fa03b0a04ea9664/dns_records?type=A&page=1&per_page=100&order=type&direction=desc&match=all" \
-H "X-Auth-Email: ваша почта" \
-H "X-Auth-Key: Global API Key" \
-H "Content-Type: application/json"[/bash]
Дальше вы получаете ответ с вашими записями зоны
[bash title=»код»]{"result":[{"id":"40f946775d6c698deb627v16c0d337a4","zone_id":"824d6c45707d99340fa03b0a04ea9664","zone_name":"hd.zp.ua","name":"субдомен.hd.zp.ua","type":"A",[/bash]
Тут нам нужен id и zone_id
Теперь сам скрипт:
[bash title=»код»]######## Set and collect general variables #########
:global hostname "субдомен.hd.zp.ua"
:global email "почта"
:global resolvedIP ""
:global externalIP ""
:global WANInterface "ISP2"
:global currentIP ""
######## Set CloudFlare variables #################
:local CFapikey "Global API Key"
:local CFzones "824d6c45707d99340fa03b0a04ea9664"
:local CFtdnsrecords "40f946775d6c698deb627v16c0d337a4"
:local CFDebug "false"
######## Resolve and set IP-variables ##########
/ip dns cache flush
:set currentIP [/ip address get [/ip address find interface=$WANInterface ] address];
:set externalIP [:pick $currentIP 0 [:find $currentIP "/"]];
:set resolvedIP [:resolve $hostname];
######## Write debug info to log #################
:if ($CFDebug = "true") do={
:log info ("CF:hostname= $hostname resolvedIP= $resolvedIP externalIP= $externalIP")
};
######## Compare and update CF if necessary #####
:if ($resolvedIP != $externalIP) do={
:log info ("CF: Updating CF, setting $CFDomain = $externalIP")
/tool fetch http-method=put url="https://api.cloudflare.com/client/v4/zones/$CFzones/dns_records/$CFtdnsrecords" http-header-field="X-Auth-Email:$email,X-Auth-Key:$CFapikey,Content-Type:application/json" http-data="{\"type\":\"A\",\"name\":\"$hostname\",\"content\":\"$externalIP\",\"ttl\":120,\"proxied\":false}" keep-result=no
/ip dns cache flush
} else={
###:log info "CF: No Update Needed!"
}[/bash]
Если сделали всё правильно, ставите скрипт в планировщик или дёргаете руками.