Документация по ОС FreeBSD Четверг, 28.03.2024, 21:29
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
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
Просмотров: 1821 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024