Свои DDNS (Dynamic DNS) сервер и клиент на базе Debian

Практика



Что такое DDNS - можно почитать в гугле. Однако если Вы зашли почитать эту записку - оно Вам, видимо, надо. Примеров куча - это может быть как просто отсутствие статического IP адреса в одном из филиалов организации (например, при работе одного из узлов через ADSL), так и просто домашнее оборудование, тоже не имеющее статического IP.

Для организации DDNS обычно пользуют внешние сервисы - ибо это проще, как правило. Например, при использовании того же DynDNS не требуется заводить свой домен.

Но давайте представим, что домен у организации уже есть и есть потребность в DDNS. Но пользоваться чужими услугами для этого не хочется - они или платные, или нифига не гарантированные (как в случае с DynDNS), или банально не имеют клиента для необходимой ОС. Так или иначе, наша цель - это настроить DDNS сервер и DDNS клиента на базе всего встроенного в Linux Debian, без установки софта сбоку и пользуясь только своими мощностями.

Данная записка ориентирована на ОС Linux Debian, однако с минимальными изменениями все это же действительно для других ОС, как, например, CentOS/RedHat


ПАРАМЕТРЫ

В данном примере будут использованы следующие параметры - это всего-лишь пример:
  • Адрес мастер-DNS сервера: ns1.example.com
  • Адрес DDNS зоны, которая будет обновляться: dynamic.example.com
  • Адрес, собственно, зоны: example.com
  • Интерфейс на клиенте с выходом в WAN: eth0
  • TTL динамической зоны: 120 (2 минуты)



КЛИЕНТ

Как ни странно, но начнем мы, пожалуй, все-же с клиента.

1) Устанавливаем необходимые пакеты (они не идут из коробки).

$ sudo apt-get install bind9utils

Действо данное нам необходимо ради получения утилитки под названием nsupdate.


2) Генерируем ключ TSIG.

Данный ключ будет позволять производить на сервере DNS изменение необходимой зоны DNS при заранее неизвестном IP адресе клиента.

$ sudo dnssec-keygen -b 512 -a HMAC-MD5 -v 2 -n HOST example.com
здесь вместо example.com введите название ключа (желательно, чтобы оно все-же совпадало с названием зоны). Причем название это потребуется в дальнейшем.

Данная процедура создаст два файла, называющихся примерно так:
Kexample.com.+157+49437.key
Kexample.com.+157+49437.private

Файлы эти лежат там, где Вы находитесь в данное время (pwd). Причем их местоположение не важно - можете хранить их хоть у себя в домашнем каталоге.


3) Создаем скрипт для автообновления адреса

Например, назовем его ddnsupdate и положим в /usr/local/bin:
#!/bin/sh

IFACE="eth0"
TTL=120
SERVER=ns1.example.com
HOSTNAME=dynamic.example.com
ZONE=example.com
KEYFILE=/path/to/tsig/Kexample.com.+157+49437.private

new_ip_address=`ifconfig $IFACE | grep "inet addr:" | awk '{print $2}' | awk -F ":" '{print $2}'`

nsupdate -v -k $KEYFILE << EOF
server $SERVER
zone $ZONE
update delete $HOSTNAME A
update add $HOSTNAME $TTL A $new_ip_address
send
EOF

Здесь:
  • IFACE="eth0" : Это название сетевой карты, с которой снимать данные о текущем IP адресе (например, для ADSL это будет, скорее всего, ppp0);
  • TTL=120 : Это время жизни данной зоны в кеже других серверов DNS и конечных компьютеров. Много ставить не надо - а то придется долго ждать, прежде чем новый IP адрес станет доступным после изменения;
  • SERVER=ns1.example.com : Это FQDN адрес Вашего DNS сервера, который будет выступать в роли и DDNS сервера;
  • HOSTNAME=dynamic.example.com : Это название зоны, IP адрес (A-запись) которой и будет обновляться через DDNS;
  • ZONE=example.com : Это название родительсвой зоны (т.е. если dynamic.example.com - это часть зоны example.com - то здесь пишем example.com);
  • KEYFILE=... : Это путь к файлу ключа, созданного в п.2.

4) Делаем этот файл исполняемым:
$ chmod +x /usr/local/bin/ddnsupdate


5) Открываем файл Kexample.com.+157+49437.private (или как он у Вас называется):
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: vHBX3cjxtS8lM37KZwfnpXFldl9QB/8vs67Rw/xCH+yGXJ9gmj5BVHY87NQMD/vmjHZc8oz38PgINGAYRMrdAA==
Bits: AAA=
Created: 20120216073642
Publish: 20120216073642
Activate: 20120216073642

