Всем доброго времени суток!
Решил поделиться решением, которое использую несколько лет для домашнего сайта. В свое время домашний провайдер за небольшое количество денег предоставлял статический 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
Скрипт хороший, а как тоже самое можно провернуть на windows?
Как вариант можно попробовать https://sourceforge.net/projects/curlforwindows/