Dynamic DNS - FreeDNS.afraid.org

Автоматизация при помощи встроенного скриптового языка и RouterOS API
LESHIY_ODESSA
Сообщения: 1
Зарегистрирован: 04 мар 2016, 20:18

Dynamic DNS - FreeDNS.afraid.org

Сообщение LESHIY_ODESSA »

Особенности в том, что поддерживает несколько поддоменов.

Изображение

Код: Выделить всё

##############   Script FreeDNS.afraid.org   ##################
##############   PARSER EDITION   ##################
##############   CREATED LESHIY_ODESSA   ##################
 
# Указываем Direct URL, который находится https://freedns.afraid.org/dynamic/
# Если версия RouterOS 5.xx, то убрать из URL шифрование - "https" поменять на "http". Так же смотри ниже.
# Перед знаком "?" поставьте обратный слеш "\"
:global "direct-url" "http://freedns.afraid.org/dynamic/update.php\?3535345345bEtWMXF3S1J3Ojg2NTI0NzE="
 
# Указываем URL API "ASCII"
# Войдите под своим аккаунтом и откройте страницу  https://freedns.afraid.org/api/
# Затем скопируйте свой URL - Available API Interfaces : ASCII (!!! НЕ XML !!!)
# ВНИМАНИЕ !!!! - Перед вопросительным знаком ставим обратный слеш - "\".
# Если версия RouterOS 5.xx, то убрать из URL шифрование - "https" поменять на "http".
:global "api-url" "http://freedns.afraid.org/api/\?action=getdyndns&sha=4ftdfgdg53fr2a23faff18a9d1abf38b"
 
# Указываем ваш домен или субдомен.
:global "dns-domain" "ВАШ ДОМЕН"
 
# Задаем переменную для внешнего интерфейса
# при DUAL ACCESS указываем PPPoE (PPTP) интерфейс. Учитываем регистр букв.
:global "out-interface" "pppoe"
 
# !!!!!!!!!!!!!!!!! Больше ничего редактировать не нужно !!!!!!!!!!!!!!!!!
 
# Проверяем есть ли файл с IP домена - freedns.txt
:if ([:len [/file find name=freedns.txt]] > 0) do={
} else={
/tool fetch url=$"api-url" dst-path="/freedns.txt"
}
# Узнаем IP адрес домена с помощью API и парсинга.
# Парсим файл
:local "result" [/file get freedns.txt contents]
:local "startloc" ([:find $"result" $"dns-domain"] + ([:len $"dns-domain"] + 1))
:local "endloc" ([:find $"result" $"direct-url" -1] -1)
:global "dns-domain-ip" [:pick $"result" $"startloc" $"endloc"]
 
# Узнаем текущий IP адрес на внешнем интерфейсе
:global "current-ip" [/ip address get [find interface=$"out-interface"] address]
 
# Из полученного IP адреса исключаем маску подсети
:set "current-ip" [:pick $"current-ip" 0 ([:len $"current-ip"]-3) ]
 
# Сравниваем внешний IP с IP адресом DNS домена.
:if ($"current-ip" != $"dns-domain-ip") do={
 
# Если разные, то отправляем на freedns.afraid.org наш внешний IP с помощью Direct URL
:log info ("Service Dynamic DNS: old IP address $"dns-domain-ip" for $"dns-domain" CHANGED to -> $"current-ip"")
/tool fetch url=$"direct-url" keep-result=no
# Скачиваем файл с новым IP через 5 сек.
:delay 5
/tool fetch url=$"api-url" dst-path="/freedns.txt"
} else={
# Чтобы не засорять лог можно/нужно закомментировать эту строку.
:log info ("IP address is NOT CHANGED, the update is not required")
}
 
# Начиная с версии RouterOS version 6.0rc12 поддерживается шифрование /tool fetch mode=https
# В :global "direct-url" нужно тоже изменить на https://
# Для версии RouterOS 6.xx
# /tool fetch mode=https url=$"direct-url"
 
#      http://wiki.mikrotik.com/wiki/Manual:Scripting
#      http://wiki.mikrotik.com/wiki/Manual:Scripting-examples
#      http://wiki.mikrotik.com/wiki/Manual:Tools/Fetch
 
##############Script FreeDNS.afraid.org##################

Код: Выделить всё

/system scheduler
add disabled=no interval=1m name=freedns.afraid.org on-event="/system script run freedns.afraid.org" policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api start-time=startup
Немного цвета :)

RED — log error ("Service Dynamic DNS: old IP address $"dns-domain-ip" for $"dns-domain" CHANGED to -> $"current-ip"")

BLUE — :log warning ("IP address is NOT CHANGED, the update is not required")


Изображение

Для перестраховки можно сделать каждый час — /tool fetch url=$"direct-url" keep-result=no

Была идея сделать в этом же скрипте цикл в 60 минут (отсюда), но руки пока не дошли.
Chupakabra303
Сообщения: 31
Зарегистрирован: 24 янв 2017, 11:57

Re: Dynamic DNS - FreeDNS.afraid.org

Сообщение Chupakabra303 »

Еще один скрипт DDNS обновляли для afraid.org
Без запроса у afraid записанного раннее адреса, только локальное хранение в LastIP и обновление по изменению и с периодичностью в 60 циклов. Основная фича: использование внешнего DNS resolve для получения публичного IP основного Inet интерфейса.
:set InternetIP [:resolve domain-name="myip.opendns.com" server=resolver1.opendns.com]
Принцип напоминает ip/cloud, но гибче настраивается и лучше контролируется. (вот неплохую нарыл инфу: https://code.blogs.iiidefix.net/posts/g ... using-dns/)

Код: Выделить всё

# Хеш домена
:global SubdomainHash "DFSFDFdfsdf....................sfdfSDfSDf"
# Имя домена (нужно только для log-а)
:global DNSDomain "subdomain.domain.ru"

# Telegram (не обязательно, можно все удалить вместе с блоком отправки сообщений телеграм)
:global TToken "3213123231... 312"
:global TChatId "424243.4234"

:global SkipCounter
:if ([:typeof $SkipCounter] != "num") do={
  :set SkipCounter 1
}

:global LastIP
:if ([:typeof $LastIP] != "ip") do={
  :set LastIP 0.0.0.0
}

:global InternetIP
:do {
  :set InternetIP [:resolve domain-name="myip.opendns.com" server=resolver1.opendns.com]
  :if ($InternetIP != $LastIP or $SkipCounter > 59) do={
    :do {
      /tool fetch url=("http://freedns.afraid.org/dynamic/update.php\?$SubdomainHash&address=$InternetIP") keep-result=no
      :if ($InternetIP != $LastIP) do={
        :log info ("Service DDNS: Update IP: $LastIP for $DNSDomain to $InternetIP")
        :put ("Service DDNS: Update IP: $LastIP for $DNSDomain to $InternetIP")
        :do {
          /tool fetch url=("https://api.telegram.org/bot$TToken/sendmessage\?chat_id=$TChatId&text=Service DDNS: Update IP: $LastIP for $DNSDomain to $InternetIP") keep-result=no
        } on-error={
          :log info ("Service DDNS: Error send Telegram info")
        }
      }
      :set LastIP $InternetIP
      :set SkipCounter 1
    } on-error={
      :log info "Service DDNS: Error update"
      :put "Service DDNS: Error update"
    }
  } else={
    :set SkipCounter ($SkipCounter + 1)
  }
} on-error={
  :log info "Service DDNS: Error resolve IP"
  :put "Service DDNS: Error resolve IP"
  :set InternetIP 0.0.0.0
}