SOFTOLAB Posted November 10, 2013 Posted November 10, 2013 Т.е. реализации динамического DNS у МикроТика из коробки нет, полез гуглить в поисках реализации, нашел кучу скриптом, но не один из них не работает. Может кто-нибудь видел рабочую реализацию для DynDNS? Пробовал и на пятой линейке, и на шестой, ни там ни там не работает. Возможно DynDNS что то у себя изменил. Вставить ник Quote
SolarW Posted November 10, 2013 Posted November 10, 2013 А что именно не работает то? Большинство скриптов применяемых для этой цели состоят из трех основных блоков: - определяем свой текущий реальный IP (есть несколько методов) - сравниваем не изменился ли этой IP по сравнению с прошлой проверкой (опционально можно еще проверить в какой IP резолвится наше имя) - в случае если IP изменился (или наше имя резолвится в IP отличный от текущего) шлем апдейт на DynDNS Вот исходя из этого и вопрос - какая часть у вас не работает? Свой текущий айпишник определить не можете или запрос на обновление привязки адреса к имени не отрабатывает? Вставить ник Quote
SOFTOLAB Posted November 10, 2013 Author Posted November 10, 2013 SolarW, какая именно часть не работет не знаю, ибо я на данном скриптовом языке не пишу, могу только сказать что IP на DynDNS не обновляется... Но если я правильно понял логику, то в тех примерах текущий IP не сверяется, он просто получается с того же DynDNS и отправляется ему же get'ом, и так каждую минуту по крону... Вставить ник Quote
MikroUser Posted November 10, 2013 Posted November 10, 2013 http://blog.1e3.ru/2013/08/dyndns-mikrotik-6/ полностью рабочий скрипт. сам юзал пока дома, пока статику не взял. Вставить ник Quote
SOFTOLAB Posted November 11, 2013 Author Posted November 11, 2013 MikroUser, не работает... :( Вставить ник Quote
MikroUser Posted November 11, 2013 Posted November 11, 2013 У кого-то из здешних видел подпись "Если не работает микротик, значит его надо правильно настроить". К тебе видимо она тоже относится) Проверь наличие интернета на роутере, проверь пинг к members.dyndns.org из терминала, проверь пошагово каждую комманду скрипта в том же терминале. Ну и лог смотри, ибо есль пользовать тот скрипт что я скинул - он пишет всю инфу туда. Вставить ник Quote
SOFTOLAB Posted November 22, 2013 Author Posted November 22, 2013 MikroUser, скрипт который вы дали все же заработал с пинками, но он черезвычайно вредный для железа, он пишет 2 файла при выполнении на диск, может быть есть вариант без файлов (ram) или этот как то подправить? Вставить ник Quote
MikroUser Posted November 22, 2013 Posted November 22, 2013 Варианта без файлов нету, ибо там парсится страница ответа от dyndns. И для железа он не вредный, вообще не понимаю откуда такие сведенья. В микротике постоянно крутится много потоков и процессов, идет работа с ram и flash памятью. Сей скрипт никаким образом не должен повлиять на работу роутера, к тому же файл который грузится - меньше одного килобайта. Вставить ник Quote
SOFTOLAB Posted November 22, 2013 Author Posted November 22, 2013 MikroUser, у nand же ограниченный цикл перезаписи, а если скрипт каждую минуту будет запускаться... В этом скриптовом языке нельзя данные поместить в переменную и с ними уже в ram'е работать, а не сохранять на диск? Вставить ник Quote
Zaebasto Posted November 22, 2013 Posted November 22, 2013 Зачем запускать скрипт на проверку раз в минуту? У меня на билайне сделано по нетвотчу, плюс один раз в сутки планировщиком( на случай сессии больше месяца - один раз на но-ип оключили учетку потому что не менялся ип 31 день) Год уже пашет, без сбоев. Сам скрипт ниже # Set needed variables :local username "@gmail.com" :local password "********" :local hostname "****.no-ip.org" :global systemname [/system identity get name] :if ($systemname = "Site1" ) do={ :set hostname "*****.no-ip.org" } :global dyndnsForce :global previousIP # print some debug info ## :log info ("UpdateDynDNS: username = $username") ## :log info ("UpdateDynDNS: password = $password") ## :log info ("UpdateDynDNS: hostname = $hostname") ## :log info ("UpdateDynDNS: previousIP = $previousIP") # get the current IP address from the internet (in case of double-nat) /tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html" :local result [/file get dyndns.checkip.html contents] # parse the current IP result :local resultLen [:len $result] :local startLoc [:find $result ": " -1] :set startLoc ($startLoc + 2) :local endLoc [:find $result "</body>" -1] :local currentIP [:pick $result $startLoc $endLoc] :log info "UpdateDynDNS: currentIP = $currentIP" # get the previous IP address from saved file dyndns.txt :if (([/file find name=dyndns.txt]) != "") do={ :local result [/file get dyndns.txt contents] # parse the previous IP result :local resultLen [:len $result] :local startLoc [:find $result "\_" -1] :set startLoc ($startLoc + 1) :local endLoc $resultLen :global previousIP [:pick $result $startLoc $endLoc] :log info "UpdateDynDNS: previousIP = $previousIP" } else={ :set previousIP "0.0.0.0" } # Remove the # on next line to force an update every single time - useful for debugging, # but you could end up getting blacklisted by DynDNS! :set dyndnsForce true ## :log info ("Debug - previousIP: ".$previousIP) ## :log info ("Debug - currentIP: ".$currentIP) ## :log info ("Debug - dyndnsForce: ".$dyndnsForce) # Determine if dyndns update is needed # more dyndns updater request details available at http://www.dyndns.com/developers/specs/syntax.html :if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={ :set dyndnsForce false :set previousIP $currentIP /tool fetch user=$username password=$password mode=http address="no-ip.com" src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/dyndns.txt" :local result [/file get dyndns.txt contents] :log info ("UpdateDynDNS: Dyndns update needed") :log info ("UpdateDynDNS: Dyndns Update Result: ".$result) :put ("Dyndns Update Result: ".$result) } else={ :log info ("UpdateDynDNS: No dyndns update needed") } Вставить ник Quote
SOFTOLAB Posted November 23, 2013 Author Posted November 23, 2013 Zaebasto, для ситуаций когда ждать сутки обновления ip адреса у поддомена не реально, это самое то. Вставить ник Quote
alex8031 Posted November 23, 2013 Posted November 23, 2013 А заче ждать сутки поставь интервал обмена 30 минут например можно меньше и все будет ГУТ. Вот полностью рабочий скрипт. :local ddnsuser "********" :local ddnspass "********" :local ddnshostname "********.no-ip.org" :local ddnsinterface "l2tp-out1" :global ddnslastip :local str :local ddnsip :local ip :if ([ :typeof $ddnslastip ] = nil ) do={ :global ddnslastip "0" } :local ddnsip [ /ip address get [/ip address find interface=$ddnsinterface ] address ] :if ([ :typeof $ddnsip ] = nil ) do={ :log info ("ServiceDNS: No ip address on $ddnsinterface .") } else={ :for i from=( [:len $ddnsip] - 1) to=0 do={ :if ( [:pick $ddnsip $i] = "/") do={ :set ddnsip [:pick $ddnsip 0 $i]; } } :if ($ddnsip != $ddnslastip) do={ :log info ("ServiceDNS: $ddnshostname -> $ddnsip") :local str "/nic/update?hostname=$ddnshostname&myip=$ddnsip" /tool fetch url="http://dynupdate.no-ip.com/$str" mode=http user=$ddnsuser password=$ddnspass \ dst-path=("/ServiceDNS.".$ddnshostname) :delay 1 :local str [/file find name=ServiceDNS.$ddnshostname]; :log info [/file get $str contents]; /file remove $str :global ddnslastip $ddnsip } } А вот в закладке Schedule впиши вот такую строку /system script run noip и поставь интервал запуска 30 минут и всё шикарно работает. Вставить ник Quote
SOFTOLAB Posted November 24, 2013 Author Posted November 24, 2013 alex8031, у nand же ограниченный цикл перезаписи, а если скрипт каждую минуту будет запускаться... И первый вариант работает, только вот крайне желательно не писать на флеш память файлы, а то кердык ей будет при интервале в минуту, а больше если ставить, уже крайне не удобно. Вставить ник Quote
Zaebasto Posted December 21, 2013 Posted December 21, 2013 перестал работать скрипт, приведенный выше. поправил # Set needed variables :local username "user" :local password "password" :local hostname "host.no-ip.org" :global systemname [/system identity get name] :if ($systemname = "Site1" ) do={ :set hostname "host.no-ip.org" } :global dyndnsForce :global previousIP # print some debug info ## :log info ("UpdateDynDNS: username = $username") ## :log info ("UpdateDynDNS: password = $password") ## :log info ("UpdateDynDNS: hostname = $hostname") ## :log info ("UpdateDynDNS: previousIP = $previousIP") # get the current IP address from the internet (in case of double-nat) /tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html" :local result [/file get dyndns.checkip.html contents] # parse the current IP result :local resultLen [:len $result] :local startLoc [:find $result ": " -1] :set startLoc ($startLoc + 2) :local endLoc [:find $result "</body>" -1] :local currentIP [:pick $result $startLoc $endLoc] :log info "UpdateDynDNS: currentIP = $currentIP" # get the previous IP address from saved file dyndns.txt :if (([/file find name=dyndns.txt]) != "") do={ :local result [/file get dyndns.txt contents] # parse the previous IP result :local resultLen [:len $result] :local startLoc [:find $result "\_" -1] :set startLoc ($startLoc + 1) :local endLoc $resultLen :global previousIP [:pick $result $startLoc $endLoc] :log info "UpdateDynDNS: previousIP = $previousIP" } else={ :set previousIP "0.0.0.0" } # Remove the # on next line to force an update every single time - useful for debugging, # but you could end up getting blacklisted by DynDNS! # :set dyndnsForce true # :set previousIP "0.0.0.0" # :log info ("Debug - previousIP: ".$previousIP) # :log info ("Debug - currentIP: ".$currentIP) # :log info ("Debug - dyndnsForce: ".$dyndnsForce) # Determine if dyndns update is needed # more dyndns updater request details available at http://www.dyndns.com/developers/specs/syntax.html :if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={ :set dyndnsForce false :set previousIP $currentIP /tool fetch user=$username password=$password mode=http url="http://www.noip.com/nic/update%3Fhostname%3D$hostname&myip%3D$currentIP" dst-path="/dyndns.txt" :local result [/file get dyndns.txt contents] :log info ("UpdateDynDNS: Dyndns update needed") :log info ("UpdateDynDNS: Dyndns Update Result: ".$result) :put ("Dyndns Update Result: ".$result) } else={ :log info ("UpdateDynDNS: No dyndns update needed") } Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.