Skip to main content

DNS - Domain Name System



NSD - Name Server Daemon


O NSD é um software que também implementa o Protocolo de Resolução de Nomes (DNS). Assim como o BIND, ele também é uma solução de código aberto e é amplamente utilizado em diversas partes do mundo. O NSD foi desenvolvido originalmente pela NLnet Labs e é projetado para ser um servidor de nomes altamente eficiente e seguro.


Enquanto o BIND pode funcionar como um servidor DNS recursivo, respondendo a consultas de clientes e mantendo um cache de consultas previamente resolvidas, o NSD é especificamente projetado para atuar como um servidor de nomes autoritativo. Isso significa que o NSD não lida com consultas recursivas ou de encaminhamento. Em vez disso, o NSD responde apenas com base nas informações contidas em suas zonas configuradas.


O NSD consiste em dois programas: o compilador de zona, que chama zonec e o próprio servidor de nomes, que chama nsd. O servidor de nomes opera com um banco de dados intermediário preparado pelo compilador de zona a partir de arquivos de zona padrão.


Para a operação do NSD, isso significa que as zonas precisam ser compiladas pelo zonec antes que o NSD possa usá-las. Todo esse processo pode ser controlado via rc.d (SIGTERM, SIGHUP) ou nsd-control, e usa um arquivo de configuração simples chamado nsd.conf.



Formato e estilo de configuração


O NSD possui um formato de configuração mais simplificado e direto, diferente do BIND. A notação usada pelo NSD é a seguinte:

attribute: 
attribute1: value1
attribute2: value2
attribute3: value3


Atributo Server


O atributo server: é usado para definir opções de configurações globais para o servidor NSD. Pode haver apenas uma única cláusula server:. Exemplo:

zone:
name: "example.com"
zonefile: "db.example.com"
provide-xfr: 192.0.2.1 NOKEY
request-xfr: 192.0.2.1 NOKEY


Atributo Zone


Para cada zona que o servidor NSD vai atender, teremos que criar uma cláusula zone:. Os elementos da lista de controle de acesso podem ser fornecidos várias vezes para adicionar vários servidores. Esses elementos precisam ser adicionados explicitamente.

zone:
name: "example.com"
zonefile: "db.example.com"


ACL


No NSD o controle de acesso pode ser configurado usando as opções allow-notify, allow-axfr-fallback, request-xfr, notify, provide-xfr, e allow-notify dentro da cláusula zone.

zone:
name: "example.com"
zonefile: "db.example.com"
provide-xfr: 192.0.2.1 NOKEY
request-xfr: 192.0.2.1 NOKEY


Logging


No NSD as configurações de registro de logs são definidas na seção server: no arquivo de configuração.

server:
verbosity: 2

A opção verbosity define o nível de verbosidade para o registro de eventos do NSD (excluindo registros de debug). O padrão é 0.

  • Nível 0 (padrão): Exibe avisos, erros e outros eventos importantes para a execução do NSD.
  • Nível 1: Exibe mensagens informativas, como notificações bem-sucedidas, transferências de zona bem-sucedidas (quando a zona é atualizada), transferências de zona falhas ou impossibilidade de processar atualizações de zona.
  • Nível 2: Exibe erros de software, como resets de conexão TCP, recusas de notificação e recusas de solicitação de transferência de zona completa (AXFR).
  • Nível 3: Imprime mais informações sobre o funcionamento do NSD.


Key


A cláusula key: estabelece uma chave para uso em listas de controle de acesso (usado com chave TSIG).

key:
name: "rndc-key"
algorithm: hmac-md5
secret: "5U9Yzt9eMqB6oW8QIbTzjw=="


Pattern


A cláusula pattern: é utilizada para definir conjuntos de opções que podem ser aplicadas a várias zonas de maneira consistente. Isso proporciona uma maneira conveniente de reutilizar configurações comuns entre diferentes zonas, evitando a necessidade de repetir as mesmas configurações para cada zona individualmente.


Por exemplo, se várias zonas compartilham algumas configurações semelhantes, como permissões de transferência de zona, notificações de atualização de zona, ou outras opções específicas, você pode definir essas configurações uma vez em uma cláusula pattern: e depois referenciá-las em cada zona aplicável usando include-pattern:. Isso simplifica a manutenção e evita a duplicação de configurações em várias partes do arquivo de configuração do NSD.

# Criando dois Pattern:
pattern:
name: "pattern1"
allow-notify: 192.0.2.1 NOKEY
request-xfr: AXFR 192.0.2.1 NOKEY

pattern:
name: "pattern2"
allow-notify: 192.0.2.2 NOKEY
request-xfr: AXFR 192.0.2.2 NOKEY

# Aplicando eles nas zonas:
zone:
name: "example.com"
zonefile: "example.com.zone"
include-pattern: "pattern1"

zone:
name: "example.net"
zonefile: "example.net.zone"
include-pattern: "pattern2"


Remote Control


