O autor selecionou a Electronic Frontier Foundation, Inc para receber uma doação como parte do programa Write for DOnations.
O DNSControl é uma ferramenta de infraestrutura como código que permite a implantação e gerenciamento de suas zonas DNS (Sistema de Nomes de Domínios, do inglês Domain Name System) usando princípios de desenvolvimento de software padrão, incluindo o controle, teste e implantação automática de versão. O DNSControl foi criado pelo Stack Exchange e foi escrito em Go.
O DNSControl elimina muitas das armadilhas do gerenciamento manual de DNS, considerando que os arquivos da zona ficam armazenados em um formato programável. Isso permite que você implante zonas para vários provedores de DNS simultaneamente, identifique erros de sintaxe e envie a configuração DNS automaticamente, reduzindo o risco de erro humano. Outro uso comum do DNSControl é a migração rápida de seu DNS para um provedor diferente; por exemplo, no caso de um ataque DDoS ou uma interrupção do sistema.
Neste tutorial, você instalará e configurará o DNSControl, criará uma configuração básica do DNS e começará a implantar registros DNS em um provedor ativo. Como parte deste tutorial, usaremos a DigitalOcean como o provedor DNS do exemplo. Se quiser usar um provedor diferente, a configuração é bastante parecida. Quando terminar, você conseguirá gerenciar e testar sua configuração de DNS em um ambiente seguro e offline e, depois, poderá implantá-lo para a produção.
Antes de iniciar este guia, você precisará do seguinte:
your-server-ipv4-address
se refere ao endereço IP do servidor onde você estiver hospedando seu site ou domínio. O your-server-ipv6-address
se refere ao endereço IPv6 do servidor onde você estiver hospedando seu site ou domínio.your_domain
durante todo o processo e a DigitalOcean como a provedora de serviço.Assim que estiver com tudo pronto, faça login no seu servidor como usuário não raiz para começar.
O DNSControl foi escrito em Go, de modo que você começará este passo instalando o Go em seu servidor e configurando o seu GOPATH
.
O Go está disponível dentro dos repositórios padrão de software do Debian, possibilitando que ele seja instalado com as ferramentas de gerenciamento de pacotes convencionais.
Também será necessário instalar o Git, pois ele é necessário para permitir que o Go baixe e instale o software DNSControl a partir de seu repositório no GitHub.
Comece atualizando o índice local de pacotes para refletir quaisquer novas alterações feitas no pacote original (upstream):
- sudo apt update
Em seguida, instale os pacotes golang-go
e git
:
- sudo apt install golang-go git
Após confirmar a instalação, a ferramenta apt
irá baixar e instalar o Go e o Git, bem como todas as suas respectivas dependências.
Em seguida, você irá configurar as variáveis de ambiente path necessárias para o Go. Se quiser saber mais sobre isso, leia o tutorial Entendendo o GOPATH. Comece editando o arquivo ~/.profile
:
- nano ~/.profile
Adicione as seguintes linhas ao final do seu arquivo:
...
export GOPATH="$HOME/go"
export PATH="$PATH:$GOPATH/bin"
Assim que tiver adicionado essas linhas ao final do arquivo, salve e feche o arquivo. Em seguida, recarregue seu perfil - seja fazendo log-off e fazendo log-in de volta, ou fornecendo o arquivo novamente:
- source ~/.profile
Agora que você instalou e configurou o Go, instale o DNSControl.
O comando go get
pode ser usado para obter uma cópia do código, compilá-lo automaticamente e instalá-lo dentro do seu diretório Go:
- go get github.com/StackExchange/dnscontrol
Assim que terminar, verifique a versão instalada para garantir que tudo está funcionando:
- dnscontrol version
Sua saída será semelhante à seguinte:
Outputdnscontrol 2.9-dev
Se ver um erro dnscontrol: command not found
, verifique novamente sua configuração de caminho do Go.
Agora que você instalou o DNSControl, você pode criar um diretório de configuração e conectar o DNSControl ao seu provedor de DNS, a fim de permitir que ele faça alterações em seus registros de DNS.
Neste passo, você criará os diretórios de configuração necessários para o DNSControl e o conectará ao seu provedor de DNS para que ele possa começar a fazer alterações dinâmicas (em tempo real) nos seus registros do DNS.
Primeiro, crie um novo diretório no qual você possa armazenar sua configuração do DNSControl e, então, vá para ele:
- mkdir ~/dnscontrol
- cd ~/dnscontrol
Nota: este tutorial se concentrará na configuração inicial do DNSControl; no entanto, para o uso na produção, é recomendável armazenar sua configuração do DNSControl em um sistema de controle de versão (VCS) como o Git. As vantagens de se usar um VCS incluem o controle total de versões, integração com CI/CD para teste, reverter implantações sem interrupções e assim por diante.
Se quiser usar o DNSControl para escrever arquivos de zona no BIND, crie também o diretório zones
:
- mkdir ~/dnscontrol/zones
Os arquivos de zona do BIND são um método bruto e padronizado para armazenar zonas/registros do DNS em formato de texto simples. Eles foram originalmente usados para o software de servidor de DNS BIND, mas agora são amplamente adotados como o método padrão para armazenar zonas de DNS. Os arquivos de zona no BIND produzidos pelo DNSControl são úteis caso queira importá-los para um servidor DNS personalizado ou auto-hospedado, ou para fins de auditoria.
No entanto, se quiser usar o DNSControl para forçar alterações do DNS em um provedor gerenciado, o diretório zones
não será necessário.
Em seguida, você precisa configurar o arquivo creds.json
, que é o que permitirá que o DNSControl se autentique para seu provedor DNS e faça as alterações. O formato creds.json
difere ligeiramente, dependendo do provedor de DNS que você estiver usando. Para encontrar a configuração do seu próprio provedor, consulte a Lista de provedores de serviço na documentação oficial do DNSControl.
Crie o arquivo creds.json
no diretório ~/dnscontrol
:
- cd ~/dnscontrol
- nano creds.json
Adicione a configuração do creds.json
do exemplo para o seu provedor de DNS ao arquivo. Se estiver usando o DigitalOcean como seu provedor fr DNS, você pode usar o seguinte:
{
"digitalocean": {
"token": "your-digitalocean-oauth-token"
}
}
Esse arquivo diz ao DNSControl com quais provedores de DNS você quer que ele se conecte.
Você precisará fornecer alguma forma de autenticação para seu provedor de DNS. Normalmente, essa autenticação consiste em uma chave de API ou token do OAuth, mas alguns provedores exigem informações extra, conforme documentado na Lista de provedores de serviço na documentação oficial do DNSControl.
Aviso: esse token dará acesso à conta do seu provedor de DNS; dessa maneira, você deve protegê-lo, do mesmo modo que faria com uma senha. Além disso, se você estiver usando um sistema de controle de versão, certifique-se de que o arquivo que contém o token seja excluído (por exemplo, usando o .gitignore
) ou criptografado de maneira segura.
Se estiver usando o DigitalOcean como seu provedor de DNS, você pode usar o token do OAuth necessário em suas configurações de conta do DigitalOcean que você gerou como parte dos pré-requisitos.
Se você tiver vários provedores de DNS — por exemplo, para nomes de domínios múltiplos, ou zonas de DNS delegadas—você pode definir todos eles no mesmo arquivo creds.json
.
Você definiu os diretórios de configuração inicial do DNSControl e configurou o creds.json
para permitir que o DNSControl autentique seu provedor de DNS e faça alterações. Em seguida, você criará a configuração para suas zonas de DNS.
Neste passo, você criará um arquivo de configuração inicial do DNS, o qual terá os registros de DNS relacionados ao seu nome de domínio ou à zona de DNS delegada.
O dnsconfig.js
é o arquivo principal de configuração de DNS para o DNSControl. Neste arquivo, as zonas de DNS e seus registros correspondentes são definidos usando a sintaxe do JavaScript. Isso é conhecido como DSL, ou Linguagem Específica de Domínio. A página de DSL do JavaScript - na documentação oficial do DNSControl, fornece mais detalhes.
Para começar, crie o arquivo de configuração do DNS no diretório ~/dnscontrol
:
- cd ~/dnscontrol
- nano dnsconfig.js
Então, adicione a seguinte configuração de exemplo ao arquivo:
// Providers:
var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_DIGITALOCEAN = NewDnsProvider('digitalocean', 'DIGITALOCEAN');
// Domains:
D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
A('@', 'your-server-ipv4-address')
);
Esse arquivo de exemplo define um nome de domínio ou uma zona de DNS em um provedor em particular que, neste caso, é o your_domain
, hospedado pelo DigitalOcean. Um registro de exemplo A
também é definido para a zona raiz (@
), que aponta para o endereço de IPv4 do servidor no qual você está hospedando seu domínio/site.
Existem três funções principais que constituem um arquivo de configuração básica de DNSControl:
NewRegistrar(name, type, metadata)
: define o registrador de domínios para o seu nome de domínio. O DNSControl pode usar esse registrador para fazer as alterações necessárias, como modificar os servidores de nomes autorizados. Se quiser usar o DNSControl somente para gerenciar suas zonas de DNS, isso geralmente pode ser deixado como NONE
.
NewDnsProvider(name, type, metadata)
: define um provedor de serviços de DNS para seu nome de domínio ou zona delegada. É aqui que o DNSControl irá forçar as alterações do DNS que você fez.
D(name, registrar, modifiers)
: define um nome de domínio ou zona de DNS delegada para o DNSControl gerenciar, além dos registros de DNS presentes na zona.
Você deve configurar o NewRegistrar()
, o NewDnsProvider()
e o D()
, conforme for o caso, usando a Lista de provedores de serviços da documentação oficial do DNSControl.
Se você está usando o DigitalOcean como seu provedor de DNS e precisa ter a capacidade de fazer alterações no DNS (e não em servidores de nome autorizados), o exemplo do bloco de código anterior já está correto.
Assim que terminar, salve e feche o arquivo.
Neste passo, você definiu um arquivo de configuração de DNS para o DNSControl, com os fornecedores relevantes definidos. Em seguida, você irá preencher o arquivo com alguns registros úteis de DNS.
Na sequência, você pode preencher o arquivo de configuração de DNS com registros de DNS úteis para o seu site ou serviço, usando a sintaxe do DNSControl.
Ao contrário dos arquivos tradicionais de zona no BIND, nos quais os registros de DNS são escritos em um formato bruto, linha por linha, os registros DNS dentro do DNSControl são definidos como um parâmetro de função (modificador de domínio) para a função D()
, como mostrado brevemente no Passo 3.
Existe um modificador de domínio para cada um dos tipos de registro padrão de DNS, incluindo A
, AAAA
, MX
, TXT
, NS
, CAA
e assim por diante. Na seção de Modificadores de domínios, da documentação sobre o DNSControl, você encontra uma lista completa dos tipos de registro disponíveis.
Os modificadores de registros individuais também estão disponíveis (modificadores de registro). Atualmente, eles são usados principalmente para definir a vida útil (TTL ou time to live) de registros individuais. Você encontra a lista completa dos modificadores de registros disponíveis na seção de Modificadores de registro da documentação sobre o DNSControl. Os modifiers de registro são opcionais e, na maioria dos casos de uso básico, podem ser deixados de fora.
A sintaxe para definir registros de DNS varia ligeiramente em relação a cada tipo de registro. Em seguida, temos alguns exemplos dos tipos de registros mais comuns:
Registros do tipo A
:
A('name', 'address', optional record modifiers)
A('@', 'your-server-ipv4-address', TTL(30))
Registros do tipo AAAA
:
AAAA('name', 'address', optional record modifiers)
AAAA('@', 'your-server-ipv6-address')
(modificador de registro deixado de lado para que a vida útil (TTL) padrão seja usada)Registros do tipo CNAME
:
CNAME('name', 'target', optional record modifiers)
CNAME('subdomain1', 'example.org.')
(note que um ponto final, .
, deve ser incluído se houver pontos no valor)Registros do tipo MX
:
MX('name', 'priority', 'target', optional record modifiers)
MX('@', 10, 'mail.example.net')
(note que um ponto final, .
, deve ser incluído se houver pontos no valor)Registros do tipo TXT
:
TXT('name', 'content', optional record modifiers)
TXT('@', 'This is a TXT record. ')
Registros do tipo CAA
:
CAA('name', 'tag', 'value', optional record modifiers)
CAA('@', 'issue', 'letsencrypt.org')
Para começar a adicionar registros de DNS ao seu domínio ou zona de DNS delegada, edite seu arquivo de configuração de DNS:
- nano dnsconfig.js
Em seguida, você pode começar a preencher os parâmetros da função D()
existente, usando a sintaxe descrita na lista anterior, além da seção de Modificadores de domínios da documentação oficial sobre DNSControl. Uma vírgula (,
) deve ser usada entre cada registro.
A título de referência, este bloco de código contém um exemplo da configuração completa de uma definição básica, inicial do DNS:
...
D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
A('@', 'your-server-ipv4-address'),
A('www', 'your-server-ipv4-address'),
A('mail', 'your-server-ipv4-address'),
AAAA('@', 'your-server-ipv6-address'),
AAAA('www', 'your-server-ipv6-address'),
AAAA('mail', 'your-server-ipv6-address'),
MX('@', 10, 'mail.your_domain.'),
TXT('@', 'v=spf1 -all'),
TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;')
);
Assim que tiver completado sua configuração inicial do DNS, salve e feche o arquivo.
Neste passo, você configurou o arquivo de configuração inicial do DNS, contendo seus registros de DNS. Em seguida, você testará a configuração e a implantará.
Neste passo, você executará uma verificação local da sintaxe em sua configuração de DNS e, em seguida, implantará as alterações no servidor/provedor ativo de DNS.
Primeiro, vá até seu diretório dnscontrol
:
- cd ~/dnscontrol
Em seguida, utilize a função preview
do DNSControl para verificar a sintaxe do seu arquivo e mostrar quais alterações ele irá fazer (sem realmente fazer as alterações):
- dnscontrol preview
Se a sintaxe do seu arquivo de configuração do DNS estiver correta, o DNSControl mostrará um panorama das alterações que ele irá fazer. Isso deve ser semelhante ao seguinte:
Output******************** Domain: your_domain
----- Getting nameservers from: digitalocean
----- DNS Provider: digitalocean...8 corrections
#1: CREATE A your_domain your-server-ipv4-address ttl=300
#2: CREATE A www.your_domain your-server-ipv4-address ttl=300
#3: CREATE A mail.your_domain your-server-ipv4-address ttl=300
#4: CREATE AAAA your_domain your-server-ipv6-address ttl=300
#5: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
#6: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
#7: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
----- Registrar: none...0 corrections
Done. 8 corrections.
Se ver um aviso de erro em sua saída, o DNSControl dará detalhes sobre o que está errado e onde o erro está localizado dentro do seu arquivo.
Aviso: o próximo comando fará alterações dinâmicas nos seus registros do DNS e possivelmente em outras configurações. Certifique-se de que esteja preparado para isso, incluindo fazendo um um backup da sua configuração de DNS existente, além de garantir que tenha os meios para reverter o processo, se necessário.
Por fim, você pode enviar as alterações para seu provedor de DNS ativo:
- dnscontrol push
Você verá uma saída similar à seguinte:
Output******************** Domain: your_domain
----- Getting nameservers from: digitalocean
----- DNS Provider: digitalocean...8 corrections
#1: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
SUCCESS!
#2: CREATE A your_domain your-server-ipv4-address ttl=300
SUCCESS!
#3: CREATE AAAA your_domain your-server-ipv6-address ttl=300
SUCCESS!
#4: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#5: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#6: CREATE A www.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#7: CREATE A mail.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
SUCCESS!
----- Registrar: none...0 corrections
Done. 8 corrections.
Agora, se verificar as configurações de DNS do seu domínio no painel de controle do DigitalOcean, verá as alterações.
Também é possível verificar a criação de registros, executando uma consulta de DNS em relação à sua zona de domínio/delegada usando o dig
.
Se não tiver o dig
instalado, será necessário instalar o pacote dnsutils
:
- sudo apt install dnsutils
Assim que instalar o dig
, utilize-o para fazer uma pesquisa de DNS em relação ao seu domínio. Você verá que os registros foram atualizados de forma adequada:
- dig +short your_domain
Você verá uma saída que mostra o endereço IP e o registro relevante de DNS da sua zona - que foi implantado usando o DNSControl. Os registros de DNS podem levar algum tempo para se propagarem, assim, talvez seja necessário esperar e executar esse comando novamente.
Neste passo final, você executou uma verificação da sintaxe local do arquivo de configuração do DNS. Em seguida, implantou-a em seu provedor de DNS ativo e testou se as alterações foram feitas com êxito.
Neste artigo, você configurou o DNSControl e implantou uma configuração de DNS em um provedor ativo. Agora, você pode gerenciar e testar suas alterações de configuração do DNS em um ambiente seguro e offline, antes de implantá-las na produção.
Se quiser explorar mais esse assunto, o DNSControl foi criado para se integrar ao seu pipeline de CI/CD (Integração Contínua/Entrega Contínua), o que lhe permite executar testes em profundidade e ter mais controle sobre sua implantação na produção. Você também pode pesquisar sobre a integração do DNSControl aos seus processos de compilação/implantação de infraestrutura, o que permite implantar servidores e adicioná-los ao DNS de maneira completamente automática.
Se quiser avançar ainda mais com o DNSControl, os artigos do DigitalOcean, a seguir, apresentam alguns passos subsequentes interessantes para ajudar a integrar o DNSControl aos fluxos de trabalho de gerenciamento de alterações e implantação de infraestrutura:
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!