Назад | Перейти на главную страницу

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

У меня следующая установка:

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

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

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

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

В соответствии с Поддержка GoDaddy:

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

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

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

  2. (Проще) Настройте любую учетную запись динамического DNS, это может быть домен 3-го уровня, например yourusername.some-dynamic-dns-provider.net, и настройте DNS-запись CNAME с помощью GoDaddy, которая будет указывать на ваше динамическое доменное имя. Например, если у вас есть www.yourdomain.com CNAME yourusername.some-dynamic-dns-provider.net, все запросы к www.yourdomain.com будут перенаправлены DNS на ваш динамический IP-адрес. Хотя запись CNAME не может быть создана для голого домена (yourdomain.com, без www.).

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

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

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

  2. Поместите следующий файл в /config/scripts/godaddy_ddns.py. Это та часть, которая выполняет фактическую работу по обновлению godaddy с помощью библиотеки pygodaddy. Он обновит все домены, связанные с вашей учетной записью godaddy. Он установит запись A для подстановочного знака поддомена '@'. Вы можете отредактировать это, если хотите указать альтернативные поддомены. Вы также должны заменить '@USERNAME@'с вашим именем пользователя godaddy и'@PASSWORD@'с вашим паролем Godaddy.

    #!/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