• 46848
  • 64
  • 22
Нравится блог?
Подписывайтесь!

Настройка автономного сервера DynDNS на FreeBSD с BIND и Apache 0 Сети/интернет

В статье рассматривается настройка локального домена 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 добавим следующую секцию:

{"source": " Alias /ipaddress \"/usr/local/www/ipaddress/\"\n \n Options Indexes\n AllowOverride All\n DirectoryIndex index.php\n Order allow,deny\n Allow from All\n AuthName \"Who are you?\"\n AuthType Basic\n AuthUserFile /usr/local/www/ipaddress/.htpasswd\n Require valid-user\n ", "language": "cpp", "insert": "Вставить", "cancel": "Отменить"}

 

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):

{"source": "", "language": "php", "insert": "Вставить", "cancel": "Отменить"}

 

<?php
$ip=$_SERVER['REMOTE_ADDR'];
echo $ip;
?>

 

При обращении к этой странице клиенты узнают свой «белый адрес» с помощью curl. Далее определим тех пользователей, которым необходимо получать свой адрес:

htpasswd -cb /usr/local/www/ipaddress/.htpasswd firstsuser userpassword
{"source": " htpasswd -cb /usr/local/www/ipaddress/.htpasswd firstsuser userpassword", "language": "text", "insert": "Вставить", "cancel": "Отменить"}

Для проверки в браузере введем http://ip-address/ipaddress/ — в результате должны увидеть приглашение ввести имя пользователя и пароль, вводим и любуемся своим внешним адресом. Если нет — проверяем логи Apache.

Теперь — сервер имен. С помощью rndc-confgen генерируем ключ. В /etc/namedb/named.conf добавим следующую запись:

{"source": "key \"rndc-key\" {\n algorithm hmac-md5;\n secret \"только_что_сгенерированный_ключ==\";\n};\n \nzone \"mydomain.local\" {\n type master;\n file \"dynamic/mydomain.local\";\n allow-update { key \"rndc-key\"; };\n};", "language": "cpp", "insert": "Вставить", "cancel": "Отменить"}

 

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:

{"source": "server 192.168.0.1\nkey rndc-key только_что_сгенерированный_ключ==\nzone mydomain.local.\nupdate delete test.mydomain.local. A\nupdate add test.mydomain.local. 600 A 192.168.0.182\nsend", "language": "cpp", "insert": "Вставить", "cancel": "Отменить"}

 

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
{"source": " nsupdate nsupdate.conf", "language": "text", "insert": "Вставить", "cancel": "Отменить"}

И проверим:

nslookup test.mydomain.local 192.168.0.1
{"source": " nslookup test.mydomain.local 192.168.0.1", "language": "text", "insert": "Вставить", "cancel": "Отменить"}

Должен вернуться адрес тестовой машины. Если нет — включаем и смотрим логи сервера имен.

На этом с сервером закончили. Для клиентской части нужен curl (распространяется с поддержкой ssl и без) и bind9. Из пакета bind9 нам понадобится только nsupdate, его библиотеки и vcredist_x86.exe. На стороне клиента выполняется следующий скрипт (он вполне понятен — подробно описывать не буду):

{"source": "var WshShell = new ActiveXObject(\"WScript.Shell\");\nvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n \nvar workdir = \"d:\\\\nsupdate\\\\\";\nvar lastaddrr = \"lastaddrr.txt\";\nvar lastip = \"127.0.0.1\";\n \nif (fso.FileExists(lastaddrr))\n{\n var fileObj = fso.GetFile(workdir + lastaddrr);\n var ts = fileObj.OpenAsTextStream(1, -2);\n \n // если файл создался десять минут назад и более, затираем его\n var x=new Date(fileObj.DateLastModified);\n var y=new Date();\n if (Math.floor((y-x)/(1000*60)) >= 10)\n {\n ts.Close();\n fso.DeleteFile(workdir + lastaddrr, true);\n }\n // иначе читаем из него адрес\n else\n {\n var lastip = ts.ReadLine();\n ts.Close();\n }\n}\n \nvar stdout = WScript.StdOut;\nvar stdin = WScript.StdIn;\n \n// определим программы и их аргументы\nvar curl = workdir + \"curl.exe -u firstuser:userpassword 192.168.0.1/ipaddress/index.php\";\nvar nsupdate = workdir + \"nsupdate.exe\";\n \n// если наш ДНС пингуется, пытаемся получить свой адрес и обновить зону\n// иначе молча выходим\nvar objLocalWMI = GetObject(\"Winmgmts:\");\nvar enumPingStatus = new Enumerator(objLocalWMI.ExecQuery(\"Select StatusCode from Win32_PingStatus Where Address='192.168.0.1'\"));\nif(enumPingStatus.item().StatusCode == 0)\n{\n // определяем внешний IP-address\n var oExec = WshShell.Exec(curl);\n \n // проинициализируем переменные\n var currentip = oExec.stdout.ReadLine();\n \n if (lastip !== currentip)\n {\n var server = \"server 192.168.0.1\";\n var key = \"key rndc-key только_что_сгенерированный_ключ==\";\n var zone = \"zone mydomain.local.\";\n var update_del = \"update delete mydomain.local. A\";\n var update_add = \"update add mydomain.local. 600 A\" + \"\\ \" + currentip;\n var send = \"send\";\n \n // отправим данные серверу\n oExec = WshShell.Exec(nsupdate);\n oExec.StdIn.Write(server + \"\\n\");\n oExec.StdIn.Write(key + \"\\n\");\n oExec.StdIn.Write(zone + \"\\n\");\n oExec.StdIn.Write(update_del + \"\\n\");\n oExec.StdIn.Write(update_add + \"\\n\");\n oExec.StdIn.Write(send + \"\\n\");\n \n // save current ip to file\n ts = fso.CreateTextFile(workdir + lastaddrr, true);\n ts.WriteLine(currentip);\n ts.Close();\n }\n}", "language": "javascript", "insert": "Вставить", "cancel": "Отменить"}

 

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. Надеюсь статья пригодится :)

