Инструменты пользователя

Инструменты сайта


// Свой домен и динамический DNS

Как писал в позапрошлой заметке - у блога новый домен. Собственно сразу стал вопрос - а как его использовать с моим-то динамическим белым IP адресом?

hatred.homelinux.net - предоставлен DynDNS.com, вот только незадача - они сделали чуть менее, чем всё у себя платным, даже если сейчас я освобожу этот хост - обратно в бесплатном аккаунте я его не выберу.

Именно поэтому в качестве DNS хостера и динамического DNS был выбран http://dnspark.net

Как делегировать туда свой домен, что делать на nic.ru или у других регистраторов - это за пределами этой статьи, в конце концов, там всё достаточно очевидно, если нет - в комментарии с вопросами :)

Но и тут имеем ложку дегтя (не говорю что в бесплатном аккаунте можно сделать только 10 DNS записей и нельзя задать wildcard *): ddclient распоследней версии работает со старым API, который постоянно пытается сбросить твой адрес в 127.0.0.1. Есть багрепорт, там же есть патчик, либой мой вариант:

dnspark-api-fix.path
--- ddclient.orig	2012-03-27 10:07:44.000000000 +1100
+++ ddclient	2012-03-27 10:20:46.000000000 +1100
@@ -3257,12 +3257,13 @@
 	info("setting IP address to %s for %s", $ip, $hosts);
 	verbose("UPDATE:","updating %s", $hosts);
 
-	#'http://www.dnspark.com:80/visitors/update.html?myip=10.20.30.40&hostname=test.burry.ca'
+	#old: 'http://www.dnspark.com:80/visitors/update.html?myip=10.20.30.40&hostname=test.burry.ca'
+	#new: 'https://www.dnspark.net:443/api/dynamic/update.php?hostname=my.hostname&ip=1.2.3.4'
 
 	my $url;
-	$url   = "http://$config{$h}{'server'}/visitors/update.html";
+	$url   = "https://$config{$h}{'server'}/api/dynamic/update.php";
 	$url  .= "?hostname=$hosts";
-	$url  .= "&myip=";
+	$url  .= "&ip=";
 	$url  .= $ip            if $ip;
 
 	if ($config{$h}{'mx'}) {
@@ -3293,7 +3294,7 @@
 		my $h = pop @hosts;
 
 		$config{$h}{'status'} = $status;
-		if ($status eq 'ok') {
+		if (($status eq 'ok') || ($status eq 'nochange')) {
 		    $config{$h}{'ip'}     = $ip;
 		    $config{$h}{'mtime'}  = $now;
 		    success("updating %s: %s: IP address set to %s", $h, $status, $ip);

Но тут появляется и вторая ложка дегтя: при обращении по этому юрлу часто имеем ошибку 500 сервера. Продакшн. Ога :)

Решил проблему своим скриптом, который засунул в cron выполняться каждые 5 минут, плюс он, в случае ошибки HTTP пытается повторить запрос несколько раз, часто это помогает с обновлением:

dnspark-update.sh
#!/bin/sh
 
host=YOUR_HOST_NAME_TO_UPDATE
# переменная dns хранит сервер, при помощи которого резолвится доменное имя вашего хоста, что понять - поменялось оно или нет
# можно оставить пустым, тогда будет использоваться сервер указанный в /etc/resolv.conf
#dns=
dns=8.8.8.8
 
# пока используется получение IP адреса только с интерфейса
use=if
if=ppp999
#use=web
 
# Логин и пароль для обновления DDNS (в случае dnspark.com логин к аккаунту и логин для обновления записей - разные сущности, второй заводится в админке)
login=DDNS_UPDATE_LOGIN
password=DDNS_UPDATE_PASSWORD
 
# вроде как не нужно уже :)
libdir=/var/lib/dnspark
prev_file=$libdir/prev
prev_ip=`cat $prev_file`
 
get_ip_if()
{
    ifconfig $if | grep inet | awk '{print($2)}'
}
 
get_ip_web()
{
    # TODO: задел на будушее
    false
}
 
get_prev_ip()
{
    host $host $dns | grep "^$host" | grep 'has address' | awk '{print($4)}'
}
 
prev_ip=`eval get_prev_ip`
current_ip=`eval "get_ip_$use"`
 
# Обновляем
if [ "$prev_ip" != "$current_ip" ]; then
    echo "Prev:    " $prev_ip
    echo "Current: " $current_ip
    echo "Updating..."
    eval "curl --retry 10 'https://$login:$password@www.dnspark.net/api/dynamic/update.php?hostname=$host&ip=$current_ip'"
fi

Ссылки

Комментарии