22
Ноя

Cloudflare как динамический DNS на Mikrotik

Есть чудесный бесплатный сервис Cloudflare, который позволяет прятать свой реальный ip при использовании доменных имен. Быстро изменяет записи на всех доменных именах и за деньги может даже отфильтровать трафик от флуда и прочей грязи (но это уже другая история, скажем дорогая и не удобная история)

Сразу привожу полный скрипт, а нижу будет разбор полётов.

######## Set and collect general variables #########
:global hostname "soft.hd.zp.ua"
:global resolvedIP ""
:global externalIP ""
:global WANInterface "ISP1"

######## Set CloudFlare variables #################
:local CFemail "mail@hd.zp.ua"
:local CFtkn "3c8b585915544145becded4f2b58068177a33"
:local CFzone "hd.zp.ua"
:local CFid "178055949"
:local CFtype "A"
:local CFttl "1"
:local CFservicemode "0"
:local CFDomain "soft"
:local CFDebug "true"

######## Resolve and set IP-variables ##########
/ip dns cache flush
:local currentIP [/ip address get [/ip address find interface="ISP1" ] address];
:set externalIP [:pick $currentIP 0 [:find $currentIP "/"]];
:set resolvedIP [:resolve $hostname];

######## Build CF API Url #########################
:local CFurl "https://www.cloudflare.com/api_json.html\3F"
:set CFurl ($CFurl . "a=rec_edit&tkn=$CFtkn&id=$CFid");
:set CFurl ($CFurl . "&email=$CFemail&z=$CFzone&type=$CFtype");
:set CFurl ($CFurl . "&name=$CFDomain&service_mode=$CFservicemode&ttl=$CFttl");

######## Write debug info to log #################
:if ($CFDebug = "true") do={
:log info ("CF: hostname = $hostname")
:log info ("CF: resolvedIP = $resolvedIP")
:log info ("CF: currentIP = $currentIP")
:log info ("CF: externalIP = $externalIP")
:log info ("CF: CFurl = $CFurl&content=$externalIP")
};

######## Compare and update CF if necessary #####
:if ($resolvedIP != $externalIP) do={
:log info ("CF: Updating CF, setting $CFDomain = $externalIP")
/tool fetch mode=https url="$CFurl&content=$externalIP" keep-result=no
/ip dns cache flush
} else={
:log info "CF: No Update Needed!"
}

:global hostname «soft.hd.zp.ua» — это полный адрес поддомена
:global WANInterface «ISP1» — интерфейс Mikrotik с динамическим IP который смотрит в интернет
:local CFemail «mail@hd.zp.ua» — почта Вашей учётной записи на Cloudflare
:local CFtkn «3c8b585915544145becded4f2b58068177a33» — это секретный ключик Вашей учётки на Cloudflare, взять можно тут Account — My account — Your API key is: 3c8b585915544145becded4f2b58068177a33
:local CFzone «hd.zp.ua» — Ваш домен
:local CFid «178455949» — это ключ домена, как получить чуть ниже
:local CFtype «A» — тип записи
:local CFttl «1»
:local CFservicemode «0» — скрывать или нет ip адрес, если скрывать, поставить «1»
:local CFDomain «soft» — имя субдомена
:local CFDebug «true» — дебажим или нет

И так, как получить :local CFid для определенного субдомена
Для этого нужен любой сервер под Linux
Заходим через ssh или telnet на сервер и даём команду
curl https://www.cloudflare.com/api_json.html -d 'a=rec_load_all' -d 'tkn=3c8b585915544145becded4f2b58068177a33' -d 'email=mail@hd.zp.ua' -d 'z=hd.zp.ua'
Опять же:
tkn=3c8b585915544145becded4f2b58068177a33 — наш ключик от учётки
email=mail@hd.zp.ua — email учётной записи
z=hd.zp.ua — наш домен

Получим в ответ многабукаф по всем записям домена hd.zp.ua
Нам необходимо найти rec_id»:»178455949″ принадлежащий субдомену soft.hd.zp.ua

Добавляем скрипт в System – Scripts , например с именем cloudflare soft.hd.zp.ua
После чего добавляем в System – Scheduler задание с именем cloudflare soft.hd.zp.ua и выбираем желаемый интервал выполнения.