O Remote Control é uma funcionalidade que permite controlar o servidor NSD de forma remota, geralmente por meio de comandos enviados via linha de comando ou via interface de controle remoto. O Remote Control (nsd-control) do NSD é semelhante ao Remote Name Daemon Control (rndc) do BIND. Ambos são utilitários que permitem controlar e gerenciar servidores de nomes de forma remota.


O NSD fornece um utilitário chamado nsd-control para interagir com o servidor NSD remotamente. Com o nsd-control, você pode executar várias operações no servidor NSD, como iniciar ou parar o servidor, recarregar a configuração, obter informações sobre o status do servidor entre outras opções.


Para utilizar o nsd-control, é necessário configurar o servidor NSD para permitir o controle remoto e definir uma senha de controle remoto no arquivo de configuração do NSD (nsd.conf). Isso é feito através da configuração da seção remote-control: no arquivo de configuração. Por exemplo, para permitir o controle remoto e definir uma senha, você pode adicionar o seguinte ao seu arquivo de configuração do NSD:

remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8952
server-key-file: "/path/to/server.key"
server-cert-file: "/path/to/server.pem"
control-key-file: "/path/to/control.key"
control-cert-file: "/path/to/control.pem"

No exemplo acima:

  • control-enable: yes habilita o controle remoto.
  • control-interface e control-port especificam o endereço IP e a porta na qual o NSD deve ouvir comandos de controle remoto.
  • server-key-file, server-cert-file, control-key-file e control-cert-file especificam os caminhos para os arquivos de chave e certificado SSL usados para comunicação segura entre o cliente e o servidor.

Os arquivos TLS são criados pelo utilitário nsd-control-setup.



TLS Auth Declarations


A cláusula tls-auth: é usada para configurar atributos de autenticação a serem usados durante uma transferência de zona usando TLS.



Instalação do NSD


Nesse método fazemos com que o servidor DNS rode preso dentro de um diretório do Sistema Operacional. Para isso vamos usar o comando chroot para simular o Root em outro ponto ou sistema. Os termos chroot jail é nomeado a partir da chamada do sistema chroot, que recebe um argumento de diretório base e não permite que o aplicativo leia ou grave fora desse diretório base.


Vamos começar preparando o ambiente para rodar com o chroot jail, nessa etapa vamos criar o usuário no qual o NSD vai rodar sob e o diretório de onde os arquivos vão ficar armazenados. Toda a configuração abaixo será feita com o usuário root.

# Crie o grupo para o usuário do NSD:
groupadd -g 53 nsd

