Настройка автономного сервера DynDNS на FreeBSD с BIND и Apache
Сети/интернет
Статья была опубликована 4 апреля 2010 года в 08:42, а последний раз правилась 18 апреля 2010 года в 19:11.
Постоянная ссылка: http://www.nixp.ru/articles/73.html
В статье рассматривается настройка локального домена 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):
<?php $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. Из недостатков — на клиентах мелькают «черные окна»; это я исправил и пока тестирую.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Простите но в чём смысл? DynDNS.com работает быстро, надёжно и не надо поддерживать bind и Apache если они не нужны. Плюс DNS быстрый, на пяти разных серверах по миру, плюс в раутерах поддерживается?
смысл… а в чем смысл париться с корпоративной почтой? завел на mail.ru 200 ящиков и голова не болит. правда ваша… в роутерах поддержки нет, не во всех правда…
а я использую отсюда иснтрумент и вроде пока как все устраивает http://dns-ip.ru/Home/DynDns
на самом деле таких инструментов много, идея в том, чтобы использовать свой сервис для своей доменной зоны.
плюс показывает один из вариантов работы подобных сервисов
Тема заглохла, но у меня есть к этому интерес, а можно исходник скрипта глянуть?
так вроде тут все подробно описанно… со всеми текстами.