Jump to content
Калькуляторы

Рабочий скрипт DynDNS для v6.6

Т.е. реализации динамического DNS у МикроТика из коробки нет, полез гуглить в поисках реализации, нашел кучу скриптом, но не один из них не работает.

Может кто-нибудь видел рабочую реализацию для DynDNS?

 

Пробовал и на пятой линейке, и на шестой, ни там ни там не работает. Возможно DynDNS что то у себя изменил.

Share this post


Link to post
Share on other sites

А что именно не работает то?

Большинство скриптов применяемых для этой цели состоят из трех основных блоков:

- определяем свой текущий реальный IP (есть несколько методов)

- сравниваем не изменился ли этой IP по сравнению с прошлой проверкой (опционально можно еще проверить в какой IP резолвится наше имя)

- в случае если IP изменился (или наше имя резолвится в IP отличный от текущего) шлем апдейт на DynDNS

Вот исходя из этого и вопрос - какая часть у вас не работает? Свой текущий айпишник определить не можете или запрос на обновление привязки адреса к имени не отрабатывает?

Share this post


Link to post
Share on other sites

SolarW, какая именно часть не работет не знаю, ибо я на данном скриптовом языке не пишу, могу только сказать что IP на DynDNS не обновляется...

Но если я правильно понял логику, то в тех примерах текущий IP не сверяется, он просто получается с того же DynDNS и отправляется ему же get'ом, и так каждую минуту по крону...

Share this post


Link to post
Share on other sites

У кого-то из здешних видел подпись "Если не работает микротик, значит его надо правильно настроить". К тебе видимо она тоже относится)

 

Проверь наличие интернета на роутере, проверь пинг к members.dyndns.org из терминала, проверь пошагово каждую комманду скрипта в том же терминале. Ну и лог смотри, ибо есль пользовать тот скрипт что я скинул - он пишет всю инфу туда.

Share this post


Link to post
Share on other sites

MikroUser, скрипт который вы дали все же заработал с пинками, но он черезвычайно вредный для железа, он пишет 2 файла при выполнении на диск, может быть есть вариант без файлов (ram) или этот как то подправить?

Share this post


Link to post
Share on other sites

Варианта без файлов нету, ибо там парсится страница ответа от dyndns. И для железа он не вредный, вообще не понимаю откуда такие сведенья. В микротике постоянно крутится много потоков и процессов, идет работа с ram и flash памятью. Сей скрипт никаким образом не должен повлиять на работу роутера, к тому же файл который грузится - меньше одного килобайта.

Share this post


Link to post
Share on other sites

MikroUser, у nand же ограниченный цикл перезаписи, а если скрипт каждую минуту будет запускаться...

В этом скриптовом языке нельзя данные поместить в переменную и с ними уже в ram'е работать, а не сохранять на диск?

Share this post


Link to post
Share on other sites

Зачем запускать скрипт на проверку раз в минуту? У меня на билайне сделано по нетвотчу, плюс один раз в сутки планировщиком( на случай сессии больше месяца - один раз на но-ип оключили учетку потому что не менялся ип 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")

}

Share this post


Link to post
Share on other sites

Zaebasto, для ситуаций когда ждать сутки обновления ip адреса у поддомена не реально, это самое то.

Share this post


Link to post
Share on other sites

А заче ждать сутки поставь интервал обмена 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 минут и всё шикарно работает.

Share this post


Link to post
Share on other sites

alex8031,

у nand же ограниченный цикл перезаписи, а если скрипт каждую минуту будет запускаться...

И первый вариант работает, только вот крайне желательно не писать на флеш память файлы, а то кердык ей будет при интервале в минуту, а больше если ставить, уже крайне не удобно.

Share this post


Link to post
Share on other sites

перестал работать скрипт, приведенный выше. поправил

 

# 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")

}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this