更新从Linux的GoDaddy DNS

我有以下设置:

  1. 一个域名注册GoDaddy
  2. 运行ArchLinuxArm的插件计算机具有dynamic公共IP
  3. 在GoDaddy DNS Manager中更新域指向插件计算机的公共IP

到现在为止还挺好。 但是,如果我的ISP决定更改它,我需要在GoDaddy DNSpipe理器中自动更新IP(DynDns样式)。

任何想法如何去呢?

目前,GoDaddy不提供dynamicDNS,并且没有API来编程更新DNS

根据GoDaddy的支持 :

…通过脚本进行DNS修改将不可能与我们的DNS服务。 这些更改只能在作为客户帐户一部分提供的DNSpipe理器界面中进行。

因此,您需要第三方供应商提供dynamicDNS,并且您有以下select:

  1. 将您的域名转移到支持dynamicDNS的DNS托pipe服务(如no-ip.com ,我自己的net-me.net 等等 )。 GoDaddy可能仍然是您的域名注册商 ,但您使用第三方DNS托pipe

  2. (更简单)设置​​任何dynamicDNS帐户,可以像yourusername.some-dynamic-dns-provider.net第三级域名,并设置一个CNAME DNSlogging与GoDaddy将指向您的dynamic域名。 例如,如果您有www.yourdomain.com CNAME yourusername.some-dynamic-dns-provider.net ,那么www.yourdomain.com的所有请求都将被DNSredirect到您的dynamicIP地址。 虽然CNAMElogging不能为裸域(yourdomain.com,没有www)创build。

  3. 您也可以将您的域名完全移动到另一个域名注册商,该域名注册商确实支持dynamicDNS。 (我认为namecheap.com有。)

如果他们不能这样做,请检查ddclient或INADYN,或者使用基于GoDaddy API的自行编写的解决scheme,以下是我用来更新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 

假设您有一台运行Linux的服务器,并且您正在使用家庭服务器的IP更新DNS Alogging,则可以在家庭服务器上执行以下操作。 请注意,它违反了您的EULA。 一定要遵守规则!

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

  2. 将以下文件放在/config/scripts/godaddy_ddns.py 。 这是使用pygodaddy库更新godaddy的实际工作的一部分。 它将更新与您的godaddy帐户相关的所有域。 它将为“@”子域通配符设置一个Alogging。 如果要指定备用子域,则可以编辑此项。 您还必须用您的godaddy用户名和' @PASSWORD@ 'replace' @USERNAME@ '和您的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. 日志将被写入/var/local/godaddy_ddns目录中的godaddy.log 。 这个目录可以通过编辑run_godaddy_ddns脚本来改变。
  12. 将以下文件放在/etc/logrotate.d/godaddy_ddns (无文件扩展名)。 这将确保您的日志文件不会填满您的磁盘,通过旋转日志文件。 如果更改了日志logging位置,则需要编辑日志文件位置。

     /var/local/godaddy_ddns/godaddy.log { weekly missingok rotate 12 compress delaycompress notifempty copytruncate maxage 365 } 

安全性注意事项:您可能应该编辑run_godaddy_ddns脚本,并将su设置为root以外的用户,以便脚本以更有限的权限运行。