Temos servidores DNS em um ambiente protegido sem acesso à internet e esses servidores resolvem apenas domínios internos que criamos. O arquivo root.servers nesses servidores DNS internos está vazio:
zone "."
{
type hint;
file "root.servers"; // root.server is empty file
};
Dessa forma, o DNS interno resolve apenas nomes internos.
Então temos servidores DNS na DMZ que encaminham domínios internos para a DMZ assim:
zone "internal" in
type forward;
forwarders { 10.10.10.1; 10.10.10.2; }; // internal DNSes
};
Esses DNSs na DMZ também encaminham endereços de internet de DNSs que resolvem domínios de internet assim:
zone "." in {
type forward;
forwarders { 172.20.10.1; 172.20.20.2; }; // DNSes resolving internet domains
};
Dessa forma, o DNS na DMZ resolve domínios internos e de internet. Ele funciona assim há muitos anos.
Agora, precisamos obter certificados assinados de uma CA bem conhecida para alguns servidores na DMZ. Para isso, criamos um subdomínio de internet. Vamos chamá-lo de dmz.example.com.
Criamos uma zona dmz.example.com em servidores de nomes DMZ e a DMZ resolve esses domínios. Queremos resolver esses domínios na rede interna também. Para esse propósito, abrimos o acesso DNS de interno para DMZ e adicionamos uma zona em DNSes internos como esta:
zone "dmz.example.com" in
{
type forward;
forwarders { 10.100.1.1; 10.100.1.2; }; // DMZ DNSes
};
Agora, DNSes internos não resolvem dmz.example.com e não acessam DNSes DMZ para obter informações sobre esse domínio. Não consigo entender por que o DNS interno não usa essa configuração de zona? Isso tem algo a ver com o arquivo root.servers vazio e a zona "."?
Na outra direção, onde os DNSs DMZ encaminham domínios internos, funciona.
Encontrei uma solução, mas não tenho certeza se estou satisfeito com ela e não a entendo muito bem.
Como escrevi na pergunta, DNSs internos têm arquivo root.servers vazio. Isso significa que todas as consultas para domínios de internet são imediatamente retornadas sem resposta.
A solução que encontrei é que os DNSs internos não usam mais o arquivo root.servers, assim:
Em vez disso, configurei a zona "." para ser uma zona de encaminhamento:
Com o tratamento de zona "." alterado, a zona dmz.example.com também começou a funcionar no DNS interno.
Não estou 100% satisfeito com essa solução, porque o DNS interno agora tenta ir para um IP inexistente para obter informações sobre domínios da internet. Anteriormente, a consulta era limitada a um arquivo local vazio root.servers. Agora, o DNS tenta fazer uma conexão com um IP inexistente, antes de retornar uma resposta vazia. Se eu escolher esse IP incorretamente, o firewall ficará ocupado com solicitações. Se o IP ficar ocupado um dia, o novo equipamento na rede começaria a receber consultas DNS. Talvez eu pudesse criar uma interface fictícia para enviar solicitações. Dessa forma, ele não sairia do computador para a rede.
Alguém tem alguma ideia de como fazer isso funcionar sem encaminhar a zona "."?
Encontrei uma solução melhor adicionando uma linha de configuração
forward only;
a uma zona externa encaminhada: