четверг, 29 апреля 2010 г.

DDNS Server - обновление и добавление записей через Http

В ранее описанной статье, для обновления записи DNS в зоне мы использовали nsupdate запущенный на клиенте.
Так как таскать за собой библиотеки c++, библиотеки от BIND не очень практично. Логичнее было бы хранить процедуру обновления на сервере. И обрабатывать http запрос, запускающий процедуры обновления записей в зоне ddns сервера.

Необходимы инструменты:
1. Apache web-server c поддержкой php
2. И конечно же настроенный BIND, Про настройки BIND можно прочитать в в этом посте.

Пример конфигурации Apache2
Файл rc.conf

apache22_enable="YES"
accf_http_load="YES"

Изменения в файле httpd.conf


Options FollowSymLinks Includes Indexes
AllowOverride All


DirectoryIndex index.html index.phtml index.php

ServerName dyndns.filial.firm.local:80

AddType application/x-httpd-php phtml php
LoadModule php5_module libexex/apache22/php5apache2.so



И соответственно настройки виртуального хоста


DocumentRoot /usr/local/www/dyndns.filial.firm.local
ServerAdmin postmastre@firm.com
ServerName dyndns.filial.firm.local
CustomLog /usr/local/www/logs/domain-access_log combined
ErrorLog /usr/local/www/logs/domain-error_log



Создаем директорию в /usr/local/www/ c именем dyndns.filial.firm.local и копируем в него файлы скрипта скачанного тут Огромное спасибо автору.

Если у вас Apache2.2 и при старте выдает ошибку "httpd not running, trying to start" смотрим тут. А также внимательно читаем лог httpd-error.log.

Теперь самое главное, настроить все правильно в соответствии с readme.
1. Создаем папку, куда скрипт будет писать изменения для зоны. Даем право записи, пользователю www и чтение группе bind
2. Проверяем включен ли mod_rewrite для apache

LoadModule rewrite_module libexec/apache22/mod_rewrite.so

Если он закоментирован #, необходимо раскоментировать и перезапустить apache.
3. В config.php редактируем пути ссылающиеся на директорию для записи изменений в зоне. BIND_CFG_PATH. В файле restart_bind изменяем пути для доступа к BIND и указываем директорию для записи
4. Заполняем в config.php массив доменов, зоны для которых будем изменять.
5. В файле зоны добавляем $INCLUDE и путь к директории, которую мы создали, с именем файла db.имя_зоны
6. В /etc/Crontab добавляем * * * * * root /path/to/this/script/restart_bind
7. Отключаем в php safemode.

Чтобы получить правильный http запрос который мы будем отправлять с клиента, изменим немного наш скрипт.
Добавляем строчку в /nic/update.php

$ip = $_REQUEST['myip'];
if ($ip=="") $ip = $_SERVER['REMOTE_ADDR'];

Также я закоментировала раздел для offline записей, и изменила значение по умолчанию для mx, сделав его пустым. Тоже самое для WildCat.

Тепер из строка, которую мы можем передавать с клиента стала намного короче

http://login:pass@192.168.1.129/nic/update?subdomain=test7&basedomain=filial.firm.local&hosttype=new&zonetoken=secret&zonecreate=nikita@post.ru&verbose=1&hostname=test7.filial.firm.local

Для обновления текущей записи, замените параметр hosttype=new на hosttype=existing.
Так же при обновлении можно удалить из строки параметры subdomain,basedomain,zonetoken.

Если вы использует браузер Internet explorer версии выше чем 6 sp1, авторизация типа http://login:pass работать не будет. По этому, если необходимо запланировать автоматическое обновление записи придется или менять браузер или воспользоваться скриптом.

Я придумала для себя вот такой вариант

wget.exe --http-user=dtobon1 --http-passwd=DToboN1 "http://192.168.101.101/nic/update?subdomain=test9&basedomain=filial.firm.local&hosttype=existing&zonetoken=&zonecreate=nikita@mail.ru&verbose=1&hostname=test9.filial.firm.locall"
echo %DATE% %TIME% >> update.log
type "update@subdomain=test9&basedomain=filial.firm.local&hosttype=existing&zonetoken=&zonecreate=nikita@mail.ru&verbose=1&hostname=test9.filial.firm.local">> update.log
del "update@subdomain=test9&basedomain=filial.firm.local&hosttype=existing&zonetoken=&zonecreate=nikita@mail.ru&verbose=1&hostname=test9.filial.firm.local"

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