Обновление DNS записей в Яндекс.DNS используя скрипт на BASH

Приветсвую вас — любителей коммандной строки, линухов и админов домашних серверов!

Сегодня я расскажу вам о том, как отказаться от ставшего платным DynDNS и как бесплатно обновлять A-записи на DNS хостинге Яндекса.

Причиной делать костыли с DDNS стало то, что DynDNS в какой-то момент стал платным, а в роутере не было настроек для альтернативных сервисов (работающих, а не прописаных там дл галочки). Ко всему прочему, хотел чтобы домен был не 3-го уровня, а второго и в случае, если мой провайдер изменит IP, этот самый IP менялся автоматически.

Яндекс предоставляет замечательный сервиc Почта для домена + возможность DNS хостинга. Так же, к DNS хостингу есть API, используя который я и добился автоматического изменения записей в DNS.

Скрипт:

#!/bin/sh

# путь к Яндекс.API
api_url=https://pddimp.yandex.ru/api2

# идентификатор, нужен для доступа к api.
# как получить: https://tech.yandex.ru/pdd/doc/concepts/access-docpage/#access-admin
token=123456789ABCDEF0000000000000000000000000000000000000

# домен которым управляем
domain=artchudinov.ru 

# поддомены и id записей
subdomain_1=@
record_id_1=23980000
subdomain_2=cloud
record_id_2=25620000
subdomain_3=www
record_id_3=17680000

# TTL
ttl=1800

# временный файл
cache_file=/tmp/ya_dns_ip

if test -f $cache_file
then
    cache_ip=$(cat $cache_file)
fi

# получаем ip
current_ip=$(wget -q -O - checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//')

# основные действия: если ip обновился, то внести новые изменения в DNS
if [ "$current_ip" != "$cache_ip" ]
then
    echo "Update Yandex DNS with" $current_ip
    echo `date` "Updating with IP" $current_ip >> /tmp/yandex-dns-update.log

# обновление DNS записей
curl -k -H 'PddToken: '$token'' -d 'domain='$domain'&record_id='$record_id_1'&subdomain='$subdomain_1'&ttl='$ttl'&content='$current_ip'' ''$api_url'/admin/dns/edit'

curl -k -H 'PddToken: '$token'' -d 'domain='$domain'&record_id='$record_id_2'&subdomain='$subdomain_2'&ttl='$ttl'&content='$current_ip'' ''$api_url'/admin/dns/edit'

curl -k -H 'PddToken: '$token'' -d 'domain='$domain'&record_id='$record_id_3'&subdomain='$subdomain_3'&ttl='$ttl'&content='$current_ip'' ''$api_url'/admin/dns/edit'

rm -f $cache_file
echo $current_ip > $cache_file
fi

# eof

Для того, чтобы получить id записей, нужно выполнить команду:

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

Особенности:

  • у меня скрипт живет на роутере RT-N56U (прошивка от Padavan + активированный Entware) и запускается каждые 30 минут с помощью cron
  • в системе должны быть установлены cURL и wget
  • я скриптом меняю 3 записи: @, www и cloud. По необходимости всё легко настраивается «под себя»
  • аргументы к sed я заимствовал из какого-то скрипта
  • рекомендую почитать документацию к API Почты для домена