14 декабря 2010, 1:30
1750

Загрузка...

Комментарии

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Только на 10-й раз он смог поступить в Кембридж! Герой с Кармакшинского района

Только на 10-й раз он смог поступить в Кембридж! Герой с Кармакшинского района

Свыше 10 известных университетов приглашают его обучаться за рубежом, но выбор будет оставаться за Сакеном. Он выберет обучение в The University of Edinburgh и отправится в эту удивительную страну...
socium_kzo
30 нояб. 2016 / 11:06
  • 11662
  • 11
Японец о Казахстане: «Ваши девушки уж сильно себе набивают цену...»

Японец о Казахстане: «Ваши девушки уж сильно себе набивают цену...»

"Мужчины должны у вас тут права качать, ибо их процент в вашей численности населения уступает проценту женщин". Я машинально начала уверять, что у нас в стране таковых не имеется...
Sapientia
вчера / 10:52
  • 6170
  • 65
Мысли вслух. Почему казахи перестали общаться с родственниками и ходить в гости?

Мысли вслух. Почему казахи перестали общаться с родственниками и ходить в гости?

Дастархан в те времена был скромен. Не было понятия «сынау» - осуждения кто как живет, какой в доме ремонт и т.д. Пока взрослые обсуждали задержку заработной платы, мы играли в армию, жмурки, строили городки...
socium_kzo
вчера / 15:19
  • 5680
  • 16
Взгляд со стороны: Назарбаев глазами кыргыза

Взгляд со стороны: Назарбаев глазами кыргыза

В чем уникальность этой личности? В чем его успех или провалы? Эти вопросы требуют глубокой аналитики и исследований. Я же хочу рассказать о Нурсултане Абишевиче глазами рядового кыргыза...
maxes
1 дек. 2016 / 8:05
  • 5595
  • 20
Молчание врачей. Дети ЮКО, заражённые ВИЧ 10-11 лет назад, узнают о диагнозе-приговоре

Молчание врачей. Дети ЮКО, заражённые ВИЧ 10-11 лет назад, узнают о диагнозе-приговоре

Как сообщают новостные издания, в ближайшее время в Южном Казахстане 102 детям в возрасте 11-12 лет сообщат об их страшном диагнозе. Все эти дети были заражены ВИЧ, причём большинство было инфицировано по вине врачей.
openqazaqstan
2 дек. 2016 / 13:57
  • 4284
  • 4
Почему Дональд Трамп назвал Казахстан чудом. Президент подтягивается по географии

Почему Дональд Трамп назвал Казахстан чудом. Президент подтягивается по географии

Трамп и не подозревает, что 16 декабря 1991 Казахстан не создал, а восстановил свою национальную государственность. Иначе бы он упомянул не только 25 лет, а больше чем 550 лет казахской истории.
Stehlikova
2 дек. 2016 / 9:02
  • 4762
  • 88
Аэропорт Схипхол и Алматы. Смотришь на это и ощущение, что мы лет на тридцать отстали

Аэропорт Схипхол и Алматы. Смотришь на это и ощущение, что мы лет на тридцать отстали

Недавно пролетал через аэропорт Амстердама - Схипхол. Так как улетал из аэропорта Алматы, то не мог не начать сравнивать эти аэропорты.
Superkurt
30 нояб. 2016 / 10:09
  • 3734
  • 14
Мой личный опыт использования Astra Plat: мелочи в моем кармане заметно стало меньше

Мой личный опыт использования Astra Plat: мелочи в моем кармане заметно стало меньше

Давно ждал запуска электронного билетирования в общественном транспорте Астаны. В ноябре 2016 года этот день настал. Мой опыт насчитывает последние 2 недели и мне есть чем поделиться.
iamYerlan
1 дек. 2016 / 15:24
  • 3323
  • 15
Понять и простить: почему большинство стран бывшего СССР отказалось от амнистий

Понять и простить: почему большинство стран бывшего СССР отказалось от амнистий

Президент Назарбаев предложил амнистию для совершивших преступления небольшой тяжести несовершеннолетних, пожилых, женщин и других социально уязвимых категорий осуждённых.
openqazaqstan
30 нояб. 2016 / 13:45
  • 3166
  • 21