Привет всем! Мы используем сервис dyndns от http://www.no-ip.com на наших Mikrotik роутерах за NAT, которые распределены по сайтам Connectivia. По этой причине мы разработали (тестировали на RouterOs 5.x) новый скрипт, объединив два отличных скрипта, уже доступных на wiki.mikrotik.com. Получился скрипт обновления dyndns, специально для сервиса No-IP, когда устройства Mkt работают за NAT. Спасибо создателю скрипта changeip, опубликованного на Wiki http://wiki.mikrotik.com/wiki/Scripts — надеемся, никто не будет против использования базы или отдельных частей.
Вот сам скрипт:
# Скрипт динамического обновления DNS для No-IP за NAT # Устанавливаем необходимые переменные :local username "uzername" :local password "pazzword" :local host "dreammachine.no-ip.org"
:global previousIP
# выводим немного отладочной информации :log info ("Обновление No-IP DNS: username = $username") :log info ("Обновление No-IP DNS: hostname = $host") :log info ("Обновление No-IP DNS: previousIP = $previousIP")
:if ($currentIP != $previousIP) do={ :log info "No-IP: Текущий IP $currentIP не совпадает с предыдущим, требуется обновление" :set previousIP $currentIP :local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP&hostname=$host" :log info "No-IP DNS: Отправляем обновление для $host" /tool fetch url=$url user=$username password=$password mode=http dst-path=("no-ip_ddns_update.txt") :log info "No-IP DNS: Хост $host обновлён на No-IP с IP $currentIP" } else={ :log info "No-IP: обновление не требуется" }
Привет! Я проверил этот скрипт на RB450G с версией 5.17. Но хотел уточнить, надо ли указывать интерфейс шлюза, чтобы он работал эффективнее. Потому что в моём предыдущем скрипте интерфейс шлюза был указан. Спасибо.
Спасибо за скрипт и предложение по улучшению. Поскольку мой IP редко меняется, я всё равно каждый месяц получаю напоминание по электронной почте войти в свой аккаунт на no-ip.com. Можно ли изменить скрипт так, чтобы он сначала обновлял фиктивный IP, а потом реальный через каждые X дней? Ещё раз спасибо.
Мне удалось запустить это на версии 6.15. Нашёл здесь
# Скрипт обновления Dynamic DNS для No-IP DNS за NAT # Устанавливаем необходимые переменные :local username "ваш логин no-ip" :local password "ваш пароль no-ip" :local host "ваш хост no-ip" :global previousIP
# выводим отладочную информацию :log info ("Обновление No-IP DNS: username = $username") :log info ("Обновление No-IP DNS: hostname = $host") :log info ("Обновление No-IP DNS: previousIP = $previousIP")
# за NAT — получаем публичный IP с помощью dyndns URL http://checkip.dyndns.org /tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html" :delay 2 :local result [/file get dyndns.checkip.html contents] :log info "Результат dyndns = $result"
:if ($currentIP != $previousIP) do={ :log info "No-IP: Текущий IP $currentIP не совпадает с предыдущим, обновление нужно" :set previousIP $currentIP :local url "http://dynupdate.no-ip.com/nic/update/?myip=$currentIP&hostname=$host" :log info "No-IP DNS: Отправляем обновление для $host" /tool fetch url=$url user=$username password=$password mode=http dst-path=("no-ip_ddns_update.txt") :log info "No-IP DNS: Хост $host обновлён на No-IP с IP $currentIP" :delay 2 :local result [/file get "no-ip_ddns_update.txt" contents] :log info "Результат обновления = $result" } else={ :log info "No-IP: обновление не требуется" }
Версия ROS >= 6.27 Добавьте скрипт с политикой чтения, записи и тестирования под названием no-ip_update:
Код: # Скрипт обновления Dynamic DNS для No-IP DNS за NAT Задайте необходимые переменные: :local username “USER” :local password “PASS” :local host “HOST” :global previousIP — за NAT, используется функция MikroTik IP Cloud # текущий IP /ip cloud force-update :delay 5 :local currentIP [/ip cloud get public-address] :log info “No-IP DNS: currentIP = $currentIP” # сравниваем IP :if ($currentIP not $previousIP) do={ :log info “No-IP: текущий IP $currentIP не совпадает с предыдущим, нужно обновление” # текущий IP заменяет предыдущий :set previousIP $currentIP :local url "> https://dynupdate.no-ip.com/nic/update/?myip=$currentIP&hostname=$host > " :log info “No-IP DNS: отправка обновления для $host” # отправляем данные, необходимые для API no-ip через https /tool fetch url=$url user=$username password=$password mode=https keep-result=no :log info “No-IP DNS: Хост $host обновлен на No-IP с IP $currentIP” } else={ :log info "No-IP: обновление не требуется" } end
Думаю, я решил проблему. #compare IPs :if ($currentIP not $previousIP) do={ должно быть :if ($currentIP != $previousIP) do={ Думаю, это просто опечатка. Спасибо за скрипт.
Получаем текущий IP с помощью функции MikroTik IP Cloud /ip cloud force-update :delay 5 :local currentIP [/ip cloud get public-address]
Логируем IP: :log info “No-IP: Предыдущий IP = $previousIP” :log info “No-IP: Текущий IP = $currentIP”
# Сравниваем IP и обновляем хост, если нужно :if ($currentIP != $previousIP) do={ :log info “No-IP: Текущий IP ($currentIP) отличается от предыдущего ($previousIP), нужно обновить” # текущий IP заменяет предыдущий :local url “https://dynupdate.no-ip.com/nic/update/?myip=$currentIP&hostname=$host” :log info “No-IP: Отправляем обновление для $host” # отправляем данные, необходимые в API no-ip через https /tool fetch url=$url user=$username password=$password mode=https keep-result=no :log info “No-IP: Хост $host обновлён на No-IP с IP $currentIP” } else={ :log info "No-IP: обновление не требуется" } end
# Получаем предыдущий IP :local previousIP [/put [:resolve $host]]
# Получаем текущий IP с помощью функции MikroTik IP Cloud /ip cloud force-update :delay 5 :local currentIP [/ip cloud get public-address]
# Логируем IP-адреса :log info "No-IP: Предыдущий IP = $previousIP" :log info "No-IP: Текущий IP = $currentIP"
# Сравниваем IP и обновляем хост при необходимости :if ($currentIP != $previousIP) do={ :log info "No-IP: Текущий IP ($currentIP) не совпадает с предыдущим ($previousIP), обновление нужно" # текущий IP заменяет предыдущий :local url "https://dynupdate.no-ip.com/nic/update/?hostname=$host" :log info "No-IP: Отправляем обновление для $host" # отправляем данные, необходимые в API no-ip через https /tool fetch url=$url http-method=post user=$username password=$password mode=https keep-result=no http-data="{\"myip\"=\"$currentIP\"}" :log info "No-IP: Хост $host обновлён на No-IP с IP $currentIP" } else={ :log info "No-IP: Обновление не требуется" }
Привет, попробуй это: # Автоматическое обновление Dynamic DNS для No-IP
#--------------- Измени значения в этом разделе, чтобы они соответствовали твоей настройке ------------------
# Данные аккаунта No-IP :local noipuser "xxxxxxxxxx" :local noippass "xxxxxxxxxx"
# Укажи имя хоста или метку сети для обновления. # Хосты с пробелами не поддерживаются. Замени значение в кавычках на свои имена хостов. # Чтобы указать несколько хостов, разделяй их запятыми. :local noiphost "xxxxxxxxx.noip.com"
# Название интерфейса, который получает динамический IP, у меня это: pppoe-out1 :local inetinterface "pppoe-out1"
#------------------------------------------------------------------------------------ # Дальше менять ничего не нужно
:global previousIP
:if ([/interface get $inetinterface value-name=running]) do={ # Получаем текущий IP на интерфейсе :local currentIP [/ip address get [find interface="$inetinterface" disabled=no] address]
# Убираем маску сети у IP :for i from=( [:len $currentIP] - 1) to=0 do={ :if ( [:pick $currentIP $i] = "/") do={ :set currentIP [:pick $currentIP 0 $i] } }
:if ($currentIP != $previousIP) do={ :log info "No-IP: Текущий IP $currentIP не совпадает с предыдущим, нужно обновить" :set previousIP $currentIP
# URL для обновления. Обрати внимание, "\3F" — это шеснадцатеричный код знака вопроса (?). Он нужен, так как ? — спецсимвол в командах. :local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP" :local noiphostarray :set noiphostarray [:toarray $noiphost] :foreach host in=$noiphostarray do={ :log info "No-IP: Отправляем обновление для $host" /tool fetch url=($url . "&hostname=$host") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt") :log info "No-IP: Хост $host обновлён на No-IP с IP $currentIP" } } else={ :log info "No-IP: Предыдущий IP $previousIP совпадает с текущим, обновление не требуется" } } else={ :log info "No-IP: Интерфейс $inetinterface сейчас не работает, обновление не будет выполнено." } С уважением.
Привет! Сначала я писал, потому что не мог заставить это работать, но в итоге всё получилось. Вот моё решение для тех, кто только начинает с Mikrotik:
Сначала я создал скрипт для NoIp, который работал при ручном запуске, но не запускался через планировщик. Вот что сработало:
Заглавные буквы в названиях не работают. Имя скрипта: noip Политика: оставил по умолчанию, все галочки включены.
Исходник:
# Скрипт для обновления Dynamic DNS через No-IP за NAT
# Устанавливаем нужные переменные :local username "Ваше имя пользователя NoIP (не email, а именно Username)" :local password "Ваш пароль NoIP" :local host "Ваш хостнейм на NoIP"
# Получаем предыдущий IP :local previousIP [/put [:resolve $host]]
# Получаем текущий IP с помощью MikroTik IP Cloud /ip cloud force-update :delay 5 :local currentIP [/ip cloud get public-address]
# Логируем IP-адреса :log info "No-IP: Previous IP = $previousIP" :log info "No-IP: Current IP = $currentIP"
# Сравниваем IP и обновляем хост, если нужно :if ($currentIP != $previousIP) do={ :log info "No-IP: Текущий IP ($currentIP) не совпадает с предыдущим ($previousIP), нужно обновить" # текущий IP заменяет предыдущий :local url "https://dynupdate.no-ip.com/nic/update/?hostname=$host" :log info "No-IP: Отправляем обновление для $host" # отправляем данные, обязательные для API no-ip через https /tool fetch url=$url http-method=post user=$username password=$password mode=https keep-result=no http-data="{\"myip\"=\"$currentIP\"}" :log info "No-IP: Хост $host обновлён на No-IP с IP $currentIP" } else={ :log info "No-IP: Обновление не требуется" }
# Конец
Настройки планировщика: Имя: noip Интервал: сначала поставил 0:00:05 для теста, чтобы проверить, работает ли запуск, потом сменил на 00:05:00, когда всё заработало. Политика: все галочки включены по умолчанию В событии: /system script run noip
Привет! Я создал новую версию Updater с такими возможностями: [ ]использование IP Cloud для получения публичного IP (требуется ROS v6.14) [ ]обновление хоста через https [ ]автоматическое обновление каждые 3 минуты [ ]не создает никаких файлов
Просто скопируй следующий код в текстовый файл, отредактируй USER, PASS и HOST, вставь в CLI — и скрипт Updater будет создан:
ROS версия >= 6.27 Добавь скрипт с политикой read, write, test под названием no-ip_update:
# Скрипт обновления динамического DNS для No-IP DNS за NAT # Задаем необходимые переменные :local username "USER" :local password "PASS" :local host "HOST" :global previousIP
# За NAT — используем MikroTik IP Cloud # Текущий IP /ip cloud force-update :delay 5 :local currentIP [/ip cloud get public-address] :log info "No-IP DNS: currentIP = $currentIP"
# Сравнение IP :if ($currentIP not $previousIP) do={ :log info "No-IP: Текущий IP $currentIP не равен предыдущему, требуется обновление" # текущий IP заменяет предыдущий :set previousIP $currentIP :local url "https://dynupdate.no-ip.com/nic/update/?myip=$currentIP&hostname=$host" :log info "No-IP DNS: Отправка обновления для $host" # отправляем данные в no-ip API через https /tool fetch url=$url user=$username password=$password mode=https keep-result=no :log info "No-IP DNS: Хост $host обновлен на No-IP с IP $currentIP" } else={ :log info "No-IP: обновление не требуется" } # конец
Вставь в CLI: /ip cloud set ddns-enabled=yes /system scheduler add name=no-ip-updater disabled=no interval=3m policy=read,write,test on-event=no-ip_update
ROS версия с 6.14 по 6.26 Добавь скрипт с политикой read, write, test под названием no-ip_update:
# Скрипт обновления динамического DNS для No-IP DNS за NAT # Задаем необходимые переменные :local username "USER" :local password "PASS" :local host "HOST" :global previousIP
# За NAT — используем MikroTik IP Cloud # Текущий IP /ip cloud force-update :delay 5 :local currentIP [/ip cloud get public-address] :log info "No-IP DNS: currentIP = $currentIP"
# Сравнение IP :if ($currentIP not $previousIP) do={ :log info "No-IP: Текущий IP $currentIP не равен предыдущему, требуется обновление" # текущий IP заменяет предыдущий :set previousIP $currentIP :local url "https://dynupdate.no-ip.com/nic/update/?myip=$currentIP&hostname=$host" :log info "No-IP DNS: Отправка обновления для $host" # отправляем данные в no-ip API через https /tool fetch url=$url user=$username password=$password mode=https keep-result=no :log info "No-IP DNS: Хост $host обновлен на No-IP с IP $currentIP" } else={ :log info "No-IP: обновление не требуется" } # конец
Вставь в CLI: /ip cloud set enabled=yes /system scheduler add name=no-ip-updater disabled=no interval=3m policy=read,write,test on-event=no-ip_update