Документация по ОС FreeBSD
Четверг, 06.11.2025, 16:08
Главная
Регистрация
Вход
Приветствую Вас
Гость
|
RSS
Меню сайта
Главная страница
Новости в мире Unix
NEW
Каталог файлов
NEW
Установка и настройка
Ports & Packages
cvs
Безопасность
Работа с железом
X Window
Multimedia
Man pages
Net
Apache
DNS
FTP
Mail
Samba
Squid
SSH
VPN
РРР
Shell
IPFW
Tips'n'tricks
RFC
Книги по FreeBSD
Темы экзамена BSDA
Гостевая книга
Форум на bsdportal.ru
Каталог сайтов
Самый свежий софт
Каталог ссылок
Категории каталога
Apache
[58]
DNS
[25]
FTP
[27]
Mail
[74]
Samba
[24]
Squid
[46]
SSH
[23]
VPN
[35]
РРР
[20]
Net
[173]
Главная
»
Статьи
»
Сеть
»
DNS
Настройка автономного сервера DynDNS на FreeBSD с BIND и Apache [2010]
В статье рассматривается настройка локального домена mydomain.local на базе FreeBSD и BIND. Удаленные точки (клиенты на Windows XP) регистрируются в локальной доменной зоне и доступны по имени из локальной сети офиса.
Иногда есть необходимость обращаться по имени клиента, а не по адресу (в случае, если адреса динамические). Сейчас это частично реализовано. Допустим, есть локальный домен mydomain.local, удаленные точки регистрируются в локальной доменной зоне и доступны по имени из локальной сети офиса. Решение тестировалось на:
сервере FreeBSD 7.2 и 8.0 с Apache 2.2, PHP, BIND 9;
клиентах Windows XP с curl, BIND 9.
Начнем с настройки сервера. В /usr/local/etc/apache22/http.conf добавим следующую секцию:
Alias /ipaddress "/usr/local/www/ipaddress/"
<Directory "/usr/local/www/ipaddress">
Options Indexes
AllowOverride All
DirectoryIndex index.php
Order allow,deny
Allow from All
AuthName "Who are you?"
AuthType Basic
AuthUserFile /usr/local/www/ipaddress/.htpasswd
Require valid-user
</Directory>
Далее создадим каталог:
mkdir /usr/local/www/ipaddress
И положим файл index.php следующего содержания (взял на http://www.phpfaq.ru/ip):
$ip=$_SERVER['REMOTE_ADDR'];
echo $ip;
?>
При обращении к этой странице клиенты узнают свой «белый адрес» с помощью curl. Далее определим тех пользователей, которым необходимо получать свой адрес:
htpasswd -cb /usr/local/www/ipaddress/.htpasswd firstsuser userpassword
Для проверки в браузере введем http://ip-address/ipaddress/ — в результате должны увидеть приглашение ввести имя пользователя и пароль, вводим и любуемся своим внешним адресом. Если нет — проверяем логи Apache.
Теперь — сервер имен. С помощью rndc-confgen генерируем ключ. В /etc/namedb/named.conf добавим следующую запись:
key "rndc-key" {
algorithm hmac-md5;
secret "только_что_сгенерированный_ключ==";
};
zone "mydomain.local" {
type master;
file "dynamic/mydomain.local";
allow-update { key "rndc-key"; };
};
И создадим файл зоны dynamic/mydomain.local — я просто скопировал файл для localhost и подправил.
Для проверки попробуем с помощью nsupdate обновить запись в зоне mydomain.local — я для этого использовал файл nsupdate.conf:
server 192.168.0.1
key rndc-key только_что_сгенерированный_ключ==
zone mydomain.local.
update delete test.mydomain.local. A
update add test.mydomain.local. 600 A 192.168.0.182
send
Выполним:
nsupdate nsupdate.conf
И проверим:
nslookup test.mydomain.local 192.168.0.1
Должен вернуться адрес тестовой машины. Если нет — включаем и смотрим логи сервера имен.
На этом с сервером закончили. Для клиентской части нужен curl (распространяется с поддержкой ssl и без) и bind9. Из пакета bind9 нам понадобится только nsupdate, его библиотеки и vcredist_x86.exe. На стороне клиента выполняется следующий скрипт (он вполне понятен — подробно описывать не буду):
var WshShell = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var workdir = "d:\\nsupdate\\";
var lastaddrr = "lastaddrr.txt";
var lastip = "127.0.0.1";
if (fso.FileExists(lastaddrr))
{
var fileObj = fso.GetFile(workdir + lastaddrr);
var ts = fileObj.OpenAsTextStream(1, -2);
// если файл создался десять минут назад и более, затираем его
var x=new Date(fileObj.DateLastModified);
var y=new Date();
if (Math.floor((y-x)/(1000*60)) >= 10)
{
ts.Close();
fso.DeleteFile(workdir + lastaddrr, true);
}
// иначе читаем из него адрес
else
{
var lastip = ts.ReadLine();
ts.Close();
}
}
var stdout = WScript.StdOut;
var stdin = WScript.StdIn;
// определим программы и их аргументы
var curl = workdir + "curl.exe -u firstuser:userpassword http://192.168.0.1/ipaddress/index.php";
var nsupdate = workdir + "nsupdate.exe";
// если наш ДНС пингуется, пытаемся получить свой адрес и обновить зону
// иначе молча выходим
var objLocalWMI = GetObject("Winmgmts:");
var enumPingStatus = new Enumerator(objLocalWMI.ExecQuery("Select StatusCode from Win32_PingStatus Where Address='192.168.0.1'"));
if(enumPingStatus.item().StatusCode == 0)
{
// определяем внешний IP-address
var oExec = WshShell.Exec(curl);
// проинициализируем переменные
var currentip = oExec.stdout.ReadLine();
if (lastip !== currentip)
{
var server = "server 192.168.0.1";
var key = "key rndc-key только_что_сгенерированный_ключ==";
var zone = "zone mydomain.local.";
var update_del = "update delete mydomain.local. A";
var update_add = "update add mydomain.local. 600 A" + "\ " + currentip;
var send = "send";
// отправим данные серверу
oExec = WshShell.Exec(nsupdate);
oExec.StdIn.Write(server + "\n");
oExec.StdIn.Write(key + "\n");
oExec.StdIn.Write(zone + "\n");
oExec.StdIn.Write(update_del + "\n");
oExec.StdIn.Write(update_add + "\n");
oExec.StdIn.Write(send + "\n");
// save current ip to file
ts = fso.CreateTextFile(workdir + lastaddrr, true);
ts.WriteLine(currentip);
ts.Close();
}
}
Этот скрипт запускаем на выполнение каждые 5 минут в планировщике:
если сервер не пингуется — молча выходим;
если адрес не менялся — ничего обновлять не будем;
если в течение 10 минут адрес не менялся (определим по времени создания файла) — адрес все равно обновим, а файл удалим; последний полученный адрес сохраним в файл и на него будем ориентироваться в течение следующих 10 минут.
P.S.
Из недостатков — на клиентах мелькают «черные окна»; это я исправил и пока тестирую.
Источник:
http://www.nixp.ru/articles/Настройка-автономного-сервера-DynDNS-на-FreeBSD-с-BIND-и-Apache.html
Категория:
DNS
| Добавил:
oleg
(06.05.2010) | Автор:
andy03
Просмотров:
1923
| Рейтинг:
0.0
/
0
|
- Оценить -
Отлично
Хорошо
Неплохо
Плохо
Ужасно
Всего комментариев:
0
Добавлять комментарии могут только зарегистрированные пользователи.
[
Регистрация
|
Вход
]
Форма входа
Друзья сайта
Google+
Copyright MyCorp © 2025