从 Linux 更新 GoDaddy DNS

从 Linux 更新 GoDaddy DNS

我有以下设置:

  1. 在 GoDaddy 注册的域名
  2. 运行 ArchLinuxArm 并具有动态公共 IP 的插头计算机
  3. 更新 GoDaddy DNS 管理器中的域以指向插头计算机的公共 IP

到目前为止一切顺利。但是,如果我的 ISP 决定更改 IP,我需要在 GoDaddy DNS 管理器中自动更新 IP(DynDns 样式)。

有什么想法可以实现吗?

答案1

目前,GoDaddy 不提供动态 DNS,并且没有 API 来以编程方式更新 DNS

根据GoDaddy 支持

... 我们的 DNS 服务无法通过脚本进行 DNS 修改。这些更改只能在作为客户帐户一部分提供的 DNS 管理器界面内进行。

因此,您需要第三方动态 DNS 提供商,并且您有以下选择:

  1. 将您的域名移动到支持动态 DNS 的 DNS 托管服务(例如无ip.com, 我自己的网我网, 和好多其它的)。GoDaddy 可能会保留您的域名注册员,但你使用第三方DNS 托管

  2. (更简单)设置​​任何动态 DNS 帐户,可以是 3 级域名,如 yourusername.some-dynamic-dns-provider.net,并使用 GoDaddy 设置指向您的动态域名的 CNAME DNS 记录。例如,如果您有www.yourdomain.com CNAME yourusername.some-dynamic-dns-provider.net,则所有对 www.yourdomain.com 的请求都将由 DNS 重定向到您的动态 IP 地址。但无法为裸域(yourdomain.com,没有 www.)创建 CNAME 记录。

  3. 您还可以将域名整体迁移至支持动态 DNS 的其他域名注册商。(我认为namecheap.com做。)

答案2

假设您有一台运行 Linux 的服务器,并且您希望使用主服务器的 IP 更新 DNS A 记录,您可以在主服务器上执行以下操作。请注意,这可能会违反您的 EULA。请务必遵守规则!

  1. 安装 Python2.7(可能已经安装)。

  2. 将以下文件放在/config/scripts/godaddy_ddns.py。这是使用 pygodaddy 库执行更新 godaddy 实际工作的部分。它将更新与您的 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。这是一个包装器脚本,它设置了一个虚拟环境来隔离 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 以外的用户,以便以更有限的权限运行该脚本。

答案3

如果它们无法做到,请检查 ddclient 或 INADYN,您可能最好使用基于 GoDaddy 的 API 的自写解决方案,下面是我用来更新 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

相关内容