Видите строчку "Key:......."? Вот нам надо скопировать в буфер обмена все, что находится после "Key:" (опустив пробел, конечно). Это ключ, который понадобится для конфигурирования сервера.



СЕРВЕР

Теперь приступим к настройке сервера. Предполагается, что DNS сервер BIND уже установлен и работает. На всякий случай - вот статья по его установке на Debian: ссылка.

Итак, у Вас есть обычная статическая DNS-зона. Например, она выглядит вот так:
$ORIGIN .
$TTL 3600       ; 1 hour
example.com             IN SOA  ns1.example.com. root.example.com. (
                                2012021602 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.example.com.
                        NS      ns2.example.com.
                        A       111.222.111.222
                        MX      10 mail.example.com.
$ORIGIN example.com.
mail                    A       111.222.111.225
www                     CNAME   example.com.

На самом деле в файле описания зоны делать ничего не надо - она так и остается - какая есть.


1) Создаем (если нет) или дописываем в (если есть) файл keys.conf. Положим этот файл в директорию остальных конфигов bind (для не-chroot-ового BIND Debian - это /etc/bind).

Файл будет иметь вот такой вид:
key example.com {
 algorithm hmac-md5.sig-alg.reg.int;
 secret vHBX3cjxtS8lM37KZwfnpXFldl9QB/8vs67Rw/xCH+yGXJ9gmj5BVHY87NQMD/vmjHZc8oz38PgINGAYRMrdAA==;
};

Заметили строчку "secret"? Сюда мы как раз ложим скопированный с клиента ключ - всю строку.

А еще заметили название ключа "example.com"? Вот оно должно быть точно таким-же, как и то название, которое мы указывали в качестве параметра "HOST" в п.2


2) Изменяем конфигурацию DNS-зоны example.com (ну конечно вместо example.com - название Вашей зоны).

Например, исходно она выглядит вот так:
zone "example.com" {
        type master;
        file "/etc/bind/master/example.com";
};

Теперь дописываем опцию "allow-update" с указанием ключа, после чего конфиг зоны будет выглядеть примерно так:
zone "example.com" {
        type master;
        file "/etc/bind/master/example.com";
        allow-update {
                key example.com;
        };
};


3) Дописываем в файл named.conf директиву загружать ключи из keys.conf:

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


4) Убеждаемся, что процесс bind сможет изменять файл зоны и писать файлы рядом с ним. Дело в том, что DNS-сервер создаст рядом файл журнала, в котором будет вести лог изменений через DDNS, а также будет самостоятельно время от времени менять файл зоны, внося в него изменения в соответствии с принимаемыми от клиента данными.

Для этого делаем пользователя bind в группе bind владельцем директорий master и dynamic:
$ sudo chown -R bind:bind /etc/bind/master
$ sudo chown -R bind:bind /etc/bind/dynamic

Без этого, если сервер не сможет изменять файлы в директории, где лежит зона, он будет просто возвращать SERVFAIL в качестве ответа на ddnsupdate.


5) Перезагружаем конфиг сервера DNS:
$ sudo rndc reload


Все, настройка сервера закончена.


СНОВА НА КЛИЕНТЕ

Снова возвращаемся к клиенту. Запускаем скрипт ddnsupdate и глядим, чтобы все прошло шоколадно.

Если не шоколадно:
  • Если вызалит "NOTZONE": проверьте, что Вы правильно указали в ddnsupdate параметры ZONE и HOSTNAME. Например, параметр HOSTNAME будет включать в себя все то, что написано в ZONE (например, ZONE=example.com, HOSTNAME=dynamic.example.com).
  • Если вызалит "NOTAUTH(BAD_KEY)": проверьте правильность копирования ключа с клиента на сервер и то, что название ключа точно соответствует как на клиенте, так и на сервере. Смысл в том, что нужно плясать с бубном возле ключа. И, кстати, не стоит копировать ключ из файла с расширением .key - на самом деле записи в нем и в .private могут легко отличаться - как это было у меня.
  • Если вылазит "SERVFAIL": проверьте, что демон bind имеет права на запись везде, где только возможно в директории конфигов сервера (в нашем случае: /etc/bind).


Если же шоколадно - то смело добавляйте запуск скрипта ddnsupdate по расписанию через редактрование /etc/crontab.


ЗЫ. Если вылазит ошибка ddnsupdate - дополните запуск nsupdate ключем -d или -D - в консоль будет вываливаться отладочная информаия (-d) или куча отладочной информации (-D).

 

Актуально для: Debian 5, Debian 6; вероятно, ubuntu/kubuntu
 
создано: 2017-05-09
обновлено: 2024-11-13
1923



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)

Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)