Обновление GoDaddy DNS из Linux

У меня есть следующие настройки:

  1. Домен, зарегистрированный в GoDaddy
  2. Подключаемый компьютер с ArchLinuxArm с динамическим публичным IP
  3. Обновлен домен в GoDaddy DNS Manager, чтобы он указывал на публичный IP подключаемого компьютера.

Все идет нормально. Однако мне нужно автоматически обновить IP (стиль DynDns) в GoDaddy DNS Manager, если мой провайдер решит его изменить.

Есть идеи, как это сделать?

3 ответа

Решение

В настоящее время GoDaddy не предоставляет динамический DNS и не имеет API для программного обновления DNS

Согласно поддержке GoDaddy:

... Модификации DNS с помощью сценариев были бы невозможны с нашими службами DNS. Эти изменения могут быть сделаны только из интерфейса диспетчера DNS, который предоставляется как часть вашей учетной записи клиента.

Таким образом, вам нужен сторонний провайдер для динамического DNS, и у вас есть следующие опции:

  1. Переместите свой домен на службу хостинга DNS, которая поддерживает динамический DNS (например, http://www.no-ip.com/, мой собственный https://www.net-me.net/ и многие другие). GoDaddy может оставаться вашим регистратором доменов, но вы используете сторонний DNS-хостинг.

  2. (Проще) Настройте любую динамическую учетную запись 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.).

  3. Вы также можете полностью переместить свой домен другому регистратору доменов, который поддерживает динамический DNS. (Я думаю, что http://www.namecheap.com/ делает.)

Предполагая, что у вас есть сервер под управлением Linux, и вы хотите обновить запись DNS A с помощью IP-адреса вашего домашнего сервера, вы можете сделать следующее на домашнем сервере. Обратите внимание, что это может нарушить ваше лицензионное соглашение. Будьте уверены, что вы следуете правилам!

  1. Установите Python2.7 (скорее всего, он уже установлен).

  2. Поместите следующий файл в /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))
    
  3. Бежать sudo chown root /config/scripts/godaddy_ddns.py

  4. Бежать sudo chmod u+x /config/scripts/godaddy_ddns.py
  5. Поместите следующий файл в /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
    
  6. Бежать sudo chown root /config/scripts/godaddy_ddns.sh

  7. Бежать sudo chmod u+x /config/scripts/godaddy_ddns.sh
  8. Поместите следующий файл в /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                                                
    
  9. Бежать sudo chown root /etc/cron.hourly/run_godaddy_ddns

  10. Бежать sudo chmod u+x /etc/cron.hourly/run_godaddy_ddns
  11. Журналы будут записаны в godaddy.log в /var/local/godaddy_ddns каталог. Этот каталог можно изменить, отредактировав скрипт run_godaddy_ddns.
  12. Поместите следующий файл в /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
Другие вопросы по тегам