Bind9 desabilitar consulta IPv6

Hoje tive um probleminha em minha rede pessoal doméstica: resolvi habilitar um serviço de DNS no meu computador pessoal. O motivo foi simples: não costumo confiar nos serviços de DNS das operadoras, pois já vi, no passado, muitos DNSs com falhas incríveis de configuração e susceptíveis a ataques de cache poisoning (envenenamento de cache).

No Debian 8.x, instalei o Bind9 que, por padrão, já vem pré-configurado em modo cache, que era bem o que eu precisava. O problema é que ele vem configurado para efetuar consultas AAAA (IPv6), e minha rede doméstica conta apenas com IPv4, assim como meu provedor ainda fornece link em IPv4.

Agora, vamos à saga:

Primeiro, eu não quis desabilitar o IPv6 na minha interface de rede, pelo simples fato de que pretendo efetuar alguns testes futuramente.

Então, comecei por desabilitar o IPv6 no Bind: então editei o arquivo /etc/bind/named.conf.options e alterei o parâmetro:

listen-on-v6 { any; };

Para:

listen-on-v6 { none; };

Aproveitando, adicionei os seguintes parâmetros neste mesmo arquivo:

version "Not available";
filter-aaaa-on-v4 yes;

O primeiro parâmetro, na verdade, não tem nenhuma relação com IPv6, mas é apenas um parâmetro de segurança que impede que a versão do Bind seja consultada pelos seus clientes.

Por padrão, no Debian, parâmetros de inicialização do Bind podem ser adicionados no arquivo /etc/default/bind9. Assim, eu editei este arquivo e adicionei a opção -4 ao parâmetro OPTIONS, que ficou assim:

OPTIONS="-4 -u bind"

Reiniciei o serviço, mas para minha surpresa, não funcionou. continuei a ver as seguintes mensagens de log em /var/log/messages:

2016-08-28T12:40:09.332992-03:00 joshua named[10172]: error (network
   unreachable) resolving 'ns-1878.awsdns-42.co.uk/A/IN':
   2a01:618:400::1#53

O que significa que o Bind ainda está fazendo consultas em IPv6. O efeito colateral disso é que a resolução de nomes fica extremamente lenta e, muitas vezes, ocorrem timeouts.

Depois de algumas pesquisas, acabei encontrando uma solução. Não a considero das melhores, porque acredito que o fato do arquivo /etc/default/bind9 existir ainda na distribuição me faz acreditar que ele deveria ser honrado pelo iniciador do serviço bind. No entanto, o Debian 8.x utiliza o systemd como gerenciador de serviços e, por algum motivo, ele não utiliza os arquivos em /etc/default. Ainda não sei se este comportamento é normal ou é um bug, de qualquer forma, me fez perder bastante tempo na busca por uma solução.

Consegui resolver o problema da seguinte forma:

Primeiro, copiei o arquivo de configuração do serviço bind para o diretório de configuração do systemd:

cp /lib/systemd/system/bind9.service /etc/systemd/system/

Depois, editei o arquivo /systemd/system/bind9.service e alterei o parâmetro ExecStart adicionando a opção -4, conforme a seguir:

ExecStart=/usr/sbin/named -f -u bind -4

Depois, solicitei ao systemd que recarregasse sua configuração e reinicie o bind:

systemctl daemon-reload
systemctl restart bind9.service

Depois disso, o Bind resolveu desistir de tentar resolver registros AAAA.

Ainda não sei se haverá algum efeito colateral quando ocorrer alguma atualização do Bind nas atualizações do sistema. Mas, na teoria, não devem ocorrer, porque os arquivos em /etc contém justamente as configurações que poder ser personalizadas pelo usuário (administardor, na verdade) e o gerenciador de pacotes APT normalmente não altera estes arquivos com novas versões sem a autorização do usuário.

Por enquanto, é isso.