Jump to content

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


Recommended Posts

Posted

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

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

 

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

Posted

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

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

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

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

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

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

Posted

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

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

Posted

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

 

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

  • 2 weeks later...
Posted

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

Posted

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

Posted

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

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

Posted

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

}

Posted

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

Posted

alex8031,

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

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

  • 4 weeks later...
Posted

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

 

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

}

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...