Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • 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
    Динамический DNS: один скрипт, чтобы управлять ими всеми.

    Динамический DNS: один скрипт, чтобы управлять ими всеми.

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Динамический DNS: один скрипт, чтобы управлять ими всеми., RouterOS
     
    aldoir
    Guest
    #1
    0
    24.08.2012 01:29:00
    Привет! Вижу много скриптов для разных провайдеров или ситуаций. Этот скрипт предназначен для работы в максимально возможном количестве ситуаций и с разными провайдерами, неважно, находитесь ли вы за NAT или у вас публичный IP. В качестве бонуса есть функция "Принудительное обновление каждые X дней". Если вам кажется, что этот скрипт полезен, я могу добавить других провайдеров. Некоторые фрагменты кода взяты из существующих скриптов, опубликованных в вики.

    # Параметры

    :local username "<ваш логин>"
    :local password "<ваш пароль>"
    :local hostname "<поддомен.вашпровайдер.net>"

    # доступные опции: "http" или "iface"
    # - http: будет запрошен внешний сервер и определен ваш публичный IP (полезно для NATted соединений)
    # - iface: будет использован IP-адрес, назначенный интерфейсу $iface (см. ниже)

    :local discoverBy "iface"

    # интерфейс, используемый для получения IP-адреса (только если discoverBy = iface)

    :local iface "public-dsl"

    # текущие доступные сервисы: "dyndns", "noip" и "changeip"
    :local service "changeip"

    # количество дней, в течение которых будет принудительно обновляться IP, если он не изменился (помогает поддерживать активность учетной записи)
    :local forceUpdate 15

    # не изменяйте это, если не знаете, что делаете

    :local force
    :global lastUpdate
    :local currentIP

    :if ($discoverBy="http") do={
      /tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"
      :local result [/file get dyndns.checkip.html contents]
      :local resultLen [:len $result]
      :local startLoc [:find $result ": " -1]
      :set startLoc ($startLoc + 2)
      :local endLoc [:find $result "</body>" -1]
      :set currentIP [:pick $result $startLoc $endLoc]
    } else={
      :set currentIP [ /ip address get [find interface=$iface disabled=no] address ]
      :for i from=( [:len $currentIP] - 1) to=0 do={
         :if ( [:pick $currentIP $i] = "/") do={ :set currentIP [:pick $currentIP 0 $i] }
      }
    }

    # Получить IP из DynDNS для нашего хоста
    :local resolvedIP [:resolve $hostname]

    # Получить текущую дату в формате mm/DD/YYYY
    :local date [ /system clock get date ]

    # Преобразовать в YYYYMMDD
    :local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
    :local month [ :pick $date 0 3 ]; :local day [ :pick $date 4 6 ]; :local year [ :pick $date 7 11 ];
    :local mm ([ :find $months $month -1 ] + 1);
    :if ($mm < 10) do={ :set month ("0" . $mm); } else={ :set month $mm; }
    :set date ($year . $month . $day);

    :if ([ :typeof $lastUpdate ]=[:nothing] || (($date-$lastUpdate) >= $forceUpdate && $forceUpdate > 0)) do={
      :set force true
    }

    :put ("Current IP: $currentIP ($discoverBy), Last update: $lastUpdate")

    # Определить, требуется ли обновление dyndns
    :if (($currentIP != $resolvedIP) || ($force = true)) do={
       
       :if ($service = "dyndns") do={
          /tool fetch user=$username password=$password mode=http address="members.dyndns.org" \
               src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/output.txt"
       }
       :if ($service = "noip") do={
          /tool fetch user=$username password=$password mode=http address="dynupdate.no-ip.com" \
               src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/output.txt"
       }
       :if ($service = "changeip") do={
          /tool fetch user=$username password=$password mode=http address="nic.changeip.com" \
               src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/output.txt"
       }

       :local result [/file get output.txt contents]
       :log info ("dynamic-dns-updater: Service = $service, Hostname = $hostname")
       :log info ("dynamic-dns-updater: CurrentIP = $currentIP, Resolved IP = $resolvedIP")
       :log info ("dynamic-dns-updater: Update result: ".$result)
       /ip dns cache flush
       :set lastUpdate $date
    }
     
     
     
    yohanvil
    Guest
    #2
    0
    05.02.2013 04:49:00
    Боюсь сообщить, что на версии RouterOS 5.22 это не работает. Спасибо все равно!!!
     
     
     
    aldoir
    Guest
    #3
    0
    05.02.2013 13:51:00
    В чём ошибка? Запусти в консоли (/system script run script-name) и вставь сюда вывод, пожалуйста.
     
     
     
    avazquez61
    Guest
    #4
    0
    01.04.2013 18:07:00
    Спасибо, работает отлично, rb751 5.24
     
     
     
    gargola
    Guest
    #5
    0
    07.08.2013 17:36:00
    Этот скрипт работает отлично на версии 6.2, проблем с обновлением dyndns хоста нет.
     
     
     
    brodie7838
    Guest
    #6
    0
    11.08.2013 00:50:00
    DNS O Matic использует точно такой же синтаксис, как DynDNS: http://dnsomatic.com/wiki/api. Я добавил в скрипт следующее:
    :if ($service = "dnsomatic") do={
          /tool fetch user=$username password=$password mode=http address="updates.dnsomatic.com" \
               src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/output.txt"
       } и получил статус: failed.

    В выводе Terminal: failure: closing connection: <301 Moved Permanently> 67.215.92.215:80 (4). Похоже, это HTTP 301 ответ от "updates.dnsomatic.com"? Какие мысли?
     
     
     
    mcskiller
    Guest
    #7
    0
    11.08.2013 07:21:00
    Отличная работа! Отправлено с моего XT890 через Tapatalk 2
     
     
     
    brodie7838
    Guest
    #8
    0
    15.08.2013 02:20:00
    Решил обновить информацию о прогрессе. Я использовал Packet Sniffer, чтобы получить захват на WAN и посмотреть, что происходит. DNS O Matic сервер точно отправляет 301 ответ и перенаправляет меня на http://www.opendns.com/nic/update?. Вот GET-запрос с Mikrotik: И 301 ответ от DNS O Matic сервера: Поэтому я отредактировал часть URL в скрипте на opendns.com, чтобы отправлять opendns.com/nic/update?hostname=$hostname&myip=$currentIP, и сделал ещё один захват пакетов. Mikrotik отправляет запрос точно так, как ожидалось, и сервер снова отвечает абсолютно тем же 301 Moved ответом. Интересно, что я могу ввести updates.dnsomatic.com или dns.com URL в браузере своего компьютера и получить нормальный ответ. Для забавы я ещё сделал захват скрипта, обновляющего мою DynDNS учётную запись. Точно такой же запрос и структура URL с Mikrotik, но на этот раз 200 OK ответ от сервера DynDNS. Итак, в данный момент я пришёл к выводу, что дело в API-сервере OpenDNS. Я отправил их службе поддержки краткое описание с этими скриншотами, надеюсь, скоро получу ответ. Я выложу информацию, как только получу ответ. Если у кого-нибудь есть какие-либо другие предложения, буду рад их услышать.
     
     
     
    specialist
    Guest
    #9
    0
    30.08.2013 20:23:00
    Этот скрипт работает на 6.2?!!!
     
     
     
    brodie7838
    Guest
    #10
    0
    30.08.2013 22:22:00
    Да, работает на 6.2
     
     
     
    brodie7838
    Guest
    #11
    0
    30.08.2013 23:45:00
    OpenDNS сегодня ответил мне. В общем, так как сервер общий, а Mikrotik не отправляет Host: в заголовке, сервер отправляет переадресацию на HTTPS (они больше не позволяют обновления через HTTP), а затем еще одну переадресацию на updates.opendns.com. Последняя обновляет только твой аккаунт OpenDNS, а не DNS-O-Matic. Так что вопрос в том, можно ли заставить Mikrotik отправлять Host:updates.dnsomatic.com в заголовке запроса?
     
     
     
    specialist
    Guest
    #12
    0
    31.08.2013 02:32:00
    В моем rb2011 6.2 с dyndns уже работало на 6.1, теперь не работает. Лог пишет, что последний IP-адрес тот же, обновление не требуется. Для аккаунта dyndns в 6.2 ? Просто вставить и всё?
     
     
     
    sirdir
    Guest
    #13
    0
    01.09.2013 01:11:00
    У меня dyndnses на нескольких интерфейсах… есть какие-нибудь идеи, как обновлять их все, а не только тот, что на шлюзе по умолчанию? Нужно будет отправлять запрос через что-то, кроме шлюза по умолчанию, может быть, используя routing marks? На pfsense жизнь была намного проще.

    С уважением,
    Patrick
    #pfsense
     
     
     
    brodie7838
    Guest
    #14
    0
    02.09.2013 13:45:00
    Патрик, я уверен, что в существующем скрипте есть более эффективный способ сделать это, но ты можешь попробовать создать две копии скрипта и настроить вторую копию со своей второй информацией DynDNS и указать соответствующий интерфейс. Тебе придется создать второе событие планировщика, чтобы оно запускалось примерно в то же время, что и первое. Если бы у меня был какой-нибудь опыт в написании скриптов, я бы что-нибудь тебе собрал; не должно быть так уж сложно сделать то, о чем ты просишь, в одном скрипте.
     
     
     
    efaden
    Guest
    #15
    0
    02.09.2013 13:51:00
    Неплохо бы сделать это, основываясь на комментариях к интерфейсам... Или на массиве... Отправлено с моего SCH-I545 через Tapatalk 4
     
     
     
    efaden
    Guest
    #16
    0
    02.09.2013 23:21:00
    Я написал две версии… Я на самом деле не тестировал их. Но это пример использования либо комментария в интерфейсе, либо массива хостов для обновления. Эти только позволяют идентификацию по адресу интерфейса IP. Если вы хотели разрешить это через fetch и использовали HTTP (НЕ HTTPS), вы могли бы использовать фильтр уровня 7, чтобы сопоставлять запросы на обновление для определенных хостов, а затем добавить метки маршрутизации… таким образом, определенные хосты запрашивают через определенные интерфейсы. У меня недостаточно оборудования, чтобы настроить тест, чтобы попробовать, как это работает… Это версия с комментарием интерфейса: #.* от RouterOS Dynamic DNS Master Script Установите комментарий интерфейса = “++hostname” Где служба = dyndns | noip | changeip Переменные :local dyndnsUsername “” :local dyndnsPassword “” :local noipUsername “” :local noipPassword “” :local changeipUsername “” :local changeipPassword “” :local forceUpdate false :local flushDNSCache true :local forceUpdateTime 15 Скрипт :global lastUpdate Расчеты дат :local date [/system clock get date] :local months (“jan”,“feb”,“mar”,“apr”,“may”,“jun”,“jul”,“aug”,“sep”,“oct”,“nov”,“dec”); :local month [:pick $date 0 3] :local day [:pick $date 4 6] :local year [:pick $date 7 11] :local mm ([ :find $months $month -1] + 1) :if ($mm < 10) do={ :set month (“0” . $mm) } else={ :set month $mm } :set date ($year . $month . $day) :if ([:typeof $lastUpdate] = “nothing” || (($date-$lastUpdate) >= $forceUpdate && $forceUpdate > 0)) do={ :set forceUpdate true } /interface ethernet { :local hadUpdate false; :foreach i in [peer find comment~"^([^+]*)\\+([^+]*)\\+([^+]*)\$"] do={ :local commentString [get $i comment] :local interfaceName [get $i name] :local tcomment [:pick $peerComment ([:find $peerComment “+”]+1) [:len $peerComment]] :local ddnsService [:pick $tcomment 0 ([:find $tcomment “+”])] :local ddnsHostname [:pick $tcomment ([:find $tcomment “+”]+1) [:len $tcomment]] :local ddnsAddress [:resolve $ddnsHostname] :local currentAddress [/ip address get [/ip address find interface=$interfaceName disabled=no] address] :set currentAddress [:pick $currentAddress 0 [:find $currentAddress "/" -1]] :local elseIf true :if (($force = true) || ($currentAddress != $ddnsAddress)) do={ :if ($ddnsService = "dyndns") do={ /tool fetch user=$username password=$password mode=http address="members.dyndns.org" src-path="/nic/update?hostname=$ddnsHostname&myip=$currentAddress" dst-path="/output.txt" :set elseIf false } :if ($elseIf && $ddnsService = "noip") do={ /tool fetch user=$username password=$password mode=http address="dynupdate.no-ip.com" src-path="/nic/update?hostname=$ddnsHostname&myip=$currentAddress" dst-path="/output.txt" :set elseIf false } :if ($elseIf && $service = "changeip") do={ /tool fetch user=$username password=$password mode=http address="nic.changeip.com" src-path="/nic/update?hostname=$ddnsHostname&myip=$currentAddress" dst-path="/output.txt" :set elseIf false } :set hadUpdate true } :if ($hadUpdate && $flushDNSCache) do={ /ip dns cache flush } } Это версия с массивом: #.* от RouterOS Dynamic DNS Master Script Переменные :local hostnamesToUpdate { "hostname, service, interface"; "hostname, service, interface" } :local dyndnsUsername “” :local dyndnsPassword “” :local noipUsername “” :local noipPassword “” :local changeipUsername “” :local changeipPassword “” :local forceUpdate false :local flushDNSCache true :local forceUpdateTime 15 Скрипт :global lastUpdate Расчеты дат :local date [/system clock get date] :local months (“jan”,“feb”,“mar”,“apr”,“may”,“jun”,“jul”,“aug”,“sep”,“oct”,“nov”,“dec”) :local month [:pick $date 0 3] :local day [:pick $date 4 6] :local year [:pick $date 7 11] :local mm ([ :find $months $month -1] + 1) :if ($mm < 10) do={ :set month ("0" . $mm) } else={ :set month $mm } :set date ($year . $month . $day) :if ([:typeof $lastUpdate] = "nothing" || (($date-$lastUpdate) >= $forceUpdate && $forceUpdate > 0)) do={ :set forceUpdate true } :local hadUpdate false; :foreach i in $hostnamesToUpdate do={ :local tempArray [:toarray $i] :local ddnsHostname [:pick $tempArray 0] :local ddnsService [:pick $tempArray 1] :local interfaceName [:pick $tempArray 2] :local ddnsAddress [:resolve $ddnsHostname] :local currentAddress [/ip address get [/ip address find interface=$interfaceName disabled=no] address] :set currentAddress [:pick $currentAddress 0 [:find $currentAddress "/" -1]] :local elseIf true :if (($force = true) || ($currentAddress != $ddnsAddress)) do={ :if ($ddnsService = "dyndns") do={ /tool fetch user=$username password=$password mode=http address="members.dyndns.org" src-path="/nic/update?hostname=$ddnsHostname&myip=$currentAddress" dst-path="/output.txt" :set elseIf false } :if ($elseIf && $ddnsService = "noip") do={ /tool fetch user=$username password=$password mode=http address="dynupdate.no-ip.com" src-path="/nic/update?hostname=$ddnsHostname&myip=$currentAddress" dst-path="/output.txt" :set elseIf false } :if ($elseIf && $service = "changeip") do={ /tool fetch user=$username password=$password mode=http address="nic.changeip.com" src-path="/nic/update?hostname=$ddnsHostname&myip=$currentAddress" dst-path="/output.txt" :set elseIf false } :set hadUpdate true } :if ($hadUpdate && $flushDNSCache) do={ /ip dns cache flush }
     
     
     
    sirdir
    Guest
    #17
    0
    12.09.2013 16:33:00
    Только что увидел твои ответы и еще не тестировал, но огромное спасибо за помощь! Быстро просмотрел код (я пока не очень разбираюсь в этом языке скриптов…), и не уверен, решает ли он мою основную проблему: Допустим, у меня есть 2 WAN-соединения, WAN1 и WAN2. Чтобы правильно обновить IP-адрес WAN2, команда извлечения/получения (fetch/get, что бы там ни было) должна проходить через WAN2. Делают ли это скрипты? С уважением, Патрик.
     
     
     
    efaden
    Guest
    #18
    0
    12.09.2013 16:52:00
    Ну… к сожалению, вы не можете контролировать интерфейс, через который выходит fetch/get. Если вам нужно использовать fetch или get для идентификации двух разных интерфейсов, то вам придется использовать какой-то вид фильтрации Layer7 или что-то подобное, чтобы помечать запросы и использовать маршрутизационные теги, чтобы fetch-запросы проходили через определенные маршруты. Придется подумать, как это сделать правильно… но это гораздо сложнее. Опции, чтобы заставить fetch использовать определенный интерфейс для своего запроса, нет. Те два скрипта, которые я написал выше… один использует массив, чтобы указать скрипту, какие интерфейсы использовать, а другой просто использует комментарии к интерфейсам. Оба предполагают, что могут получить корректный IP-адрес с самого интерфейса. Вам нужно использовать fetch для получения правильных адресов?
     
     
     
    efaden
    Guest
    #19
    0
    12.09.2013 16:54:00
    Могу подумать, как это сделать, чтобы понять, нужно ли тебе это… Но я "СЧИТАЮ", ты можешь сделать что-то вроде этого: создать правило фильтра Layer7 для установки метки маршрутизации на пакеты на http://myip.dnsomatic.com/interface1, а затем использовать эту метку маршрутизации для маршрутизации через интерфейс 1. То же самое для интерфейса 2… Но для этого потребуется немного больше размышлений и экспериментов.
     
     
     
    sirdir
    Guest
    #20
    0
    12.09.2013 17:48:00
    У адрес в интерфейсе все в порядке, это просто. А у других двойной NAT, так что в интерфейсе только внутренний IP, и приходится запрашивать внешний (как в скриптах…). Раньше у меня был роутер на базе pfSense, там было очень просто, можно было настроить несколько клиентов dyndns, по одному на каждый интерфейс. 😉 А потом, Mikrotik, конечно, намного мощнее, когда знаешь, что делаешь (чего я пока не знаю 😉).
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры