У меня есть небольшая внутренняя сеть физических машин с гипервизорами, которые, в свою очередь, запускают несколько виртуальных машин 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):
Установите DNS-сервер, поддерживающий динамический DNS.
Настройте соответствующую зону DNS на сервере
Настройте DNS-сервер, чтобы разрешить безопасные и небезопасные обновления DNS для зоны.
Настройте DNS-клиенты с DNS-суффиксом, соответствующим зоне DNS.
Настройте DNS-клиенты для использования DNS-сервера для разрешения имен
Настройте DNS-клиенты для регистрации в DNS