среда, 2 июля 2014 г.

DynDNS уволен! Организуем свой домен второго уровня с динамическим IP

Не так давно всеми любимый сервис dyndns.org "предложил" начать оплачивать услуги хостинга доменов.
This email is an reminder that Dyn's free hostname program will be ending on Wednesday, May 7th
Мол, "мы делаем наш сервис качественнее", переходите на VIP всего за N баксов, уж не помню сколько было, но пусть даже $1 - русские люди принципиально не платят за то, что раньше было халявой!
Подстава получилась довольно великая: на текущее DNS-имя (mex.homeip.net) у меня, разумеется, уже многое завязано и настроено, о нем знают друзья, коллеги. А теперь о нем придется забыть.

Ну и не очень то и надо, я всегда хотел организовать свой домен 2 уровня, который я полностью контролирую. Вот и повод нашелся.

Для начала я выбрал и купил домен на webnames.ru, в dns серверах у него выбрал "Задать самостоятельно" и прописал
ns1.he.net
ns2.he.net
HE.net выбрал из комментов на хабре по какой-то теме DNS хостинга.
Само собой, там нужно сначала зарегиться, завести запись о своем домене на вкладке Zone Management, затем Edit, добавление корневой записи с опцией dynamic DNS и генерация ключа для обновления извне.

Даже если с этим DNS-хостингом что-то случится, профит в том, что можно выбрать другой, не меняя доменного имени. А если на планете вдруг кончатся Free DNS хостеры, ну придется купить постоянный IP у провайдера и настроить зону у регистратора, либо хостить ее самому у себя же.
На этом минимальная настройка у днс-хостера закончена.

Настройка обновления DynDNS на роутере

Полученный ключ будем использовать для авторизации вместо пароля, а имя домена - вместо имени пользователя. Так типа не раскрываются основные авторизационные данные аккаунта, более секьюрно будет.
Итак
Server Address - dyn.dns.he.net
Host Name - mydomain.net
Username or Key - mydomain.net
Password or Key - наш ключ
Verify Password or Key - наш ключ еще раз
Все, Save

Но вообще-то обычный среднестатистический роутер у меня уже давно уволен за нестабильность и местами тупость, и только ради вайфая стоит. Функцию шлюза взял на себя домашний сервер под Debian. На нем в кроне на каждые 5 минут крутится особый скрипт, мониторящий и обновляющий значение нашего непостоянного IP для домена.

Мониторинг состояния интернета. Обновление DynDNS IP

Скрипт у меня работает давно и занимется не только обновлением IP, но и активным вмешательством в дело обеспечения стабильности инета. Так что в качестве бонуса дарю функционал мониторинга наличя интернета и переподключения при неполадках со связью.
#!/bin/sh
# для разработчиков
# http://dyn.com/support/developers/api/perform-update/
reconnect () {
        sudo poff dsl-provider
        sleep 3
        sudo pon dsl-provider
}
SELF_DIR=`dirname $0`
PING_HOST="8.8.8.8"
DDNS_SERVICE="ns1.he.net"
DDNS_HOSTNAME="mydomain.net"
DDNS_KEY="тут тот самый ключ"
DNS_TIMEOUT=`nslookup -timeout=5 -query=hinfo www.ru | grep "timed out"`
if [ "$DNS_TIMEOUT" != "" ] ; then
        echo Nslookup timeout
        reconnect;
        exit 1
fi;
# пингуем кого нибудь, если ответа нет - реконнектим инет и выходим
PACKETS_RECEIVED=`ping $PING_HOST -c5 | grep -i loss | cut -d " " -f 4`
if [ "$PACKETS_RECEIVED" -lt "3" ] ; then
        echo Packets received: $PACKETS_RECEIVED. reconnecting
        reconnect;
        exit 1
fi;
# теперь сравниваем адреса, реальный и из DynDNS
CURRENT_DNS_IP=`nslookup $DDNS_HOSTNAME $DDNS_SERVICE | tail -n2|head -n1 | sed 's/[Adres: ]//g'`
CURRENT_REAL_IP=`wget -q -O - http://wtfismyip.com/text`
CURRENT_IF_IP=`/sbin/ifconfig ppp0 | head -n2 | tail -n 1 | cut -f 12 -d " " | cut -d ":" -f 2`
if [ "$CURRENT_REAL_IP" = "" ] ; then
        echo Empty real IP
        exit 1;
fi;
# реальный IP равен IP из dyndns
if [ "$CURRENT_REAL_IP" = "$CURRENT_DNS_IP" ] ; then
        # echo IP equals Current: $CURRENT_DNS_IP, real: $CURRENT_REAL_IP, if: $CURRENT_IF_IP
        exit 0;
fi;
echo -n `date`:
# если IF IP не равен REAL IP - реконнект
if [ "$CURRENT_REAL_IP" != "$CURRENT_IF_IP" ] ; then
        echo REAL IP $CURRENT_REAL_IP != IF IP $CURRENT_IF_IP
        reconnect;
        sleep 10
        sh $0 #  вызов самого себя
        exit 3;
fi;
# не совпали, обновим dyndns и положим real ip в файлик
echo Address mismatch. Current: $CURRENT_DNS_IP, real: $CURRENT_REAL_IP
DYN_URL="http://$DDNS_HOSTNAME:$DDNS_KEY@dyn.dns.he.net/nic/update?hostname=$DDNS_HOSTNAME&myip=$CURRENT_REAL_IP"
echo -n $CURRENT_REAL_IP > $SELF_DIR/current_ip.txt
RESULT=`wget -qS "$DYN_URL" -O - 2>&1 | tail -n1`
CODE=`echo "$RESULT" | cut -d " " -f 1`
# смотрим код, если good, значит обновлен
if [ "$CODE" = "good" ] ; then
        echo Updated with result $RESULT
        exit 0
fi;
echo Code is $CODE
exit 2;

Комментариев нет:

Отправить комментарий