Перейти к содержимому
Калькуляторы

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://blog.1e3.ru/2013/08/dyndns-mikrotik-6/ полностью рабочий скрипт. сам юзал пока дома, пока статику не взял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

alex8031,

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

# 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.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.