Назад | Перейти на главную страницу

Как настроить простой автономный динамический DNS-сервер

У меня есть небольшая внутренняя сеть физических машин с гипервизорами, которые, в свою очередь, запускают несколько виртуальных машин KVM Ubuntu. Как мне настроить внутренний динамический DNS-сервер, чтобы при запуске сценария для создания новой виртуальной машины эта виртуальная машина могла автоматически регистрироваться на DNS-сервере?

Привязать кажется стандартным DNS-сервером для Linux, но кажется, что он разработан для гораздо более «статической» модели DNS. Для его динамического обновления потребуется сложный сценарий, который должен подключиться к DNS-серверу по SSH, отредактировать файлы конфигурации, а затем перезапустить сервер. Это не кажется изящным решением. Есть варианты получше?

Я видел аналогичный вопрос, хотя они просят решение для публичной настройки на Amazon. Мои серверы полностью частные, и я не хочу полагаться на внешний хост виртуальных машин или поставщика динамического DNS.

Фактически Bind может выполнять динамические обновления DNS через стандартные сообщения RFC 2136. Использование инструмента nsupdate и правильной конфигурации (не очень сложно, но и не совсем тривиально).

Ваши варианты аутентификации этих сообщений обновления: 1) разрешение только определенным IP-адресам для отправки сообщений обновления 2a) симметричное шифрование TSIG 2b) криптография с открытым ключом на основе SIG (0) или комбинация 1 и 2 *. Среди других мест можно найти инструкции Вот

При реализации этого лично я обнаружил, что самая большая проблема заключалась в предоставлении named достаточных прав на запись в / var / named. Он должен иметь возможность создавать файлы в каталоге, а также иметь права на запись в файлы для динамических зон.

Ключи Sig (0) генерируются с помощью утилиты dnssec-keygen с типом имени HOST и типом ключа KEY. Например (может быть неточным) (RSAMD5 охватывает почти каждый пакет привязки):

dnssec-keygen -a RSAMD5 -b 1024 -n HOST -f Ключ host.domain.tld

Полученный файл .key будет добавлен в ваш файл зоны, а .private будет указан в командной строке с помощью nsupdate.

Я установил привязку с динамическими обновлениями через nsupdate (как описано в CarbonLifeForm) и объединил это с простым Perl-Script, который вызывается через зашифрованный HTTPS-запрос REST, проверяет комбинацию поддомена / пароля и затем вызывает nsupdate с IP-адресом запроса.

Пример Update-Call от любого клиента (который автоматически установит соответствующий поддомен на общедоступный IP-адрес этого клиента)

Просто зайдите в любой браузер (в этом примере https был доступен через порт 12345):

https://ddns.YOURDOMAIN.net:12345/update-my-ip.pl?subdomain=***&password=***

или через командную строку (например, для обновлений каждые 15 минут через cronjob):

www-browser -dump 'https://ddns.YOURDOMAIN.net:12345/update-my-ip.pl?subdomain=***&password=***'

Вот perl-скрипт update-my-ip.pl:

#!/usr/bin/perl
use strict;
use CGI;
use Digest::SHA1 qw(sha1_hex);

my %accounts = (
# create via: sha1sum, then type password, then press Ctrl-D to calculate checksum (echo     with pipe gives wrong result!)
# update via: www-browser -dump 'https://ddns.YOURDOMAIN.net:12345/update-my-ip.pl?    subdomain=***&password=***'
    'YOURSUBDOMAIN1' =>     '93485720985720394853452345235-fake-sha1-checksum1',
    'YOURSUBDOMAIN2' =>     '93485720985720394853452345235-fake-sha1-checksum2', 
    'YOURSUBDOMAIN3' =>     '93485720985720394853452345235-fake-sha1-checksum3',
);
my $cgi = new CGI;

print "Content-type: text/html\n\n";
my $subdomain = $cgi->param('subdomain');
my $password = $cgi->param('password');
if( !$password || !$subdomain || length($password) <= 3 || length($subdomain) <= 1)
{
    print "ERROR\n";
    exit 0;
}
my $sha1 = sha1_hex($password);
my $ip = $ENV{'REMOTE_ADDR'};
my $should_be_sha1 = $accounts{$subdomain};
if( $sha1 && length($sha1) > 10 && $sha1 eq $should_be_sha1)
{
    print "START: ddns.YOURDOMAIN.net DNS updating <a href=\"http://$subdomain.YOURDOMAIN.net\">http://$subdomain.YOURDOMAIN.net</a> (<a href=\"https://$subdomain.YOURDOMAIN.net\">SSL</a>) to IP <a href=\"http://$ip\">$ip</a>.<br/>\n";
    my $out = `echo "update delete $subdomain.YOURDOMAIN.net A\n\n" | nsupdate 2>&1`;
    print "STEP1 $out<br/>\n";
    $out = `echo "update add $subdomain.YOURDOMAIN.net 60 A $ip\n\n" | nsupdate 2>&1`;
    print "STEP2 $out<br/>\n";
    print "DONE<br/>\n";
}
else
{
    print "ERROR\n";
}

Поскольку все ваши серверы являются частными, я предполагаю, что вы не хотите публиковать IP-адреса в большом Интернете. Это действительно упрощает ситуацию.

Я знаю, что для моих небольших сетей я добился успеха dnsmasq, дохлый простой DNS и DHCP сервер. Он должен позволять клиентам добавлять себя к DNS-серверу, когда они получают аренду DHCP.

Дальнейшее чтение: https://superuser.com/questions/312515/dnsmasq-without-altering-etc-hosts-file- вручную

Как IP-адреса назначаются вашим виртуальным машинам? Предполагая, что DHCP, вы можете настроить его для динамического обновления BIND. Вот документация Ubuntu по настройке dhcpd.conf.

http://manpages.ubuntu.com/manpages/lucid/man5/dhcpd.conf.5.html#contenttoc14

На стороне BIND named.conf будет указывать локальную зону для динамического обновления. Вы должны использовать ключи, как указано пользователем 115014.

В общем (и ориентированном на Windows):

  1. Установите DNS-сервер, поддерживающий динамический DNS.

  2. Настройте соответствующую зону DNS на сервере

  3. Настройте DNS-сервер, чтобы разрешить безопасные и небезопасные обновления DNS для зоны.

  4. Настройте DNS-клиенты с DNS-суффиксом, соответствующим зоне DNS.

  5. Настройте DNS-клиенты для использования DNS-сервера для разрешения имен

  6. Настройте DNS-клиенты для регистрации в DNS