# Crie o usuário de sistema que vamos usar para executar o NSD:
adduser --system --uid 53 --gid 53 --disabled-login --disabled-password --home /usr/local/nsd nsd
Adding system user `nsd' (UID 53) ...
Adding new user `nsd' (UID 53) with group `nsd' ...
Creating home directory `/usr/local/nsd' ...

# Bloqueie a conta para que não seja possível efetuar login:
usermod -L nsd

# Verifique se foi criado:
getent passwd nsd
nsd:x:53:53::/usr/local/nsd:/usr/sbin/nologin

# Verifique se o grupo foi criado (provavelmente foi):
getent group nsd
nsd:x:53:

Agora vamos desativar o resolvectl que fica ouvindo na porta 53, caso você não tenha ele instalado como um resolver no seu Ubuntu, pode pular essa etapa.

# Desative o resolvectl:
systemctl stop systemd-resolved
systemctl disable systemd-resolved

# Remova o link abaixo:
unlink /etc/resolv.conf

# Já que desativamos o resolvectl, temos que configurar um outro servidor DNS como recursivo até finalizar a instalação do NSD:
echo -e "nameserver 9.9.9.11\nnameserver 2620:fe::fe:11" > /etc/resolv.conf

Agora vamos instalar as aplicações necessárias para compilar o NSD e instalar ele.

# Instale os pacotes necessários para compilação do NSD:
apt install -y build-essential libevent-dev libssl-dev bison flex

# Entre no diretório abaixo:
cd /usr/src

# Baixe o código fonte:
wget https://nlnetlabs.nl/downloads/nsd/nsd-4.8.0.tar.gz

# Extraia o arquivo baixado e entre no diretório do NSD:
tar xvf nsd-4.8.0.tar.gz && cd nsd-4.8.0

# Configure o ambiente para a compilação:
./configure --prefix=/usr/local/nsd --enable-ratelimit --enable-packed --disable-radix-tree

# Compile o código:
make

# Instalar o código já compilado:
make install

# Crie os certificados para controlar o NSD usando 'nsd-control' de forma segura:
nsd-control-setup
setup in directory /usr/local/nsd/etc/nsd
removing artifacts
Setup success. Certificates created. Enable in nsd.conf file to use

# Agora configure as permissões abaixo:
chown -R nsd: /usr/local/nsd
chmod 0640 /usr/local/nsd/etc/nsd/*.{pem,key}

# Adicionando '/usr/local/named/sbin' a variável 'PATH':
echo 'PATH="$PATH:/usr/local/nsd/sbin:"' >> ~/.bashrc

# Agora recarregue as opções em '~/.bashrc':
source ~/.bashrc

# Veja a versão do NSD:
nsd -v
NSD version 4.8.0
Written by NLnet Labs.

Configure line: --prefix=/usr/local/nsd
Event loop: libevent 2.1.12-stable (uses epoll)
Linked with OpenSSL 3.0.2 15 Mar 2022

Copyright (C) 2001-2020 NLnet Labs. This is free software.
There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE

Vamos criar o arquivo de configuração.

vim /usr/local/nsd/etc/nsd/nsd.conf
server:
# use this number of cpu cores
server-count: 2
# We recommend leaving this empty, otherwise use "/var/db/nsd/nsd.db"
database: ""
# the default file used for the nsd-control addzone and delzone commands
# zonelistfile: "/var/db/nsd/zone.list"
# The unprivileged user that will run NSD, can also be set to "" if
# user privilige protection is not needed
username: nsd
# Default file where all the log messages go
logfile: "/usr/local/nsd/var/log/nsd.log"
# Use this pid file instead of the platform specific default
pidfile: "/usr/local/nsd/etc/nsd/nsd.pid"
# Enable if privilege "jail" is needed for unprivileged user. Note
# that other file paths may break when using chroot
chroot: "/usr/local/nsd/"
# The default zone transfer file
# xfrdfile: "/var/db/nsd/xfrd.state"
# The default working directory before accessing zone files
#zonesdir: "/usr/local/nsd/etc/nsd"
xfrdir: "/usr/local/nsd/tmp"
zonefiles-write: 10800

remote-control:
# this allows the use of 'nsd-control' to control NSD. The default is "no"
control-enable: yes
# the interface NSD listens to for nsd-control. The default is 127.0.0.1
control-interface: 127.0.0.1
# the key files that allow the use of 'nsd-control'. The default path is "/etc/nsd/". Create these using the 'nsd-control-setup' utility
server-key-file: /usr/local/nsd/etc/nsd/nsd_server.key
server-cert-file: /usr/local/nsd/etc/nsd/nsd_server.pem
control-key-file: /usr/local/nsd/etc/nsd/nsd_control.key
control-cert-file: /usr/local/nsd/etc/nsd/nsd_control.pem

#zone:
# name: example.com
# zonefile: /etc/nsd/example.com.zone

Agora crie o serviço para executar o NSD:

vim /etc/systemd/system/nsd.service
[Unit]
Description=NSD Domain Name Server
After=syslog.target network-online.target

[Service]
Type=forking
ExecStart=/usr/local/nsd/sbin/nsd-control start
ExecReload=/usr/local/nsd/sbin/nsd-control reconfig
ExecStop=/usr/local/nsd/sbin/nsd-control stop

[Install]
WantedBy=multi-user.target

Após isso é preciso informar o SystemD que houveram alterações e ele deve recarregar sua configuração.

# Recarregue as units:
systemctl daemon-reload

# Inicie o serviço:
systemctl start nsd.service

# Ative o serviço no boot do sistema:
systemctl enable nsd.service


Falar de:
---------------------------------------------------------------------------------------------------------------
We verify the configuration and if there are no errors we restart the server:

$ nsd-checkconf /etc/nsd/nsd.conf
---------------------------------------------------------------------------------------------------------------
nsd-control reconfig
nsd-control reload grp6.lactld.te-labs.training
---------------------------------------------------------------------------------------------------------------
ip-address
---------------------------------------------------------------------------------------------------------------
identity
---------------------------------------------------------------------------------------------------------------
database
---------------------------------------------------------------------------------------------------------------
nsid:
---------------------------------------------------------------------------------------------------------------
chroot: "/usr/local/nsd/"
---------------------------------------------------------------------------------------------------------------
logfile: "/usr/local/nsd/var/log/nsd.log"
---------------------------------------------------------------------------------------------------------------
pidfile: "/usr/local/nsd/etc/nsd/nsd.pid"
---------------------------------------------------------------------------------------------------------------
difffile: "/usr/local/nsd/etc/nsd/ixfr.db"
---------------------------------------------------------------------------------------------------------------
xfrdfile: "/usr/local/nsd/etc/nsd/xfrd.state"
---------------------------------------------------------------------------------------------------------------
zonesdir: "/usr/local/nsd/etc/nsd/"
---------------------------------------------------------------------------------------------------------------
xfrdir: "/usr/local/nsd/tmp"
---------------------------------------------------------------------------------------------------------------
zonelistfile: "/usr/local/nsd/etc/nsd/zones.list"
---------------------------------------------------------------------------------------------------------------
minimal-responses: yes
---------------------------------------------------------------------------------------------------------------
zonefiles-write: 10800
---------------------------------------------------------------------------------------------------------------


Fontes:


https://nsd.docs.nlnetlabs.nl/en/latest/configuration.html?highlight=key%3A

https://nsd.docs.nlnetlabs.nl/en/latest/installation.html

https://nsd.docs.nlnetlabs.nl/en/latest/configuration.html

https://nsd.docs.nlnetlabs.nl/en/latest/catalog-zones.html?highlight=nsd-control%20addzone

https://nsd.docs.nlnetlabs.nl/en/latest/manpages/nsd-control.html