Переход на Яндекс.DNS

Yandex.DNS Пару недель назад, когда что-то произошло то ли у eNom, то ли у Google Public DNS были какие-то проблемы, в результате чего сайт не открывался у многих посетителей. Но чёрт с ним, с сайтом, хуже то, что и почта (!) приходила со сбоями. Видимо, многие почтовые службы, включая Mail.ru, используют в качестве резолвера Google DNS.
Тогда я быстро выяснил, что проблема была связана именно с DNS. При этом, если воспользоваться сервисом Яндекс.DNS, всё мгновенно исправлялось.

Всё это подтолкнуло меня попробовать Яндекс.DNS 77.88.8.8 вместо Google DNS 8.8.8.8.
Увидев, что в Санкт-Петербурге пинг до Яндек.DNS в 1.7 раза меньше (15.0 мс), чем до Google (26.7 мс), и фактически доменные имена разрешаются быстрее, я поменял настройки Wi-Fi на роутере и устройствах.

Кроме того, оказалось полезно внимательно прочитать API Яндекса для управления делегированными доменами. Динамическое обновление записей DNS у Яндекса реализовано лучше, чем у eNom. Зачем это? Для того, чтобы связать субдомен с динамическим адресом IP.

После того, как Dyn.com прошлой весной прекратила обслуживание бесплатных аккаунтов, у меня не возникло желания платить им в месяц больше, чем стоит годовое обслуживание домена на eNom.
Нужно было как-то самостоятельно решать вопрос обновления динамического адреса в DNS. К счастью, у eNom тогда уже был API для динамического обновления A-записи, но вот передавать через интернет свой пароль для управления доменом в GET-запросе, пусть и по HTTPS, – совсем неправильно.
В API Яндекса ключ (token) передаётся в виде HTTPS-заголовка, а сами данные – методом POST. Это куда лучше.

После делегирования домена на Яндекс оставалось написать новый скрипт обновления A-записи в DNS и добавить его на файл-сервере в crontab. Вот что получилось в итоге:
#!/bin/sh
# Yandex DNS Updater Script
# (c) Gregory A. Pozhvanov, 2015

# Для начала – несколько переменных:
token="токен_для_доступа_к_DNS_API"
domain="домен.рф"
subdomain="субдомен"
record_id="ID_записи_в_DNS"
ttl="900" # Время жизни записи (в секундах). Выбираем самое короткое из возможных, но не меньше, чем интервал запуска задания в crontab
email_interface="https://домен.рф/mailer.php" # URL вашего API для отправки оповещений
mailto="mymail@домен.рф" # адрес для оповещения
mailto_name="Контактное лицо" # Имя контактного лица, получающего уведомления. Мелочь, а приятно!
mailto_subject="$subdomain.$domain" # Тема письма или сообщения

cur_ip_cache=/tmp/cur_ip # путь к файлу, в котором сохраняем текущий IP-адрес

prev_ip=$(cat $cur_ip_cache) # читаем предыдущий IP-адрес в переменную
cur_ip=$(curl https://ifcfg.me/i) # проверяем текущий внешний IP-адрес

if [ "$cur_ip" != "$prev_ip" ] # Проверяем, изменился ли адрес с момента последней проверки
then
   # Адрес действительно изменился, запускаем процедуру обновления
   # Записываем новый адрес в файл:
   echo $cur_ip > $cur_ip_cache
   # Обновляем запись DNS на Яндексе:
   curl -H "PddToken: $token" -d "domain=$domain&record_id=$record_id&subdomain=$subdomain&ttl=$ttl&content=$cur_ip&refresh=$ttl&retry=120" "https://pddimp.yandex.ru/api2/admin/dns/edit"
   # Направляем контактному лицу уведомление:
   curl -d "mailto=$mailto&to=$mailto_name&subject=$mailto_subject&text=New IP address of $subdomain.$domain is $cur_ip" "$email_interface"
   # Прочие свистелки и перделки добавляем тут
else
   # Адрес не изменился, гуляем смело.
   
fi
exit #

Теперь осталось только сделать скрипт исполняемым:
chmod 755 ~/DNSupdate

и добавить задачу в crontab:
*/5 * * * * ~/DNSupdate
Не забудьте перезагрузить cron, чтобы новые задания выполнялись.

Теперь каждые пять минут файл-сервер будет проверять свой IP-адрес и при необходимости изменять A-запись с помощью API Яндекса.

Переход на Яндекс.DNS: 2 комментария

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