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 «[email protected]»
: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 «[email protected]» — почта Вашей учётной записи на 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 protected]’ -d ‘z=hd.zp.ua’
Опять же:
tkn=3c8b585915544145becded4f2b58068177a33 — наш ключик от учётки
[email protected] — 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 и выбираем желаемый интервал выполнения.