Я давно пользуюсь nsupdate
в различных сценариях, связанных с динамическими обновлениями зон DNS без каких-либо проблем. Я всегда использовал TSIG для аутентификации запросов к DNS-серверу, где ключи были сгенерированы ddns-confgen
. Это означает, что я не использовал ключевые пары , подобные тем, которые были сгенерированы dnssec-keygen
; скорее, формат файла ключей выглядит следующим образом:
key "ddns-key.my.domain.example" {
algorithm hmac-sha512;
secret "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefijklmnopqrstuvwxyzabcdefghij==";
};
Соответствующая конфигурация зоны содержит:
update-policy {
grant ddns-key.my.domain.example name host.my.domain.example ANY;
};
Теперь у меня есть более сложная задача, и я пытаюсь решить ее с помощью Perl
сценария. Я изучил документацию Perl::DNS::Update
, Perl::DNS
и Perl::DNS:RR:TSIG
и изучил множество примеров, которые должны прояснить использование этих модулей.
Однако каждый пример, который я видел, когда приходил к подписанию запроса с помощью TSIG
, использовал файлы ключей в формате dnssec-keygen
, а не файлы ключей в формате, который у меня есть. Действительно, что-то вроде
$o_Resolver = new Net::DNS::Resolver(nameservers => ['127.0.0.1']);
$o_Update = new Net::DNS::Update('my.domain.example', 'IN');
$o_Update -> push(update => rr_del('host A'));
$o_Update -> push(update => rr_add('host 1800 IN A 192.0.2.1'));
$o_Update -> sign_tsig('/etc/bind/ddns-key.my.domain.example.key');
$o_Reply = ($o_Resolver -> send($o_Update));
не работает, выдавая следующее сообщение:
TSIG: unable to sign packet at /path/to/script.pl line 240.
unknown type "ddns-key.my.domain.example" at /usr/local/share/perl/5.20.2/Net/DNS/RR.pm line 669.
file /etc/bind/ddns-key.my.domain.example.key line 1
at /usr/local/share/perl/5.20.2/Net/DNS/RR/TSIG.pm line 403.
TSIG: unable to sign packet at /path/to/script.pl line 240.
Полагаю, у меня теперь есть два варианта: либо использовать ключи в формате dnssec-keygen
, который, как представляется, можно непосредственно использовать с Net::DNS
и его друзьями, либо создать ключ TSIG вручную, как показано в документе:
my $key_name = 'tsig-key';
my $key = 'awwLOtRfpGE+rRKF2+DEiw==';
my $tsig = new Net::DNS::RR("$key_name TSIG $key");
$tsig->fudge(60);
my $update = new Net::DNS::Update('example.com');
$update->push( update => rr_add('foo.example.com A 10.1.2.3') );
$update->push( additional => $tsig );
[Конечно, я бы не стал жестко кодировать ключ в моем скрипте Perl
, но вместо этого прочитал бы его из файла ключа.]
Переключение на другой формат файла ключа означало бы изменение конфигурации DNS-сервера, что не является элегантным решением. «Ручное» чтение файлов ключей, а затем «ручное» создание ключей также не очень удовлетворительно, поэтому возникает вопрос:
Правильно ли я понял, что невозможно использовать файлы ключей в формате ddns-confgen
напрямую с Net::DNS
и его подмодулями для TSIG
-подписывания запросов на обновление DNS?