Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    [Скрипт] Namecheap Digitalocean Скрипт динамического обновления DNS

    [Скрипт] Namecheap Digitalocean Скрипт динамического обновления DNS

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    [Скрипт] Namecheap Digitalocean Скрипт динамического обновления DNS, RouterOS
     
    soonwai
    Guest
    #1
    0
    14.04.2016 17:44:00
    Скрипт обновления Dynamic DNS для Namecheap http://wiki.mikrotik.com/wiki/Dynamic_DNS_Update_Script_for_Namecheap

    Это скрипт для ROS 7 (если не ошибаюсь, команда fetch немного отличается в ROS 6), который проверяет, изменился ли IP для интерфейса, обновляет dynamic DNS на namecheap.com и отправляет вам об этом письмо. Как оказалось, он ещё и полезен, чтобы уведомлять меня, когда после отключения света снова появляется электричество или когда провайдер восстанавливает соединение после сбоя. В ROS теперь есть /ip cloud с собственным ddns от Mikrotik. С этим скриптом и Namecheap можно получить гораздо более крутой и короткий ddns-домен. А ещё это запасной вариант на случай, если /ip cloud вдруг перестанет работать.

    Это мой первый скрипт здесь, так что пишите, если что-то можно улучшить. Я пока новичок в Mikrotik. Скрипт изначально взял с вики Mikrotik для другого ddns-провайдера и потом переделал под Namecheap. Инструмент для email надо настроить заранее. Просто поменяйте переменные на ваши. Ошибок при обновлении ddns или отправке почты не отслеживается. Запланируйте выполнение скрипта через нужные интервалы. Для pppoe его можно запускать и через up/down скрипты ppp профиля.

    :local "NC_DDNS_SERVER" "dynamicdns.park-your-domain.com"  
    :local "NC_DDNS_HOSTNAMES_ARRAY" {"host1";"host2"}  
    :local "NC_DDNS_HOSTNAMES" [:tostr $"NC_DDNS_HOSTNAMES_ARRAY"]

    :local "NC_DDNS_DOMAIN" "example.com"  
    :local "NC_TOKEN" "0123456789abcdef"  
    :local "TELEGRAM_SERVER" "api.telegram.org"  
    :local "TELEGRAM_KEY" "bot0123456789abcdef"  
    :local "TELEGRAM_CHAT_ID" "012345678"  
    :local "ISP_NAME" "My_ISP"  
    :local "WAN_INTERFACE" "pppoe-out1"  
    :local "LOG_FILE_PREFIX" "/disk1/logs/DDNS_NC."  

    :global "ddns_previous_ip"  
    :local "ddns_current_ip" [ /ip address get [/ip address find interface=$"WAN_INTERFACE"] address ]
    :local "current_date" [/system clock get date]
    :local "current_time" [/system clock get time]
    :local "system_name" [/system identity get name]
    :local "system_uptime" [/system resource get uptime]
    :local "system_free_memory" [/system resource get free-memory]
    :local "system_cpu_load" [/system resource get cpu-load]
    :local "system_version" ("ROS " . [/system/package/get [find name=routeros] version])

    # Убираем маску сети из IP-адреса  
    :set "ddns_current_ip" [:pick $"ddns_current_ip" 0 [:find $"ddns_current_ip" "/"]]

    :if ([ :typeof $"ddns_previous_ip" ] = nil) do={ :global "ddns_previous_ip" "0" }
    :if ([ :typeof $"ddns_current_ip" ] = nil) do={
       :log info ("DDNS: На интерфейсе $"WAN_INTERFACE" нет IP-адреса, проверьте пожалуйста.")  
    } else={  
       :if ($"ddns_current_ip" != $"ddns_previous_ip") do={  
           :foreach hostname in=$"NC_DDNS_HOSTNAMES_ARRAY" do={  
               :log info ("DDNS: Обновляем $hostname.$"NC_DDNS_DOMAIN" с $"ddns_previous_ip" на $"ddns_current_ip"")  
               :local str "https://$"NC_DDNS_SERVER"/update?host=$"hostname"&domain=$"NC_DDNS_DOMAIN"&password=$"NC_TOKE­N"&ip=$"ddns_current_ip""  
               #:log info $str  
               /tool fetch url=$str mode=https dst-path=($"LOG_FILE_PREFIX".$hostname)  
           }  
           #:log info $"NC_DDNS_HOSTNAMES"  
           :log info "DDNS: Отправляем Email"  
           /tool e-mail send to=myself@example.com subject="$"ISP_NAME" IP $"current_date" $"current_time" $"system_name"" body="$"system_name" $"current_date" $"current_time"\r$"system_version"\rNamecheap: $"NC_DDNS_HOSTNAMES"\rДомен: $"NC_DDNS_DOMAIN"\r$"ISP_NAME" IP: $"ddns_current_ip"\rПредыдущий IP: $"ddns_previous_ip"\rВремя работы: $"system_uptime"\rСвободная память: $"system_free_memory" kb\rЗагрузка CPU: $"system_cpu_load" %"  
           :log info "DDNS: Отправляем Telegram"  
           :local str "https://$"TELEGRAM_SERVER"/$"TELEGRAM_KEY"/sendMessage?chat_id=$"TELEGRAM_CHAT_ID"&parse_mode=Markdown&text=$"ISP_N­AME" $"system_name" $"system_version"%0ANamecheap: $"NC_DDNS_HOSTNAMES"%0AДомен: $"NC_DDNS_DOMAIN"%0A$"current_date" $"current_time"%0A$"ISP_NAME" IP: $"ddns_current_ip"%0AПредыдущий IP: $"ddns_previous_ip"%0AВремя работы: $"system_uptime"%0AСвободная память: $"system_free_memory" kb%0AЗагрузка CPU: $"system_cpu_load" %"  
           #:log info $str  
           /tool fetch url=$str mode=https keep-result=no  
           :global "ddns_previous_ip" $"ddns_current_ip"  
       } else={  
           :log info "DDNS: IP не изменился. Обновление не требуется."  
       }  
    }  

    Ниже фрагмент кода для обновления DNS Digitalocean через их API. Можно использовать его вместо Namecheap в скрипте выше или одновременно с ним. Будем надеяться, что идентификаторы записей DO DNS остаются постоянными.

    # Только recordid(s) из DO_DDNS_RECORDID_ARRAY используются в DNS API Digitalocean.  
    :local "DO_DDNS_RECORDID_ARRAY" {"host1"=123456789;"host2"=987654321}  
    :local "DO_DDNS_DOMAIN" "example.com"  
    :local "DO_TTL" 30  
    :local "DO_TOKEN" "dop_v1_abcdefghijklmn1234567890opqrstuvwxyz"  
    :local "DO_HEADER" "Content-Type: application/json,Authorization: Bearer $"DO_TOKEN""  
    :local "DO_LOG_FILE_PREFIX" "/disk1/logs/DDNS_DO."  

    :local "do_data" "{\"ttl\":$"DO_TTL", \"data\":\"$"ddns_current_ip"\"}"  

    :foreach hostname,recordid in=$"DO_DDNS_RECORDID_ARRAY" do={  
     :local "do_url" "https://api.digitalocean.com/v2/domains/$"DO_DDNS_DOMAIN"/records/$"recordid""  
     :log info $"do_url"  
     /tool fetch mode=https http-method=put http-header-field=$"DO_HEADER" http-data=$"do_data" url=$"do_url" dst-path=($"DO_LOG_FILE_PREFIX".$hostname)  
    }
     
     
     
    priv
    Guest
    #2
    0
    21.10.2022 06:38:00
    Привет! Я заметил, что оригинальный скрипт больше не работает и был удалён из вики. (Я не знаю, как долго он был сломан, потому что мои IP-адреса не менялись.) Я немного покопался в командной строке и выяснил, что команда fetch с параметром “address” вызывает проблемы с HTTPS. Сейчас namecheap принимает только режим “url”.

    /tool fetch url=$str mode=https keep-result=no

    Кроме того, оригинальный скрипт экспортирует много глобальных переменных, но нужен только lastip, остальные могут быть локальными.

    Вот исправленный скрипт:

    :local ddnsserv "dynamicdns.park-your-domain.com"  
    :local ddnshostname "home"  
    :local ddnsdomain "yourdomain.com"  
    :local ddnspass "masked"  
    :local ddnsip [ /ip address get [/ip address find interface=pppoe-out1 ] address ]
    :global ddnslastip

    # Убираем маску подсети из IP-адреса  
    :for i from=( [:len $ddnsip] - 1) to=0 do={
      :if ( [:pick $ddnsip $i] = "/") do={
         :set ddnsip [:pick $ddnsip 0 $i]
        }  
      }

    :if ([ :typeof $ddnslastip ] = nil ) do={ :global ddnslastip "0" }
    :if ([ :typeof $ddnsip ] = nil ) do={
      :log info ("DDNS: На интерфейсе pppoe нет IP-адреса.")  
    } else={  
     :if ($ddnsip != $ddnslastip) do={  
       :log info "DDNS: IP изменился, предыдущий IP=$ddnslastip, новый IP=$ddnsip"  
       :log info ("DDNS: Обновляю Namecheap Dynamic DNS")  
       :local str "https://$ddnsserv/update?host=$ddnshostname&domain=$ddnsdomain&password=$ddnspass&ip=­$ddnsip"  
       /tool fetch url=$str mode=https keep-result=no  
       :global ddnslastip $ddnsip  
     } else={  
       #:log info "DDNS: IP не изменился. Обновление не требуется."  
     }  
    }

    С уважением, Alvin
     
     
     
    capac
    Guest
    #3
    0
    19.02.2023 14:37:00
    Привет, ребята, пытался использовать последнюю версию этого скрипта, но никак не получается… Скопировал и вставил скрипт, подстроил под свой домен/субдомен/пароль/интерфейс, а результата ноль. Может, кто-нибудь выложит свежий рабочий скрипт? Большое спасибо.
     
     
     
    lorenzopicoli
    Guest
    #4
    0
    14.04.2023 14:45:00
    Могу подтвердить, что последний скрипт работает. Обязательно проверьте строку номер 5, где задаётся ddnsip, чтобы он проверял правильный интерфейс.
     
     
     
    rextended
    Guest
    #5
    0
    14.04.2023 15:14:00
    Он уже написал, что изменил интерфейс. Скрипт полный ошибок, так что в зависимости от версии RouterOS, которую, естественно, никто не указывает, результаты будут разными.
     
     
     
    aka13
    Guest
    #6
    0
    30.05.2024 19:42:00
    Хотел просто добавить, что скрипт от 2017 года для DHCP-клиента действительно работает по той же логике. Я использую его для своего домена с небольшими косметическими правками:

    :local host "*"
    :local domain "my_domain"
    :local password "my_api_key"

    :if ($bound=1) do={
       :local ipaddress $"lease-address"
       :log info "Получен IP-адрес, обновляю DDNS"
       /tool fetch url="https://dynamicdns.park-your-domain.com/update?host=$host&domain=$domain&password=$password&ip=$ipaddress" mode=https keep-result=no
    } else={
       :log info "IP-адрес не получен, с DDNS ничего делать не надо"
    }
    :log info "Скрипт DHCP-клиента успешно отработал"  

    Последняя строка — это проверка на то, что скрипт действительно выполнился. К сожалению, скрипты обычно завершаются с ошибкой без уведомления, и если в самом конце нет вывода в лог, нельзя быть уверенным, что он отработал полностью.
     
     
     
    cpunk
    Guest
    #7
    0
    16.08.2024 21:22:00
    Это отлично сработало у меня. Я заменил запланированный скрипт на этот. Спасибо!
     
     
     
    beadon
    Guest
    #8
    0
    15.02.2025 06:21:00
    Эм… как добавить скрипт? [редактировать] Нашёл — но странно, не могу проверить его на bonded-интерфейсе… буду дальше тестировать. Для тех, кто повторяет у себя — нужно зайти в DHCP Client через webfig, открыть нужный интерфейс (у меня это bond1, потому что bonded), затем выбрать «Advanced». Там есть опция для скриптов. [редактировать] Ах, да, первое — «host» должен быть поддоменом, который вы зарегистрировали как A+ DDNS-запись. Так что поменяйте его на осмысленное имя. Далее, странно, что скрипт не запускается при обновлении DHCP: в логах не видно его работы, и Namecheap не обновляет IP для домена. [редактировать] Посмотрел логи, обратите внимание — нужно листать до КОНЦА лога, они не отсортированы по убыванию времени, как можно было бы ожидать. Вижу такие ошибки: Download from dynamicdns.park-your-domain.com FAILED: resolving error. Думаю, это как раз гонка условий — DNS ещё не применён, а он нам нужен. Проверка разрешения DNS после получения DHCP-адреса вроде проходит нормально — [@MikroTik] > put [:resolve dynamicdns.park-your-domain.com] 104.22.62.177 [редактировать] Да, именно так. DNS не успевал обновиться к моменту, когда я пытался использовать DNS-имя. После того как в скрипт добавил небольшую задержку, имя DNS обновлялось правильно. Вот обновлённый скрипт:

    :local host "subdomain"  
    :local domain "domain.com"  
    :local password "my_api_key"  

    :if ($bound=1) do={  
       :local ipaddress $"lease-address"  
       :delay 2000ms;  
       :log info "IP lease получен, обновляем DDNS"  
       /tool fetch url="https://dynamicdns.park-your-domain.com/update?host=$host&domain=$domain&password=$password&ip=$ipaddress" mode=https keep-result=no  
    } else={  
       :log info "Нет IP-адреса, обновлять DDNS нечего"  
    }  
    :log info "Скрипт DHCP клиента успешно выполнен"
     
     
     
    Van9018
    Guest
    #9
    0
    29.01.2021 02:37:00
    Вы также можете создать CNAME-запись, которая будет указывать на ваш mikrotik ddns URL. Это сэкономит вам расходы на хостинг ddns.
     
     
     
    soonwai
    Guest
    #10
    0
    20.02.2017 19:25:00
    Добавлено в Wiki: http://wiki.mikrotik.com/wiki/Dynamic_DNS_Update_Script_for_Namecheap
     
     
     
    IMLizKing
    Guest
    #11
    0
    23.10.2017 22:38:00
    Я использовал приведённое выше как отправную точку для своего скрипта обновления динамического DNS в Namecheap. Вместо этого я связал его с моим DHCP-клиентским скриптом для WAN-интерфейса, так что нет нужды запускать его каждые 5 минут или что-то в этом роде. Также я не стал заморачиваться с отправкой e-mail и хранением кучи переменных глобально. В общем, решил поделиться этим тут, так как именно сюда я пришёл, когда захотел сделать динамический DNS с Namecheap на моём роутере MikroTik…

    :if ($bound=1) do {
     имя (в домене), которое нужно обновить — оно уже должно существовать!
     :local host
     имя домена
     :local domain
     ключ для обновлений Namecheap
     :local password
     получить IP WAN (легко в DHCP-скрипте)
     :local wanip $“lease-address”
     :log info “DHCP получил WAN IP: $wanip”
     :local url “https://dynamicdns.park-your-domain.com/update?host=$host&domain=$domain&password=$password&ip=$wanip”
     #:log info “URL args: $url”
     это должно сработать! (примечание: здесь нет проверки, сначала проверьте через Namecheap!)
     /tool fetch url=$url mode=https keep-result=no
    } else {
     #:log info “DHCP отключился”
    }

    Для начала вам нужно войти в Namecheap, найти ваш DNS-ключ для обновлений и создать первоначальную запись в вашей DNS-таблице (тип «A + Dynamic DNS Record»). Скрипт практически не проверяет ошибки, но если он сработал хоть раз, скорее всего, будет продолжать работать. Когда DHCP отключается, я ничего не делаю — не думаю, что это сильно повредит, плюс не уверен, что можно удалённо удалить DNS-запись в Namecheap.

    Надеюсь, кому-то пригодится! Удачи!
     
     
     
    CyberCam
    Guest
    #12
    0
    03.08.2018 10:42:00
    Если у вас больше одного имени хоста, нужно ли создавать этот скрипт для каждого поддомена отдельно? Или есть способ внести все имена поддоменов в один скрипт?
     
     
     
    BloodLizard
    Guest
    #13
    0
    14.01.2019 13:38:00
    Сделал для себя простые изменения. # имя (внутри домена) для обновления — должно уже существовать!
    :local hosts [:toarray value="record1,record2,record3"];
    # имя домена
    :local domain <domain>
    # ключ для обновлений namecheap
    :local password <pass key>
    # получить WAN IP
    :local ddnsip [ /ip address get [/ip address find interface=<wan interface>] address ]
    :log info "WAN IP: $ddnsip"
    # Убираем маску сети из IP-адреса
    :for i from=( [:len $ddnsip] - 1) to=0 do={
       :if ( [:pick $ddnsip $i] = "/") do={
           :set ddnsip [:pick $ddnsip 0 $i]
       }
    }
    :foreach host in $hosts do={
       :local url "https://dynamicdns.park-your-domain.com/update?host=$host&domain=$domain&password=$password&ip=$ddnsip"
       :log info "Параметры URL: $url"
       /tool fetch url=$url mode=https keep-result=no
    }
     
     
     
    Kronyx
    Guest
    #14
    0
    29.04.2019 16:54:00
    Привет! Я искал, но не нашёл, как создать скрипт и куда его ставить. Простите, я новичок в Mikrotik.
     
     
     
    sealtech
    Guest
    #15
    0
    17.11.2019 11:56:00
    Так в твоём примере домен cctv1.soonwai.com? У меня не получается заставить скрипт обновлять мой поддомен:  
    :global ddnshostname "cctv1"  
    :global ddnsdomain "soonwai.com"
     
     
     
    Lilarcor
    Guest
    #16
    0
    28.01.2021 04:29:00
    Я пользуюсь этим уже почти год, и работает отлично. Недавно мой провайдер выдал мне IPv6-адрес. Есть ли способ заставить скрипт поддерживать обновление AAAA-записи?
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры