Configurando um resolver DNS BIND no RHEL 9/Rocky Linux 9/Alma Linux 9

Configurando um resolver DNS BIND no RHEL 9/Rocky Linux 9/Alma Linux 9

Este guia irá orientá-lo na configuração de um resolver DNS local no RHEL 9/Rocky Linux 9/Alma Linux 9, utilizando o popular software BIND9 DNS. Existem vários termos para “resolver DNS”, todos se referindo à mesma coisa:

  • Resolver completo (em contraste com resolver stub)
  • Recursor DNS
  • Servidor DNS recursivo
  • Resolver recursivo

Também é importante notar que um servidor DNS também pode ser chamado de servidor de nomes. Exemplos de resolvers DNS são 8.8.8.8 (servidor DNS público do Google) e 1.1.1.1 (servidor DNS público da Cloudflare). O sistema operacional do seu PC também possui um resolver, embora seja chamado de resolver stub devido à sua capacidade limitada. Um resolver stub é um pequeno cliente DNS no computador do usuário final que recebe solicitações DNS de aplicativos como o Firefox e as encaminha para um resolver recursivo. Quase todos os resolvers podem armazenar em cache a resposta DNS para melhorar o desempenho, por isso também são chamados de servidores DNS de cache.

Mas, se você quer apenas uma lista atualizada de DNS para melhorar a velocidade da sua internet, então aqui temos o post:

Por que executar seu próprio Resolver DNS

Normalmente, seu computador ou roteador usa o resolver DNS do seu provedor de serviços de Internet (ISP) para consultar nomes de domínio para obter um endereço IP. Executar seu próprio resolver DNS local pode acelerar as consultas DNS, porque:

  • O resolver DNS local só escuta suas solicitações DNS e não responde às solicitações DNS de outras pessoas, então você tem uma chance muito maior de obter respostas DNS diretamente do cache no resolver.
  • A latência de rede entre seu computador e o resolver DNS é eliminada (quase zero), então as consultas DNS podem ser enviadas para os servidores DNS raiz mais rapidamente.
  • Se você executar um servidor de e-mail e usar listas negras de DNS (DNSBL) para bloquear spam, então é aconselhável executar um resolver DNS local para acelerar as consultas DNS. Se você executar seu próprio servidor VPN em um Servidor Privado Virtual (VPS), também é uma boa prática instalar um resolver DNS no mesmo VPS.

Você também pode querer executar seu próprio resolver DNS se não gostar que seu histórico de navegação na Internet seja armazenado em um servidor de terceiros.

Se você possui um site e quer que seu próprio servidor DNS lide com a resolução de nomes para o seu nome de domínio, em vez de usar o servidor DNS do registrador do seu domínio, então você precisará configurar um servidor DNS autoritativo, que é diferente de um resolver DNS. O BIND pode atuar como um servidor DNS autoritativo e um resolver DNS ao mesmo tempo, mas é uma boa prática separar os dois papéis em diferentes caixas. Este tutorial mostra como configurar um resolver DNS local e, como ele será usado no host local/rede local, não é necessário criptografia (DNS sobre TLS ou DNS sobre HTTPS). A configuração de um servidor DoT ou DoH será discutida em um artigo futuro.

Por favor, note que você precisa ter privilégios de root ao instalar software no AlmaLinux/RHEL. Você pode adicionar sudo no início de um comando, ou usar o comando su – para mudar para o usuário root.

Instalando o BIND9 no Rocky Linux 9/Alma Linux 9

BIND (Berkeley Internet Name Domain) é um software de servidor DNS de código aberto amplamente utilizado em Unix/Linux devido à sua estabilidade e alta qualidade. Foi originalmente desenvolvido pela UC Berkeley, e mais tarde, em 1994, seu desenvolvimento foi transferido para o Internet Systems Consortium, Inc (ISC).

Execute o seguinte comando para instalar o BIND 9 no Rocky Linux 9/Alma Linux 9 a partir do repositório padrão. BIND 9 é a versão atual e BIND 10 é um projeto morto.

sudo dnf update
sudo dnf install -y bind

Verifique as informações da versão.

named -v

Saída de exemplo:

BIND 9.16.23-RH (Extended Support Version) <id:fde3b1f>

Para verificar o número da versão e as opções de compilação, execute

named -V

Agora podemos iniciar o BIND 9 com:

