Как писал в позапрошлой заметке - у блога новый домен. Собственно сразу стал вопрос - а как его использовать с моим-то динамическим белым IP адресом?
hatred.homelinux.net - предоставлен DynDNS.com, вот только незадача - они сделали чуть менее, чем всё у себя платным, даже если сейчас я освобожу этот хост - обратно в бесплатном аккаунте я его не выберу.
Именно поэтому в качестве DNS хостера и динамического DNS был выбран http://dnspark.net
Как делегировать туда свой домен, что делать на nic.ru или у других регистраторов - это за пределами этой статьи, в конце концов, там всё достаточно очевидно, если нет - в комментарии с вопросами :)
Но и тут имеем ложку дегтя (не говорю что в бесплатном аккаунте можно сделать только 10 DNS записей и нельзя задать wildcard *
): ddclient распоследней версии работает со старым API, который постоянно пытается сбросить твой адрес в 127.0.0.1. Есть
багрепорт, там же есть патчик, либой мой вариант:
--- 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 пытается повторить запрос несколько раз, часто это помогает с обновлением:
#!/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
Ссылки
- http://www.dnspark.com/support/developers/ - информация как тестировать свои клиенты обновления dnspark
- http://www.dnspark.com/support/developers/updateSpecs.php - строка запроса для обновления записей
- http://www.dnspark.com/support/developers/resultCodes.php - возможные ответы сервера (у меня в скрипте не учитываются)