суббота, 1 июня 2013 г.

Настройка сервиса SkyDNS на роутере Mikrotik с динамическим адресом

Вводная: Есть роутер Mikrotik с динамическим IP адресом и бесплатный аккаунт SkyDNS (про сервис можно прочитать на сайте - https://www.skydns.ru/ ). Необходимо реализовать возможность фильтрации через сервис SkyDNS.

Решение: Первоначально было не совсем понятно, как реализовать данный функционал - в инструкциях https://www.skydns.ru/info/guide и FAQ https://www.skydns.ru/info/faq информации по динамическому обновлению без специальных программ нет. Среди роутеров, с динамическим адресом, прозрачно работает только Zyxel серии Keenetic (https://www.skydns.ru/info/guides/zyxel-keenetic).

Дальнейшее чтение навело на "Поддержка динамических ip-адресов в Linux, FreeBSD, и других UNIX" https://www.skydns.ru/info/guides/ddclient в которой описывался способ настройки через программу ddclient. Она была скачана и просмотрены исходники - работает она достаточно просто. В зависимости от указанных настроек генерируется URL, переходом на который и обновляется текущий IP адрес для фильтрации. Итоговый URL выглядит таким образом -
http://email:password@www.skydns.ru/nic/update?hostname=notebook .

Далее был создан скрипт, который автоматически выполняет данное действие на роутере Mikrotik. Причём для снижения нагрузки на сервера SkyDNS, скрипт проверяет, было ли уже выполнено обновление для текущего IP адреса.
(не забудьте прописать свои данные в первые четыре строки)

:global skyduser "email"
:global skydpass "password"
:global skydhost "notebook"
:global skydinterface "pppoe-out1"

:global skydip
:global skydlastip

:global skydip [ /ip address get [/ip address find interface=$skydinterface ] address ]

:if ([ :typeof $skydlastip ] = "nothing" ) do={ :global skydlastip 0.0.0.0/0 }
:if ([ :typeof $skydip ] = "nothing" ) do={
:log info ("SkyDNS: No ip address present on " . $skydinterface . ", please check.")
} else={
   :if ($skydip != $skydlastip) do={
   :local str "/nic/update?hostname=$skydhost"
   /tool fetch address=www.skydns.ru src-path=$str mode=http user=$skyduser password=$skydpass dst-path=("/SkyDNS.".$skydhost)
   :delay 2
   :local str [/file find name="SkyDNS.$skydhost"];
   /file remove $str
   :log info ("SkyDNS: UPDATE! ".$skydip)
   :global skydlastip $skydip
}
}


Затем ставим наш скрипт на периодическое выполнение
/system scheduler
add interval=10m name=SkyDNSDinamic on-event=SkyDNSDinamic \
policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api \
start-time=startup


И настраиваем наш роутер на работу в качестве сервера DNS
/ip dns
set allow-remote-requests=yes servers=193.58.251.251


Теперь достаточно указывать адрес нашего роутера, как DNS-сервера для клиентов (вручную или лучше указав его в DHCP)
Дополнительные ссылки -
http://habrahabr.ru/company/skydns/blog/110450/ - про сервис SkyDNS на habrahabr
http://dyn.com/support/developers/api/perform-update/ - про API DynDNS
https://www.skydns.ru/info/guides/ddclient - про ddclient