sudo systemctl start named

E habilitar a inicialização automática na hora do boot:

sudo systemctl enable named

Você pode verificar seu status com:

systemctl status named

Dica: Se o comando acima não sair imediatamente, pressione Q. O servidor BIND será executado como o usuário named, que é criado durante a instalação, e escuta na porta TCP e UDP 53, como pode ser visto ao executar o seguinte comando:

sudo ss -lnptu | grep named

Geralmente, as consultas DNS são enviadas para a porta UDP 53. A porta TCP 53 é para respostas de tamanho maior que 512 bytes.

O daemon BIND é chamado named. (Um daemon é um software que roda em segundo plano.) O binário named é instalado pelo pacote bind e há outro binário importante: rndc, o controlador remoto do daemon de nomes. O binário rndc é usado para recarregar/parar e controlar outros aspectos do daemon BIND. A comunicação é feita pela porta TCP 953.

Por exemplo, podemos verificar o status do servidor de nomes BIND.

sudo rndc status

Configurações para um Resolver DNS Local

O daemon named no Rocky Linux 9/Alma Linux 9 usa o arquivo de dicas de root em /var/named/named.ca. O arquivo de dicas de root é usado pelos resolvers DNS para consultar os servidores DNS raiz. Existem 13 grupos de servidores DNS raiz, de a.root-servers.net a m.root-servers.net.

Por padrão, o servidor BIND9 no RHEL 9/Rocky Linux9/Alma Linux9 fornece serviço recursivo apenas para localhost. Consultas externas serão negadas. Edite o arquivo de configuração principal do BIND /etc/named.conf.

sudo nano /etc/named.conf

Na cláusula options, você pode encontrar as duas linhas seguintes.

listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };

Isso faz com que o named escute apenas no localhost. Se você quiser permitir que clientes na mesma rede consultem nomes de domínio, então comente essas duas linhas. (adicione duas barras no início de cada linha)

// listen-on port 53 { 127.0.0.1; };
// listen-on-v6 port 53 { ::1; };

Encontre a seguinte linha.

allow-query { localhost; };

Adicione a faixa de rede a partir da qual os clientes podem consultar nomes de domínio como abaixo.

allow-query { localhost; 192.168.0.0/24; 10.10.10.0/24; };

A seguinte linha habilita o serviço de recursão, o que é bom.

recursion yes;

Eu também recomendo adicionar as seguintes diretivas na cláusula options.

 // esconde o número da versão dos clientes por razões de segurança.
 version "não disponível no momento";
 // habilita o log de consultas<br> querylog yes;

Salve e feche o arquivo. Em seguida, teste a sintaxe do arquivo de configuração.

sudo named-checkconf

Se o teste for bem-sucedido (indicado por uma saída silenciosa), então reinicie o named.

sudo systemctl restart named

Se você tiver um firewall rodando no servidor BIND, então você precisa abrir a porta 53 para permitir que os clientes da LAN enviem consultas DNS.

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4
source address="192.168.0.0/24" port protocol="udp" port="53" accept'

Recarregue o firewall para que a mudança tenha efeito.

sudo systemctl reload firewalld

Isso abrirá a porta UDP 53 para a rede privada 192.168.0.0/24. Então, de outro computador na mesma LAN, podemos executar o seguinte comando para consultar o registro A de google.com. Substitua 192.168.0.101 pelo endereço IP do seu resolver BIND.

dig A google.com @192.168.0.101

Nota: No AlmaLinux/RHEL, você precisa instalar o pacote bind-utils para usar o comando dig.

sudo dnf install bind-utils

Agora, no resolver BIND, verifique o log de consultas com o seguinte comando.

sudo journalctl -eu named

Isso mostrará a última mensagem de log do serviço named. Eu posso encontrar a seguinte linha no log, que indica que uma consulta DNS para o registro A de google.com foi recebida da porta 57806 do endereço IP 192.168.0.103.

named[1162]: client @0x7f4d2406f0f0 192.168.0.103#57806 (google.com): query: google.com IN A +E(0)K (192.168.0.101)

Configurando o Resolver DNS Padrão no Servidor Rocky Linux 9/Alma Linux 9

No servidor BIND, precisamos definir 127.0.0.1 como o resolver DNS padrão. Você pode verificar o resolver DNS atual no Rocky Linux 9/Alma Linux 9 com o seguinte comando.

