Обновление GoDaddy DNS из Linux
У меня есть следующие настройки:
- Домен, зарегистрированный в GoDaddy
- Подключаемый компьютер с ArchLinuxArm с динамическим публичным IP
- Обновлен домен в GoDaddy DNS Manager, чтобы он указывал на публичный IP подключаемого компьютера.
Все идет нормально. Однако мне нужно автоматически обновить IP (стиль DynDns) в GoDaddy DNS Manager, если мой провайдер решит его изменить.
Есть идеи, как это сделать?
3 ответа
В настоящее время GoDaddy не предоставляет динамический DNS и не имеет API для программного обновления DNS
Согласно поддержке GoDaddy:
... Модификации DNS с помощью сценариев были бы невозможны с нашими службами DNS. Эти изменения могут быть сделаны только из интерфейса диспетчера DNS, который предоставляется как часть вашей учетной записи клиента.
Таким образом, вам нужен сторонний провайдер для динамического DNS, и у вас есть следующие опции:
Переместите свой домен на службу хостинга DNS, которая поддерживает динамический DNS (например, http://www.no-ip.com/, мой собственный https://www.net-me.net/ и многие другие). GoDaddy может оставаться вашим регистратором доменов, но вы используете сторонний DNS-хостинг.
(Проще) Настройте любую динамическую учетную запись DNS, это может быть домен 3-го уровня, например yourusername.some-dynamic-dns-provider.net, и настройте запись CNAME DNS с помощью GoDaddy, которая будет указывать на ваше динамическое доменное имя. Например, если у вас есть
www.yourdomain.com CNAME yourusername.some-dynamic-dns-provider.net
все запросы на www.yourdomain.com будут перенаправляться DNS на ваш динамический IP-адрес. Хотя запись CNAME не может быть создана для голого домена (yourdomain.com, без www.).Вы также можете полностью переместить свой домен другому регистратору доменов, который поддерживает динамический DNS. (Я думаю, что http://www.namecheap.com/ делает.)
Предполагая, что у вас есть сервер под управлением Linux, и вы хотите обновить запись DNS A с помощью IP-адреса вашего домашнего сервера, вы можете сделать следующее на домашнем сервере. Обратите внимание, что это может нарушить ваше лицензионное соглашение. Будьте уверены, что вы следуете правилам!
Установите Python2.7 (скорее всего, он уже установлен).
Поместите следующий файл в
/config/scripts/godaddy_ddns.py
, Это та часть, которая выполняет актуальную работу по обновлению godaddy с использованием библиотеки pygodaddy. Он обновит все домены, связанные с вашей учетной записью Godaddy. Он установит запись A для подстановочного знака субдомена '@'. Вы можете изменить это, если хотите указать альтернативные субдомены. Вы также должны заменить@USERNAME@
"с вашим добрым именем пользователя и"@PASSWORD@
'с вашим чертовым паролем.#!/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