Previous Entry Share Next Entry
Динамический dns или как я отказался от dyndns-сервиса
ursus_mellifera
Уже давно использовал сервис от компании dyndns, который позволял привязать доменное имя к динамическому ip-адресу компьютера. Удобно администрировать клиента, удобно клиенту из дома подключиться к рабочему компьютеру. Но с некоторых пор сервис начал затягивать гайки, сначала можно было пользоваться одним доменным именем на учетной записи бесплатно. Позже доменное имя начало сбрасываться каждый месяц - это периодически требовало усилий по восстановлению работы. Другие бесплатные сервисы не приглянулись и в какой-то момент я подписался на их платную услугу за $25 в год, что дало мне возможность использовать до 30 доменных имен. Было неудобство - клиентская программа под Windows визуализирует все доменные имена моей учетки при настройке и любой клиент случайно или умышленно может повредить привязку чужого доменного имени. В общем гнетет, но терпимо. На прошлой неделе пришла пора продлевать на год подписку. Цена выросла до $30, да и рубль упал к этому моменту до 60р за доллар. Жалко мне стало рублей и я таки решил дожать динамический DNS на своей площадке.

Исходные данные:

  • windows и *nix машины с динамическими ip

  • freebsd 9.3

  • bind9

  • apache 2.4

  • php 5.3

  • свой домен



Что-нужно получить:

  • простую в использовании клиентскую часть



Решение:

Предположим наш домен - MyDomain.ru

опишем его как мастер зону в /etc/namedb/named.conf


zone "MyDomain.ru" {
type master;
file "/etc/namedb/master/MyDomain.ru";
};



соответственно в /etc/namedb/master/MyDomain.ru пропишем что-нибудь типа


$ORIGIN .
$TTL 3600 ; 1 hour
MyDomain.ru IN SOA ns1.MyDomain.ru. root.MyDomain.ru. (
2015032014 ; serial
10800 ; refresh (3 hours)
3600 ; retry (1 hour)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS ns1.MyDomain.ru.
NS ns2.MyDomain.ru.
A 188.120.254.163
MX 10 mail.MyDomain.ru.
MX 20 mail.MyDomain.ru.
$ORIGIN MyDomain.ru.
mail A 192.168.0.1
ns1 A 192.168.0.1
ns2 A 192.168.0.1
smtp A 192.168.0.1
www A 192.168.0.1



после выполнения

echo named_enable="YES" >> /etc/rc.conf
echo 127.0.0.1 >> /etc/resolv.conf
/etc/rc.d/named start




получаем работающий dns-сервер, проверяем пингом разрешение имен в адреса, если есть файерволл не забываем открыть 53 и 953 порты на вход. Ставим rdns - утилиту управления демоном named.


rndc-confgen


ее вывод распределяем по двум файлам


key "rndc-key" {
algorithm hmac-md5;
secret "rxeXMLrA\1py6mDLhGO7dA==";
};

options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};



помещаем в /etc/namedb/rdnc.conf, а


# key "rndc-key" {
# algorithm hmac-md5;
# secret "rxeXMLrA\1py6mDLhGO7dA==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };



предваритель убрав комментарий добавляем в /etc/namedb/named.conf, если все правильно, то следующая команда должна выполнится успешно.


rndc reload


нужно добавить немного прав юзеру, от имени которого работает named


chown bind /etc/named/master


создаем скрипт следующего содержания и размещаем его в /root/ddns/ddns.sh к примеру


#!/usr/local/bin/bash
TTL=120
SERVER=127.0.0.1
ZONE=MyDomain.ru.
HOSTNAME=$1.$ZONE
KEY="rxeXMLrA\1py6mDLhGO7dA=="
new_ip_address=$2
nsupdate << EOF
server $SERVER
key rndc-key $KEY
zone $ZONE
update delete $HOSTNAME A
update add $HOSTNAME $TTL A $new_ip_address
send
EOF




вызов его с двумя параметрами


/root/ddns/ddns test 192.168.0.2


должен добавить в нашу зону домен третьего уровня test.MyDomain.ru c адресом 192.168.0.2
Теперь осталось как-то разрешить обращаться клиентам к этому скрипту, чтобы они могли обновлять свои имена в зоне на актуальные ip-адреса. Я решил это с помощью веб-сервера. В конфигурации апача разрешил виртуальные сервера и создал один для собственных нужд.



ServerAdmin root@MyDomain.ru
DocumentRoot "/usr/local/www/ddns"
ServerName ddns.MyDomain.ru
DirectoryIndex index.php
ErrorLog "/var/log/apache/ddns-error.log"
CustomLog "/var/log/apache/ddns-access.log" common

AllowOverride All
Order allow,deny
Require valid-user
Allow from all
AuthName "Who are you?"
AuthType Basic
AuthUserFile /usr/local/www/ddns/.htpasswd




Основной ньюанс в том, что доступ к этому сайту возможен только с указанием имени пользователя и пароля. Учетные данные хранятся в /usr/local/www/ddns/.htpasswd в том же каталоге размещаем php-скрипт следующего содержания:





ну и не забываем собственно наполнить файл учетными данными:


htpasswd -сb ./usr/local/www/ddns/htpasswd test test-password
htpasswd -b ./usr/local/www/ddns/htpasswd test1 test1-password
htpasswd -b ./usr/local/www/ddns/htpasswd test2 test2-password



Если правильно настроен sudo, нет проблем с правами доступ пользователя www, то при обращении клиента к ресурсу

http://ddns.MyDomain.ru

получаем приглашение на ввод учетных данных. Вводим логин и пароль, получаем в браузере ответ с ip-адресом клиента. На сервере при этом php-скрипт по логину клиента и ip-адресу обновляет его доменное имя в dns. Еще считаю разумным добавить в настройку named для нашей зоны следующие строки:

update-policy {
grant rndc-key name test.MyDomain.ru. A;
grant rndc-key name test1.MyDomain.ru. A;
grant rndc-key name test2.MyDomain.ru. A;
};


чтобы ключем rndc-key можно было править только разрешенные доменные имена. Еще хорошо бы общение клиента и сервера оформить через https, чтобы открытые пароли не гуляли в интернете.

Осталось только допилить клиента. Там все просто.


curl -u test:test-password http://ddns.MyDomain.ru

утилита curl в *nix системах должна быть по-умолчанию, для windows ее придется скачать. Оформить эту команду в bat-файл или sh-скрипт и разместить в планировщике задач или cron'е соответственно с интервалом вызова в 5 минут.

Чтобы добавить нового клиента в схему, нужно придумать его логин (домен 3-го уровня) и пароль, внести их в клиентский скрипт и файл htpasswd на сервере.

?

Log in

No account? Create an account