cat /etc/resolv.conf

Saída de exemplo:

# Generated by NetworkManager
nameserver 192.168.0.1
nameserver 8.8.8.8

Se você executar o seguinte comando no servidor BIND,

dig A facebook.com

Esta consulta DNS não pode ser encontrada no log do BIND. Em vez disso, você precisa dizer explicitamente ao dig para usar o BIND.

dig A facebook.com @127.0.0.1

Para definir o BIND como o resolver padrão, primeiro você precisa encontrar o nome da sua interface de rede principal com o seguinte comando.

ip addr

A minha é ens3. Em seguida, execute o seguinte comando para editar o arquivo de configuração da interface de rede. Substitua ens3 pelo nome da sua interface. Se o resolver BIND estiver rodando em um laptop conectado via Wi-Fi, então você precisa editar o arquivo ifcfg-nome-da-rede-sem-fio.

sudo nano /etc/sysconfig/network-scripts/ifcfg-ens3

Encontre o parâmetro DNS1 e mude seu valor para 127.0.0.1. Note que se os valores para outros parâmetros neste arquivo estiverem entre aspas duplas, então você também precisa colocar 127.0.0.1 entre aspas duplas.

DNS1="127.0.0.1"

Se você não encontrar o parâmetro DNS1, então adicione a linha acima no final. Salve e feche o arquivo. Em seguida, reinicie o NetworkManager para que a mudança tenha efeito.

sudo systemctl restart NetworkManager

Agora você pode verificar novamente o conteúdo de /etc/resolv.conf. Como você pode ver, 127.0.0.1 (BIND) é agora o resolver DNS padrão no Rocky Linux 9/Alma Linux 9.

change name server on centos 8

Solução de problemas

Alguns provedores de hospedagem podem ter um mecanismo diferente para atualizar o resolver DNS. Se o arquivo /etc/resolv.conf não mostrar 127.0.0.1 como o resolver, pode ser que este arquivo não seja gerenciado pelo NetworkManager. Você pode editar manualmente este arquivo.

sudo nano /etc/resolv.conf

E mude o servidor de nomes para 127.0.0.1.

nameserver 127.0.0.1

Salve e feche o arquivo.

Configurando o resolver DNS padrão nos computadores Cliente

Agora você pode configurar outros computadores na LAN para usar o servidor BIND como resolver DNS. Para computadores Windows e MacOS, você pode pesquisar no Google para descobrir como definir os resolvers DNS padrão. Aqui vou mostrar como definir o resolver DNS em computadores desktop Linux. O seguinte método funciona em qualquer distribuição Linux que use o NetworkManager.

Clique no ícone do Network Manager no seu desktop Linux para encontrar a opção Editar conexões. (Em algumas distribuições Linux, você precisa clicar com o botão direito do mouse no Network Manager.)

network-manager-change-DNS-server

Em seguida, selecione a conexão atual e clique no ícone de engrenagem para editar esta conexão.

dns server bind9

Selecione a aba Configurações IPv4, mude o método de Automático(DHCP) para Apenas endereços Automático(DHCP), o que impedirá que seu sistema obtenha o endereço do servidor DNS do seu roteador. Em seguida, especifique um servidor DNS. Aqui eu insiro o endereço IP do servidor BIND na minha LAN.

bind local dns server lan

Salve suas alterações. Em seguida, reinicie o NetworkManager para que as mudanças tenham efeito.

sudo systemctl restart NetworkManager

Uma vez que você estiver reconectado, clique novamente no ícone do Network Manager e selecione informações de conexão. Você pode ver que seu computador desktop Linux agora está usando seu servidor DNS BIND.

change dns server on linux

Como Desativar o IPv6 no BIND

Se você não usa o IPv6 na sua rede, então é uma boa ideia desativar o IPv6 no BIND, caso contrário haverá muitos erros sobre o IPv6 no log do BIND como abaixo.

network unreachable resolving 'mirrors.fedoraproject.org/A/IN': 2001:4178:2:1269:dead:beef:cafe:fed5#53
network unreachable resolving 'mirrors.fedoraproject.org/AAAA/IN': 2001:4178:2:1269:dead:beef:cafe:fed5#53
network unreachable resolving 'mirrors.fedoraproject.org/A/IN': 2610:28:3090:3001:dead:beef:cafe:fed5#53
network unreachable resolving 'mirrors.fedoraproject.org/AAAA/IN': 2610:28:3090:3001:dead:beef:cafe:fed5#53

