Estou configurando um servidor DNS simples (BIND/Named), que está sendo executado localmente em um laptop OSX.
Seu objetivo é resolver todas as solicitações de "*.laptop.example.com" para "192.168.2.2" - que é o endereço IP atribuído manualmente (não DHCP) de uma interface de rede virtual.
Estou usando uma interface de rede virtual (fornecida pela Parallels) para garantir que o endereço IP permaneça sempre o mesmo (eth0 mudará seu endereço IP quando conectado a redes diferentes) e também para garantir que esteja sempre disponível (eth0 está desabilitado/indisponível quando um cabo de rede não está conectado).
Tenho usado a seguinte configuração:
options {
...
forwarders {
192.168.1.1;
};
forward only;
};
No entanto, isso exige que a configuração seja atualizada sempre que o laptop mudar de rede (já que a maioria das redes tem um endereço DNS diferente para usar).
Eu gostaria de eliminar esse requisito para que, se o BIND/Named não reconhecer o nome de domínio (ou seja, não for um subdomínio de "laptop.example.com"), ele retorne um erro para que o laptop possa tentar o segundo Endereço DNS registrado (um que foi obtido do DHCP).
Uma possibilidade é usar:
options {
...
forwarders {
};
forward only;
recursion no;
};
O que impede que ele gaste mais de 3 segundos consultando os servidores ROOT... no entanto, o cliente interpreta essa resposta como "o domínio não existe", em vez de um erro que pode ser corrigido tentando o próximo servidor.
Responder1
Obrigado Alnitak, duffbeer703, John Gardeniers, todos comentários muito bons.
A solução que usei para o meu problema é usar o launchd para detectar as alterações em /etc/resolv.conf e, em seguida, atualizar a lista de encaminhadores.
Criando o arquivo:
/Library/LaunchDaemons/myname.update.plist
Com o conteúdo:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>Label</key>
<string>myname.update</string>
<key>ProgramArguments</key>
<array>
<string>[PATH]/update.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/var/run/resolv.conf</string>
</array>
</dict>
</plist>
E carregando isso com:
launchctl load /Library/LaunchDaemons/myname.update.plist
launchctl start myname.update
Um script em:
[PATH]/update.sh
Pode executar algo como:
DST="/var/named/forwarders.conf";
echo "forwarders {" > $DST
cat /etc/resolv.conf | \
grep -v -E "(127.0.0.1|localhost)" | \
awk '{ sub("^nameserver ", "\t"); sub("$", ";"); print }' >> $DST
echo "};" >> $DST
E então na configuração nomeada, ele pode usá-lo com:
options {
directory "[PATH]/conf/";
listen-on { 127.0.0.1; [IP_ADDRESS_HOST]; };
include "/var/named/forwarders.conf";
forward only;
};
Se você quiser ver ou usar a implementação completa, vá paraminha página de configuração do BINDe use o formulário de download... ele cria um pacote ZIP com um único script de instalação, então espero que seja bastante simples de configurar e usar.
Responder2
Por que não apenas adicionar uma entrada ao arquivo hosts e salvar todo esse incômodo?
Responder3
Você pode querer entrar em mais detalhes sobre o que está tentando fazer - isso não faz muito sentido. Meu conselho é não ajustar os fundamentos do DNS – você está quebrando algo que simplesmente funciona.
Os servidores DNS primário e secundário estão na configuração da sua rede para disponibilidade. Se um servidor DNS não puder fornecer uma resposta, o cliente não irá para o servidor secundário – as pessoas que inventaram o DNS implementaram o conceito de “recursão” para resolver esse problema.
Se você estiver usando Macs, poderá descobrir que usar Bonjour/mDNS é um caminho mais produtivo.
Responder4
Tente usarunbound
em vez de.
Embora seja principalmente um servidor recursivo, acredito que ele tenha a capacidade de fornecer a substituição de curinga necessária, bem como encaminhar todo o resto para oatualservidores DNS upstream, conforme aprendido automaticamente em /etc/resolv.conf
.