Pesquisa de site

Como configurar o resolvedor de DNS local com Unbound no Ubuntu 22.04


Nesta página

  1. Pré-requisitos
  2. Instalando servidor DNS não associado
  3. Configurando Unbound como servidor DNS local
    1. Configuração básica
    2. Ativar Cache DNS
    3. Privacidade e segurança ilimitadas
    4. Definir rede privada e listas de controle de acesso (ACLs)
    5. Configurar domínio local
    6. Ajuste e ajustes de desempenho ilimitados
    7. Configurar Unbound como um DNS Resolver com DNS-over-TLS (DoT)

    1. Para Ubuntu Desktop
    2. Para servidor Ubuntu genérico

    O Unbound é um software de servidor DNS gratuito e de código aberto que pode ser usado para validar, recursivamente e armazenar em cache resolvedores de DNS. É um servidor DNS rico em recursos que oferece suporte a DNS sobre TLS (DoT), DNS sobre HTTPS (DoH), minimização de nome de consulta, uso agressivo de cache validado por DNSSEC e suporte para zonas de autoridade. O Unbound está focado na privacidade e segurança do DNS, mas sem sacrificar a velocidade e o desempenho.

    O Unbound é desenvolvido principalmente pela NLnet Labs e distribuído sob a licença BSD, e suporta recursos modernos em padrões abertos do servidor DNS. Unbound foi rigorosamente auditado e pode ser executado em Linux, BSD e macOS. O Unbound está disponível para a maioria desses sistemas operacionais e pode ser instalado por meio do gerenciador de pacotes do sistema.

    Neste tutorial, você irá instalar o Unbound no servidor Ubuntu 22.04 e configurá-lo como um servidor DNS local com alguns recursos ativados, como DNSSEC, cache DNS, nomes de domínio e subdomínios locais e também DNS-over-TLS (DoT ). Você também configurará o log Unbound via Rsyslog e logrotate e configurará uma máquina cliente Ubuntu para verificar sua instalação Unbound.

    Pré-requisitos

    Para concluir este tutorial, você deve ter os seguintes requisitos:

    • Um servidor Ubuntu 22.04 - Este exemplo usa um servidor Ubuntu com o hostname unbound-server e o endereço IP 192.168.5.100.
    • Um usuário não root com privilégios de administrador sudo/root.

    É isso. Agora você está pronto para prosseguir com a instalação do Unound.

    Instalando servidor DNS não vinculado

    Por padrão, o repositório do Ubuntu fornece um pacote Unbound que você pode instalar facilmente via APT. Antes de iniciar a instalação Unbound, emita o seguinte comando apt para atualizar e atualizar seu índice de pacotes do Ubuntu.

    sudo apt update

    Agora verifique os detalhes do pacote não vinculado por meio do seguinte comando.

    sudo apt info unbound

    No momento da redação deste artigo, o repositório padrão do Ubuntu fornece o Unbound 1.13.

    Em seguida, instale o Unbound usando o seguinte comando apt. Quando solicitado, insira y para confirmar e pressione ENTER para prosseguir.

    sudo apt install unbound

    Saída:

    Depois que o Unbound estiver instalado, execute o comando systemctl abaixo para verificar o serviço Unbound.

    sudo systemctl is-enabled unbound
    sudo systemctl status unbound

    A saída habilitada confirma que o Unbound está habilitado e iniciará automaticamente na inicialização do sistema. E a saída ativa (em execução) confirma que o Unbound está em execução.

    Configurando Unbound como servidor DNS local

    A configuração Unbound padrão está localizada em /etc/unbound/unbound.conf. Nesta etapa, você modificará o arquivo de configuração principal do Unbound /etc/unbound/unbound.conf por meio de seu editor preferido.

    Agora você aprenderá sobre a configuração básica de um servidor DNS Unbound, habilitando o cache DNS, configurando nomes de domínio e subdomínios locais, configurando Unbound como resolvedor DNS com DoT (DNS-over-TLS) ativado.

    Configuração básica

    Abra o arquivo de configuração Unbound padrão /etc/unbound/unbound.conf usando seu editor preferido. Este exemplo usa o nano para editar o arquivo de configuração /etc/unbound/unbound.conf.

    sudo nano /etc/unbound/unbound.conf

    Adicione as seguintes linhas ao arquivo. A seção do servidor permite definir configurações básicas do Unbound. Neste exemplo, você executará o Unbound no endereço IP local 192.168.5.100 com a porta padrão 53. Além disso, você configurará o log para mensagens Syslog e desabilitará o IPv6. Por fim, você configurará o Unbound para consultar recursivamente qualquer nome de host dos servidores DNS raiz por meio do arquivo root-hints.

    #Adding DNS-Over-TLS support
    server:
        use-syslog: yes
        username: "unbound"
        directory: "/etc/unbound"
        tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt
        
        do-ip6: no
        interface: 192.168.5.100
        port: 53
        prefetch: yes

        root-hints: /usr/share/dns/root.hints
        harden-dnssec-stripped: yes

    Parâmetros de detalhe:

    • use-syslog: ativa o registro em mensagens Syslog.
    • username: executado como usuário não vinculado, que é o usuário padrão.
    • diretório: o diretório de trabalho padrão para Unbound é o diretório /etc/unbound.
    • tls-cert-bundle: Certificados usados para autenticar conexões feitas upstream. Na distribuição baseada em Debian, o arquivo cert está localizado em /etc/ssl/certs/ca-certificates.crt.
    • do-ip6: use yes para executar o Unbound com IPv6 ou defina no para desabilitar o IPv6.
    • interface: interface de rede ou endereço IP que não vinculado estará em execução. Você pode usar um endereço IP ou o nome da interface, como eth0. Além disso, você pode executar em uma porta específica adicionando um formato como este [protegido por e-mail].
    • porta: especifique a porta que o Unbound estará rodando, e esta porta irá lidar com as conexões dos clientes. A porta DNS padrão é 53.
    • pré-busca: defina como sim para ativar a pré-busca de entradas de cache de mensagens quase expiradas.
    • root-hints: um arquivo que contém detalhes do servidor DNS raiz. O arquivo /usr/share/dns/root.hints é fornecido pelo pacote dns-root-data. E também pode baixar o arquivo root-hints aqui https://www.internic.net/domain/named.cache.
    • harden-dnssec-stripped: defina-o como yes para proteger contra o recebimento de dados com dnssec-stripped.

    Ativar Cache DNS

    Em seguida, adicione as seguintes linhas para habilitar a consulta de cache DNS em sua instalação Unbound.

        cache-max-ttl: 14400
        cache-min-ttl: 11000

    Parâmetros de detalhe:

    • cache-max-ttl: TTL ou Time To Live para RRSets e mensagens no cache DNS. O formato é em segundos.
    • cache-min-ttl: tempo de vida mínimo para o cache. O padrão é 0, mas você pode alterá-lo para o seu tipo, como 11.000 segundos. Não defina isso por mais de 1 hora ou você terá problemas devido a dados obsoletos.

    Privacidade e segurança ilimitadas

    Agora você pode adicionar as seguintes linhas para configurar a privacidade e a segurança básicas do Unbound.

        aggressive-nsec: yes
        hide-identity: yes
        hide-version: yes
        use-caps-for-id: yes

    Parâmetros de detalhe:

    • aggressive-nsec: defina como yes para permitir que o NSEC agressivo use a cadeia DNSSEC NSEC para sintetizar NXDOMAIN e outras negações. Verifique a página da web do IETF sobre NSEC https://www.ietf.org/archive/id/draft-ietf-dnsop-nsec-ttl-00.html.
    • hide-identity: defina como yes para desabilitar respostas de consultas de ligação sobre id.server ou hostname.bind.
    • hide-version: defina como yes para desabilitar as consultas version.server e version.bind.
    • use-caps-for-id: defina como yes para permitir o uso de 0x100-codificado na consulta para evitar tentativas de falsificação.

    Definir rede privada e listas de controle de acesso (ACLs)

    Em seguida, você precisa definir o endereço privado de sua rede e as ACLs (listas de controle de acesso). Certifique-se de alterar a sub-rede local nas linhas abaixo com seu ambiente de rede atual.

        private-address: 192.168.0.0/16
        private-address: 192.168.5.0/24
        private-address: 169.254.0.0/16
        private-address: 172.16.0.0/12
        private-address: 10.0.0.0/8
        private-address: fd00::/8
        private-address: fe80::/10

        #control which clients are allowed to make (recursive) queries
        access-control: 127.0.0.1/32 allow_snoop
        access-control: ::1 allow_snoop
        access-control: 127.0.0.0/8 allow
        access-control: 192.168.5.0/24 allow

    Parâmetros de detalhe:

    • private-address: defina sub-redes de rede privada em sua infraestrutura. Somente nomes de domínio privado e dados locais podem ter esses endereços privados.
    • controle de acesso: define o controle de acesso no qual os clientes podem fazer consultas (recursivas) ao servidor Unbound. O parâmetro allow habilitará o recursivo, enquanto o allow_snoop habilitará tanto o recursivo quanto o não recursivo.

    Configurar domínio local

    Depois de configurar o endereço privado e as listas de controle de acesso, você definirá a zona local de seus nomes de domínio. Isso é muito útil, especialmente se você tiver vários aplicativos auto-hospedados em sua rede local. Você pode definir facilmente seu nome de domínio ou subdomínios e apontar para o endereço IP de destino específico.

    Este exemplo criará a zona para o domínio home.lan com o tipo estático e, em seguida, você criará vários subdomínios por meio do parâmetro local-data. Cada subdomínio será apontado para um endereço IP específico e você também criará registros PTR por meio do parâmetro local-data-ptr.

        # local zone
        local-zone: "home.lan." static

        local-data: "firewall.home.lan.  IN A 10.0.0.1"
        local-data: "vault.home.lan.    IN A 10.0.0.2"
        local-data: "media.home.lan.   IN A 10.0.0.3"
        local-data: "docs.home.lan.       IN A 10.0.0.4"
        local-data: "wiki.home.lan.     IN A 10.0.0.5"

        local-data-ptr: "10.0.0.1  firewall.home.lan"
        local-data-ptr: "10.0.0.2  vault.home.lan"
        local-data-ptr: "10.0.0.3  media.home.lan"
        local-data-ptr: "10.0.0.4  docs.home.lan"
        local-data-ptr: "10.0.0.5  wiki.home.lan"

    Parâmetros de detalhe:

    • local-zone: defina o domínio local aqui.
    • local-data: define um registro para subdomínios e qual endereço IP local será resolvido.
    • local-data-ptr: defina o registro ptr para seus subdomínios.

    Ajuste e ajustes de desempenho não vinculados

    Adicione as seguintes linhas para obter mais desempenho. Você pode ajustar os parâmetros abaixo com seu ambiente atual.

        num-threads: 4
        msg-cache-slabs: 8
        rrset-cache-slabs: 8
        infra-cache-slabs: 8
        key-cache-slabs: 8
        rrset-cache-size: 256m
        msg-cache-size: 128m
        so-rcvbuf: 8m

    Parâmetros de detalhe:

    • num-threads: o número de threads que serão criados. O valor deve corresponder aos núcleos da CPU do servidor.
    • msg-cache-slabs: o número de slabs a serem usados para o cache de mensagens. Defina-o como 8 para otimizar o Unbound para usar mais memória para armazenamento em cache.
    • rrset-cache-slabs: o número de slabs a serem usados para o cache RRset. Defina-o como 8 para otimizar Unbound para usar mais memória para o cache RRSet.
    • infra-cache-slabs: o número de slabs a serem usados para o cache de infraestrutura. Defina-o como 8 para otimizar Unbound para usar mais memória para o cache de infraestrutura.
    • key-cache-slabs: o número de slabs a serem usados para o cache de chaves. Defina-o como 8 para otimizar o Unbound para usar mais memória para o cache de chaves.
    • rrset-cache-size: especifique a quantidade de memória para o cache RRSet. Este exemplo usa 256 MB, com o padrão de apenas 4 MB.
    • msg-cache-size: especifique a quantidade de memória para o cache de mensagens. Este exemplo usa 128 MB, com o padrão de apenas 4 MB.
    • so-rcvbuf: configura o tamanho do buffer para a porta DNS 53/udp para 8 MB. No sistema Ubuntu, você também deve configurar um valor mais alto para o parâmetro do kernel net.core.rmem_max.

    Configuração Unbound como um DNS Resolver com DNS-over-TLS (DoT)

    Por fim, adicione uma nova seção de zona de encaminhamento para configurar o Unbound como um resolvedor de DNS para suas redes locais. Este exemplo usa servidores DNS Quad9 com DoT (DNS-over-TLS) habilitado.

    forward-zone:
        name: "."
        forward-ssl-upstream: yes
        ## Also add IBM IPv6 Quad9 over TLS
        forward-addr: #dns.quad9.net

    Parâmetros de detalhes:

    • zona de encaminhamento: define a zona de encaminhamento para não vinculado.
    • nome: defina como \.\ para encaminhar todas as consultas de DNS.
    • forward-addr: use um encaminhador específico para encaminhar todas as consultas de DNS. Este exemplo usa Quad9 DNS com DNS-over-TLS (DoT) habilitado.

    Salve e saia do arquivo /etc/unbound/unbound.conf quando terminar. Com o arquivo de configuração Unbound modificado, agora você pode reiniciar o serviço Unbound e aplicar as alterações.

    Execute a verificação de comando abaixo e verifique a configuração Unbound. Se for bem-sucedido, você deve obter uma saída como unbound-checkconf: sem erros em /etc/unbound/unbound.conf.

    sudo unbound-checkconf

    Em seguida, execute o comando abaixo para aumentar o net.core.rmem_max padrão do sistema por meio do arquivo /etc/sysctl.conf. Em seguida, aplique as alterações por meio do comando sysctl.

    echo "net.core.rmem_max= 8388608" >> /etc/sysctl.conf
    sudo sysctl -p

    Depois disso, execute o comando systemctl abaixo para reiniciar o serviço Unbound e aplicar as alterações.

    sudo systemctl restart unbound

    Com isso, o serviço Unbound deverá estar rodando com a nova configuração no endereço IP 192.168.5.100 na porta 53.

    Verifique a lista de portas abertas em seu sistema por meio do comando ss abaixo.

    ss -tulpn

    Você receberá uma saída como esta - A porta DNS udp padrão 53 é usada pelo serviço Unbound.

    Agora que concluiu as configurações do Unbound, você configurará o firewall UFW e abrirá a porta DNS padrão 53.

    Configurando o Firewall UFW

    No Ubuntu, o firewall padrão instalado é o UFW. Está instalado, mas ainda inativo. Nesta etapa, você configurará o firewall UFW e abrirá a porta UDP para Unbound.

    Execute o comando abaixo para abrir o serviço OpenSSH no UFW por meio do comando abaixo. Em seguida, você pode adicionar a porta DNS 53/udp ao firewall UFW.

    sudo ufw allow OpenSSH
    sudo ufw allow 53/udp

    Em seguida, execute o comando abaixo para iniciar e habilitar o serviço de firewall UFW. Quando solicitado, insira y para confirmar e pressione ENTER para continuar.

    sudo ufw enable

    A saída Firewall está ativo e ativado na inicialização do sistema confirma que o firewall UFW está em execução e ativado, o que significa que o firewall UFW será iniciado automaticamente na inicialização do sistema.

    Saída:

    Agora execute o comando ufw abaixo para verificar o status do firewall UFW. Você deve receber uma saída informando que o status do UFW está ativo com o serviço OpenSSH e a porta DNS 53/udp habilitada.

    sudo ufw status

    Saída:

    Configurando o Unbound Log via Rsyslog e Logrotate

    Depois de configurar o firewall UFW, você agora configurará um arquivo de log para Unbound via rsyslog e logrotate. O serviço rsyslog criará um arquivo de log específico para Unbound e o logrotate irá girar o arquivo de log Unbound em um determinado momento.

    Execute o comando abaixo para adicionar uma nova configuração Rsyslog /etc/rsyslog.d/unbound.conf para o serviço Unbound. Com isso, os logs Unbound serão armazenados em /var/log/unbound.log.

    cat <<EOF | sudo tee /etc/rsyslog.d/unbound.conf
    # Log messages generated by unbound application
    if $programname == 'unbound' then /var/log/unbound.log
    # stop processing it further
    & stop
    EOF

    Em seguida, execute o comando abaixo para adicionar a configuração logrotate /etc/logrotate.d/unbound para o serviço Unbound. Isso criará rotação de log para o arquivo de log Unbound /var/log/unbound.log diariamente.

    cat <<EOF | sudo tee /etc/logrotate.d/unbound
    /var/log/unbound.log {
      daily
      rotate 7
      missingok
      create 0640 root adm
      postrotate
        /usr/lib/rsyslog/rsyslog-rotate
      endscript
    }
    EOF

    Agora execute o comando systemctl abaixo para reiniciar os serviços Rsyslog e Logrotate. Isso aplicará as alterações feitas em ambos os serviços.

    sudo systemctl restart rsyslog logrotate

    Por fim, você pode verificar o arquivo de log reiniciando o serviço Unbound usando o comando abaixo.

    Com isso, as mensagens que forem geradas pelo serviço Unbound durante o processo de reinicialização serão armazenadas no arquivo de log /var/log/unbound.log. Execute o comando cat para mostrar o conteúdo do arquivo de log /var/log/unbound.log.

    sudo systemctl restart unbound
    cat /var/log/unbound.log

    Saída:

    Configurando o resolvedor de DNS no cliente

    Quanto ao lado do cliente, você precisa configurar o resolvedor de DNS e usar o Unbound como um resolvedor padrão no sistema do cliente. Para distribuição Ubuntu, você pode usar o NetworkManager, serviço resolvido pelo systemd, ou configurar um arquivo estático para /etc/resolv.conf.

    Nesta etapa, você aprenderá como configurar o resolvedor de DNS no Ubuntu Desktop e no Ubuntu Server.

    Para área de trabalho do Ubuntu

    O serviço NetworkManager lida com a rede padrão para a versão Ubuntu Desktop. Portanto, você pode configurar facilmente o resolvedor de DNS por meio do NetworkManager, o que pode ser feito por meio da GUI de linha de comando ou editando o arquivo de configuração para cada interface de rede.

    Para configurar o resolvedor de DNS por meio da linha de comando, você pode usar o comando nmcli. Execute o comando abaixo para configurar o resolvedor de DNS para a interface de rede específica. Você pode substituir o nome da interface eth0.

    sudo nmcli connection modify eth0 ipv4.dns "192.168.5.100"

    Cada interface gerenciada pelo NetworkManager possui um arquivo de configuração específico que é armazenado no diretório /etc/NetworkManager/system-connections com o formato .nmconnection.

    Você pode modificar a configuração da interface com seu editor de texto preferido e adicionar as seguintes linhas à seção [ipv4].

    [ipv4]
    dns=192.168.5.100
    ignore-auto-dns=true
    never-default=true

    Se preferir usar um aplicativo GUI, abra o aplicativo NetworkManager em sua máquina e edite o nome da interface que deseja modificar. Clique na guia Configurações de IPv4 e insira seu servidor DNS local. Em seguida, clique em Salvar para confirmar.

    Para servidor Ubuntu genérico

    Para máquinas de servidor Ubuntu genéricas, a rede é tratada pelo netplan com o serviço de back-end systemd-networkd. E para a configuração do resolvedor de DNS, o systemd-networkd é usado o systemd-resolved. Portanto, para configurar o resolvedor de DNS em um servidor Ubuntu genérico, você pode fazer isso por meio do serviço resolvido pelo sistema.

    Abra o arquivo de configuração resolvido pelo sistema usando seu editor preferido. Este exemplo usa um editor nano.

    sudo nano /etc/systemd/resolved.conf

    Na seção [Resolver], remova o comentário do parâmetro DNS e insira o endereço IP do seu servidor DNS local.

    [Resolve]
    DNS=192.168.5.100

    Salve e saia do arquivo quando terminar.

    Agora execute o comando abaixo para reiniciar o serviço resolvido pelo systemd e aplicar as alterações. Em seguida, você pode verificar o status do resolvedor de DNS por meio do comando resolvectl conforme abaixo.

    sudo systemctl restart systemd-resolved
    sudo resolvectl status

    Se for bem-sucedido, você deverá ver uma saída como esta - O resolvedor de DNS padrão é alterado para o endereço IP do servidor DNS local não vinculado 192.168.5.100.

    Testando servidor DNS não vinculado

    Para garantir que o Unbound DNS esteja funcionando como um resolvedor de DNS, execute o comando dig abaixo na máquina cliente Ubuntu. O parâmetro @192.168.5.100 garante que você esteja usando um servidor DNS não vinculado executado no endereço IP 192.168.5.100.

    dig @192.168.5.100

    Quando bem-sucedido, você recebe uma resposta do servidor DNS raiz como a saída abaixo. Além disso, você notará o sinalizador de anúncio (dados autênticos) na saída do cabeçalho, o que significa que o DNSSEC está ativado.

    Em seguida, execute o comando abaixo para garantir que os clientes possam acessar nomes de domínio na Internet.

    dig github.com
    dig duckduckgo.com

    Quando bem-sucedido, você deve receber um registro DNS de detalhes de saída para o domínio github.com e duckduckgo.com. Você pode ver que o resolvedor de DNS que responde à consulta é 127.0.0.53#53, o resolvido pelo sistema que usa Unbound como o resolvedor padrão. Além disso, você pode ver o tempo de consulta para cada consulta, o tempo de consulta para o domínio github.com é 1748 e para duckduckgo.com é 999.

    Saída para github.com:

    Saída para duckduckgo.com:

    Se você executar novamente o comando dig no topo, o tempo de consulta deve ser reduzido. E isso confirma que suas consultas foram armazenadas em cache e o cache DNS está funcionando.

    dig github.com
    dig duckduckgo.com

    Acesse o Github após armazenar o cache:

    Acesse o duckduckgo após o cache armazenado:

    Em seguida, verifique o domínio ou subdomínio local por meio do comando dig abaixo. Se for bem-sucedido, cada subdomínio será apontado para o endereço IP correto configurado no arquivo de configuração Unbound /etc/unbound/unbound.conf.

    dig firewall.home.lan +short
    dig vault.home.lan +short
    dig media.home.lan +short

    Saída:

    Agora execute o comando dig abaixo para garantir que os registros PTR sejam apontados para o nome de domínio correto.

    dig -x 10.0.0.1 +short
    dig -x 10.0.0.2 +short
    dig -x 10.0.0.3 +short

    Saída:

    Você também pode verificar DoT (DNS sobre TLS) via tcpdump. Instale o pacote tcpdump em seu servidor Unbound.

    sudo apt install tcpdump

    Digite y quando solicitado e pressione ENTER para continuar.

    Agora execute o comando tcpdump abaixo para monitorar o tráfego na interface eth0 com porta DoT 853. Neste exemplo, o Unbound DNS está sendo executado no endereço IP 192.168.5.100 com a interface eth0.

    tcpdump -vv -x -X -s 1500 -i eth0 'port 853'

    Vá para a máquina cliente e execute o comando abaixo para acessar nomes de domínio externo/internet por meio do comando dig abaixo.

    dig google.com

    Saída:

    Depois disso, volte para o servidor Unbound e agora você deve obter uma saída semelhante a esta na saída do tcpdump.

    Com isso, você instalou e configurou o servidor DNS local via Unbound no servidor Ubuntu. Além disso, você configurou um resolvedor de DNS em desktops e servidores Ubuntu via NetworkManager e resolvido pelo systemd.

    Conclusão

    Neste guia, você instalou o Unbound Local DNS Server em um servidor Ubuntu 22.04. Você habilitou o cache DNS, DNSSEC (habilitado por padrão), configurou endereços privados e ACLs, adicionou domínio local via zona local e configurou Unbound como resolvedor de DNS com DoT (DNS-over-TLS).

    Além disso, você configurou a privacidade e a segurança básicas do DNS, otimizou o Unbound e configurou logs do Unbound via rsyslog e logrotate.

    No final deste guia, você também aprendeu como configurar um resolvedor de DNS em desktops e servidores Ubuntu via NetworkManager e resolvido pelo systemd. E também aprendeu o uso básico do comando dig para verificar o servidor DNS.