У меня следующая установка:
Все идет нормально. Однако мне нужно автоматически обновить IP-адрес (стиль DynDns) в GoDaddy DNS Manager, если мой интернет-провайдер решит его изменить.
Есть идеи, как это сделать?
В настоящее время GoDaddy не поддерживает динамический DNS и не имеет API для программного обновления DNS.
В соответствии с Поддержка GoDaddy:
... Изменение DNS с помощью скриптов невозможно с нашими службами DNS. Эти изменения можно сделать только из интерфейса диспетчера DNS, который предоставляется как часть вашей учетной записи.
Таким образом, вам нужен сторонний провайдер для динамического DNS, и у вас есть следующие возможности:
Переместите свой домен в службу хостинга DNS, которая поддерживает динамический DNS (например, no-ip.com, мой собственный net-me.net, и многие другие). GoDaddy может остаться вашим доменом регистратор, но вы используете 3-ю сторону DNS хостинг.
(Проще) Настройте любую учетную запись динамического 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.).
Вы также можете полностью переместить свой домен к другому регистратору доменов, который поддерживает динамический DNS. (Думаю namecheap.com делает.)
Предполагая, что у вас есть сервер под управлением Linux, и вы хотите обновить запись DNS A с IP-адресом вашего домашнего сервера, вы можете сделать следующее на домашнем сервере. Обратите внимание, что это нарушает ваше EULA. Обязательно соблюдайте правила!
Установите Python2.7 (вероятно, он уже установлен).
Поместите следующий файл в /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))
Бегать sudo chown root /config/scripts/godaddy_ddns.py
sudo chmod u+x /config/scripts/godaddy_ddns.py
Поместите следующий файл в /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
Бегать 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, так что сценарий запускается с более ограниченными разрешениями.
Оформить заказ на 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