Автоматична актуализация на DNS записи с MikroTik и Cloudflare API

Въведение
Този скрипт автоматично обновява DNS записите в Cloudflare когато се промени публичният IP адрес на рутера. Полезен е за home lab среди, сървъри с динамичен IP или когато искаме нашите поддомейни винаги да сочат към правилния IP адрес.
Защо този скрипт?
Проблемът: Динамичните IP адреси се променят периодично от интернет доставчика, което прави недостъпни нашите услуги (сървъри, NAS, камери и др.).
Решението: Автоматично откриване на промяна в IP адреса и обновяване на DNS записите в Cloudflare.
Предварителни изисквания
1. Cloudflare акаунт и домейн
- Акаунт в Cloudflare (безплатен)
- Домейн добавен в Cloudflare
- DNS записи създадени за поддомейните
2. RouterOS/MikroTik рутер
- RouterOS версия V7 или по-нова
- Интернет достъп от рутера
- Тествано на v7.19.3
Стъпка 1: Подготовка на Cloudflare
Създаване на API Token
- Влезте в Cloudflare Dashboard
- Създайте Custom Token
- Натиснете "Create Token"
- Изберете "Custom token"
- Настройки на токена:
Token name: DDNS RouterOS
Permissions:
- Zone:Zone:Read
- Zone:DNS:Edit
Zone Resources:
- Include: Specific zone: вашият-домейн.com
- Запазете токена – ще ви трябва за скрипта!
Намиране на Zone ID
- В Cloudflare Dashboard
- Изберете вашия домейн
- В дясната колона намерете "Zone ID"
- Копирайте го – ще ви трябва!
Създаване на DNS записи
За всеки поддомейн създайте A запис:
- DNS > Records
- Add record
Type: A
Name: proxmox (за proxmox.fedia.eu)
IPv4 address: 1.1.1.1 (временно)
TTL: Auto
Намиране на всички под домейни
Нека създадем скрипт, който ще намери автоматично всички под-домейни на fedia.eu:
/system script add name="find-subdomains" source=":local CFtoken \"ВАШИЯ_ТОКЕН\"; /tool fetch url=\"https://api.cloudflare.com/client/v4/zones/66fe8bcd7a9fc761f5f08dfdae57a263/dns_records?type=A\" http-header-field=\"Authorization: Bearer \$CFtoken\" dst-path=\"fedia-records.txt\"; :delay 3s; /file get fedia-records.txt contents"
Заменете ВАШИЯ_ТОКЕН
с вашия API токен и изпълнете:
/system script run find-subdomains
Това ще покаже всички A записи за fedia.eu домейна.
Създаване на DDNS скрипта
/system script add name="fedia-ddns"
Редактирайте го:
/system script edit fedia-ddns source
В редактора копирайте този код:
# RouterOS DDNS Script за Cloudflare с persistent storage
# Използва файл за запазване на последния IP адрес
# Конфигурация
:local CFtoken "вашия_API_TOKEN_тук"
:local zoneid "вашето_ZONE_ID_тук"
:local subdomains {
proxmox.fedia.eu=41fade...
dashy.fedia.eu=a69e3bd9...
nextcloud.fedia.eu=5272...
npm.fedia.eu=536415c2c2...
}
# Вземане на текущия публичен IP
:local currentIP ""
:do {
/tool fetch url="https://ipv4.icanhazip.com" dst-path="ip.txt"
:delay 2s
:set currentIP [/file get "ip.txt" contents]
:set currentIP [:pick $currentIP 0 ([:len $currentIP] - 1)]
/file remove "ip.txt"
:put "Current IP: $currentIP"
} on-error={
:put "ERROR: Cannot get current IP"
:error "Cannot get IP"
}
# Четене на последния запазен IP
:local lastFediaIP ""
:do {
:set lastFediaIP [/file get "last-fedia-ip.txt" contents]
:set lastFediaIP [:pick $lastFediaIP 0 ([:len $lastFediaIP] - 1)]
:put "Last saved IP: $lastFediaIP"
} on-error={
:put "No previous IP found, this is the first run."
:set lastFediaIP ""
}
# Ако IP-то се е променило, обнови DNS записите
:if ($lastFediaIP != $currentIP) do={
:put "IP changed from $lastFediaIP to $currentIP"
:put "Updating fedia.eu subdomains..."
:local successCount 0
:local totalCount [:len $subdomains]
:foreach subdomain,recordid in=$subdomains do={
:put "Updating $subdomain..."
:do {
:local url "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$recordid"
:local headers "Authorization: Bearer $CFtoken,Content-Type: application/json"
:local data "{\"type\":\"A\",\"name\":\"$subdomain\",\"content\":\"$currentIP\",\"ttl\":300}"
/tool fetch url=$url http-method=put http-header-field=$headers http-data=$data dst-path="update-$subdomain.txt"
:delay 2s
:local response [/file get "update-$subdomain.txt" contents]
/file remove "update-$subdomain.txt"
:if ([:find $response "\"success\":true"] >= 0) do={
:put "✓ $subdomain updated successfully"
:log info "DDNS: $subdomain updated to $currentIP"
:set successCount ($successCount + 1)
} else={
:put "✗ Error updating $subdomain"
:log error "DDNS: Error updating $subdomain - Response: $response"
}
} on-error={
:put "✗ Network error for $subdomain"
:log error "DDNS: Network error for $subdomain"
}
:delay 1s
}
:put "Result: $successCount/$totalCount subdomains updated"
# Записване на новия IP във файл само ако има успешни обновления
:if ($successCount > 0) do={
:do {
/file remove "last-fedia-ip.txt"
} on-error={}
# Създаване на файл с новия IP
/tool fetch url="data:text/plain,$currentIP" dst-path="last-fedia-ip.txt"
:put "✓ New IP saved to file"
}
} else={
:put "IP unchanged ($currentIP)"
}
:put "DDNS check completed"
Заменете ВАШИЯ_API_ТОКЕН
с вашия реален токен
6. Запишете с Ctrl+O
Тестване на финалния скрипт
Изпълнете скрипта:
/system script run fedia-ddns
Скриптът ще:
- Покаже текущия IP
- Каже че IP-то се е променило (първо изпълнение)
- Актуализира всички под домейна от старото към новото IP
- Покаже резултата (колко са актуализирани успешно)
Този тест ще направи реални промени в Cloudflare DNS записите!
Може да промените името на скрипта, както си желаете. Не е необходимо да е fedia-ddns .
Естествено при стартиране на скрипта, трябва да промените името:
/system script run вашето-име-на-скрипта
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut