Страница 2 из 2

Re: Бесплатная альтернатива DynDNS.

Добавлено: Ср апр 01, 2015 4:04 pm
savenko_egor
Как-то подзатянулось у меня с данным решением. На самом деле я давно его уже использую, но вот написать статью, смог только сейчас. Наконец-то появилось время.

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

Приступим :D

Я знаю что есть множество сервисов предоставляющих свои услуги бесплатно. Но!

1. У некоторых из них есть какие-либо определённые условия по использованию.
2. Хотелось написать что-то своё. Так как очень необходим опыт по написанию BASH и PHP скриптов.
3. Своё всегда приятнее ;)

Так как я использую MDM, то конечно хотелось бы заходить на систему используя домен и не переживая за то, что у меня измениться IP. А так как он у меня динамический, то понятное дело хотя бы раз в 1 неделю он будет обновляться. Возможность заказать статический IP есть, но платить за такое не очень хочется, потому-что не резонно. Я лично не понимаю почему я должен платить за то, что мне ранее предоставлялось бесплатно.

У Яндекса появились, по вей видимости давно, API для изменения записей для доменов делегированных на их NS. Но к сожалению, я об этом узнал буквально недавно.

Чем нам это может быть полезно? Тем что мы, написав небольшой скрипт, можем автоматом отправлять запросы на изменение IP для домена, и таким образом не переживать о том, что в какой-то момент мы не сможем попасть туда, куда нам необходимо.

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

В случае если у Вас уже есть домен, Вам проще. Тем у кого домена нет, для этих целей можно зарегистрировать бесплатный в зоне: "pp.ua" - тыц. Я себе регистрировал у Ник-ов .
ИзображениеПоказать
domain.jpg
Domain
domain.jpg (54.24 КБ) 5893 просмотра
После получения доменного имени в своё распоряжение, необходимо делегировать его на NS Яндекса. Для этого у Вашего регистратора смените NS на:

Код: Выделить всё

dns1.yandex.net
dns2.yandex.net
ИзображениеПоказать
ns.jpg
NS
ns.jpg (8.22 КБ) 5893 просмотра

Далее необходимо получить ID записи, которую необходимо изменять, а так же токен. Хочу заметить, что все процедуры необходимо выполнять залогинившись в систему Яндекса.

Для получения токена необходимо перейти по ссылке: https://pddimp.yandex.ru/api2/admin/get_token ввести капчу и имя домена который направляли на NS Яндекса и нажать: "Get token". После этого Вам будет отображена длинная строка содержащая число-буквенное значение. Это и есть токен. Его необходимо куда-то сохранить, так как в дальнейшем будем его использовать.

Для получения ID записи необходимо выполнить в командной строке:

Код: Выделить всё

[root@smart ~]# curl -H 'PddToken: 123456789ABCDEF0000000000000000000000000000000000000' 'https://pddimp.yandex.ru/api2/admin/dns/list?domain=domain.pp.ua'      
Где "domain.pp.ua" имя Вашего домена, а "123456789ABCDEF0000000000000000000000000000000000000" Ваш токен.

В ответ Вы получите просто чудовищную кучу информации, в которой нетрудно запутаться. Но! Если разобраться, то всё на много проще! Символы: "}, {" отделяют одну запись от другой, и если Вы расставите все записи с новой строки, Вы поймете на сколько всё просто. В моём случае, мне необходимы ID двух записей. Для "@" - то есть главной записи, и для субдомена: "www".

Мои записи выглядят так:

Код: Выделить всё

