Введение

Иногда необходимо иметь доступ к своей машине, или машине клиента, которые имеют динамический IP адрес. Для этих целей существует масса сервисов, но бесплатных становится все меньше и меньше. Вот для этого и предназначена данная статья. Если у вас есть под рукой сервер (VDS, VPS или дедик), из которого можно сделать ДНС сервер, то с помощью данной статьи вы сможете сделать для себя такой сервис и пользоваться им как вам удобно и сколько вам хочется. В ходе создания сервиса было перерыто множество страниц в интернете, зачастую противоречащих друг другу. Поэтому, ссылки на исходники указаны не будут. Это статья как бы компиляция всех сведений, нарытых в сети.

Начало работы

Для начала работы по созданию сервиса предполагается, что у вас настроен на сервере BIND, установлены пакет dnsutils и программа Curl. Если обнаружилось вдруг, что у вас этого нет, почитайте, что написано в этой статье. Для простоты сразу договоримся, что оперировать будем доменом dyndns.my и поддоменом с динамическим IP dhost. Полный адрес получится dhost.dyndns.my. В домене должна быть запись A ns с IP вашего сервера. Или не ns, тут кому как нравится, но в этом примере дело обстоит именно так. Ну и для полной ясности, и сервер, и клиент - компы с Ubuntu. Версия уже принципиального значения не имеет.

Он сказал, поехали!

Настройка клиентской части

Раздел идет впереди настройки сервера потому, что ключи авторизации необходимо генерировать на клиенте.

Создадим отдельный каталог в /etc.

sudo mkdir /etc/ddns/

Перейдем в него.

cd /etc/ddns/

Генерируем пару ключей для обмена информацией между клиентом и сервером.

sudo dnssec-keygen -b 512 -a HMAC-MD5 -v 2 -n HOST dyndns.my

В результате этой операции в каталоге появляются два файлика - Kdyndns.my.+157+48025.key и Kdyndns.my.+157+48025.private. Из первого файла нам будет необходим только набор символов после «157 ». Именно после пробела начинается тело ключа. Создаем скрипт обновления доменных зон.

sudo nano ddns.sh

Вставляем туда текст.

#!/bin/bash
TTL=3600
SERVER=ns.dyndns.my
HOSTNAME=dhost.dyndns.my
ZONE=dyndns.my
KEYFILE=Kdyndns.my.+157+48025.private
new_ip_address=`curl http://dyndns.my/ip.php`  #Этот файлик создадим позднее на сервере!
cd /etc/ddns
nsupdate -v -k $KEYFILE << EOF
server $SERVER
zone $ZONE
update delete $HOSTNAME A
update add $HOSTNAME $TTL A $new_ip_address
send
EOF

Сохраняем. Затем даем права на исполнение.

sudo chmod +x ddns.sh

Создаем символическую ссылку в каталог /usr/sbin, чтобы не добавлять в пути скрипт обновления зон. Это не обязательно, будет просто не лишним для того, чтобы из консоли набирать команду без путей.

sudo ln -s /etc/ddns/ddns.sh /usr/sbin/ddns_update

Раз добавили, то в /etc/crontab будем использовать его.

Настройка серверной части

Настройка сервера имен заключается в прописывании домена и установке разрешения на обновления записей A доменных имен с динамическими IP. Переходим в каталог bind.

cd /etc/bind/
sudo nano dnskeys.conf

Вставляем туда текст и тело ключа, о котором упоминалось в предыдущем разделе.

key "dyndns.my" {
        algorithm hmac-md5;
        secret "тут тело ключа";
};

Добавляем в файл /etc/bind/named.conf строчку с указанием файла, где определен ключ.

include "/etc/bind/dnskeys.conf";

Следующим шагом необходимо в файл /etc/bind/named.conf.local прописать доменную зону, которой мы оперируем.

zone "dyndns.my" {
        type master;
        allow-update {key dyndns.my;};
        file "/etc/bind/pri.dyndns.my";
};

Необходимо будет создать и файл /etc/bind/pri.dyndns.my с различными записями для домена. Он обычный, с минимально необходимым набором записей для функционирования домена, потому и нет необходимости рассматривать его в данной статье. Рестартуем сервер имен для завершения и применения настроек.

sudo service bind9 restart

Теперь в каталог, предназначенный для веб страниц, помещаем очень простой скрипт на php.

sudo nano /var/www/ip.php

Вставляем туда код.

<?php
echo $_SERVER["REMOTE_ADDR"];
?>

Если вы обратитесь к этому файлу через веб, к примеру, http://dyndns.my/ip.php, то, кроме своего IP адреса ничего не увидите. Что нам и требовалось. Клиент, с помощью curl, его и получает и обновляет информацию на сервере.

Вот и все телодвижения по настройке серверной части.

Настройка заключительная

Доделываем клиента.

sudo nano /etc/crontab

Добавляем строчку.

*/15 *  * * *   root    /usr/sbin/ddns_update

Это означает, что раз в 15 минут скрипт будет запускаться. На этом настройка клиентской части закончена. Можно подождать 15 минут и убедиться, что наш хости работает пингом со стороннего сервера. А можно и выполнить команду.

sudo ddns_update

Для чего, собственно, мы и делали симлинк в /usr/sbin. Если вы не получили в ответ выхлоп со словом REFUSED, значит вы все сделали правильно и можете быть счастливы.

Выводы

На выходе мы получили вполне себе работающий сервис динамических имен. Есть, конечно, и существенный недостаток. Используемый ключ подходит для изменения любого поддомена из прописанных. Т.е., он один для всех. Это открывает простор для хулиганства, если кто-то упрет ключ. Поскольку, сервис делался для себя, то особых проблем это не вызовет. Ибо надо быть не совсем здоровым психически, чтоб хулиганить самому у себя. Возможно есть и решение, позволяющее каждый поддомен авторизовать по своему ключу, но целью данной статьи это не ставилось, потому гугля сильно и не терзалась.

Большая просьба, при перепечатке данной статьи, указывать источник, в частности, этот ресурс.

Ссылки