Para desativar o IPv6 no BIND no AlmaLinux/RHEL, simplesmente abra o arquivo /etc/sysconfig/named

sudo nano /etc/sysconfig/named

E adicione a seguinte linha no final do arquivo.

OPTIONS="-4"

Salve e feche o arquivo. Em seguida, reinicie o named e você está pronto.

sudo systemctl restart named

Agora execute o seguinte comando. Você pode ver que o BIND não está mais ouvindo no endereço IPv6.

sudo netstat -lnptu | grep named

BIND SERVFAIL

Se o seu resolver BIND não puder responder às consultas DNS (SERVFAIL), e você ver a seguinte linha no log do BIND.

dnssec: warning: managed-keys-zone: Unable to fetch DNSKEY set '.': 
timed out

Provavelmente é porque seu servidor não tem uma conectividade IPv6 funcionando. Isso aconteceu com um dos meus servidores. Eu pensei que a conectividade IPv6 estava funcionando como de costume, mas de repente parou de funcionar por razões que eu não sabia. Uma vez que eu desativei o IPv6 no BIND, a resolução DNS voltou a funcionar.

Eu tive outra situação interessante. Meu servidor BIND teve o problema SERVFAIL. Meu servidor só pode consultar o resolver DNS público do Google (8.8.8.8 e 8.8.4.4). As consultas DNS para todos os outros endereços IP são bloqueadas. Eu certamente não defini tal regra de firewall no meu próprio servidor. Se você estiver na mesma situação, pode significar que seu provedor de hospedagem não quer que você execute um resolver DNS, porque algumas pessoas não bloqueiam as consultas DNS públicas que chegam ao seu resolver DNS e, portanto, se tornam resolvers DNS abertos, que podem ser usados por atores mal-intencionados para lançar um ataque de amplificação DNS.

Neste caso, você pode configurar seu BIND para encaminhar consultas DNS para o resolver DNS público do Google, para que os clientes DNS possam continuar a usar seu resolver BIND.

Adicione uma diretiva de encaminhadores como abaixo na cláusula options no arquivo /etc/named.conf, então seu resolver BIND se torna um encaminhador, que encaminhará as solicitações DNS para um resolver DNS upstream como 8.8.8.8.

options {
//      listen-on port 53 { 127.0.0.1; };
//      listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query { localhost; 192.168.0.0/24; 10.10.10.0/24; };

        ...
        ...

        forwarders {
              8.8.8.8;
              8.8.4.4;
        };

        ...
        ...
};

Salve e feche o arquivo. Em seguida, reinicie o BIND para que as mudanças tenham efeito.

sudo systemctl restart named

Reinício Automático do Named

Se por qualquer motivo seu processo Named for encerrado, você precisa executar o seguinte comando para reiniciá-lo.

sudo systemctl restart named

Em vez de digitar manualmente este comando, podemos fazer com que o Named reinicie automaticamente editando a unidade de serviço systemd named.service. Para substituir a configuração de serviço systemd padrão, criamos um diretório separado.

sudo mkdir -p /etc/systemd/system/named.service.d/

Em seguida, crie um arquivo sob este diretório.

sudo nano /etc/systemd/system/named.service.d/restart.conf

Adicione as seguintes linhas no arquivo, que farão com que o Named reinicie automaticamente 5 segundos após a detecção de uma falha.

[Service]
Restart=always
RestartSec=5s

Salve e feche o arquivo. Em seguida, recarregue o systemd.

sudo systemctl daemon-reload

Para verificar se isso funcionaria, mate o Named com:

sudo pkill named

Em seguida, verifique o status do Named. Você verá que o Named reiniciou automaticamente.

systemctl status named

BIND max-cache-size

O BIND pode armazenar em cache os resultados DNS no servidor para acelerar a consulta DNS para os clientes. O BIND assume que você está executando um resolver DNS dedicado, ou seja, nenhum outro serviço web está rodando no mesmo host, então o tamanho do cache padrão (definido por max-cache-size) é definido para 90% da RAM total para alcançar o melhor desempenho. Você pode ver uma linha como abaixo no log do BIND (sudo journalctl -eu named) quando o BIND inicia.