{"content": "ip_server, "domain": "domain.pp.ua", "fqdn": "domain.pp.ua", "priority": "", "ttl": 3600, "record_id": 12345678, "subdomain": "@", "type": "A"}

{"content": "ip_server", "domain": "domain.pp.ua", "fqdn": "www.domain.pp.ua", "priority": "", "ttl": 3600, "record_id": 12345679, "subdomain": "www", "type": "A"}
Пояснения:

"ip_server" - IP адрес. Как раз тот который мы и будем изменять.
"domain.pp.ua" - Сам домен на котором будут производиться изменения.
"type" - Тип записи. В нашем случае, А запись, так как именно она отвечает за то, откуда будет открываться домен.
"record_id" - ID нашей записи. Именно то, что нам и нужно.

После того как мы получили всю необходимую информацию, осталось написать сам скрипт...

Код моего скрипта таков:
Код рекомендую брать с github-а. Здесь для примера.Показать

Код: Выделить всё

#!/bin/bash
source /etc/ddnsy/ddnsy.conf #Подключаем конфиг

#Задаём переменные
IP=`curl -s $site` #Получаем значение текущего IP
OLD_IP=`cat /etc/ddnsy/old-ip` #Получаем значение старого IP из файла

rm $last_log #Чистим ласт лог
exec > $last_log #Пишем в ласт лог вывод скрипта

date #Вывод даты для логирования

if [[ "$IP" != "$OLD_IP" ]] #Проверяем одинаковые IP или нет
then #Если не одинаковые выполняем:
echo "Получен новый IP адрес"

echo "Старый IP: $OLD_IP" #Выводим старый IP
echo "Новый IP: $IP" #Выводим новый IP

echo "Записываю новый IP в файл"
echo "$IP" > /etc/ddnsy/old-ip #Изменение старого IP в файле

echo "Вношу новый IP на DNSы"
curl -H "PddToken: $token" -d "domain=$domain&record_id=$id_record_a&ttl=$ttl&content=$IP" "$y_address" #Изменяем главную А запись на DNS
curl -H "PddToken: $token" -d "domain=$domain&record_id=$id_additional_record&ttl=$ttl&content=$IP" "$y_address" #Изменяем www А запись на DNS

echo "Операция завершена"
else # Если одиноковые выполняем:
echo "IP адрес не изменился"
fi #Выходим из условия

echo "--------------------" >> $log #Запись в файл прочерков, сделал для того чтоб отделить одну запись от другой
cat $last_log >> $log #Переносим инфу из ласт лога в общий лог без затирания старой информации
echo "--------------------" >> $log #Те же прочерки
 
Содержимое файла: /etc/ddnsy/ddnsy.conf то есть конфига:
Код рекомендую брать с github-а. Здесь для примера.Показать

Код: Выделить всё

y_address="https://pddimp.yandex.ru/api2/admin/dns/edit" #Адрес API Яндекса на который будет отправляться запрос на изменение IP.

domain="domain.pp.ua" #Сам домен.
token="123456789ABCDEF0000000000000000000000000000000000000" #Токен. Необходим как защита.

id_record_a="23589279" #ID записи которую необходимо отредактировать.
id_additional_record="23589280" #Так как я меняю IP на двух записях, я добавил ещё один ID.
ttl="3600" #TTL - это у нас время жизни записи.

site="http://checkip.soluslabs.com" #URL сайта на котором скрипт забирает IP который сейчас установлен.

log="/var/log/ddnsy/main.log" #Путь к лог файлу
last_log="/var/log/ddnsy/main.log.last" #Путь к ласт лог файлу
 
Ссылка на git в конце.

После написания скрипта, я дал ему права на выполнение

Код: Выделить всё

[root@smart ~]# chmod +x /etc/ddnsy/ddnsy.sh    
и добавил скрипт в крон.

Код: Выделить всё

[root@smart ~]# crontab -l
0 */1  *  *  * /etc/ddnsy/ddnsy.sh
То есть в данном случае скрипт будет стартовать каждый час и проверять не изменился ли IP и в случае если IP изменился, будет отправлять запрос на изменение IP на NSах. Выполнение каждый час, я поставил для того чтоб быть уверенным, что скрипт во время изменит IP на домене и мне не придётся ждать. Но думаю что опытным путём это время можно увеличить.

Будьте внимательны! Все действия производились в Linux системе. Для Windows этот скрипт пока не подходит. Но!
1. Планирую написать этот же скрипт на PHP для того что бы его можно было использовать на Windows платформе.
2. В случае необходимости, могу быстро набросать софт на VisualBasic, который выполнял бы те же функции но был ещё и с GUI.
3. Так же хочу попробовать написать APP для MDM что бы все было в самой системе.
4. И ещё есть идея повторить данный скрипт для Ардуино. Думаю тоже будет полезно.

На данный момент, добавить больше нечего. В случае если у Вас появятся какие либо дополнительные вопросы, всегда буду рад помочь.

Сам скрпит и конфиг файл, я расположил на github-е.
В случае необходимости, Вы всегда сможете найти новую его версию тут: DynDNS Yandex

Скрипт успешно используется с ~15.11.2014 и не разу ещё не подвёл. Когда бы я не зашёл на свой домен, я всегда попадаю на свою MDM.

А пока у меня всё. Всем Алису(добра) :D