我有以下设置:
- 在 GoDaddy 注册的域名
- 运行 ArchLinuxArm 并具有动态公共 IP 的插头计算机
- 更新 GoDaddy DNS 管理器中的域以指向插头计算机的公共 IP
到目前为止一切顺利。但是,如果我的 ISP 决定更改 IP,我需要在 GoDaddy DNS 管理器中自动更新 IP(DynDns 样式)。
有什么想法可以实现吗?
答案1
目前,GoDaddy 不提供动态 DNS,并且没有 API 来以编程方式更新 DNS
根据GoDaddy 支持:
... 我们的 DNS 服务无法通过脚本进行 DNS 修改。这些更改只能在作为客户帐户一部分提供的 DNS 管理器界面内进行。
因此,您需要第三方动态 DNS 提供商,并且您有以下选择:
将您的域名移动到支持动态 DNS 的 DNS 托管服务(例如无ip.com, 我自己的网我网, 和好多其它的)。GoDaddy 可能会保留您的域名注册员,但你使用第三方DNS 托管。
(更简单)设置任何动态 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 记录。您还可以将域名整体迁移至支持动态 DNS 的其他域名注册商。(我认为namecheap.com做。)
答案2
假设您有一台运行 Linux 的服务器,并且您希望使用主服务器的 IP 更新 DNS A 记录,您可以在主服务器上执行以下操作。请注意,这可能会违反您的 EULA。请务必遵守规则!
安装 Python2.7(可能已经安装)。
将以下文件放在
/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))
跑步
sudo chown root /config/scripts/godaddy_ddns.py
- 跑步
sudo chmod u+x /config/scripts/godaddy_ddns.py
将以下文件放在
/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
跑步
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 以外的用户,以便以更有限的权限运行该脚本。
答案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