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

Автоматична актуализация на 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

  1. Влезте в Cloudflare Dashboard
  2. Създайте Custom Token
    • Натиснете "Create Token"
    • Изберете "Custom token"
  3. Настройки на токена:
Token name: DDNS RouterOS
Permissions:
- Zone:Zone:Read
- Zone:DNS:Edit
Zone Resources:
- Include: Specific zone: вашият-домейн.com

  1. Запазете токена – ще ви трябва за скрипта!

Намиране на Zone ID

  1. В Cloudflare Dashboard
    • Изберете вашия домейн
    • В дясната колона намерете "Zone ID"
    • Копирайте го – ще ви трябва!

Създаване на DNS записи

За всеки поддомейн създайте A запис:

  1. DNS > Records
  2. 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

Скриптът ще:

  1. Покаже текущия IP
  2. Каже че IP-то се е променило (първо изпълнение)
  3. Актуализира всички под домейна от старото към новото IP
  4. Покаже резултата (колко са актуализирани успешно)

Този тест ще направи реални промени в Cloudflare DNS записите!

Може да промените името на скрипта, както си желаете. Не е необходимо да е fedia-ddns .

Естествено при стартиране на скрипта, трябва да промените името:

/system script run вашето-име-на-скрипта

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: