Como configurar um servidor DNS dinâmico auto-hospedado simples

5

Eu tenho uma pequena rede interna de máquinas físicas executando hipervisores, que por sua vez executam várias máquinas virtuais do KVM Ubuntu. Como eu configuraria um servidor DNS dinâmico interno para que, quando eu executasse um script para criar uma nova máquina virtual, essa VM pudesse se registrar automaticamente no servidor DNS?

Bind parece ser o servidor DNS padrão para Linux, mas parece projetado para um DNS muito mais "estático" modelo. Atualizar dinamicamente isso exigiria um script complicado que precisaria acessar o SSH no servidor DNS, editar os arquivos de configuração e, em seguida, reiniciar o servidor. Isso não parece ser uma solução muito elegante. Existem melhores opções?

Eu vi uma pergunta semelhante , embora eles estão pedindo uma solução para um ambiente público na Amazon. Meus servidores são totalmente privados e não quero depender de um host de VM externo ou de um provedor de DNS dinâmico.

    
por Cerin 27.03.2012 / 17:40

5 respostas

6

Realmente Bind é capaz de fazer atualizações de DNS dinâmicas através de mensagens padrão RFC 2136. Usando a ferramenta nsupdate e a configuração correta (não terrivelmente difícil, mas também não completamente trivial).

Suas opções para autenticar essas mensagens de atualização são 1) permitir que apenas determinados IPs enviem mensagens de atualização 2a) Criptografia simétrica TSIG 2b) Criptografia de chave pública baseada em SIG (0) ou uma combinação de 1 e 2 *. Entre outros lugares, instruções podem ser encontradas aqui

Ao implementar isso pessoalmente, descobri que o maior problema era dar privilégios de escrita suficientes em / var / named. Ele precisa ser capaz de criar arquivos no diretório, além de ter permissões de gravação para os arquivos das zonas dinâmicas.

As chaves Sig (0) são geradas com o utilitário dnssec-keygen com o tipo de nome HOST e keytype KEY. Por exemplo (pode não ser exato) (o RSAMD5 cobre quase todos os pacotes de bind):

dnssec-keygen -a RSAMD5 -b 1024 -n HOST -f Chave host.domain.tld

O arquivo .key resultante será adicionado ao seu arquivo de zona, o .private será especificado na linha de comando com o nsupdate.

    
por 27.03.2012 / 18:59
4

Eu configurei bind com atualizações dinâmicas via nsupdate (como CarbonLifeForm descreveu), e combinei isso com um simples Perl-Script que é chamado via HTTPS REST-Request criptografada, verifica a combinação subdomain / password e então chama nsupdate com o IP de o pedido.

Exemplo de chamada de atualização de qualquer cliente (que definirá automaticamente o subdomínio apropriado para o IP público desse cliente)

Basta visitar qualquer navegador (neste exemplo, https foi disponibilizado pela porta 12345):

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

ou por meio da linha de comando (por exemplo, para atualizações a cada 15 minutos por meio do cronjob):

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

Aqui está o script 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";
}
    
por 26.05.2012 / 15:38
2

Como seus servidores são todos privados, presumo que você não queira publicar os endereços IP na Internet maior. Isso realmente simplifica as coisas.

Eu sei que para minhas pequenas redes eu tive sucesso com dnsmasq , um DNS simples e morto Servidor DHCP. Ele deve permitir que os clientes se adicionem ao servidor DNS quando receberem uma concessão de DHCP.

Outras leituras: link

    
por 27.03.2012 / 19:15
1

Como os endereços IP são atribuídos às suas VMs? Assumindo DHCP, você pode configurá-lo para atualizar dinamicamente o BIND. Aqui está a documentação do Ubuntu na configuração do dhcpd.conf.

link

No lado do BIND, o named.conf irá especificar a zona local a ser atualizada dinamicamente. Você usaria as chaves, conforme descrito pelo user115014.

    
por 27.03.2012 / 19:24
0

Genericamente (e centrado no Windows):

  1. Instale um servidor DNS que suporte DNS dinâmico

  2. Configure a zona DNS apropriada no servidor

  3. Configure o servidor DNS para permitir atualizações de DNS seguras e não seguras para a zona

  4. Configure os clientes DNS com um sufixo DNS que corresponda à zona DNS

  5. Configure os clientes DNS para usar o servidor DNS para resolução de nomes

  6. Configure os clientes DNS para se registrarem no DNS

por 27.03.2012 / 17:48