Сам себе Dynamic DNS

Всем доброго времени суток!

Решил поделиться решением, которое использую несколько лет для домашнего сайта. В свое время домашний провайдер за небольшое количество денег предоставлял статический IP адрес и проблем собственно не было, потом эту услугу похоронили, оставив так называемый динамический реальный IP адрес (DHCP). Который никак не резервируется, т.е. при перезагрузке роутера в 99% адрес изменится. Т.к. за сайтом приглядываю вяло, часто о смене адреса узнавал от metrika.yandex.ru. В общем если интересно, то прошу пройти далее

Итак есть у нас домен второго уровня domain.ru и домен третьего уровня www.domain.ru. В принципе доменов может быть сколько угодно, для простоты я взял два. Домен должен быть делегирован на ppd.yandex.ru, что очень просто делается. Я буду использовать сервер с операционной системой FreeBSD 10.2, curl и простой скрипт на sh,  решение должно работать на любой UNIX подобной ОС. Предварительно нужно так же установить curl, cd /usr/ports/ftp/curl && make install clean. (В Ubuntu sudo apt-get install curl libcurl3 libcurl3-dev)

Нам нужно используя сравнение текущего IP адреса сервера на котором размещен наш домен с записью DNS и если адреса не совпадают, произвести замену IP адреса в pdd.yandex.ru используя предоставленное яндексом API.

Текущий IP адрес будем дергать отсюда http://yandex.ru/internet.

Для использования API, прежде всего необходимо получен токен от яндекса на странице  в domain name вводим наш домен второго уровня (например domain.ru) жмем Get token и копируем (в notepad, winword, etc) полученный результат вида 123456789ABCDEF0000000000000000000000000000000000000

Получаем все записи для домена на нашем аккаунте

curl -H 'PddToken: 123456789ABCDEF0000000000000000000000000000000000000' 'https://pddimp.yandex.ru/api2/admin/dns/list?domain=domain.ru'

В выводе нас интересуют записи типа "A" ("type": "A"), при условии, что почтовый сервер мы используем от Яндекса, в противном случае возможно вам понадобятся так же MX запись(и).
Из вывода нам нужно скопировать "record_id" для нужных нам доменов.  Для основного домена (второго уровня domain.ru ) record_id берется из строки "subdomain": "@"

Создадим наш скрипт, который будем время от времени дергать по cron

vi /home/admins/scripts/dyndns.sh

Меняем значения в переменных, подставляя наши значения домена(ов), токен

#!/bin/sh
#Наш домен
domain="domain.ru"

#Получаем текущий IP адрес с yandex.ru/internet
curl -s http://yandex.ru/internet | grep "info__value info__value_type_ipv4" | cut -f 4 -d ">" -s | cut -f 1 -d "<" -s`

#Получаем IP адрес записанный в dns ppd.yandex.ru для нашего домена
dnsip=`host "$domain" dns2.yandex.ru | grep has | awk '{print $4}'`

#Для удобства выносим в переменные наш токен и record_id наших доменов
token="123456789ABCDEF0000000000000000000000000000000000000"
record_id_="1234567"
record_id_www="7654321"

#Log-файл (сюда будем писать дату и время изменения IP адреса)
LOG="/var/log/dyndns.log"

#Сравниваем текущий ip адрес с адресом прописанным в DNS
if [ $ip = $dnsip ]
    then
         exit 1
else
    curl -H 'PddToken: '$token'' -d 'domain='$domain'&record_id='$record_id_'&subdomain=@&ttl=14400&content='$ip'' 'https://pddimp.yandex.ru/api2/admin/dns/edit' >> null
    curl -H 'PddToken: '$token'' -d 'domain='$domain'&record_id='$record_id_www'&subdomain=www&ttl=14400&content='$ip'' 'https://pddimp.yandex.ru/api2/admin/dns/edit' >> null
    echo `date "+%Y%m%d %H:%M"` $ipaddr >> $LOG
fi

Сохраняем скрипт, делаем его исполняемым

chmod +x /home/admins/scripts/dyndns.sh


и добавляем задание в crontab (crontab -u user -e), будем дергать каждые 10 минут

*/2 * * * * /home/admins/scripts/dyndns.sh  >/dev/null 2>&1

Ну вроде как все, спасибо за внимание!

Описание, примеры API 

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Комментарии: 2
  1. Игорь

    Скрипт хороший, а как тоже самое можно провернуть на windows?

    1. Vladimir (автор)

      Как вариант можно попробовать https://sourceforge.net/projects/curlforwindows/

Добавить комментарий

:) :D :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.