Обновление GoDaddy DNS из Linux
У меня есть следующие настройки:
- Домен, зарегистрированный в GoDaddy
- Подключаемый компьютер с ArchLinuxArm с динамическим публичным IP
- Обновлен домен в GoDaddy DNS Manager, чтобы он указывал на публичный IP подключаемого компьютера.
Все идет нормально. Однако мне нужно автоматически обновить IP (стиль DynDns) в GoDaddy DNS Manager, если мой провайдер решит его изменить.
Есть идеи, как это сделать?
3 ответа
В настоящее время GoDaddy не предоставляет динамический DNS и не имеет API для программного обновления DNS
Согласно поддержке GoDaddy:
... Модификации DNS с помощью сценариев были бы невозможны с нашими службами DNS. Эти изменения могут быть сделаны только из интерфейса диспетчера DNS, который предоставляется как часть вашей учетной записи клиента.
Таким образом, вам нужен сторонний провайдер для динамического DNS, и у вас есть следующие опции:
- Переместите свой домен на службу хостинга DNS, которая поддерживает динамический DNS (например, http://www.no-ip.com/, мой собственный https://www.net-me.net/ и многие другие). GoDaddy может оставаться вашим регистратором доменов, но вы используете сторонний DNS-хостинг. 
- (Проще) Настройте любую динамическую учетную запись DNS, это может быть домен 3-го уровня, например yourusername.some-dynamic-dns-provider.net, и настройте запись CNAME DNS с помощью GoDaddy, которая будет указывать на ваше динамическое доменное имя. Например, если у вас есть - www.yourdomain.com CNAME yourusername.some-dynamic-dns-provider.netвсе запросы на www.yourdomain.com будут перенаправляться DNS на ваш динамический IP-адрес. Хотя запись CNAME не может быть создана для голого домена (yourdomain.com, без www.).
- Вы также можете полностью переместить свой домен другому регистратору доменов, который поддерживает динамический DNS. (Я думаю, что http://www.namecheap.com/ делает.) 
Предполагая, что у вас есть сервер под управлением Linux, и вы хотите обновить запись DNS A с помощью IP-адреса вашего домашнего сервера, вы можете сделать следующее на домашнем сервере. Обратите внимание, что это может нарушить ваше лицензионное соглашение. Будьте уверены, что вы следуете правилам!
- Установите Python2.7 (скорее всего, он уже установлен). 
- Поместите следующий файл в - /config/scripts/godaddy_ddns.py, Это та часть, которая выполняет актуальную работу по обновлению godaddy с использованием библиотеки pygodaddy. Он обновит все домены, связанные с вашей учетной записью Godaddy. Он установит запись A для подстановочного знака субдомена '@'. Вы можете изменить это, если хотите указать альтернативные субдомены. Вы также должны заменить- @USERNAME@"с вашим добрым именем пользователя и"- @PASSWORD@'с вашим чертовым паролем.- #!/usr/bin/env python import logging import pif import pygodaddy # Original Source: # https://saschpe.wordpress.com/2013/11/12/godaddy-dyndns-for-the-poor/ # https://github.com/observerss/pygodaddy # # Modified by Jeremy Sears (https://stackoverflow.com/users/1240482/jsears) logging.basicConfig(filename='godaddy.log', format='%(asctime)s %(message)s', level=logging.INFO) # the "requests" library logs noisily, so turn that off logging.getLogger("requests").setLevel(logging.WARNING) logging.debug("DEBUG: Running godaddy_ddns.py"); U="@USERNAME@" P="@PASSWORD@" client = pygodaddy.GoDaddyClient() success = client.login(U,P) if success: logging.debug("DEBUG: Successfully logged in.") else: logging.error("ERROR: Failed to log in to godaddy.com with username: '{0}'.".format(U)) for domain in client.find_domains(): logging.debug("DEBUG: Looking up DNS Records for {0}.".format(domain)) dns_records = client.find_dns_records(domain) public_ip = pif.get_public_ip() logging.debug("DEBUG: Domain '{0}' DNS records: {1}".format(domain, dns_records)) logging.debug("DEBUG: Current Public IP '{0}'.".format(public_ip)) if len(dns_records) == 0: logging.debug("DEBUG: No existing DNS records found.") else: logging.debug("DEBUG: Existing IP in DNS is '{0}'.".format(dns_records[0].value)) if len(dns_records) == 0 or public_ip != dns_records[0].value: logging.debug("DEBUG: Updating A record for domain '{0}'.".format(domain)) success = client.update_dns_record("@."+domain, public_ip) if success: logging.info("INFO: Domain '{0}': Successfully set public IP to '{1}'.".format(domain, public_ip)) else: logging.error("ERROR: Domain '{0}': Unable to update public IP to '{1}'.".format(domain, public_ip)) else: logging.info("INFO: Public IP A record DNS record for domain '{0}' is up to date, and does not need to be updated.".format(domain))
- Бежать - sudo chown root /config/scripts/godaddy_ddns.py
- Бежать sudo chmod u+x /config/scripts/godaddy_ddns.py
- Поместите следующий файл в - /config/scripts/godaddy_ddns.sh, Это скрипт-обертка, который устанавливает virtualenv для изоляции библиотек, используемых скриптом python. Затем он вызывает вышеупомянутый скрипт Python.- #!/bin/sh # Original Source: # https://saschpe.wordpress.com/2013/11/12/godaddy-dyndns-for-the-poor/ # https://github.com/observerss/pygodaddy # # Modified by Jeremy Sears (https://stackoverflow.com/users/1240482/jsears) OLD_PWD=$PWD ROOT_DIR=$(dirname $0) if [ -n "$1" ] ; then WORKING_DIR=$1 else WORKING_DIR=$ROOT_DIR fi mkdir -p $WORKING_DIR cd $WORKING_DIR if [ ! -d .venv27 ] ; then curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.9.tar.gz tar xvfz virtualenv-1.9.tar.gz python virtualenv-1.9/virtualenv.py .venv27 fi source .venv27/bin/activate pip install -q --upgrade pif pygodaddy $ROOT_DIR/godaddy_ddns.py deactivate cd $OLD_PWD
- Бежать - sudo chown root /config/scripts/godaddy_ddns.sh
- Бежать sudo chmod u+x /config/scripts/godaddy_ddns.sh
- Поместите следующий файл в - /etc/cron.hourly/run_godaddy_ddns(без расширения файла). Это будет вызывать скрипт godaddy_ddns.sh каждый час.- #!/bin/sh WORKING_DIR=/var/local/godaddy_ddns exec /config/scripts/godaddy_ddns.sh $WORKING_DIR exit 0
- Бежать - sudo chown root /etc/cron.hourly/run_godaddy_ddns
- Бежать sudo chmod u+x /etc/cron.hourly/run_godaddy_ddns
- Журналы будут записаны в godaddy.logв/var/local/godaddy_ddnsкаталог. Этот каталог можно изменить, отредактировав скрипт run_godaddy_ddns.
- Поместите следующий файл в - /etc/logrotate.d/godaddy_ddns(без расширения файла). Это гарантирует, что ваш файл журнала не заполняет ваш диск, вращая файл журнала. Если вы изменили местоположение журнала, вам нужно будет отредактировать местоположение файла журнала.- /var/local/godaddy_ddns/godaddy.log { weekly missingok rotate 12 compress delaycompress notifempty copytruncate maxage 365 }
Примечание по безопасности: вам, вероятно, следует отредактировать run_godaddy_ddns сценарий и su пользователю, отличному от root, чтобы скрипт запускался с более ограниченными разрешениями.
Оформить заказ ddclient или INADYN, если они не могут этого сделать, возможно, вам лучше использовать самостоятельно написанное решение, основанное на API от GoDaddy, и вот ссылка на скрипт, который я использую для обновления своего DNS: http://paste.org/49922
#!/bin/sh
hosts=( 'your.host.tld' )
user='username'
pass_enc='password using base64'
lastipfile='/tmp/lastip'
pass=`echo $pass_enc | base64 -d`
myip=`dig a myip.opendns.com @resolver1.opendns.com +short`
lastip=`cat $lastipfile`
if [ "$myip" != "$lastip" ]; then
  for host in ${hosts[@]};
    do
      URL="https://dyndns.dns-stock.com/?hostname=$host&username;=$user&password;=$pass&myip;=$myip"
      wget -O /dev/null --quiet --no-check-certificate $URL
      echo $myip > $lastipfile
      touch $lastipfile
  done
else
  echo "IP did not change!" > /dev/null
fi