<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wiki.ispup.com.br/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gondim</id>
	<title>ISPUP! - Contribuições do usuário [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ispup.com.br/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gondim"/>
	<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/Especial:Contribui%C3%A7%C3%B5es/Gondim"/>
	<updated>2026-08-15T11:06:11Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Sobre_mim&amp;diff=1177</id>
		<title>Sobre mim</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Sobre_mim&amp;diff=1177"/>
		<updated>2026-07-13T16:51:27Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Marcelo Gondim da Cunha ===&lt;br /&gt;
[[Arquivo:Gondim perfil2026.png|esquerda|miniaturadaimagem|246x246px]]&lt;br /&gt;
&#039;&#039;&#039;Contribuições e trabalhos:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Administração de Sistemas Unix-Like desde 1996.&lt;br /&gt;
* Consultor na Conectiva S/A - Unidade Rio em 2000.&lt;br /&gt;
* Autor do projeto TuxFrw - https://github.com/gondimcodes/tuxfrw e https://github.com/gondimcodes/tuxfrw-nft&lt;br /&gt;
* Administração de sistemas BSD pela FreeBSD Brasil em 2010.&lt;br /&gt;
* Direção do AS53135 - Nettel Telecomunicações entre 2003 e 2021 atingindo a marca de 41.000 assinantes. Gerando qualidade na entrega de serviços e implantando boas práticas como: &lt;br /&gt;
&lt;br /&gt;
a) IPv6.&lt;br /&gt;
&lt;br /&gt;
b) MANRS.&lt;br /&gt;
&lt;br /&gt;
c) RPKI.&lt;br /&gt;
&lt;br /&gt;
d) CPEs com firmware baseada na BCOP &amp;lt;nowiki&amp;gt;https://www.m3aawg.org/sites/default/files/lac-bcop-1-m3aawg-v1-portuguese-final.pdf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SOC Specialist na Brasil TecPar (AS262907) de 2022 a 2025. Um milhão de clientes. Responsável pelas estratégias de mitigação anti-DDoS atendendo as Operações de RJ, SP, RS, SC, MT e MS. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Palestras ministradas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Semana da Informática UERJ 2002 - TuxFrw.&lt;br /&gt;
* CONISLI 2003 - TuxFrw.&lt;br /&gt;
* CONISLI 2004 - Fazendo compras com Gentoo Linux - Palestra sobre a distribuição Linux e suas ferramentas fantásticas.&lt;br /&gt;
* CONISLI 2004 - OpenVPN - Palestra sobre como criar VPNs seguras com OpenVPN e diferenças entre ele e o IPSec.&lt;br /&gt;
* CONISLI 2005 - SPoP (Security Point of Presence) com OpenVPN - Como utilizar túneis encriptados do OpenVPN para acessar a Internet de forma segura, onde quer que esteja.&lt;br /&gt;
* SECOMP 2005 UNIFEI - TuxFrw.&lt;br /&gt;
&lt;br /&gt;
* Debconf19 2019 - [https://debconf19.debconf.org/talks/4-debian-na-vida-de-uma-operadora-de-telecom/ Debian na vida de uma operadora de Telecom], [https://www.youtube.com/watch?v=vQSTslUZy8k&amp;amp;list=PLYUtdmpYPTTJDtwgD8AtxzFJ9t_URhFMK&amp;amp;index=35 vídeo] e [https://salsa.debian.org/debconf-team/public/share/debconf19/raw/master/slides/4-debian-na-vida-de-uma-operadora-de-telecom.pdf?inline=false pdf].&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=5uOFtkplDts FiqueEmCasaUseDebian - CGNAT com NFTables] e [https://www.youtube.com/watch?v=Wz2IAg6MMlU SysAdmin apps].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Artigos desenvolvidos para a comunidade do Brasil Peering Fórum:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/CGNAT_na_pratica CGNAT na pratica].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Acesso_via_IPv6_Link-Local Acesso via IPv6 Link-Local].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/MANRS MANRS].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/CGNAT_Bulk_Port_Allocation_com_DPDK CGNAT Bulk Port Allocation com DPDK].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Servidor_de_Logs Servidor de Logs].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/DNS_Recursivo_Anycast_Hyperlocal DNS Anycast com Hyperlocal].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Portas_de_Amplifica%C3%A7%C3%A3o_DDoS_e_Botnets Portas de Amplificação DDoS e Botnets]&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Static_Loop_-_um_erro_que_pode_matar_seu_ISP/ITP Static Loop - um erro que pode matar seu ISP/ITP]&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Recomenda%C3%A7%C3%B5es_sobre_Mitiga%C3%A7%C3%A3o_DDoS Recomendações sobre Mitigação DDoS]&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Vazamento_de_prefixos_na_mitiga%C3%A7%C3%A3o_DDoS Vazamento de prefixos na mitigação DDoS]&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Identificando_e_neutralizando_uma_Botnet Identificando e neutralizando uma Botnet]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [https://bit.ly/2saumHK Segurança de roteamento: MANRS (Mutually Agreed Norms for Routing Security) - Tutoriais NIC.br em 09/12/2019].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://www.manrs.org/about/advisory-group/members/ MANRS Advisory Group Member (2020-2021)]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=oahQkGx8urY &#039;&#039;&#039;Live sobre MANRS com Leonardo Furtado&#039;&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
Criação da Wiki ISPUP! em 24/12/2022.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semana de Capacitação 6 do NIC.br 28/04/2023&#039;&#039;&#039; - &amp;quot;&#039;&#039;&#039;CONCEITOS E IMPLEMENTAÇÃO DE CGNAT&amp;quot;&#039;&#039;&#039;. Material [https://semanacap.bcp.nic.br/6-online/ aqui] e vídeo aula [https://www.youtube.com/watch?v=1q7J3NkQVSc aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semana de Capacitação 10 do NIC.br 01/07/2025&#039;&#039;&#039; - &amp;quot;&#039;&#039;&#039;Teste para padrões técnicos modernos de Internet e segurança: IPv6, DNSSEC, TLS, HTTPS e HSTS&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;.&#039;&#039;&#039; Material [https://semanacap.bcp.nic.br/semana-de-capacitacao-online-edicao-10-2025/ aqui] e vídeo aula [https://www.youtube.com/watch?v=55RBnGQhi2o aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IX Fórum Regional Sudeste (Rio de Janeiro) 24/10/2025&#039;&#039;&#039; com a palestra &amp;quot;&#039;&#039;&#039;Segurança com o pé direito&#039;&#039;&#039;&amp;quot; pode ser baixada [https://regional.forum.ix.br/files/apresentacao/arquivo/2307/gondim.pdf aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fórum BCOP-ICANN Edição Especial DNS 19/12/2025&#039;&#039;&#039; com o painel &amp;quot;&#039;&#039;&#039;DNS em Ação: Como os provedores estão implantando as Boas Práticas&amp;quot;&#039;&#039;&#039; com &#039;&#039;&#039;apresentação&#039;&#039;&#039; [https://forumbcop.nic.br/files/apresentacao/arquivo/2428/DNS_KINDNS_Reduzido.pdf aqui] e vídeo [https://www.youtube.com/live/GnYK9UOLXr4?t=10257s aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fórum BCOP Fortaleza&#039;&#039;&#039; com a palestra: &amp;quot;&#039;&#039;&#039;Recomendações de segurança para provedores&amp;quot;&#039;&#039;&#039; com apresentação [https://fortaleza.forumbcop.nic.br/files/apresentacao/arquivo/2487/Marcelo_Gondim_Recomendacoes_seguranca_provedores.pdf aqui] e vídeo [https://youtu.be/Qjgb7P3cG8k?t=9237 aqui]&#039;&#039;&#039;.&#039;&#039;&#039; Os arquivos anexos de configuração: [https://fortaleza.forumbcop.nic.br/files/apresentacao/arquivo/2489/Marcelo_Gondim_filtros_edge_huawei.pdf filtros_edge_huawei], [https://fortaleza.forumbcop.nic.br/files/apresentacao/arquivo/2490/spoofer.pdf spoofer] e [https://fortaleza.forumbcop.nic.br/files/apresentacao/arquivo/2491/filtros_bng_huawei.pdf filtros_bng_huawei]. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Live INTRAREDE&#039;&#039;&#039; 08/07/2026 com o tema: &#039;&#039;&#039;&amp;quot;Troca da chave KSK 2026 e Boas Práticas para uma Operação DNS Segura e Resiliente&amp;quot;&#039;&#039;&#039; com a apresentação [https://youtu.be/WVRrDb_wdxM?t=5534 aqui]. A presentação pode ser baixada [https://intrarede.nic.br/files/apresentacao/arquivo/2511/DNS_Seguro_DoT_e_DoH_Protegendo_consultas_DNS_contra_interceptacao.pdf aqui]. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Moeda recebida pelo NIC.br por contribuir com conhecimento palestrando na Semana de Infraestrutura da Internet no Brasil em 2025:&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Moeda1.jpg|nenhum|miniaturadaimagem|407x407px]]&lt;br /&gt;
&#039;&#039;&#039;Moeda comemorativa de 5 anos recebida pelo NIC.br em 2025 por contribuir com conhecimento para a Semana de Capacitação e Camada 8:&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Moeda2.jpg|nenhum|miniaturadaimagem|407x407px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Moeda IX Fórum Fortaleza 2026:&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Frum-bcop-fortaleza-2026 55178462504 o.jpg|esquerda|miniaturadaimagem|470x470px]]&lt;br /&gt;
[[Arquivo:Frum-bcop-fortaleza-2026 55178206816 o.jpg|nenhum|miniaturadaimagem|447x447px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Webinar:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Proteção e Mitigação de ataques DDoS em 10/09/2024 às 20:00 UTC -3. Site da chamada [https://gdg.community.dev/events/details/google-gdg-sinop-presents-webinar-ao-vivo-protecao-e-mitigacao-de-ataques-ddos/ aqui] e o vídeo da live no Youtube [https://www.youtube.com/live/7VIaoDQaLQE aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Podcast:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/live/x4fxtma4eyQ Segurança de Rede e Infraestrutura para 2025: Preparando os ISPs para o futuro!] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Contatos:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Telegram: &#039;&#039;&#039;@Marcelo_Gondim&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WhatsApp: +55 (22) 99743-9060&lt;br /&gt;
&lt;br /&gt;
E-mail: &#039;&#039;&#039;gondim at gmail.com&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Linkedin: https://www.linkedin.com/in/marcelo-gondim-sysadmin/&lt;br /&gt;
&lt;br /&gt;
Meu Github: https://github.com/gondimcodes&lt;br /&gt;
==Mini-CV==&lt;br /&gt;
&#039;&#039;&#039;Marcelo Gondim&#039;&#039;&#039; começou sua carreira como desenvolvedor de software em COBOL e Clipper entre 1992 e 1995. Em 1996 foi responsável por desenvolver um sistema concorrente com o RENPAC da Embratel para acesso ao SISCOMEX e implantou a Internet para fins comerciais na empresa DATABRAS. Trabalhou como consultor e instrutor de GNU/Linux na Conectiva S/A em 2000. Em 2003 se tornou consultor de diversos Provedores de Internet na Região dos Lagos - RJ e onde acabou se tornando CTO da Nettel Telecomunicações (AS53135) com 42.000 assinantes. Implantou IPv6 iniciando em 2013 e se tornou participante do MANRS com diversas contribuições com artigos e palestras. Trabalhou como Especialista em Redes e SOC (Security Operations Center) na Brasil TecPar AS262907 entre 2022 e 2025, onde implementou boas práticas, tratamentos de incidentes relacionados ao ASN, desenvolveu as estratégias de Mitigação DDoS e uma Rede de DNS Recursivo Anycast espalhada pelo RS, RJ, SP, SC MT e MS, também certificada KINDNS. Fundador da empresa ISPFocus especializada em Tecnologia da Informação e boas práticas para ISPs.&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1176</id>
		<title>Certificado TLS com ACME-DNS e DNS-01</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1176"/>
		<updated>2026-07-12T17:45:20Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Diagrama exemplo ==&lt;br /&gt;
[[Arquivo:Acme-dns.drawio.png|semmoldura|685x685px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via &#039;&#039;&#039;HTTPS&#039;&#039;&#039;, servidores de envio e recebimento de e-mails (&#039;&#039;&#039;MTA&#039;&#039;&#039;s), clientes de e-mail (&#039;&#039;&#039;MUA&#039;&#039;&#039;s) quando se comunicam com os MTAs, DNS quando utilizamos &#039;&#039;&#039;DNSSEC&#039;&#039;&#039; e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando &#039;&#039;&#039;HTTP (80/tcp)&#039;&#039;&#039; e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum &#039;&#039;&#039;malware&#039;&#039;&#039; hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com &#039;&#039;&#039;criptografia assimétrica&#039;&#039;&#039; onde temos um par de chaves, a &#039;&#039;&#039;chave pública&#039;&#039;&#039; e uma &#039;&#039;&#039;chave privada&#039;&#039;&#039;. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as &#039;&#039;&#039;Autoridades Certificadoras (CA&#039;&#039;&#039;s&#039;&#039;&#039;)&#039;&#039;&#039;, elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;. Ela é uma opção gratuita e extremamente utilizada na Internet.&lt;br /&gt;
&lt;br /&gt;
== Como funciona a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; ==&lt;br /&gt;
Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039; lá no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.&lt;br /&gt;
&lt;br /&gt;
A Let&#039;s Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039;. Ela pode fazer isso de duas formas:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HTTP-01&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
No modelo de confirmação &#039;&#039;&#039;HTTP-01&#039;&#039;&#039; é necessário que a Let&#039;s Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com &#039;&#039;&#039;IP 192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;FD00::192:168:0:10&#039;&#039;&#039;. Aí nesse caso podemos tomar para uso a autenticação via &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usando DNS-01, a Let&#039;s Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let&#039;s Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar,  &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Meu artigo será exatamente sobre o uso do &#039;&#039;&#039;DNS-01&#039;&#039;&#039; e o &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ACME-DNS-RUST ==&lt;br /&gt;
O &#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust acme-dns-rust]&#039;&#039;&#039; é um micro servidor de DNS programado em &#039;&#039;&#039;Rust&#039;&#039;&#039; e que também tem o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; para comunicação com ele. O &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; terá a função de armazenar e atualizar os &#039;&#039;&#039;registros TXT de DNS&#039;&#039;&#039;, com os desafios gerados pela &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e este possui uma API HTTPS para se comunicar com o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar os seguintes programas neste artigo:&lt;br /&gt;
&lt;br /&gt;
* Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let&#039;s Encrypt.&lt;br /&gt;
* ACME-DNS-CLIENT-RUST, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.&lt;br /&gt;
* ACME-DNS-RUST, o serviço de DNS que armazenará os desafios para o seu servi__FORCARTDC__dor.&lt;br /&gt;
O funcionamento do conjunto &#039;&#039;&#039;acme-dns-rust/acme-dns-client-rust&#039;&#039;&#039; é bem simples, é necessário criarmos um &#039;&#039;&#039;subdomínio&#039;&#039;&#039; para a nossa gerência de desafios apontando para onde nosso &#039;&#039;&#039;servidor acme-dns-rust&#039;&#039;&#039; ficará rodando. Vamos usar para isso um sistema &#039;&#039;&#039;GNU/Linux Debian&#039;&#039;&#039; mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;:&lt;br /&gt;
 auth.seudominio.com.br.     IN NS ns1.auth.seudominio.com.br.&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN A 198.18.0.1&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN AAAA 2001:db8::198:18:0:1&lt;br /&gt;
Acima estamos criando nosso &#039;&#039;&#039;subdomínio auth&#039;&#039;&#039; e apontando para os &#039;&#039;&#039;IPs fictícios 198.18.0.1 e 2001:db8::198:18:0:1&#039;&#039;&#039; que é onde estará rodando nosso servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Esse serviço uma vez rodando, você poderá usá-lo para criar &#039;&#039;&#039;certificados TLS usando Let&#039;s Encrypt DNS-01&#039;&#039;&#039; para qualquer domínio, seja ele público ou privado.&lt;br /&gt;
&lt;br /&gt;
Para que você não precise instalar o cargo do Rust e compilar o projeto, você pode usar os &#039;&#039;&#039;binários&#039;&#039;&#039; já compilados pelo &#039;&#039;&#039;CI/CD do GitHub&#039;&#039;&#039;: https://github.com/gondimcodes/acme-dns-rust/releases&lt;br /&gt;
&lt;br /&gt;
Basta descompactá-los e colocá-los em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039;. Lá também tem os binários para &#039;&#039;&#039;FreeBSD&#039;&#039;&#039; se preferir.&lt;br /&gt;
&lt;br /&gt;
Agora falta pouco para termos rodando nosso &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Siga os passos abaixo:&lt;br /&gt;
 # useradd -r -s /bin/false acme-dns&lt;br /&gt;
 # mkdir -p /etc/acme-dns-rust&lt;br /&gt;
 # mkdir -p /var/lib/acme-dns-rust&lt;br /&gt;
Dentro do diretório &#039;&#039;&#039;/etc/acme-dns-rust&#039;&#039;&#039; criaremos um arquivo chamado &#039;&#039;&#039;config.toml&#039;&#039;&#039; e o conteúdo dele está configurado para o nosso exemplo, mas nesse caso é só você alterar as configurações para o seu uso em produção:&lt;br /&gt;
&lt;br /&gt;
Conteúdo de &#039;&#039;&#039;/etc/acme-dns-rust/config.toml&#039;&#039;&#039;:&lt;br /&gt;
 [general]&lt;br /&gt;
 # DNS interface. Note that systemd-resolved may reserve port 53 on 127.0.0.53&lt;br /&gt;
 # In this case acme-dns will error out and you will need to define the listening interface&lt;br /&gt;
 # for example: listen = &amp;quot;127.0.0.1:53&amp;quot;&lt;br /&gt;
 listen = &amp;quot;[::]:53&amp;quot;&lt;br /&gt;
 # protocol, &amp;quot;both&amp;quot;, &amp;quot;both4&amp;quot;, &amp;quot;both6&amp;quot;, &amp;quot;udp&amp;quot;, &amp;quot;udp4&amp;quot;, &amp;quot;udp6&amp;quot; or &amp;quot;tcp&amp;quot;, &amp;quot;tcp4&amp;quot;, &amp;quot;tcp6&amp;quot;&lt;br /&gt;
 protocol = &amp;quot;both&amp;quot;&lt;br /&gt;
 # domain name to serve the requests off of&lt;br /&gt;
 domain = &amp;quot;auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # zone name server&lt;br /&gt;
 nsname = &amp;quot;ns1.auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # admin email address, where @ is substituted with .&lt;br /&gt;
 nsadmin = &amp;quot;admin.seudominio.com.br&amp;quot;&lt;br /&gt;
 # predefined records served in addition to the TXT&lt;br /&gt;
 records = [&lt;br /&gt;
     # domain pointing to the public IP of your acme-dns server &lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. A 198.1.0.1&amp;quot;,&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. A 198.51.100.1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     # specify that auth.example.org will resolve any *.auth.example.org records&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. NS ns1.auth.seudominio.com.br.&amp;quot;,&lt;br /&gt;
 ]&lt;br /&gt;
 # debug messages from CORS etc&lt;br /&gt;
 debug = false&lt;br /&gt;
 &lt;br /&gt;
 [database]&lt;br /&gt;
 # Database engine to use, sqlite or postgres&lt;br /&gt;
 engine = &amp;quot;sqlite&amp;quot;&lt;br /&gt;
 # Connection string, filename for sqlite3 and postgres://$username:$password@$host/$db_name for postgres&lt;br /&gt;
 # Please note that the default Docker image uses path /var/lib/acme-dns/acme-dns.db for sqlite3&lt;br /&gt;
 connection = &amp;quot;/var/lib/acme-dns-rust/acme-dns.db&amp;quot;&lt;br /&gt;
 # connection = &amp;quot;postgres://user:password@localhost/acmedns_db&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [api]&lt;br /&gt;
 # listen ip eg. 127.0.0.1&lt;br /&gt;
 ip = &amp;quot;::&amp;quot;&lt;br /&gt;
 # disable registration endpoint&lt;br /&gt;
 disable_registration = false&lt;br /&gt;
 # listen port, eg. 443 for default HTTPS&lt;br /&gt;
 port = &amp;quot;443&amp;quot;&lt;br /&gt;
 # possible values: &amp;quot;letsencrypt&amp;quot;, &amp;quot;letsencryptstaging&amp;quot;, &amp;quot;cert&amp;quot;, &amp;quot;none&amp;quot;&lt;br /&gt;
 tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;cert&amp;quot;&lt;br /&gt;
 tls_cert_privkey = &amp;quot;/etc/tls/example.org/privkey.pem&amp;quot;&lt;br /&gt;
 tls_cert_fullchain = &amp;quot;/etc/tls/example.org/fullchain.pem&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 acme_cache_dir = &amp;quot;api-certs&amp;quot;&lt;br /&gt;
 # optional e-mail address to which Let&#039;s Encrypt will send expiration notices for the API&#039;s cert&lt;br /&gt;
 notification_email = &amp;quot;&amp;quot;&lt;br /&gt;
 # CORS AllowOrigins, wildcards can be used&lt;br /&gt;
 corsorigins = [&lt;br /&gt;
     &amp;quot;*&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 # use HTTP header to get the client ip&lt;br /&gt;
 use_header = false&lt;br /&gt;
 # header name to pull the ip address / list of ip addresses from&lt;br /&gt;
 header_name = &amp;quot;X-Forwarded-For&amp;quot;&lt;br /&gt;
 # enable HSTS (HTTP Strict Transport Security)&lt;br /&gt;
 hsts_enabled = false&lt;br /&gt;
 # HSTS max age in seconds (default: 31536000 = 1 year)&lt;br /&gt;
 hsts_max_age = 31536000&lt;br /&gt;
 # HSTS include subdomains directive&lt;br /&gt;
 hsts_include_subdomains = false&lt;br /&gt;
 # HSTS preload directive&lt;br /&gt;
 hsts_preload = false&lt;br /&gt;
 # List of trusted reverse proxy IPs/CIDRs (used when use_header = true to prevent IP spoofing)&lt;br /&gt;
 # Example: [&amp;quot;127.0.0.1/32&amp;quot;, &amp;quot;10.0.0.0/8&amp;quot;]&lt;br /&gt;
 trusted_proxies = []&lt;br /&gt;
 # Max registration requests per minute per IP (0 = use global rate limiter only)&lt;br /&gt;
 register_rate_limit_per_min = 1&lt;br /&gt;
 # Enable automatic cleanup of registered users that never completed a TXT update&lt;br /&gt;
 cleanup_orphans = true&lt;br /&gt;
 # Time (in minutes) to wait before deleting an inactive/orphan user&lt;br /&gt;
 orphan_timeout_mins = 30&lt;br /&gt;
 &lt;br /&gt;
 [logconfig]&lt;br /&gt;
 # logging level: &amp;quot;error&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;info&amp;quot; or &amp;quot;debug&amp;quot;&lt;br /&gt;
 loglevel = &amp;quot;info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O arquivo já possui comentários das opções de configuração para ajudá-lo a personalizar mais o serviço mas não entraremos em detalhe. Só buscar na documentação do projeto. Acima configuramos ele para funcionar com nossos dados fictícios, estará funcionando tanto via &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto via &#039;&#039;&#039;IPv6&#039;&#039;&#039; apontados para &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. Ele também já está configurado para solicitar para ele um certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; automaticamente.&lt;br /&gt;
&lt;br /&gt;
Após terminada a configuração acima, iniciaremos o serviço:&lt;br /&gt;
 # chown -R acme-dns:acme-dns /var/lib/acme-dns-rust&lt;br /&gt;
 # chown -R root:acme-dns /etc/acme-dns-rust&lt;br /&gt;
 # chmod 640 /etc/acme-dns-rust/config.toml&lt;br /&gt;
Agora precisamos criar nosso arquivo do systemd. Crie esse arquivo &#039;&#039;&#039;/etc/systemd/system/acme-dns-rust.service&#039;&#039;&#039; com o conteúdo abaixo:&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=acme-dns-rust Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=acme-dns&lt;br /&gt;
 Group=acme-dns&lt;br /&gt;
 WorkingDirectory=/var/lib/acme-dns-rust&lt;br /&gt;
 ExecStart=/usr/local/bin/acme-dns-rust --config /etc/acme-dns-rust/config.toml&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 AmbientCapabilities=CAP_NET_BIND_SERVICE&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Depois de salvar execute o comando abaixo. Ele solicitará uma senha para administração do seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;, para uso em CLI:&amp;lt;pre&amp;gt;&lt;br /&gt;
# acme-dns-rust --config /etc/acme-dns-rust/config.toml users list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable acme-dns-rust&lt;br /&gt;
 # systemctl start acme-dns-rust.service&lt;br /&gt;
Após iniciar o serviço teremos as seguintes portas up: &#039;&#039;&#039;53/udp&#039;&#039;&#039;, &#039;&#039;&#039;53/tcp&#039;&#039;&#039; e a &#039;&#039;&#039;443/tcp&#039;&#039;&#039;. Esta última porta é para a comunicação &#039;&#039;&#039;API&#039;&#039;&#039; entre o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns&#039;&#039;&#039;. Para checar se o serviço está rodando:&lt;br /&gt;
 # systemctl status acme-dns-rust&lt;br /&gt;
[[Arquivo:Acme-dns-02.png.png|nenhum|miniaturadaimagem|1454x1454px]]&lt;br /&gt;
&lt;br /&gt;
Você também pode monitorar o serviço através do comando:&lt;br /&gt;
 # journalctl -u acme-dns-rust.service -f&lt;br /&gt;
Importante! Para funcionar, o serviço de DNS Autoritativo tem que estar configurado certinho. Depois que o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; estiver rodando você pode checar assim. Lembre-se de fazer com seus dados reais.&lt;br /&gt;
 # host auth.seudominio.com.br&lt;br /&gt;
 auth.seudominio.com.br has address 198.18.0.1&lt;br /&gt;
 auth.seudominio.com.br has IPv6 address 2001:db8::198:18:0:1&lt;br /&gt;
Se apresentar erro de &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039;, então algo não ficou bem configurado no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;, ou &#039;&#039;&#039;na configuração do seu acme-dns-rust&#039;&#039;&#039;. Dê uma revisada novamente aqui no artigo.&lt;br /&gt;
&lt;br /&gt;
Se tudo ocorreu bem, então você tem um &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039; rodando e pronto para armazenar os &#039;&#039;&#039;desafios TXT da Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CERTBOT e ACME-DNS-CLIENT-RUST ==&lt;br /&gt;
Agora vamos entrar na parte de como gerar um certificado TLS para o seu servidor, mesmo que ele possua apenas IP privado, sem abertura de portas e mais seguro. Para todo sistema que precisarmos gerar certificados, utilizaremos o &#039;&#039;&#039;certbot&#039;&#039;&#039; e do &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No diagrama deste artigo dou como exemplo um servidor Web HTTPS e um outro com aplicação corporativa mas você poderá gerar certificados para qualquer ambiente.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez nosso ambiente será um GNU/Linux Debian 13 (Trixie). Coloque o binário do nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039; no servidor que receberá o certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install certbot&lt;br /&gt;
&lt;br /&gt;
Pronto! Instalamos o &#039;&#039;&#039;certbot&#039;&#039;&#039;, cliente ACME para fazer as solicitações e atualizações dos nossos certificados para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e também instalamos nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Registrando seu domínio e subdomínios que ira utilizar no seu servidor ==&lt;br /&gt;
Vamos supor que você tenha um &#039;&#039;&#039;ERP&#039;&#039;&#039; da empresa no &#039;&#039;&#039;IP 192.168.10.10&#039;&#039;&#039; e que queira gerar o certificado para ele. Após fazer os passos acima, façamos nosso registro no servidor com &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; rodando:&lt;br /&gt;
 # acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&lt;br /&gt;
Esse comando acima vai registrar no seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; o registro para &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039; e ele vai te vai solicitar que crie um desafio &#039;&#039;&#039;CNAME&#039;&#039;&#039; apontando para o seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. No exemplo abaixo a saída vai ser parecida mas o &#039;&#039;&#039;CNAME&#039;&#039;&#039; diferente para você cadastrar no seu DNS Autoritativo. O &#039;&#039;&#039;acme-dns-client-rust ficará aguardando e testando até que você gere esse registro CNAME&#039;&#039;&#039;. Aqui não optei por usar o registro &#039;&#039;&#039;CAA&#039;&#039;&#039; (Certification Authority Authorization) que seria para só autorizar determinada autoridade certificadora à assinar seu certificado.&lt;br /&gt;
 &#039;&#039;&#039;# acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Registering account for domain: sgp.redesimtelecom.net.br...&lt;br /&gt;
 &lt;br /&gt;
 Registration successful!&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 Username:   342f334e-5ce7-488b-8cf4-721a03fab0e5&lt;br /&gt;
 Password:   4W1c8O28Wod7GrP4bZWIXRKy0WSdUyjR-PLLBrYA&lt;br /&gt;
 FullDomain: 989c7170-37e4-4cb0-9f2b-9244aa404350.auth.ispfocus.net.br&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 Please create the following CNAME record in your DNS zone:&lt;br /&gt;
 &#039;&#039;&#039;_acme-challenge.erp.seudominio.com.br.&#039;&#039;&#039; IN CNAME &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br.&#039;&#039;&#039;&lt;br /&gt;
 Do you want acme-dns-client-rust to monitor the CNAME record change? [Y/n]: y&lt;br /&gt;
 &lt;br /&gt;
 Waiting for CNAME record propagation...&lt;br /&gt;
 Checking...                         &lt;br /&gt;
 CNAME propagation verified successfully!&lt;br /&gt;
 &lt;br /&gt;
 --- CAA Configuration ---&lt;br /&gt;
 A CAA record allows you to control certificate issuance safeguards.&lt;br /&gt;
 Do you wish to set up a CAA record now? [y/N]: &lt;br /&gt;
 Skipping CAA record setup.&lt;br /&gt;
Vejam como é interessante seu funcionamento: O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; para confirmar que você é o dono do domínio, ele procura pelo &#039;&#039;&#039;TXT&#039;&#039;&#039; com o desafio em &#039;&#039;&#039;_acme-challenge.seudominio.com.br&#039;&#039;&#039; só que ele não está no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039; e sim no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. O que o &#039;&#039;&#039;CNAME&#039;&#039;&#039; faz é repassar a consulta para o domínio &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br&#039;&#039;&#039; que está criado no seu &#039;&#039;&#039;acme-dns&#039;&#039;&#039;, que por sua vez contém o &#039;&#039;&#039;desafio TXT que a Let&#039;s Encrypt está procurando&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lembra que no início do artigo criamos o subdomínio &#039;&#039;&#039;auth.seudomínio.com.br&#039;&#039;&#039; e apontamos tudo que for para ele, consultar no &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;? Ou seja &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350&#039;&#039;&#039; é um subdomínio de &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. É confuso para quem nunca configurou um serviço de DNS mas se você realmente não está conseguindo entender, procure dar uma estudada sobre &#039;&#039;&#039;DNS (Domain Name System)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Após conseguirmos registrar o domínio acima, passamos para o uso com o &#039;&#039;&#039;certbot&#039;&#039;&#039;, para que possamos solicitar nosso certificado digital para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Usando o certbot com o acme-dns-client ==&lt;br /&gt;
Abaixo estamos solicitamos ao &#039;&#039;&#039;certbot&#039;&#039;&#039; ,usando o nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; como auth-hook, para gerar o certificado TLS para o &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039;. O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; gerará um &#039;&#039;&#039;desafio TXT (DNS-01)&#039;&#039;&#039; para o &#039;&#039;&#039;erp.seudomínio.com.br&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; incluirá o registro no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; fazendo com que a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; encontre o desafio e libere o certificado digital.&lt;br /&gt;
 # &#039;&#039;&#039;certbot certonly --manual --preferred-challenges dns --manual-auth-hook &#039;/usr/local/bin/acme-dns-client-rust&#039; -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Enter email address (used for urgent renewal and security notices)&lt;br /&gt;
  (Enter &#039;c&#039; to cancel): noc@seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Please read the Terms of Service at&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf&amp;lt;/nowiki&amp;gt;. You must&lt;br /&gt;
 agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: Y&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
 share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
 partner of the Let&#039;s Encrypt project and the non-profit organization that&lt;br /&gt;
 develops Certbot? We&#039;d like to send you email about our work encrypting the web,&lt;br /&gt;
 EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: N&lt;br /&gt;
 Account registered.&lt;br /&gt;
 Requesting a certificate for erp.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 Successfully received certificate.&lt;br /&gt;
 Certificate is saved at: /etc/letsencrypt/live/erp.seudominio.com.br/fullchain.pem&lt;br /&gt;
 Key is saved at:         /etc/letsencrypt/live/erp.seudominio.com.br/privkey.pem&lt;br /&gt;
 This certificate expires on 2025-07-22.&lt;br /&gt;
 These files will be updated when the certificate renews.&lt;br /&gt;
 Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 If you like Certbot, please consider supporting our work by:&lt;br /&gt;
  * Donating to ISRG / Let&#039;s Encrypt:   &amp;lt;nowiki&amp;gt;https://letsencrypt.org/donate&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  * Donating to EFF:                    &amp;lt;nowiki&amp;gt;https://eff.org/donate-le&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Os certificados são gerados em /etc/letsencrypt e aí só usá-los em suas aplicações.  Para atualizar automaticamente os certificados basta colocar algo assim em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew &amp;amp;&amp;amp; /usr/bin/systemctl reload nginx.service&lt;br /&gt;
Acima estamos renovando o certificado todo dia 01 de cada mês às 00:00 e na sequência recarregando o nginx para conter o novo certificado. Você pode adaptar para a sua realidade.&lt;br /&gt;
&lt;br /&gt;
Espero que seja útil este artigo e que agora não tenhamos mais que usar certificados TLS auto-assinados que são feios, não passam segurança e não confirmam a identidade de quem está fornecendo o serviço. Coloque certificado TLS válido em todos os seus serviços e mantenha as boas práticas em dia.&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto ACME-DNS-RUST ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o meu estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1175</id>
		<title>Certificado TLS com ACME-DNS e DNS-01</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1175"/>
		<updated>2026-07-12T05:53:33Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Diagrama exemplo ==&lt;br /&gt;
[[Arquivo:Acme-dns.drawio.png|semmoldura|685x685px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via &#039;&#039;&#039;HTTPS&#039;&#039;&#039;, servidores de envio e recebimento de e-mails (&#039;&#039;&#039;MTA&#039;&#039;&#039;s), clientes de e-mail (&#039;&#039;&#039;MUA&#039;&#039;&#039;s) quando se comunicam com os MTAs, DNS quando utilizamos &#039;&#039;&#039;DNSSEC&#039;&#039;&#039; e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando &#039;&#039;&#039;HTTP (80/tcp)&#039;&#039;&#039; e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum &#039;&#039;&#039;malware&#039;&#039;&#039; hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com &#039;&#039;&#039;criptografia assimétrica&#039;&#039;&#039; onde temos um par de chaves, a &#039;&#039;&#039;chave pública&#039;&#039;&#039; e uma &#039;&#039;&#039;chave privada&#039;&#039;&#039;. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as &#039;&#039;&#039;Autoridades Certificadoras (CA&#039;&#039;&#039;s&#039;&#039;&#039;)&#039;&#039;&#039;, elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;. Ela é uma opção gratuita e extremamente utilizada na Internet.&lt;br /&gt;
&lt;br /&gt;
== Como funciona a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; ==&lt;br /&gt;
Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039; lá no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.&lt;br /&gt;
&lt;br /&gt;
A Let&#039;s Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039;. Ela pode fazer isso de duas formas:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HTTP-01&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
No modelo de confirmação &#039;&#039;&#039;HTTP-01&#039;&#039;&#039; é necessário que a Let&#039;s Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com &#039;&#039;&#039;IP 192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;FD00::192:168:0:10&#039;&#039;&#039;. Aí nesse caso podemos tomar para uso a autenticação via &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usando DNS-01, a Let&#039;s Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let&#039;s Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar,  &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Meu artigo será exatamente sobre o uso do &#039;&#039;&#039;DNS-01&#039;&#039;&#039; e o &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ACME-DNS-RUST ==&lt;br /&gt;
O &#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust acme-dns-rust]&#039;&#039;&#039; é um micro servidor de DNS programado em &#039;&#039;&#039;Rust&#039;&#039;&#039; e que também tem o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; para comunicação com ele. O &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; terá a função de armazenar e atualizar os &#039;&#039;&#039;registros TXT de DNS&#039;&#039;&#039;, com os desafios gerados pela &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e este possui uma API HTTPS para se comunicar com o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar os seguintes programas neste artigo:&lt;br /&gt;
&lt;br /&gt;
* Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let&#039;s Encrypt.&lt;br /&gt;
* ACME-DNS-CLIENT-RUST, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.&lt;br /&gt;
* ACME-DNS-RUST, o serviço de DNS que armazenará os desafios para o seu servi__FORCARTDC__dor.&lt;br /&gt;
O funcionamento do conjunto &#039;&#039;&#039;acme-dns-rust/acme-dns-client-rust&#039;&#039;&#039; é bem simples, é necessário criarmos um &#039;&#039;&#039;subdomínio&#039;&#039;&#039; para a nossa gerência de desafios apontando para onde nosso &#039;&#039;&#039;servidor acme-dns-rust&#039;&#039;&#039; ficará rodando. Vamos usar para isso um sistema &#039;&#039;&#039;GNU/Linux Debian&#039;&#039;&#039; mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;:&lt;br /&gt;
 auth.seudominio.com.br.     IN NS ns1.auth.seudominio.com.br.&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN A 198.18.0.1&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN AAAA 2001:db8::198:18:0:1&lt;br /&gt;
Acima estamos criando nosso &#039;&#039;&#039;subdomínio auth&#039;&#039;&#039; e apontando para os &#039;&#039;&#039;IPs fictícios 198.18.0.1 e 2001:db8::198:18:0:1&#039;&#039;&#039; que é onde estará rodando nosso servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Esse serviço uma vez rodando, você poderá usá-lo para criar &#039;&#039;&#039;certificados TLS usando Let&#039;s Encrypt DNS-01&#039;&#039;&#039; para qualquer domínio, seja ele público ou privado.&lt;br /&gt;
&lt;br /&gt;
Para que você não precise instalar o cargo do Rust e compilar o projeto, você pode usar os &#039;&#039;&#039;binários&#039;&#039;&#039; já compilados pelo &#039;&#039;&#039;CI/CD do GitHub&#039;&#039;&#039;: https://github.com/gondimcodes/acme-dns-rust/releases&lt;br /&gt;
&lt;br /&gt;
Basta descompactá-los e colocá-los em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039;. Lá também tem os binários para &#039;&#039;&#039;FreeBSD&#039;&#039;&#039; se preferir.&lt;br /&gt;
&lt;br /&gt;
Agora falta pouco para termos rodando nosso &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Siga os passos abaixo:&lt;br /&gt;
 # useradd -r -s /bin/false acme-dns&lt;br /&gt;
 # mkdir -p /etc/acme-dns-rust&lt;br /&gt;
 # mkdir -p /var/lib/acme-dns-rust&lt;br /&gt;
Dentro do diretório &#039;&#039;&#039;/etc/acme-dns-rust&#039;&#039;&#039; criaremos um arquivo chamado &#039;&#039;&#039;config.toml&#039;&#039;&#039; e o conteúdo dele está configurado para o nosso exemplo, mas nesse caso é só você alterar as configurações para o seu uso em produção:&lt;br /&gt;
&lt;br /&gt;
Conteúdo de &#039;&#039;&#039;/etc/acme-dns-rust/config.toml&#039;&#039;&#039;:&lt;br /&gt;
 [general]&lt;br /&gt;
 # DNS interface. Note that systemd-resolved may reserve port 53 on 127.0.0.53&lt;br /&gt;
 # In this case acme-dns will error out and you will need to define the listening interface&lt;br /&gt;
 # for example: listen = &amp;quot;127.0.0.1:53&amp;quot;&lt;br /&gt;
 listen = &amp;quot;[::]:53&amp;quot;&lt;br /&gt;
 # protocol, &amp;quot;both&amp;quot;, &amp;quot;both4&amp;quot;, &amp;quot;both6&amp;quot;, &amp;quot;udp&amp;quot;, &amp;quot;udp4&amp;quot;, &amp;quot;udp6&amp;quot; or &amp;quot;tcp&amp;quot;, &amp;quot;tcp4&amp;quot;, &amp;quot;tcp6&amp;quot;&lt;br /&gt;
 protocol = &amp;quot;both&amp;quot;&lt;br /&gt;
 # domain name to serve the requests off of&lt;br /&gt;
 domain = &amp;quot;auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # zone name server&lt;br /&gt;
 nsname = &amp;quot;ns1.auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # admin email address, where @ is substituted with .&lt;br /&gt;
 nsadmin = &amp;quot;admin.seudominio.com.br&amp;quot;&lt;br /&gt;
 # predefined records served in addition to the TXT&lt;br /&gt;
 records = [&lt;br /&gt;
     # domain pointing to the public IP of your acme-dns server &lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. A 198.1.0.1&amp;quot;,&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. A 198.51.100.1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     # specify that auth.example.org will resolve any *.auth.example.org records&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. NS ns1.auth.seudominio.com.br.&amp;quot;,&lt;br /&gt;
 ]&lt;br /&gt;
 # debug messages from CORS etc&lt;br /&gt;
 debug = false&lt;br /&gt;
 &lt;br /&gt;
 [database]&lt;br /&gt;
 # Database engine to use, sqlite or postgres&lt;br /&gt;
 engine = &amp;quot;sqlite&amp;quot;&lt;br /&gt;
 # Connection string, filename for sqlite3 and postgres://$username:$password@$host/$db_name for postgres&lt;br /&gt;
 # Please note that the default Docker image uses path /var/lib/acme-dns/acme-dns.db for sqlite3&lt;br /&gt;
 connection = &amp;quot;/var/lib/acme-dns-rust/acme-dns.db&amp;quot;&lt;br /&gt;
 # connection = &amp;quot;postgres://user:password@localhost/acmedns_db&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [api]&lt;br /&gt;
 # listen ip eg. 127.0.0.1&lt;br /&gt;
 ip = &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
 # disable registration endpoint&lt;br /&gt;
 disable_registration = false&lt;br /&gt;
 # listen port, eg. 443 for default HTTPS&lt;br /&gt;
 port = &amp;quot;443&amp;quot;&lt;br /&gt;
 # possible values: &amp;quot;letsencrypt&amp;quot;, &amp;quot;letsencryptstaging&amp;quot;, &amp;quot;cert&amp;quot;, &amp;quot;none&amp;quot;&lt;br /&gt;
 tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;cert&amp;quot;&lt;br /&gt;
 tls_cert_privkey = &amp;quot;/etc/tls/example.org/privkey.pem&amp;quot;&lt;br /&gt;
 tls_cert_fullchain = &amp;quot;/etc/tls/example.org/fullchain.pem&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 acme_cache_dir = &amp;quot;api-certs&amp;quot;&lt;br /&gt;
 # optional e-mail address to which Let&#039;s Encrypt will send expiration notices for the API&#039;s cert&lt;br /&gt;
 notification_email = &amp;quot;&amp;quot;&lt;br /&gt;
 # CORS AllowOrigins, wildcards can be used&lt;br /&gt;
 corsorigins = [&lt;br /&gt;
     &amp;quot;*&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 # use HTTP header to get the client ip&lt;br /&gt;
 use_header = false&lt;br /&gt;
 # header name to pull the ip address / list of ip addresses from&lt;br /&gt;
 header_name = &amp;quot;X-Forwarded-For&amp;quot;&lt;br /&gt;
 # enable HSTS (HTTP Strict Transport Security)&lt;br /&gt;
 hsts_enabled = false&lt;br /&gt;
 # HSTS max age in seconds (default: 31536000 = 1 year)&lt;br /&gt;
 hsts_max_age = 31536000&lt;br /&gt;
 # HSTS include subdomains directive&lt;br /&gt;
 hsts_include_subdomains = false&lt;br /&gt;
 # HSTS preload directive&lt;br /&gt;
 hsts_preload = false&lt;br /&gt;
 # List of trusted reverse proxy IPs/CIDRs (used when use_header = true to prevent IP spoofing)&lt;br /&gt;
 # Example: [&amp;quot;127.0.0.1/32&amp;quot;, &amp;quot;10.0.0.0/8&amp;quot;]&lt;br /&gt;
 trusted_proxies = []&lt;br /&gt;
 # Max registration requests per minute per IP (0 = use global rate limiter only)&lt;br /&gt;
 register_rate_limit_per_min = 1&lt;br /&gt;
 # Enable automatic cleanup of registered users that never completed a TXT update&lt;br /&gt;
 cleanup_orphans = true&lt;br /&gt;
 # Time (in minutes) to wait before deleting an inactive/orphan user&lt;br /&gt;
 orphan_timeout_mins = 30&lt;br /&gt;
 &lt;br /&gt;
 [logconfig]&lt;br /&gt;
 # logging level: &amp;quot;error&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;info&amp;quot; or &amp;quot;debug&amp;quot;&lt;br /&gt;
 loglevel = &amp;quot;info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O arquivo já possui comentários das opções de configuração para ajudá-lo a personalizar mais o serviço mas não entraremos em detalhe. Só buscar na documentação do projeto. Acima configuramos ele para funcionar com nossos dados fictícios, estará funcionando tanto via &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto via &#039;&#039;&#039;IPv6&#039;&#039;&#039; apontados para &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. Ele também já está configurado para solicitar para ele um certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; automaticamente.&lt;br /&gt;
&lt;br /&gt;
Após terminada a configuração acima, iniciaremos o serviço:&lt;br /&gt;
 # chown -R acme-dns:acme-dns /var/lib/acme-dns-rust&lt;br /&gt;
 # chown -R root:acme-dns /etc/acme-dns-rust&lt;br /&gt;
 # chmod 640 /etc/acme-dns-rust/config.toml&lt;br /&gt;
Agora precisamos criar nosso arquivo do systemd. Crie esse arquivo &#039;&#039;&#039;/etc/systemd/system/acme-dns-rust.service&#039;&#039;&#039; com o conteúdo abaixo:&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=acme-dns-rust Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=acme-dns&lt;br /&gt;
 Group=acme-dns&lt;br /&gt;
 WorkingDirectory=/var/lib/acme-dns-rust&lt;br /&gt;
 ExecStart=/usr/local/bin/acme-dns-rust --config /etc/acme-dns-rust/config.toml&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 AmbientCapabilities=CAP_NET_BIND_SERVICE&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Depois de salvar execute o comando abaixo. Ele solicitará uma senha para administração do seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;, para uso em CLI:&amp;lt;pre&amp;gt;&lt;br /&gt;
# acme-dns-rust --config /etc/acme-dns-rust/config.toml users list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable acme-dns-rust&lt;br /&gt;
 # systemctl start acme-dns-rust.service&lt;br /&gt;
Após iniciar o serviço teremos as seguintes portas up: &#039;&#039;&#039;53/udp&#039;&#039;&#039;, &#039;&#039;&#039;53/tcp&#039;&#039;&#039; e a &#039;&#039;&#039;443/tcp&#039;&#039;&#039;. Esta última porta é para a comunicação &#039;&#039;&#039;API&#039;&#039;&#039; entre o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns&#039;&#039;&#039;. Para checar se o serviço está rodando:&lt;br /&gt;
 # systemctl status acme-dns-rust&lt;br /&gt;
[[Arquivo:Acme-dns-02.png.png|nenhum|miniaturadaimagem|1454x1454px]]&lt;br /&gt;
&lt;br /&gt;
Você também pode monitorar o serviço através do comando:&lt;br /&gt;
 # journalctl -u acme-dns-rust.service -f&lt;br /&gt;
Importante! Para funcionar, o serviço de DNS Autoritativo tem que estar configurado certinho. Depois que o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; estiver rodando você pode checar assim. Lembre-se de fazer com seus dados reais.&lt;br /&gt;
 # host auth.seudominio.com.br&lt;br /&gt;
 auth.seudominio.com.br has address 198.18.0.1&lt;br /&gt;
 auth.seudominio.com.br has IPv6 address 2001:db8::198:18:0:1&lt;br /&gt;
Se apresentar erro de &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039;, então algo não ficou bem configurado no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;, ou &#039;&#039;&#039;na configuração do seu acme-dns-rust&#039;&#039;&#039;. Dê uma revisada novamente aqui no artigo.&lt;br /&gt;
&lt;br /&gt;
Se tudo ocorreu bem, então você tem um &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039; rodando e pronto para armazenar os &#039;&#039;&#039;desafios TXT da Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CERTBOT e ACME-DNS-CLIENT-RUST ==&lt;br /&gt;
Agora vamos entrar na parte de como gerar um certificado TLS para o seu servidor, mesmo que ele possua apenas IP privado, sem abertura de portas e mais seguro. Para todo sistema que precisarmos gerar certificados, utilizaremos o &#039;&#039;&#039;certbot&#039;&#039;&#039; e do &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No diagrama deste artigo dou como exemplo um servidor Web HTTPS e um outro com aplicação corporativa mas você poderá gerar certificados para qualquer ambiente.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez nosso ambiente será um GNU/Linux Debian 13 (Trixie). Coloque o binário do nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039; no servidor que receberá o certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install certbot&lt;br /&gt;
&lt;br /&gt;
Pronto! Instalamos o &#039;&#039;&#039;certbot&#039;&#039;&#039;, cliente ACME para fazer as solicitações e atualizações dos nossos certificados para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e também instalamos nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Registrando seu domínio e subdomínios que ira utilizar no seu servidor ==&lt;br /&gt;
Vamos supor que você tenha um &#039;&#039;&#039;ERP&#039;&#039;&#039; da empresa no &#039;&#039;&#039;IP 192.168.10.10&#039;&#039;&#039; e que queira gerar o certificado para ele. Após fazer os passos acima, façamos nosso registro no servidor com &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; rodando:&lt;br /&gt;
 # acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&lt;br /&gt;
Esse comando acima vai registrar no seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; o registro para &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039; e ele vai te vai solicitar que crie um desafio &#039;&#039;&#039;CNAME&#039;&#039;&#039; apontando para o seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. No exemplo abaixo a saída vai ser parecida mas o &#039;&#039;&#039;CNAME&#039;&#039;&#039; diferente para você cadastrar no seu DNS Autoritativo. O &#039;&#039;&#039;acme-dns-client-rust ficará aguardando e testando até que você gere esse registro CNAME&#039;&#039;&#039;. Aqui não optei por usar o registro &#039;&#039;&#039;CAA&#039;&#039;&#039; (Certification Authority Authorization) que seria para só autorizar determinada autoridade certificadora à assinar seu certificado.&lt;br /&gt;
 &#039;&#039;&#039;# acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Registering account for domain: sgp.redesimtelecom.net.br...&lt;br /&gt;
 &lt;br /&gt;
 Registration successful!&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 Username:   342f334e-5ce7-488b-8cf4-721a03fab0e5&lt;br /&gt;
 Password:   4W1c8O28Wod7GrP4bZWIXRKy0WSdUyjR-PLLBrYA&lt;br /&gt;
 FullDomain: 989c7170-37e4-4cb0-9f2b-9244aa404350.auth.ispfocus.net.br&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 Please create the following CNAME record in your DNS zone:&lt;br /&gt;
 &#039;&#039;&#039;_acme-challenge.erp.seudominio.com.br.&#039;&#039;&#039; IN CNAME &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br.&#039;&#039;&#039;&lt;br /&gt;
 Do you want acme-dns-client-rust to monitor the CNAME record change? [Y/n]: y&lt;br /&gt;
 &lt;br /&gt;
 Waiting for CNAME record propagation...&lt;br /&gt;
 Checking...                         &lt;br /&gt;
 CNAME propagation verified successfully!&lt;br /&gt;
 &lt;br /&gt;
 --- CAA Configuration ---&lt;br /&gt;
 A CAA record allows you to control certificate issuance safeguards.&lt;br /&gt;
 Do you wish to set up a CAA record now? [y/N]: &lt;br /&gt;
 Skipping CAA record setup.&lt;br /&gt;
Vejam como é interessante seu funcionamento: O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; para confirmar que você é o dono do domínio, ele procura pelo &#039;&#039;&#039;TXT&#039;&#039;&#039; com o desafio em &#039;&#039;&#039;_acme-challenge.seudominio.com.br&#039;&#039;&#039; só que ele não está no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039; e sim no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. O que o &#039;&#039;&#039;CNAME&#039;&#039;&#039; faz é repassar a consulta para o domínio &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br&#039;&#039;&#039; que está criado no seu &#039;&#039;&#039;acme-dns&#039;&#039;&#039;, que por sua vez contém o &#039;&#039;&#039;desafio TXT que a Let&#039;s Encrypt está procurando&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lembra que no início do artigo criamos o subdomínio &#039;&#039;&#039;auth.seudomínio.com.br&#039;&#039;&#039; e apontamos tudo que for para ele, consultar no &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;? Ou seja &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350&#039;&#039;&#039; é um subdomínio de &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. É confuso para quem nunca configurou um serviço de DNS mas se você realmente não está conseguindo entender, procure dar uma estudada sobre &#039;&#039;&#039;DNS (Domain Name System)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Após conseguirmos registrar o domínio acima, passamos para o uso com o &#039;&#039;&#039;certbot&#039;&#039;&#039;, para que possamos solicitar nosso certificado digital para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Usando o certbot com o acme-dns-client ==&lt;br /&gt;
Abaixo estamos solicitamos ao &#039;&#039;&#039;certbot&#039;&#039;&#039; ,usando o nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; como auth-hook, para gerar o certificado TLS para o &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039;. O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; gerará um &#039;&#039;&#039;desafio TXT (DNS-01)&#039;&#039;&#039; para o &#039;&#039;&#039;erp.seudomínio.com.br&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; incluirá o registro no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; fazendo com que a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; encontre o desafio e libere o certificado digital.&lt;br /&gt;
 # &#039;&#039;&#039;certbot certonly --manual --preferred-challenges dns --manual-auth-hook &#039;/usr/local/bin/acme-dns-client-rust&#039; -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Enter email address (used for urgent renewal and security notices)&lt;br /&gt;
  (Enter &#039;c&#039; to cancel): noc@seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Please read the Terms of Service at&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf&amp;lt;/nowiki&amp;gt;. You must&lt;br /&gt;
 agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: Y&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
 share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
 partner of the Let&#039;s Encrypt project and the non-profit organization that&lt;br /&gt;
 develops Certbot? We&#039;d like to send you email about our work encrypting the web,&lt;br /&gt;
 EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: N&lt;br /&gt;
 Account registered.&lt;br /&gt;
 Requesting a certificate for erp.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 Successfully received certificate.&lt;br /&gt;
 Certificate is saved at: /etc/letsencrypt/live/erp.seudominio.com.br/fullchain.pem&lt;br /&gt;
 Key is saved at:         /etc/letsencrypt/live/erp.seudominio.com.br/privkey.pem&lt;br /&gt;
 This certificate expires on 2025-07-22.&lt;br /&gt;
 These files will be updated when the certificate renews.&lt;br /&gt;
 Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 If you like Certbot, please consider supporting our work by:&lt;br /&gt;
  * Donating to ISRG / Let&#039;s Encrypt:   &amp;lt;nowiki&amp;gt;https://letsencrypt.org/donate&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  * Donating to EFF:                    &amp;lt;nowiki&amp;gt;https://eff.org/donate-le&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Os certificados são gerados em /etc/letsencrypt e aí só usá-los em suas aplicações.  Para atualizar automaticamente os certificados basta colocar algo assim em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew &amp;amp;&amp;amp; /usr/bin/systemctl reload nginx.service&lt;br /&gt;
Acima estamos renovando o certificado todo dia 01 de cada mês às 00:00 e na sequência recarregando o nginx para conter o novo certificado. Você pode adaptar para a sua realidade.&lt;br /&gt;
&lt;br /&gt;
Espero que seja útil este artigo e que agora não tenhamos mais que usar certificados TLS auto-assinados que são feios, não passam segurança e não confirmam a identidade de quem está fornecendo o serviço. Coloque certificado TLS válido em todos os seus serviços e mantenha as boas práticas em dia.&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto ACME-DNS-RUST ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o meu estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1174</id>
		<title>Certificado TLS com ACME-DNS e DNS-01</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1174"/>
		<updated>2026-07-10T15:51:38Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Diagrama exemplo ==&lt;br /&gt;
[[Arquivo:Acme-dns.drawio.png|semmoldura|685x685px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via &#039;&#039;&#039;HTTPS&#039;&#039;&#039;, servidores de envio e recebimento de e-mails (&#039;&#039;&#039;MTA&#039;&#039;&#039;s), clientes de e-mail (&#039;&#039;&#039;MUA&#039;&#039;&#039;s) quando se comunicam com os MTAs, DNS quando utilizamos &#039;&#039;&#039;DNSSEC&#039;&#039;&#039; e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando &#039;&#039;&#039;HTTP (80/tcp)&#039;&#039;&#039; e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum &#039;&#039;&#039;malware&#039;&#039;&#039; hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com &#039;&#039;&#039;criptografia assimétrica&#039;&#039;&#039; onde temos um par de chaves, a &#039;&#039;&#039;chave pública&#039;&#039;&#039; e uma &#039;&#039;&#039;chave privada&#039;&#039;&#039;. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as &#039;&#039;&#039;Autoridades Certificadoras (CA&#039;&#039;&#039;s&#039;&#039;&#039;)&#039;&#039;&#039;, elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;. Ela é uma opção gratuita e extremamente utilizada na Internet.&lt;br /&gt;
&lt;br /&gt;
== Como funciona a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; ==&lt;br /&gt;
Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039; lá no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.&lt;br /&gt;
&lt;br /&gt;
A Let&#039;s Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039;. Ela pode fazer isso de duas formas:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HTTP-01&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
No modelo de confirmação &#039;&#039;&#039;HTTP-01&#039;&#039;&#039; é necessário que a Let&#039;s Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com &#039;&#039;&#039;IP 192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;FD00::192:168:0:10&#039;&#039;&#039;. Aí nesse caso podemos tomar para uso a autenticação via &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usando DNS-01, a Let&#039;s Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let&#039;s Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar,  &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Meu artigo será exatamente sobre o uso do &#039;&#039;&#039;DNS-01&#039;&#039;&#039; e o &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ACME-DNS-RUST ==&lt;br /&gt;
O &#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust acme-dns-rust]&#039;&#039;&#039; é um micro servidor de DNS programado em &#039;&#039;&#039;Rust&#039;&#039;&#039; e que também tem o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; para comunicação com ele. O &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; terá a função de armazenar e atualizar os &#039;&#039;&#039;registros TXT de DNS&#039;&#039;&#039;, com os desafios gerados pela &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e este possui uma API HTTPS para se comunicar com o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar os seguintes programas neste artigo:&lt;br /&gt;
&lt;br /&gt;
* Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let&#039;s Encrypt.&lt;br /&gt;
* ACME-DNS-CLIENT-RUST, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.&lt;br /&gt;
* ACME-DNS-RUST, o serviço de DNS que armazenará os desafios para o seu servi__FORCARTDC__dor.&lt;br /&gt;
O funcionamento do conjunto &#039;&#039;&#039;acme-dns-rust/acme-dns-client-rust&#039;&#039;&#039; é bem simples, é necessário criarmos um &#039;&#039;&#039;subdomínio&#039;&#039;&#039; para a nossa gerência de desafios apontando para onde nosso &#039;&#039;&#039;servidor acme-dns-rust&#039;&#039;&#039; ficará rodando. Vamos usar para isso um sistema &#039;&#039;&#039;GNU/Linux Debian&#039;&#039;&#039; mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;:&lt;br /&gt;
 auth.seudominio.com.br.     IN NS ns1.auth.seudominio.com.br.&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN A 198.18.0.1&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN AAAA 2001:db8::198:18:0:1&lt;br /&gt;
Acima estamos criando nosso &#039;&#039;&#039;subdomínio auth&#039;&#039;&#039; e apontando para os &#039;&#039;&#039;IPs fictícios 198.18.0.1 e 2001:db8::198:18:0:1&#039;&#039;&#039; que é onde estará rodando nosso servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Esse serviço uma vez rodando, você poderá usá-lo para criar &#039;&#039;&#039;certificados TLS usando Let&#039;s Encrypt DNS-01&#039;&#039;&#039; para qualquer domínio, seja ele público ou privado.&lt;br /&gt;
&lt;br /&gt;
Para que você não precise instalar o cargo do Rust e compilar o projeto, você pode usar os &#039;&#039;&#039;binários&#039;&#039;&#039; já compilados pelo &#039;&#039;&#039;CI/CD do GitHub&#039;&#039;&#039;: https://github.com/gondimcodes/acme-dns-rust/releases&lt;br /&gt;
&lt;br /&gt;
Basta descompactá-los e colocá-los em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039;. Lá também tem os binários para &#039;&#039;&#039;FreeBSD&#039;&#039;&#039; se preferir.&lt;br /&gt;
&lt;br /&gt;
Agora falta pouco para termos rodando nosso &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Siga os passos abaixo:&lt;br /&gt;
 # useradd -r -s /bin/false acme-dns&lt;br /&gt;
 # mkdir -p /etc/acme-dns-rust&lt;br /&gt;
 # mkdir -p /var/lib/acme-dns-rust&lt;br /&gt;
Dentro do diretório &#039;&#039;&#039;/etc/acme-dns-rust&#039;&#039;&#039; criaremos um arquivo chamado &#039;&#039;&#039;config.toml&#039;&#039;&#039; e o conteúdo dele está configurado para o nosso exemplo, mas nesse caso é só você alterar as configurações para o seu uso em produção:&lt;br /&gt;
&lt;br /&gt;
Conteúdo de &#039;&#039;&#039;/etc/acme-dns-rust/config.toml&#039;&#039;&#039;:&lt;br /&gt;
 [general]&lt;br /&gt;
 # DNS interface. Note that systemd-resolved may reserve port 53 on 127.0.0.53&lt;br /&gt;
 # In this case acme-dns will error out and you will need to define the listening interface&lt;br /&gt;
 # for example: listen = &amp;quot;127.0.0.1:53&amp;quot;&lt;br /&gt;
 listen = &amp;quot;[::]:53&amp;quot;&lt;br /&gt;
 # protocol, &amp;quot;both&amp;quot;, &amp;quot;both4&amp;quot;, &amp;quot;both6&amp;quot;, &amp;quot;udp&amp;quot;, &amp;quot;udp4&amp;quot;, &amp;quot;udp6&amp;quot; or &amp;quot;tcp&amp;quot;, &amp;quot;tcp4&amp;quot;, &amp;quot;tcp6&amp;quot;&lt;br /&gt;
 protocol = &amp;quot;both&amp;quot;&lt;br /&gt;
 # domain name to serve the requests off of&lt;br /&gt;
 domain = &amp;quot;auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # zone name server&lt;br /&gt;
 nsname = &amp;quot;ns1.auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # admin email address, where @ is substituted with .&lt;br /&gt;
 nsadmin = &amp;quot;admin.seudominio.com.br&amp;quot;&lt;br /&gt;
 # predefined records served in addition to the TXT&lt;br /&gt;
 records = [&lt;br /&gt;
     # domain pointing to the public IP of your acme-dns server &lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. A 198.1.0.1&amp;quot;,&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. A 198.51.100.1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     # specify that auth.example.org will resolve any *.auth.example.org records&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. NS ns1.auth.seudominio.com.br.&amp;quot;,&lt;br /&gt;
 ]&lt;br /&gt;
 # debug messages from CORS etc&lt;br /&gt;
 debug = false&lt;br /&gt;
 &lt;br /&gt;
 [database]&lt;br /&gt;
 # Database engine to use, sqlite or postgres&lt;br /&gt;
 engine = &amp;quot;sqlite&amp;quot;&lt;br /&gt;
 # Connection string, filename for sqlite3 and postgres://$username:$password@$host/$db_name for postgres&lt;br /&gt;
 # Please note that the default Docker image uses path /var/lib/acme-dns/acme-dns.db for sqlite3&lt;br /&gt;
 connection = &amp;quot;/var/lib/acme-dns-rust/acme-dns.db&amp;quot;&lt;br /&gt;
 # connection = &amp;quot;postgres://user:password@localhost/acmedns_db&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [api]&lt;br /&gt;
 # listen ip eg. 127.0.0.1&lt;br /&gt;
 ip = &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
 # disable registration endpoint&lt;br /&gt;
 disable_registration = false&lt;br /&gt;
 # listen port, eg. 443 for default HTTPS&lt;br /&gt;
 port = &amp;quot;443&amp;quot;&lt;br /&gt;
 # possible values: &amp;quot;letsencrypt&amp;quot;, &amp;quot;letsencryptstaging&amp;quot;, &amp;quot;cert&amp;quot;, &amp;quot;none&amp;quot;&lt;br /&gt;
 tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;cert&amp;quot;&lt;br /&gt;
 tls_cert_privkey = &amp;quot;/etc/tls/example.org/privkey.pem&amp;quot;&lt;br /&gt;
 tls_cert_fullchain = &amp;quot;/etc/tls/example.org/fullchain.pem&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 acme_cache_dir = &amp;quot;api-certs&amp;quot;&lt;br /&gt;
 # optional e-mail address to which Let&#039;s Encrypt will send expiration notices for the API&#039;s cert&lt;br /&gt;
 notification_email = &amp;quot;&amp;quot;&lt;br /&gt;
 # CORS AllowOrigins, wildcards can be used&lt;br /&gt;
 corsorigins = [&lt;br /&gt;
     &amp;quot;*&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 # use HTTP header to get the client ip&lt;br /&gt;
 use_header = false&lt;br /&gt;
 # header name to pull the ip address / list of ip addresses from&lt;br /&gt;
 header_name = &amp;quot;X-Forwarded-For&amp;quot;&lt;br /&gt;
 # enable HSTS (HTTP Strict Transport Security)&lt;br /&gt;
 hsts_enabled = false&lt;br /&gt;
 # HSTS max age in seconds (default: 31536000 = 1 year)&lt;br /&gt;
 hsts_max_age = 31536000&lt;br /&gt;
 # HSTS include subdomains directive&lt;br /&gt;
 hsts_include_subdomains = false&lt;br /&gt;
 # HSTS preload directive&lt;br /&gt;
 hsts_preload = false&lt;br /&gt;
 # List of trusted reverse proxy IPs/CIDRs (used when use_header = true to prevent IP spoofing)&lt;br /&gt;
 # Example: [&amp;quot;127.0.0.1/32&amp;quot;, &amp;quot;10.0.0.0/8&amp;quot;]&lt;br /&gt;
 trusted_proxies = []&lt;br /&gt;
 # Max registration requests per minute per IP (0 = use global rate limiter only)&lt;br /&gt;
 register_rate_limit_per_min = 1&lt;br /&gt;
 &lt;br /&gt;
 [logconfig]&lt;br /&gt;
 # logging level: &amp;quot;error&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;info&amp;quot; or &amp;quot;debug&amp;quot;&lt;br /&gt;
 loglevel = &amp;quot;info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O arquivo já possui comentários das opções de configuração para ajudá-lo a personalizar mais o serviço mas não entraremos em detalhe. Só buscar na documentação do projeto. Acima configuramos ele para funcionar com nossos dados fictícios, estará funcionando tanto via &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto via &#039;&#039;&#039;IPv6&#039;&#039;&#039; apontados para &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. Ele também já está configurado para solicitar para ele um certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; automaticamente.&lt;br /&gt;
&lt;br /&gt;
Após terminada a configuração acima, iniciaremos o serviço:&lt;br /&gt;
 # chown -R acme-dns:acme-dns /var/lib/acme-dns-rust&lt;br /&gt;
 # chown -R root:acme-dns /etc/acme-dns-rust&lt;br /&gt;
 # chmod 640 /etc/acme-dns-rust/config.toml&lt;br /&gt;
Agora precisamos criar nosso arquivo do systemd. Crie esse arquivo &#039;&#039;&#039;/etc/systemd/system/acme-dns-rust.service&#039;&#039;&#039; com o conteúdo abaixo:&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=acme-dns-rust Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=acme-dns&lt;br /&gt;
 Group=acme-dns&lt;br /&gt;
 WorkingDirectory=/var/lib/acme-dns-rust&lt;br /&gt;
 ExecStart=/usr/local/bin/acme-dns-rust --config /etc/acme-dns-rust/config.toml&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 AmbientCapabilities=CAP_NET_BIND_SERVICE&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Depois de salvar execute o comando abaixo. Ele solicitará uma senha para administração do seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;, para uso em CLI:&amp;lt;pre&amp;gt;&lt;br /&gt;
# acme-dns-rust --config /etc/acme-dns-rust/config.toml users list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable acme-dns-rust&lt;br /&gt;
 # systemctl start acme-dns-rust.service&lt;br /&gt;
Após iniciar o serviço teremos as seguintes portas up: &#039;&#039;&#039;53/udp&#039;&#039;&#039;, &#039;&#039;&#039;53/tcp&#039;&#039;&#039; e a &#039;&#039;&#039;443/tcp&#039;&#039;&#039;. Esta última porta é para a comunicação &#039;&#039;&#039;API&#039;&#039;&#039; entre o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns&#039;&#039;&#039;. Para checar se o serviço está rodando:&lt;br /&gt;
 # systemctl status acme-dns-rust&lt;br /&gt;
[[Arquivo:Acme-dns-02.png.png|nenhum|miniaturadaimagem|1454x1454px]]&lt;br /&gt;
&lt;br /&gt;
Você também pode monitorar o serviço através do comando:&lt;br /&gt;
 # journalctl -u acme-dns-rust.service -f&lt;br /&gt;
Importante! Para funcionar, o serviço de DNS Autoritativo tem que estar configurado certinho. Depois que o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; estiver rodando você pode checar assim. Lembre-se de fazer com seus dados reais.&lt;br /&gt;
 # host auth.seudominio.com.br&lt;br /&gt;
 auth.seudominio.com.br has address 198.18.0.1&lt;br /&gt;
 auth.seudominio.com.br has IPv6 address 2001:db8::198:18:0:1&lt;br /&gt;
Se apresentar erro de &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039;, então algo não ficou bem configurado no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;, ou &#039;&#039;&#039;na configuração do seu acme-dns-rust&#039;&#039;&#039;. Dê uma revisada novamente aqui no artigo.&lt;br /&gt;
&lt;br /&gt;
Se tudo ocorreu bem, então você tem um &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039; rodando e pronto para armazenar os &#039;&#039;&#039;desafios TXT da Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CERTBOT e ACME-DNS-CLIENT-RUST ==&lt;br /&gt;
Agora vamos entrar na parte de como gerar um certificado TLS para o seu servidor, mesmo que ele possua apenas IP privado, sem abertura de portas e mais seguro. Para todo sistema que precisarmos gerar certificados, utilizaremos o &#039;&#039;&#039;certbot&#039;&#039;&#039; e do &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No diagrama deste artigo dou como exemplo um servidor Web HTTPS e um outro com aplicação corporativa mas você poderá gerar certificados para qualquer ambiente.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez nosso ambiente será um GNU/Linux Debian 13 (Trixie). Coloque o binário do nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039; no servidor que receberá o certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install certbot&lt;br /&gt;
&lt;br /&gt;
Pronto! Instalamos o &#039;&#039;&#039;certbot&#039;&#039;&#039;, cliente ACME para fazer as solicitações e atualizações dos nossos certificados para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e também instalamos nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Registrando seu domínio e subdomínios que ira utilizar no seu servidor ==&lt;br /&gt;
Vamos supor que você tenha um &#039;&#039;&#039;ERP&#039;&#039;&#039; da empresa no &#039;&#039;&#039;IP 192.168.10.10&#039;&#039;&#039; e que queira gerar o certificado para ele. Após fazer os passos acima, façamos nosso registro no servidor com &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; rodando:&lt;br /&gt;
 # acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&lt;br /&gt;
Esse comando acima vai registrar no seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; o registro para &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039; e ele vai te vai solicitar que crie um desafio &#039;&#039;&#039;CNAME&#039;&#039;&#039; apontando para o seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. No exemplo abaixo a saída vai ser parecida mas o &#039;&#039;&#039;CNAME&#039;&#039;&#039; diferente para você cadastrar no seu DNS Autoritativo. O &#039;&#039;&#039;acme-dns-client-rust ficará aguardando e testando até que você gere esse registro CNAME&#039;&#039;&#039;. Aqui não optei por usar o registro &#039;&#039;&#039;CAA&#039;&#039;&#039; (Certification Authority Authorization) que seria para só autorizar determinada autoridade certificadora à assinar seu certificado.&lt;br /&gt;
 &#039;&#039;&#039;# acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Registering account for domain: sgp.redesimtelecom.net.br...&lt;br /&gt;
 &lt;br /&gt;
 Registration successful!&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 Username:   342f334e-5ce7-488b-8cf4-721a03fab0e5&lt;br /&gt;
 Password:   4W1c8O28Wod7GrP4bZWIXRKy0WSdUyjR-PLLBrYA&lt;br /&gt;
 FullDomain: 989c7170-37e4-4cb0-9f2b-9244aa404350.auth.ispfocus.net.br&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 Please create the following CNAME record in your DNS zone:&lt;br /&gt;
 &#039;&#039;&#039;_acme-challenge.erp.seudominio.com.br.&#039;&#039;&#039; IN CNAME &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br.&#039;&#039;&#039;&lt;br /&gt;
 Do you want acme-dns-client-rust to monitor the CNAME record change? [Y/n]: y&lt;br /&gt;
 &lt;br /&gt;
 Waiting for CNAME record propagation...&lt;br /&gt;
 Checking...                         &lt;br /&gt;
 CNAME propagation verified successfully!&lt;br /&gt;
 &lt;br /&gt;
 --- CAA Configuration ---&lt;br /&gt;
 A CAA record allows you to control certificate issuance safeguards.&lt;br /&gt;
 Do you wish to set up a CAA record now? [y/N]: &lt;br /&gt;
 Skipping CAA record setup.&lt;br /&gt;
Vejam como é interessante seu funcionamento: O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; para confirmar que você é o dono do domínio, ele procura pelo &#039;&#039;&#039;TXT&#039;&#039;&#039; com o desafio em &#039;&#039;&#039;_acme-challenge.seudominio.com.br&#039;&#039;&#039; só que ele não está no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039; e sim no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. O que o &#039;&#039;&#039;CNAME&#039;&#039;&#039; faz é repassar a consulta para o domínio &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br&#039;&#039;&#039; que está criado no seu &#039;&#039;&#039;acme-dns&#039;&#039;&#039;, que por sua vez contém o &#039;&#039;&#039;desafio TXT que a Let&#039;s Encrypt está procurando&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lembra que no início do artigo criamos o subdomínio &#039;&#039;&#039;auth.seudomínio.com.br&#039;&#039;&#039; e apontamos tudo que for para ele, consultar no &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;? Ou seja &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350&#039;&#039;&#039; é um subdomínio de &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. É confuso para quem nunca configurou um serviço de DNS mas se você realmente não está conseguindo entender, procure dar uma estudada sobre &#039;&#039;&#039;DNS (Domain Name System)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Após conseguirmos registrar o domínio acima, passamos para o uso com o &#039;&#039;&#039;certbot&#039;&#039;&#039;, para que possamos solicitar nosso certificado digital para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Usando o certbot com o acme-dns-client ==&lt;br /&gt;
Abaixo estamos solicitamos ao &#039;&#039;&#039;certbot&#039;&#039;&#039; ,usando o nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; como auth-hook, para gerar o certificado TLS para o &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039;. O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; gerará um &#039;&#039;&#039;desafio TXT (DNS-01)&#039;&#039;&#039; para o &#039;&#039;&#039;erp.seudomínio.com.br&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; incluirá o registro no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; fazendo com que a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; encontre o desafio e libere o certificado digital.&lt;br /&gt;
 # &#039;&#039;&#039;certbot certonly --manual --preferred-challenges dns --manual-auth-hook &#039;/usr/local/bin/acme-dns-client-rust&#039; -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Enter email address (used for urgent renewal and security notices)&lt;br /&gt;
  (Enter &#039;c&#039; to cancel): noc@seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Please read the Terms of Service at&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf&amp;lt;/nowiki&amp;gt;. You must&lt;br /&gt;
 agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: Y&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
 share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
 partner of the Let&#039;s Encrypt project and the non-profit organization that&lt;br /&gt;
 develops Certbot? We&#039;d like to send you email about our work encrypting the web,&lt;br /&gt;
 EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: N&lt;br /&gt;
 Account registered.&lt;br /&gt;
 Requesting a certificate for erp.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 Successfully received certificate.&lt;br /&gt;
 Certificate is saved at: /etc/letsencrypt/live/erp.seudominio.com.br/fullchain.pem&lt;br /&gt;
 Key is saved at:         /etc/letsencrypt/live/erp.seudominio.com.br/privkey.pem&lt;br /&gt;
 This certificate expires on 2025-07-22.&lt;br /&gt;
 These files will be updated when the certificate renews.&lt;br /&gt;
 Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 If you like Certbot, please consider supporting our work by:&lt;br /&gt;
  * Donating to ISRG / Let&#039;s Encrypt:   &amp;lt;nowiki&amp;gt;https://letsencrypt.org/donate&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  * Donating to EFF:                    &amp;lt;nowiki&amp;gt;https://eff.org/donate-le&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Os certificados são gerados em /etc/letsencrypt e aí só usá-los em suas aplicações.  Para atualizar automaticamente os certificados basta colocar algo assim em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew &amp;amp;&amp;amp; /usr/bin/systemctl reload nginx.service&lt;br /&gt;
Acima estamos renovando o certificado todo dia 01 de cada mês às 00:00 e na sequência recarregando o nginx para conter o novo certificado. Você pode adaptar para a sua realidade.&lt;br /&gt;
&lt;br /&gt;
Espero que seja útil este artigo e que agora não tenhamos mais que usar certificados TLS auto-assinados que são feios, não passam segurança e não confirmam a identidade de quem está fornecendo o serviço. Coloque certificado TLS válido em todos os seus serviços e mantenha as boas práticas em dia.&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto ACME-DNS-RUST ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o meu estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1173</id>
		<title>Certificado TLS com ACME-DNS e DNS-01</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1173"/>
		<updated>2026-07-10T15:51:14Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Diagrama exemplo ==&lt;br /&gt;
[[Arquivo:Acme-dns.drawio.png|semmoldura|685x685px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via &#039;&#039;&#039;HTTPS&#039;&#039;&#039;, servidores de envio e recebimento de e-mails (&#039;&#039;&#039;MTA&#039;&#039;&#039;s), clientes de e-mail (&#039;&#039;&#039;MUA&#039;&#039;&#039;s) quando se comunicam com os MTAs, DNS quando utilizamos &#039;&#039;&#039;DNSSEC&#039;&#039;&#039; e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando &#039;&#039;&#039;HTTP (80/tcp)&#039;&#039;&#039; e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum &#039;&#039;&#039;malware&#039;&#039;&#039; hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com &#039;&#039;&#039;criptografia assimétrica&#039;&#039;&#039; onde temos um par de chaves, a &#039;&#039;&#039;chave pública&#039;&#039;&#039; e uma &#039;&#039;&#039;chave privada&#039;&#039;&#039;. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as &#039;&#039;&#039;Autoridades Certificadoras (CA&#039;&#039;&#039;s&#039;&#039;&#039;)&#039;&#039;&#039;, elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;. Ela é uma opção gratuita e extremamente utilizada na Internet.&lt;br /&gt;
&lt;br /&gt;
== Como funciona a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; ==&lt;br /&gt;
Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039; lá no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.&lt;br /&gt;
&lt;br /&gt;
A Let&#039;s Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039;. Ela pode fazer isso de duas formas:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HTTP-01&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
No modelo de confirmação &#039;&#039;&#039;HTTP-01&#039;&#039;&#039; é necessário que a Let&#039;s Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com &#039;&#039;&#039;IP 192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;FD00::192:168:0:10&#039;&#039;&#039;. Aí nesse caso podemos tomar para uso a autenticação via &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usando DNS-01, a Let&#039;s Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let&#039;s Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar,  &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Meu artigo será exatamente sobre o uso do &#039;&#039;&#039;DNS-01&#039;&#039;&#039; e o &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ACME-DNS-RUST ==&lt;br /&gt;
O &#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust acme-dns-rust]&#039;&#039;&#039; é um micro servidor de DNS programado em &#039;&#039;&#039;Rust&#039;&#039;&#039; e que também tem o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; para comunicação com ele. O &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; terá a função de armazenar e atualizar os &#039;&#039;&#039;registros TXT de DNS&#039;&#039;&#039;, com os desafios gerados pela &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e este possui uma API HTTPS para se comunicar com o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar os seguintes programas neste artigo:&lt;br /&gt;
&lt;br /&gt;
* Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let&#039;s Encrypt.&lt;br /&gt;
* ACME-DNS-CLIENT-RUST, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.&lt;br /&gt;
* ACME-DNS-RUST, o serviço de DNS que armazenará os desafios para o seu servi__FORCARTDC__dor.&lt;br /&gt;
O funcionamento do conjunto &#039;&#039;&#039;acme-dns-rust/acme-dns-client-rust&#039;&#039;&#039; é bem simples, é necessário criarmos um &#039;&#039;&#039;subdomínio&#039;&#039;&#039; para a nossa gerência de desafios apontando para onde nosso &#039;&#039;&#039;servidor acme-dns-rust&#039;&#039;&#039; ficará rodando. Vamos usar para isso um sistema &#039;&#039;&#039;GNU/Linux Debian&#039;&#039;&#039; mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;:&lt;br /&gt;
 auth.seudominio.com.br.     IN NS ns1.auth.seudominio.com.br.&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN A 198.18.0.1&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN AAAA 2001:db8::198:18:0:1&lt;br /&gt;
Acima estamos criando nosso &#039;&#039;&#039;subdomínio auth&#039;&#039;&#039; e apontando para os &#039;&#039;&#039;IPs fictícios 198.18.0.1 e 2001:db8::198:18:0:1&#039;&#039;&#039; que é onde estará rodando nosso servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Esse serviço uma vez rodando, você poderá usá-lo para criar &#039;&#039;&#039;certificados TLS usando Let&#039;s Encrypt DNS-01&#039;&#039;&#039; para qualquer domínio, seja ele público ou privado.&lt;br /&gt;
&lt;br /&gt;
Para que você não precise instalar o cargo do Rust e compilar o projeto, você pode usar os &#039;&#039;&#039;binários&#039;&#039;&#039; já compilados pelo &#039;&#039;&#039;CI/CD do GitHub&#039;&#039;&#039;: https://github.com/gondimcodes/acme-dns-rust/releases&lt;br /&gt;
&lt;br /&gt;
Basta descompactá-los e colocá-los em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039;. Lá também tem os binários para &#039;&#039;&#039;FreeBSD&#039;&#039;&#039; se preferir.&lt;br /&gt;
&lt;br /&gt;
Agora falta pouco para termos rodando nosso &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Siga os passos abaixo:&lt;br /&gt;
 # useradd -r -s /bin/false acme-dns&lt;br /&gt;
 # mkdir -p /etc/acme-dns-rust&lt;br /&gt;
 # mkdir -p /var/lib/acme-dns-rust&lt;br /&gt;
Dentro do diretório &#039;&#039;&#039;/etc/acme-dns-rust&#039;&#039;&#039; criaremos um arquivo chamado &#039;&#039;&#039;config.toml&#039;&#039;&#039; e o conteúdo dele está configurado para o nosso exemplo, mas nesse caso é só você alterar as configurações para o seu uso em produção:&lt;br /&gt;
&lt;br /&gt;
Conteúdo de &#039;&#039;&#039;/etc/acme-dns-rust/config.toml&#039;&#039;&#039;:&lt;br /&gt;
 [general]&lt;br /&gt;
 # DNS interface. Note that systemd-resolved may reserve port 53 on 127.0.0.53&lt;br /&gt;
 # In this case acme-dns will error out and you will need to define the listening interface&lt;br /&gt;
 # for example: listen = &amp;quot;127.0.0.1:53&amp;quot;&lt;br /&gt;
 listen = &amp;quot;[::]:53&amp;quot;&lt;br /&gt;
 # protocol, &amp;quot;both&amp;quot;, &amp;quot;both4&amp;quot;, &amp;quot;both6&amp;quot;, &amp;quot;udp&amp;quot;, &amp;quot;udp4&amp;quot;, &amp;quot;udp6&amp;quot; or &amp;quot;tcp&amp;quot;, &amp;quot;tcp4&amp;quot;, &amp;quot;tcp6&amp;quot;&lt;br /&gt;
 protocol = &amp;quot;both&amp;quot;&lt;br /&gt;
 # domain name to serve the requests off of&lt;br /&gt;
 domain = &amp;quot;auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # zone name server&lt;br /&gt;
 nsname = &amp;quot;ns1.auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # admin email address, where @ is substituted with .&lt;br /&gt;
 nsadmin = &amp;quot;admin.seudominio.com.br&amp;quot;&lt;br /&gt;
 # predefined records served in addition to the TXT&lt;br /&gt;
 records = [&lt;br /&gt;
     # domain pointing to the public IP of your acme-dns server &lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. A 198.1.0.1&amp;quot;,&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. A 198.51.100.1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     # specify that auth.example.org will resolve any *.auth.example.org records&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. NS ns1.auth.seudominio.com.br.&amp;quot;,&lt;br /&gt;
 ]&lt;br /&gt;
 # debug messages from CORS etc&lt;br /&gt;
 debug = false&lt;br /&gt;
 &lt;br /&gt;
 [database]&lt;br /&gt;
 # Database engine to use, sqlite or postgres&lt;br /&gt;
 engine = &amp;quot;sqlite&amp;quot;&lt;br /&gt;
 # Connection string, filename for sqlite3 and postgres://$username:$password@$host/$db_name for postgres&lt;br /&gt;
 # Please note that the default Docker image uses path /var/lib/acme-dns/acme-dns.db for sqlite3&lt;br /&gt;
 connection = &amp;quot;/var/lib/acme-dns-rust/acme-dns.db&amp;quot;&lt;br /&gt;
 # connection = &amp;quot;postgres://user:password@localhost/acmedns_db&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [api]&lt;br /&gt;
 # listen ip eg. 127.0.0.1&lt;br /&gt;
 ip = &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
 # disable registration endpoint&lt;br /&gt;
 disable_registration = false&lt;br /&gt;
 # listen port, eg. 443 for default HTTPS&lt;br /&gt;
 port = &amp;quot;443&amp;quot;&lt;br /&gt;
 # possible values: &amp;quot;letsencrypt&amp;quot;, &amp;quot;letsencryptstaging&amp;quot;, &amp;quot;cert&amp;quot;, &amp;quot;none&amp;quot;&lt;br /&gt;
 tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;cert&amp;quot;&lt;br /&gt;
 tls_cert_privkey = &amp;quot;/etc/tls/example.org/privkey.pem&amp;quot;&lt;br /&gt;
 tls_cert_fullchain = &amp;quot;/etc/tls/example.org/fullchain.pem&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 acme_cache_dir = &amp;quot;api-certs&amp;quot;&lt;br /&gt;
 # optional e-mail address to which Let&#039;s Encrypt will send expiration notices for the API&#039;s cert&lt;br /&gt;
 notification_email = &amp;quot;&amp;quot;&lt;br /&gt;
 # CORS AllowOrigins, wildcards can be used&lt;br /&gt;
 corsorigins = [&lt;br /&gt;
     &amp;quot;*&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 # use HTTP header to get the client ip&lt;br /&gt;
 use_header = false&lt;br /&gt;
 # header name to pull the ip address / list of ip addresses from&lt;br /&gt;
 header_name = &amp;quot;X-Forwarded-For&amp;quot;&lt;br /&gt;
 # enable HSTS (HTTP Strict Transport Security)&lt;br /&gt;
 hsts_enabled = false&lt;br /&gt;
 # HSTS max age in seconds (default: 31536000 = 1 year)&lt;br /&gt;
 hsts_max_age = 31536000&lt;br /&gt;
 # HSTS include subdomains directive&lt;br /&gt;
 hsts_include_subdomains = false&lt;br /&gt;
 # HSTS preload directive&lt;br /&gt;
 hsts_preload = false&lt;br /&gt;
 # List of trusted reverse proxy IPs/CIDRs (used when use_header = true to prevent IP spoofing)&lt;br /&gt;
 # Example: [&amp;quot;127.0.0.1/32&amp;quot;, &amp;quot;10.0.0.0/8&amp;quot;]&lt;br /&gt;
 trusted_proxies = []&lt;br /&gt;
 # Max registration requests per minute per IP (0 = use global rate limiter only)&lt;br /&gt;
 register_rate_limit_per_min = 1&lt;br /&gt;
 &lt;br /&gt;
 [logconfig]&lt;br /&gt;
 # logging level: &amp;quot;error&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;info&amp;quot; or &amp;quot;debug&amp;quot;&lt;br /&gt;
 loglevel = &amp;quot;info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O arquivo já possui comentários das opções de configuração para ajudá-lo a personalizar mais o serviço mas não entraremos em detalhe. Só buscar na documentação do projeto. Acima configuramos ele para funcionar com nossos dados fictícios, estará funcionando tanto via &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto via &#039;&#039;&#039;IPv6&#039;&#039;&#039; apontados para &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. Ele também já está configurado para solicitar para ele um certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; automaticamente.&lt;br /&gt;
&lt;br /&gt;
Após terminada a configuração acima, iniciaremos o serviço:&lt;br /&gt;
 # chown -R acme-dns:acme-dns /var/lib/acme-dns-rust&lt;br /&gt;
 # chown -R root:acme-dns /etc/acme-dns-rust&lt;br /&gt;
 # chmod 640 /etc/acme-dns-rust/config.toml&lt;br /&gt;
Agora precisamos criar nosso arquivo do systemd. Crie esse arquivo &#039;&#039;&#039;/etc/systemd/system/acme-dns-rust.service&#039;&#039;&#039; com o conteúdo abaixo:&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=acme-dns-rust Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=acme-dns&lt;br /&gt;
 Group=acme-dns&lt;br /&gt;
 WorkingDirectory=/var/lib/acme-dns-rust&lt;br /&gt;
 ExecStart=/usr/local/bin/acme-dns-rust --config /etc/acme-dns-rust/config.toml&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 AmbientCapabilities=CAP_NET_BIND_SERVICE&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Depois de salvar execute o comando abaixo. Ele solicitará uma senha para administração do seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;, para uso em CLI:&amp;lt;pre&amp;gt;&lt;br /&gt;
# acme-dns-rust --config /etc/acme-dns-rust/config.toml users list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable acme-dns-rust&lt;br /&gt;
 # systemctl start acme-dns-rust.service&lt;br /&gt;
Após iniciar o serviço teremos as seguintes portas up: &#039;&#039;&#039;53/udp&#039;&#039;&#039;, &#039;&#039;&#039;53/tcp&#039;&#039;&#039; e a &#039;&#039;&#039;443/tcp&#039;&#039;&#039;. Esta última porta é para a comunicação &#039;&#039;&#039;API&#039;&#039;&#039; entre o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns&#039;&#039;&#039;. Para checar se o serviço está rodando:&lt;br /&gt;
 # systemctl status acme-dns-rust&lt;br /&gt;
[[Arquivo:Acme-dns-02.png.png|nenhum|miniaturadaimagem|1454x1454px]]&lt;br /&gt;
&lt;br /&gt;
Você também pode monitorar o serviço através do comando:&lt;br /&gt;
 # journalctl -u acme-dns-rust.service -f&lt;br /&gt;
Importante! Para funcionar, o serviço de DNS Autoritativo tem que estar configurado certinho. Depois que o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; estiver rodando você pode checar assim. Lembre-se de fazer com seus dados reais.&lt;br /&gt;
 # host auth.seudominio.com.br&lt;br /&gt;
 auth.seudominio.com.br has address 198.18.0.1&lt;br /&gt;
 auth.seudominio.com.br has IPv6 address 2001:db8::198:18:0:1&lt;br /&gt;
Se apresentar erro de &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039;, então algo não ficou bem configurado no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;, ou &#039;&#039;&#039;na configuração do seu acme-dns-rust&#039;&#039;&#039;. Dê uma revisada novamente aqui no artigo.&lt;br /&gt;
&lt;br /&gt;
Se tudo ocorreu bem, então você tem um &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039; rodando e pronto para armazenar os &#039;&#039;&#039;desafios TXT da Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CERTBOT e ACME-DNS-CLIENT-RUST ==&lt;br /&gt;
Agora vamos entrar na parte de como gerar um certificado TLS para o seu servidor, mesmo que ele possua apenas IP privado, sem abertura de portas e mais seguro. Para todo sistema que precisarmos gerar certificados, utilizaremos o &#039;&#039;&#039;certbot&#039;&#039;&#039; e do &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No diagrama deste artigo dou como exemplo um servidor Web HTTPS e um outro com aplicação corporativa mas você poderá gerar certificados para qualquer ambiente.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez nosso ambiente será um GNU/Linux Debian 13 (Trixie). Coloque o binário do nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039; no servidor que receberá o certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install certbot&lt;br /&gt;
&lt;br /&gt;
Pronto! Instalamos o &#039;&#039;&#039;certbot&#039;&#039;&#039;, cliente ACME para fazer as solicitações e atualizações dos nossos certificados para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e também instalamos nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Registrando seu domínio e subdomínios que ira utilizar no seu servidor ==&lt;br /&gt;
Vamos supor que você tenha um &#039;&#039;&#039;ERP&#039;&#039;&#039; da empresa no &#039;&#039;&#039;IP 192.168.10.10&#039;&#039;&#039; e que queira gerar o certificado para ele. Após fazer os passos acima, façamos nosso registro no servidor com &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; rodando:&lt;br /&gt;
 # acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&lt;br /&gt;
Esse comando acima vai registrar no seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; o registro para &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039; e ele vai te vai solicitar que crie um desafio &#039;&#039;&#039;CNAME&#039;&#039;&#039; apontando para o seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. No exemplo abaixo a saída vai ser parecida mas o &#039;&#039;&#039;CNAME&#039;&#039;&#039; diferente para você cadastrar no seu DNS Autoritativo. O &#039;&#039;&#039;acme-dns-client-rust ficará aguardando e testando até que você gere esse registro CNAME&#039;&#039;&#039;. Aqui não optei por usar o registro &#039;&#039;&#039;CAA&#039;&#039;&#039; (Certification Authority Authorization) que seria para só autorizar determinada autoridade certificadora à assinar seu certificado.&lt;br /&gt;
 &#039;&#039;&#039;# acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Registering account for domain: sgp.redesimtelecom.net.br...&lt;br /&gt;
 &lt;br /&gt;
 Registration successful!&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 Username:   342f334e-5ce7-488b-8cf4-721a03fab0e5&lt;br /&gt;
 Password:   4W1c8O28Wod7GrP4bZWIXRKy0WSdUyjR-PLLBrYA&lt;br /&gt;
 FullDomain: 989c7170-37e4-4cb0-9f2b-9244aa404350.auth.ispfocus.net.br&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 Please create the following CNAME record in your DNS zone:&lt;br /&gt;
 &#039;&#039;&#039;_acme-challenge.erp.seudominio.com.br.&#039;&#039;&#039; IN CNAME &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br.&#039;&#039;&#039;&lt;br /&gt;
 Do you want acme-dns-client-rust to monitor the CNAME record change? [Y/n]: y&lt;br /&gt;
 &lt;br /&gt;
 Waiting for CNAME record propagation...&lt;br /&gt;
 Checking...                         &lt;br /&gt;
 CNAME propagation verified successfully!&lt;br /&gt;
 &lt;br /&gt;
 --- CAA Configuration ---&lt;br /&gt;
 A CAA record allows you to control certificate issuance safeguards.&lt;br /&gt;
 Do you wish to set up a CAA record now? [y/N]: &lt;br /&gt;
 Skipping CAA record setup.&lt;br /&gt;
Vejam como é interessante seu funcionamento: O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; para confirmar que você é o dono do domínio, ele procura pelo &#039;&#039;&#039;TXT&#039;&#039;&#039; com o desafio em &#039;&#039;&#039;_acme-challenge.seudominio.com.br&#039;&#039;&#039; só que ele não está no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039; e sim no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. O que o &#039;&#039;&#039;CNAME&#039;&#039;&#039; faz é repassar a consulta para o domínio &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br&#039;&#039;&#039; que está criado no seu &#039;&#039;&#039;acme-dns&#039;&#039;&#039;, que por sua vez contém o &#039;&#039;&#039;desafio TXT que a Let&#039;s Encrypt está procurando&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lembra que no início do artigo criamos o subdomínio &#039;&#039;&#039;auth.seudomínio.com.br&#039;&#039;&#039; e apontamos tudo que for para ele, consultar no &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;? Ou seja &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350&#039;&#039;&#039; é um subdomínio de &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. É confuso para quem nunca configurou um serviço de DNS mas se você realmente não está conseguindo entender, procure dar uma estudada sobre &#039;&#039;&#039;DNS (Domain Name System)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Após conseguirmos registrar o domínio acima, passamos para o uso com o &#039;&#039;&#039;certbot&#039;&#039;&#039;, para que possamos solicitar nosso certificado digital para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Usando o certbot com o acme-dns-client ==&lt;br /&gt;
Abaixo estamos solicitamos ao &#039;&#039;&#039;certbot&#039;&#039;&#039; ,usando o nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; como auth-hook, para gerar o certificado TLS para o &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039;. O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; gerará um &#039;&#039;&#039;desafio TXT (DNS-01)&#039;&#039;&#039; para o &#039;&#039;&#039;erp.seudomínio.com.br&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; incluirá o registro no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; fazendo com que a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; encontre o desafio e libere o certificado digital.&lt;br /&gt;
 # &#039;&#039;&#039;certbot certonly --manual --preferred-challenges dns --manual-auth-hook &#039;/usr/local/bin/acme-dns-client-rust&#039; -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Enter email address (used for urgent renewal and security notices)&lt;br /&gt;
  (Enter &#039;c&#039; to cancel): noc@seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Please read the Terms of Service at&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf&amp;lt;/nowiki&amp;gt;. You must&lt;br /&gt;
 agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: Y&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
 share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
 partner of the Let&#039;s Encrypt project and the non-profit organization that&lt;br /&gt;
 develops Certbot? We&#039;d like to send you email about our work encrypting the web,&lt;br /&gt;
 EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: N&lt;br /&gt;
 Account registered.&lt;br /&gt;
 Requesting a certificate for erp.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 Successfully received certificate.&lt;br /&gt;
 Certificate is saved at: /etc/letsencrypt/live/erp.seudominio.com.br/fullchain.pem&lt;br /&gt;
 Key is saved at:         /etc/letsencrypt/live/erp.seudominio.com.br/privkey.pem&lt;br /&gt;
 This certificate expires on 2025-07-22.&lt;br /&gt;
 These files will be updated when the certificate renews.&lt;br /&gt;
 Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 If you like Certbot, please consider supporting our work by:&lt;br /&gt;
  * Donating to ISRG / Let&#039;s Encrypt:   &amp;lt;nowiki&amp;gt;https://letsencrypt.org/donate&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  * Donating to EFF:                    &amp;lt;nowiki&amp;gt;https://eff.org/donate-le&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Os certificados são gerados em /etc/letsencrypt e aí só usá-los em suas aplicações.  Para atualizar automaticamente os certificados basta colocar algo assim em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew &amp;amp;&amp;amp; /usr/bin/systemctl reload nginx.service&lt;br /&gt;
Acima estamos renovando o certificado todo dia 01 de cada mês às 00:00 e na sequência recarregando o nginx para conter o novo certificado. Você pode adaptar para a sua realidade.&lt;br /&gt;
&lt;br /&gt;
Espero que seja útil este artigo e que agora não tenhamos mais que usar certificados TLS auto-assinados que são feios, não passam segurança e não confirmam a identidade de quem está fornecendo o serviço. Coloque certificado TLS válido em todos os seus serviços e mantenha as boas práticas em dia.&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto UNBOUND-KINDNS ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o meu estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1172</id>
		<title>Certificado TLS com ACME-DNS e DNS-01</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1172"/>
		<updated>2026-07-10T15:49:58Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Diagrama exemplo ==&lt;br /&gt;
[[Arquivo:Acme-dns.drawio.png|semmoldura|685x685px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via &#039;&#039;&#039;HTTPS&#039;&#039;&#039;, servidores de envio e recebimento de e-mails (&#039;&#039;&#039;MTA&#039;&#039;&#039;s), clientes de e-mail (&#039;&#039;&#039;MUA&#039;&#039;&#039;s) quando se comunicam com os MTAs, DNS quando utilizamos &#039;&#039;&#039;DNSSEC&#039;&#039;&#039; e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando &#039;&#039;&#039;HTTP (80/tcp)&#039;&#039;&#039; e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum &#039;&#039;&#039;malware&#039;&#039;&#039; hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com &#039;&#039;&#039;criptografia assimétrica&#039;&#039;&#039; onde temos um par de chaves, a &#039;&#039;&#039;chave pública&#039;&#039;&#039; e uma &#039;&#039;&#039;chave privada&#039;&#039;&#039;. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as &#039;&#039;&#039;Autoridades Certificadoras (CA&#039;&#039;&#039;s&#039;&#039;&#039;)&#039;&#039;&#039;, elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;. Ela é uma opção gratuita e extremamente utilizada na Internet.&lt;br /&gt;
&lt;br /&gt;
== Como funciona a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; ==&lt;br /&gt;
Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039; lá no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.&lt;br /&gt;
&lt;br /&gt;
A Let&#039;s Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039;. Ela pode fazer isso de duas formas:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HTTP-01&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
No modelo de confirmação &#039;&#039;&#039;HTTP-01&#039;&#039;&#039; é necessário que a Let&#039;s Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com &#039;&#039;&#039;IP 192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;FD00::192:168:0:10&#039;&#039;&#039;. Aí nesse caso podemos tomar para uso a autenticação via &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usando DNS-01, a Let&#039;s Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let&#039;s Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar,  &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Meu artigo será exatamente sobre o uso do &#039;&#039;&#039;DNS-01&#039;&#039;&#039; e o &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ACME-DNS-RUST ==&lt;br /&gt;
O &#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust acme-dns-rust]&#039;&#039;&#039; é um micro servidor de DNS programado em &#039;&#039;&#039;Rust&#039;&#039;&#039; e que também tem o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; para comunicação com ele. O &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; terá a função de armazenar e atualizar os &#039;&#039;&#039;registros TXT de DNS&#039;&#039;&#039;, com os desafios gerados pela &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e este possui uma API HTTPS para se comunicar com o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar os seguintes programas neste artigo:&lt;br /&gt;
&lt;br /&gt;
* Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let&#039;s Encrypt.&lt;br /&gt;
* ACME-DNS-CLIENT-RUST, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.&lt;br /&gt;
* ACME-DNS-RUST, o serviço de DNS que armazenará os desafios para o seu servi__FORCARTDC__dor.&lt;br /&gt;
O funcionamento do conjunto &#039;&#039;&#039;acme-dns-rust/acme-dns-client-rust&#039;&#039;&#039; é bem simples, é necessário criarmos um &#039;&#039;&#039;subdomínio&#039;&#039;&#039; para a nossa gerência de desafios apontando para onde nosso &#039;&#039;&#039;servidor acme-dns-rust&#039;&#039;&#039; ficará rodando. Vamos usar para isso um sistema &#039;&#039;&#039;GNU/Linux Debian&#039;&#039;&#039; mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;:&lt;br /&gt;
 auth.seudominio.com.br.     IN NS ns1.auth.seudominio.com.br.&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN A 198.18.0.1&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN AAAA 2001:db8::198:18:0:1&lt;br /&gt;
Acima estamos criando nosso &#039;&#039;&#039;subdomínio auth&#039;&#039;&#039; e apontando para os &#039;&#039;&#039;IPs fictícios 198.18.0.1 e 2001:db8::198:18:0:1&#039;&#039;&#039; que é onde estará rodando nosso servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Esse serviço uma vez rodando, você poderá usá-lo para criar &#039;&#039;&#039;certificados TLS usando Let&#039;s Encrypt DNS-01&#039;&#039;&#039; para qualquer domínio, seja ele público ou privado.&lt;br /&gt;
&lt;br /&gt;
Para que você não precise instalar o cargo do Rust e compilar o projeto, você pode usar os &#039;&#039;&#039;binários&#039;&#039;&#039; já compilados pelo &#039;&#039;&#039;CI/CD do GitHub&#039;&#039;&#039;: https://github.com/gondimcodes/acme-dns-rust/releases&lt;br /&gt;
&lt;br /&gt;
Basta descompactá-los e colocá-los em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039;. Lá também tem os binários para &#039;&#039;&#039;FreeBSD&#039;&#039;&#039; se preferir.&lt;br /&gt;
&lt;br /&gt;
Agora falta pouco para termos rodando nosso &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Siga os passos abaixo:&lt;br /&gt;
 # useradd -r -s /bin/false acme-dns&lt;br /&gt;
 # mkdir -p /etc/acme-dns-rust&lt;br /&gt;
 # mkdir -p /var/lib/acme-dns-rust&lt;br /&gt;
Dentro do diretório &#039;&#039;&#039;/etc/acme-dns-rust&#039;&#039;&#039; criaremos um arquivo chamado &#039;&#039;&#039;config.toml&#039;&#039;&#039; e o conteúdo dele está configurado para o nosso exemplo, mas nesse caso é só você alterar as configurações para o seu uso em produção:&lt;br /&gt;
&lt;br /&gt;
Conteúdo de &#039;&#039;&#039;/etc/acme-dns-rust/config.toml&#039;&#039;&#039;:&lt;br /&gt;
 [general]&lt;br /&gt;
 # DNS interface. Note that systemd-resolved may reserve port 53 on 127.0.0.53&lt;br /&gt;
 # In this case acme-dns will error out and you will need to define the listening interface&lt;br /&gt;
 # for example: listen = &amp;quot;127.0.0.1:53&amp;quot;&lt;br /&gt;
 listen = &amp;quot;[::]:53&amp;quot;&lt;br /&gt;
 # protocol, &amp;quot;both&amp;quot;, &amp;quot;both4&amp;quot;, &amp;quot;both6&amp;quot;, &amp;quot;udp&amp;quot;, &amp;quot;udp4&amp;quot;, &amp;quot;udp6&amp;quot; or &amp;quot;tcp&amp;quot;, &amp;quot;tcp4&amp;quot;, &amp;quot;tcp6&amp;quot;&lt;br /&gt;
 protocol = &amp;quot;both&amp;quot;&lt;br /&gt;
 # domain name to serve the requests off of&lt;br /&gt;
 domain = &amp;quot;auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # zone name server&lt;br /&gt;
 nsname = &amp;quot;ns1.auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # admin email address, where @ is substituted with .&lt;br /&gt;
 nsadmin = &amp;quot;admin.seudominio.com.br&amp;quot;&lt;br /&gt;
 # predefined records served in addition to the TXT&lt;br /&gt;
 records = [&lt;br /&gt;
     # domain pointing to the public IP of your acme-dns server &lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. A 198.1.0.1&amp;quot;,&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. A 198.51.100.1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     # specify that auth.example.org will resolve any *.auth.example.org records&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. NS ns1.auth.seudominio.com.br.&amp;quot;,&lt;br /&gt;
 ]&lt;br /&gt;
 # debug messages from CORS etc&lt;br /&gt;
 debug = false&lt;br /&gt;
 &lt;br /&gt;
 [database]&lt;br /&gt;
 # Database engine to use, sqlite or postgres&lt;br /&gt;
 engine = &amp;quot;sqlite&amp;quot;&lt;br /&gt;
 # Connection string, filename for sqlite3 and postgres://$username:$password@$host/$db_name for postgres&lt;br /&gt;
 # Please note that the default Docker image uses path /var/lib/acme-dns/acme-dns.db for sqlite3&lt;br /&gt;
 connection = &amp;quot;/var/lib/acme-dns-rust/acme-dns.db&amp;quot;&lt;br /&gt;
 # connection = &amp;quot;postgres://user:password@localhost/acmedns_db&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [api]&lt;br /&gt;
 # listen ip eg. 127.0.0.1&lt;br /&gt;
 ip = &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
 # disable registration endpoint&lt;br /&gt;
 disable_registration = false&lt;br /&gt;
 # listen port, eg. 443 for default HTTPS&lt;br /&gt;
 port = &amp;quot;443&amp;quot;&lt;br /&gt;
 # possible values: &amp;quot;letsencrypt&amp;quot;, &amp;quot;letsencryptstaging&amp;quot;, &amp;quot;cert&amp;quot;, &amp;quot;none&amp;quot;&lt;br /&gt;
 tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;cert&amp;quot;&lt;br /&gt;
 tls_cert_privkey = &amp;quot;/etc/tls/example.org/privkey.pem&amp;quot;&lt;br /&gt;
 tls_cert_fullchain = &amp;quot;/etc/tls/example.org/fullchain.pem&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 acme_cache_dir = &amp;quot;api-certs&amp;quot;&lt;br /&gt;
 # optional e-mail address to which Let&#039;s Encrypt will send expiration notices for the API&#039;s cert&lt;br /&gt;
 notification_email = &amp;quot;&amp;quot;&lt;br /&gt;
 # CORS AllowOrigins, wildcards can be used&lt;br /&gt;
 corsorigins = [&lt;br /&gt;
     &amp;quot;*&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 # use HTTP header to get the client ip&lt;br /&gt;
 use_header = false&lt;br /&gt;
 # header name to pull the ip address / list of ip addresses from&lt;br /&gt;
 header_name = &amp;quot;X-Forwarded-For&amp;quot;&lt;br /&gt;
 # enable HSTS (HTTP Strict Transport Security)&lt;br /&gt;
 hsts_enabled = false&lt;br /&gt;
 # HSTS max age in seconds (default: 31536000 = 1 year)&lt;br /&gt;
 hsts_max_age = 31536000&lt;br /&gt;
 # HSTS include subdomains directive&lt;br /&gt;
 hsts_include_subdomains = false&lt;br /&gt;
 # HSTS preload directive&lt;br /&gt;
 hsts_preload = false&lt;br /&gt;
 # List of trusted reverse proxy IPs/CIDRs (used when use_header = true to prevent IP spoofing)&lt;br /&gt;
 # Example: [&amp;quot;127.0.0.1/32&amp;quot;, &amp;quot;10.0.0.0/8&amp;quot;]&lt;br /&gt;
 trusted_proxies = []&lt;br /&gt;
 # Max registration requests per minute per IP (0 = use global rate limiter only)&lt;br /&gt;
 register_rate_limit_per_min = 1&lt;br /&gt;
 &lt;br /&gt;
 [logconfig]&lt;br /&gt;
 # logging level: &amp;quot;error&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;info&amp;quot; or &amp;quot;debug&amp;quot;&lt;br /&gt;
 loglevel = &amp;quot;info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O arquivo já possui comentários das opções de configuração para ajudá-lo a personalizar mais o serviço mas não entraremos em detalhe. Só buscar na documentação do projeto. Acima configuramos ele para funcionar com nossos dados fictícios, estará funcionando tanto via &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto via &#039;&#039;&#039;IPv6&#039;&#039;&#039; apontados para &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. Ele também já está configurado para solicitar para ele um certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; automaticamente.&lt;br /&gt;
&lt;br /&gt;
Após terminada a configuração acima, iniciaremos o serviço:&lt;br /&gt;
 # chown -R acme-dns:acme-dns /var/lib/acme-dns-rust&lt;br /&gt;
 # chown -R root:acme-dns /etc/acme-dns-rust&lt;br /&gt;
 # chmod 640 /etc/acme-dns-rust/config.toml&lt;br /&gt;
Agora precisamos criar nosso arquivo do systemd. Crie esse arquivo &#039;&#039;&#039;/etc/systemd/system/acme-dns-rust.service&#039;&#039;&#039; com o conteúdo abaixo:&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=acme-dns-rust Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=acme-dns&lt;br /&gt;
 Group=acme-dns&lt;br /&gt;
 WorkingDirectory=/var/lib/acme-dns-rust&lt;br /&gt;
 ExecStart=/usr/local/bin/acme-dns-rust --config /etc/acme-dns-rust/config.toml&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 AmbientCapabilities=CAP_NET_BIND_SERVICE&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Depois de salvar execute o comando abaixo. Ele solicitará uma senha para administração do seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;, para uso em CLI:&amp;lt;pre&amp;gt;&lt;br /&gt;
# acme-dns-rust --config /etc/acme-dns-rust/config.toml users list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable acme-dns-rust&lt;br /&gt;
 # systemctl start acme-dns-rust.service&lt;br /&gt;
Após iniciar o serviço teremos as seguintes portas up: &#039;&#039;&#039;53/udp&#039;&#039;&#039;, &#039;&#039;&#039;53/tcp&#039;&#039;&#039; e a &#039;&#039;&#039;443/tcp&#039;&#039;&#039;. Esta última porta é para a comunicação &#039;&#039;&#039;API&#039;&#039;&#039; entre o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns&#039;&#039;&#039;. Para checar se o serviço está rodando:&lt;br /&gt;
 # systemctl status acme-dns-rust&lt;br /&gt;
[[Arquivo:Acme-dns-02.png.png|nenhum|miniaturadaimagem|1454x1454px]]&lt;br /&gt;
&lt;br /&gt;
Você também pode monitorar o serviço através do comando:&lt;br /&gt;
 # journalctl -u acme-dns-rust.service -f&lt;br /&gt;
Importante! Para funcionar, o serviço de DNS Autoritativo tem que estar configurado certinho. Depois que o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; estiver rodando você pode checar assim. Lembre-se de fazer com seus dados reais.&lt;br /&gt;
 # host auth.seudominio.com.br&lt;br /&gt;
 auth.seudominio.com.br has address 198.18.0.1&lt;br /&gt;
 auth.seudominio.com.br has IPv6 address 2001:db8::198:18:0:1&lt;br /&gt;
Se apresentar erro de &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039;, então algo não ficou bem configurado no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;, ou &#039;&#039;&#039;na configuração do seu acme-dns-rust&#039;&#039;&#039;. Dê uma revisada novamente aqui no artigo.&lt;br /&gt;
&lt;br /&gt;
Se tudo ocorreu bem, então você tem um &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039; rodando e pronto para armazenar os &#039;&#039;&#039;desafios TXT da Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CERTBOT e ACME-DNS-CLIENT-RUST ==&lt;br /&gt;
Agora vamos entrar na parte de como gerar um certificado TLS para o seu servidor, mesmo que ele possua apenas IP privado, sem abertura de portas e mais seguro. Para todo sistema que precisarmos gerar certificados, utilizaremos o &#039;&#039;&#039;certbot&#039;&#039;&#039; e do &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No diagrama deste artigo dou como exemplo um servidor Web HTTPS e um outro com aplicação corporativa mas você poderá gerar certificados para qualquer ambiente.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez nosso ambiente será um GNU/Linux Debian 13 (Trixie). Coloque o binário do nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039; no servidor que receberá o certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install certbot&lt;br /&gt;
&lt;br /&gt;
Pronto! Instalamos o &#039;&#039;&#039;certbot&#039;&#039;&#039;, cliente ACME para fazer as solicitações e atualizações dos nossos certificados para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e também instalamos nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Registrando seu domínio e subdomínios que ira utilizar no seu servidor ==&lt;br /&gt;
Vamos supor que você tenha um &#039;&#039;&#039;ERP&#039;&#039;&#039; da empresa no &#039;&#039;&#039;IP 192.168.10.10&#039;&#039;&#039; e que queira gerar o certificado para ele. Após fazer os passos acima, façamos nosso registro no servidor com &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; rodando:&lt;br /&gt;
 # acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&lt;br /&gt;
Esse comando acima vai registrar no seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; o registro para &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039; e ele vai te vai solicitar que crie um desafio &#039;&#039;&#039;CNAME&#039;&#039;&#039; apontando para o seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. No exemplo abaixo a saída vai ser parecida mas o &#039;&#039;&#039;CNAME&#039;&#039;&#039; diferente para você cadastrar no seu DNS Autoritativo. O &#039;&#039;&#039;acme-dns-client-rust ficará aguardando e testando até que você gere esse registro CNAME&#039;&#039;&#039;. Aqui não optei por usar o registro &#039;&#039;&#039;CAA&#039;&#039;&#039; (Certification Authority Authorization) que seria para só autorizar determinada autoridade certificadora à assinar seu certificado.&lt;br /&gt;
 &#039;&#039;&#039;# acme-dns-client-rust -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt; register -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Registering account for domain: sgp.redesimtelecom.net.br...&lt;br /&gt;
 &lt;br /&gt;
 Registration successful!&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 Username:   342f334e-5ce7-488b-8cf4-721a03fab0e5&lt;br /&gt;
 Password:   4W1c8O28Wod7GrP4bZWIXRKy0WSdUyjR-PLLBrYA&lt;br /&gt;
 FullDomain: 989c7170-37e4-4cb0-9f2b-9244aa404350.auth.ispfocus.net.br&lt;br /&gt;
 ------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 Please create the following CNAME record in your DNS zone:&lt;br /&gt;
 &#039;&#039;&#039;_acme-challenge.erp.seudominio.com.br.&#039;&#039;&#039; IN CNAME &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br.&#039;&#039;&#039;&lt;br /&gt;
 Do you want acme-dns-client-rust to monitor the CNAME record change? [Y/n]: y&lt;br /&gt;
 &lt;br /&gt;
 Waiting for CNAME record propagation...&lt;br /&gt;
 Checking...                         &lt;br /&gt;
 CNAME propagation verified successfully!&lt;br /&gt;
 &lt;br /&gt;
 --- CAA Configuration ---&lt;br /&gt;
 A CAA record allows you to control certificate issuance safeguards.&lt;br /&gt;
 Do you wish to set up a CAA record now? [y/N]: &lt;br /&gt;
 Skipping CAA record setup.&lt;br /&gt;
Vejam como é interessante seu funcionamento: O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; para confirmar que você é o dono do domínio, ele procura pelo &#039;&#039;&#039;TXT&#039;&#039;&#039; com o desafio em &#039;&#039;&#039;_acme-challenge.seudominio.com.br&#039;&#039;&#039; só que ele não está no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039; e sim no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. O que o &#039;&#039;&#039;CNAME&#039;&#039;&#039; faz é repassar a consulta para o domínio &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350.auth.seudominio.com.br&#039;&#039;&#039; que está criado no seu &#039;&#039;&#039;acme-dns&#039;&#039;&#039;, que por sua vez contém o &#039;&#039;&#039;desafio TXT que a Let&#039;s Encrypt está procurando&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lembra que no início do artigo criamos o subdomínio &#039;&#039;&#039;auth.seudomínio.com.br&#039;&#039;&#039; e apontamos tudo que for para ele, consultar no &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;? Ou seja &#039;&#039;&#039;979c7577-37e4-6cb0-8f2b-5244bb404350&#039;&#039;&#039; é um subdomínio de &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. É confuso para quem nunca configurou um serviço de DNS mas se você realmente não está conseguindo entender, procure dar uma estudada sobre &#039;&#039;&#039;DNS (Domain Name System)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Após conseguirmos registrar o domínio acima, passamos para o uso com o &#039;&#039;&#039;certbot&#039;&#039;&#039;, para que possamos solicitar nosso certificado digital para a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Usando o certbot com o acme-dns-client ==&lt;br /&gt;
Abaixo estamos solicitamos ao &#039;&#039;&#039;certbot&#039;&#039;&#039; ,usando o nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; como auth-hook, para gerar o certificado TLS para o &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039;. O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; gerará um &#039;&#039;&#039;desafio TXT (DNS-01)&#039;&#039;&#039; para o &#039;&#039;&#039;erp.seudomínio.com.br&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; incluirá o registro no seu servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; fazendo com que a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; encontre o desafio e libere o certificado digital.&lt;br /&gt;
 # &#039;&#039;&#039;certbot certonly --manual --preferred-challenges dns --manual-auth-hook &#039;/usr/local/bin/acme-dns-client-rust&#039; -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Enter email address (used for urgent renewal and security notices)&lt;br /&gt;
  (Enter &#039;c&#039; to cancel): noc@seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Please read the Terms of Service at&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf&amp;lt;/nowiki&amp;gt;. You must&lt;br /&gt;
 agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: Y&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
 share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
 partner of the Let&#039;s Encrypt project and the non-profit organization that&lt;br /&gt;
 develops Certbot? We&#039;d like to send you email about our work encrypting the web,&lt;br /&gt;
 EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: N&lt;br /&gt;
 Account registered.&lt;br /&gt;
 Requesting a certificate for erp.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 Successfully received certificate.&lt;br /&gt;
 Certificate is saved at: /etc/letsencrypt/live/erp.seudominio.com.br/fullchain.pem&lt;br /&gt;
 Key is saved at:         /etc/letsencrypt/live/erp.seudominio.com.br/privkey.pem&lt;br /&gt;
 This certificate expires on 2025-07-22.&lt;br /&gt;
 These files will be updated when the certificate renews.&lt;br /&gt;
 Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 If you like Certbot, please consider supporting our work by:&lt;br /&gt;
  * Donating to ISRG / Let&#039;s Encrypt:   &amp;lt;nowiki&amp;gt;https://letsencrypt.org/donate&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  * Donating to EFF:                    &amp;lt;nowiki&amp;gt;https://eff.org/donate-le&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Os certificados são gerados em /etc/letsencrypt e aí só usá-los em suas aplicações.  Para atualizar automaticamente os certificados basta colocar algo assim em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew &amp;amp;&amp;amp; /usr/bin/systemctl reload nginx.service&lt;br /&gt;
Acima estamos renovando o certificado todo dia 01 de cada mês às 00:00 e na sequência recarregando o nginx para conter o novo certificado. Você pode adaptar para a sua realidade.&lt;br /&gt;
&lt;br /&gt;
Espero que seja útil este artigo e que agora não tenhamos mais que usar certificados TLS auto-assinados que são feios, não passam segurança e não confirmam a identidade de quem está fornecendo o serviço. Coloque certificado TLS válido em todos os seus serviços e mantenha as boas práticas em dia.&lt;br /&gt;
&lt;br /&gt;
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos [[Sobre mim|aqui]].&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1171</id>
		<title>Certificado TLS com ACME-DNS e DNS-01</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1171"/>
		<updated>2026-07-10T15:14:24Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Diagrama exemplo ==&lt;br /&gt;
[[Arquivo:Acme-dns.drawio.png|semmoldura|685x685px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via &#039;&#039;&#039;HTTPS&#039;&#039;&#039;, servidores de envio e recebimento de e-mails (&#039;&#039;&#039;MTA&#039;&#039;&#039;s), clientes de e-mail (&#039;&#039;&#039;MUA&#039;&#039;&#039;s) quando se comunicam com os MTAs, DNS quando utilizamos &#039;&#039;&#039;DNSSEC&#039;&#039;&#039; e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando &#039;&#039;&#039;HTTP (80/tcp)&#039;&#039;&#039; e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum &#039;&#039;&#039;malware&#039;&#039;&#039; hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com &#039;&#039;&#039;criptografia assimétrica&#039;&#039;&#039; onde temos um par de chaves, a &#039;&#039;&#039;chave pública&#039;&#039;&#039; e uma &#039;&#039;&#039;chave privada&#039;&#039;&#039;. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as &#039;&#039;&#039;Autoridades Certificadoras (CA&#039;&#039;&#039;s&#039;&#039;&#039;)&#039;&#039;&#039;, elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;. Ela é uma opção gratuita e extremamente utilizada na Internet.&lt;br /&gt;
&lt;br /&gt;
== Como funciona a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; ==&lt;br /&gt;
Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039; lá no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.&lt;br /&gt;
&lt;br /&gt;
A Let&#039;s Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039;. Ela pode fazer isso de duas formas:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HTTP-01&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
No modelo de confirmação &#039;&#039;&#039;HTTP-01&#039;&#039;&#039; é necessário que a Let&#039;s Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com &#039;&#039;&#039;IP 192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;FD00::192:168:0:10&#039;&#039;&#039;. Aí nesse caso podemos tomar para uso a autenticação via &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usando DNS-01, a Let&#039;s Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let&#039;s Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar,  &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Meu artigo será exatamente sobre o uso do &#039;&#039;&#039;DNS-01&#039;&#039;&#039; e o &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ACME-DNS-RUST ==&lt;br /&gt;
O &#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust acme-dns-rust]&#039;&#039;&#039; é um micro servidor de DNS programado em &#039;&#039;&#039;Rust&#039;&#039;&#039; e que também tem o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; para comunicação com ele. O &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; terá a função de armazenar e atualizar os &#039;&#039;&#039;registros TXT de DNS&#039;&#039;&#039;, com os desafios gerados pela &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e este possui uma API HTTPS para se comunicar com o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar os seguintes programas neste artigo:&lt;br /&gt;
&lt;br /&gt;
* Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let&#039;s Encrypt.&lt;br /&gt;
* ACME-DNS-CLIENT-RUST, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.&lt;br /&gt;
* ACME-DNS-RUST, o serviço de DNS que armazenará os desafios para o seu servi__FORCARTDC__dor.&lt;br /&gt;
O funcionamento do conjunto &#039;&#039;&#039;acme-dns-rust/acme-dns-client-rust&#039;&#039;&#039; é bem simples, é necessário criarmos um &#039;&#039;&#039;subdomínio&#039;&#039;&#039; para a nossa gerência de desafios apontando para onde nosso &#039;&#039;&#039;servidor acme-dns-rust&#039;&#039;&#039; ficará rodando. Vamos usar para isso um sistema &#039;&#039;&#039;GNU/Linux Debian&#039;&#039;&#039; mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;:&lt;br /&gt;
 auth.seudominio.com.br.     IN NS ns1.auth.seudominio.com.br.&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN A 198.18.0.1&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN AAAA 2001:db8::198:18:0:1&lt;br /&gt;
Acima estamos criando nosso &#039;&#039;&#039;subdomínio auth&#039;&#039;&#039; e apontando para os &#039;&#039;&#039;IPs fictícios 198.18.0.1 e 2001:db8::198:18:0:1&#039;&#039;&#039; que é onde estará rodando nosso servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Esse serviço uma vez rodando, você poderá usá-lo para criar &#039;&#039;&#039;certificados TLS usando Let&#039;s Encrypt DNS-01&#039;&#039;&#039; para qualquer domínio, seja ele público ou privado.&lt;br /&gt;
&lt;br /&gt;
Para que você não precise instalar o cargo do Rust e compilar o projeto, você pode usar os &#039;&#039;&#039;binários&#039;&#039;&#039; já compilados pelo &#039;&#039;&#039;CI/CD do GitHub&#039;&#039;&#039;: https://github.com/gondimcodes/acme-dns-rust/releases&lt;br /&gt;
&lt;br /&gt;
Basta descompactá-los e colocá-los em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039;. Lá também tem os binários para &#039;&#039;&#039;FreeBSD&#039;&#039;&#039; se preferir.&lt;br /&gt;
&lt;br /&gt;
Agora falta pouco para termos rodando nosso &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Siga os passos abaixo:&lt;br /&gt;
 # useradd -r -s /bin/false acme-dns&lt;br /&gt;
 # mkdir -p /etc/acme-dns-rust&lt;br /&gt;
 # mkdir -p /var/lib/acme-dns-rust&lt;br /&gt;
Dentro do diretório &#039;&#039;&#039;/etc/acme-dns-rust&#039;&#039;&#039; criaremos um arquivo chamado &#039;&#039;&#039;config.toml&#039;&#039;&#039; e o conteúdo dele está configurado para o nosso exemplo, mas nesse caso é só você alterar as configurações para o seu uso em produção:&lt;br /&gt;
&lt;br /&gt;
Conteúdo de &#039;&#039;&#039;/etc/acme-dns-rust/config.toml&#039;&#039;&#039;:&lt;br /&gt;
 [general]&lt;br /&gt;
 # DNS interface. Note that systemd-resolved may reserve port 53 on 127.0.0.53&lt;br /&gt;
 # In this case acme-dns will error out and you will need to define the listening interface&lt;br /&gt;
 # for example: listen = &amp;quot;127.0.0.1:53&amp;quot;&lt;br /&gt;
 listen = &amp;quot;[::]:53&amp;quot;&lt;br /&gt;
 # protocol, &amp;quot;both&amp;quot;, &amp;quot;both4&amp;quot;, &amp;quot;both6&amp;quot;, &amp;quot;udp&amp;quot;, &amp;quot;udp4&amp;quot;, &amp;quot;udp6&amp;quot; or &amp;quot;tcp&amp;quot;, &amp;quot;tcp4&amp;quot;, &amp;quot;tcp6&amp;quot;&lt;br /&gt;
 protocol = &amp;quot;both&amp;quot;&lt;br /&gt;
 # domain name to serve the requests off of&lt;br /&gt;
 domain = &amp;quot;auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # zone name server&lt;br /&gt;
 nsname = &amp;quot;ns1.auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # admin email address, where @ is substituted with .&lt;br /&gt;
 nsadmin = &amp;quot;admin.seudominio.com.br&amp;quot;&lt;br /&gt;
 # predefined records served in addition to the TXT&lt;br /&gt;
 records = [&lt;br /&gt;
     # domain pointing to the public IP of your acme-dns server &lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. A 198.1.0.1&amp;quot;,&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. A 198.51.100.1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     # specify that auth.example.org will resolve any *.auth.example.org records&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. NS ns1.auth.seudominio.com.br.&amp;quot;,&lt;br /&gt;
 ]&lt;br /&gt;
 # debug messages from CORS etc&lt;br /&gt;
 debug = false&lt;br /&gt;
 &lt;br /&gt;
 [database]&lt;br /&gt;
 # Database engine to use, sqlite or postgres&lt;br /&gt;
 engine = &amp;quot;sqlite&amp;quot;&lt;br /&gt;
 # Connection string, filename for sqlite3 and postgres://$username:$password@$host/$db_name for postgres&lt;br /&gt;
 # Please note that the default Docker image uses path /var/lib/acme-dns/acme-dns.db for sqlite3&lt;br /&gt;
 connection = &amp;quot;/var/lib/acme-dns-rust/acme-dns.db&amp;quot;&lt;br /&gt;
 # connection = &amp;quot;postgres://user:password@localhost/acmedns_db&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [api]&lt;br /&gt;
 # listen ip eg. 127.0.0.1&lt;br /&gt;
 ip = &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
 # disable registration endpoint&lt;br /&gt;
 disable_registration = false&lt;br /&gt;
 # listen port, eg. 443 for default HTTPS&lt;br /&gt;
 port = &amp;quot;443&amp;quot;&lt;br /&gt;
 # possible values: &amp;quot;letsencrypt&amp;quot;, &amp;quot;letsencryptstaging&amp;quot;, &amp;quot;cert&amp;quot;, &amp;quot;none&amp;quot;&lt;br /&gt;
 tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;cert&amp;quot;&lt;br /&gt;
 tls_cert_privkey = &amp;quot;/etc/tls/example.org/privkey.pem&amp;quot;&lt;br /&gt;
 tls_cert_fullchain = &amp;quot;/etc/tls/example.org/fullchain.pem&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 acme_cache_dir = &amp;quot;api-certs&amp;quot;&lt;br /&gt;
 # optional e-mail address to which Let&#039;s Encrypt will send expiration notices for the API&#039;s cert&lt;br /&gt;
 notification_email = &amp;quot;&amp;quot;&lt;br /&gt;
 # CORS AllowOrigins, wildcards can be used&lt;br /&gt;
 corsorigins = [&lt;br /&gt;
     &amp;quot;*&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 # use HTTP header to get the client ip&lt;br /&gt;
 use_header = false&lt;br /&gt;
 # header name to pull the ip address / list of ip addresses from&lt;br /&gt;
 header_name = &amp;quot;X-Forwarded-For&amp;quot;&lt;br /&gt;
 # enable HSTS (HTTP Strict Transport Security)&lt;br /&gt;
 hsts_enabled = false&lt;br /&gt;
 # HSTS max age in seconds (default: 31536000 = 1 year)&lt;br /&gt;
 hsts_max_age = 31536000&lt;br /&gt;
 # HSTS include subdomains directive&lt;br /&gt;
 hsts_include_subdomains = false&lt;br /&gt;
 # HSTS preload directive&lt;br /&gt;
 hsts_preload = false&lt;br /&gt;
 # List of trusted reverse proxy IPs/CIDRs (used when use_header = true to prevent IP spoofing)&lt;br /&gt;
 # Example: [&amp;quot;127.0.0.1/32&amp;quot;, &amp;quot;10.0.0.0/8&amp;quot;]&lt;br /&gt;
 trusted_proxies = []&lt;br /&gt;
 # Max registration requests per minute per IP (0 = use global rate limiter only)&lt;br /&gt;
 register_rate_limit_per_min = 1&lt;br /&gt;
 &lt;br /&gt;
 [logconfig]&lt;br /&gt;
 # logging level: &amp;quot;error&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;info&amp;quot; or &amp;quot;debug&amp;quot;&lt;br /&gt;
 loglevel = &amp;quot;info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O arquivo já possui comentários das opções de configuração para ajudá-lo a personalizar mais o serviço mas não entraremos em detalhe. Só buscar na documentação do projeto. Acima configuramos ele para funcionar com nossos dados fictícios, estará funcionando tanto via &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto via &#039;&#039;&#039;IPv6&#039;&#039;&#039; apontados para &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. Ele também já está configurado para solicitar para ele um certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; automaticamente.&lt;br /&gt;
&lt;br /&gt;
Após terminada a configuração acima, iniciaremos o serviço:&lt;br /&gt;
 # chown -R acme-dns:acme-dns /var/lib/acme-dns-rust&lt;br /&gt;
 # chown -R root:acme-dns /etc/acme-dns-rust&lt;br /&gt;
 # chmod 640 /etc/acme-dns-rust/config.toml&lt;br /&gt;
Agora precisamos criar nosso arquivo do systemd. Crie esse arquivo &#039;&#039;&#039;/etc/systemd/system/acme-dns-rust.service&#039;&#039;&#039; com o conteúdo abaixo:&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=acme-dns-rust Server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=acme-dns&lt;br /&gt;
 Group=acme-dns&lt;br /&gt;
 WorkingDirectory=/var/lib/acme-dns-rust&lt;br /&gt;
 ExecStart=/usr/local/bin/acme-dns-rust --config /etc/acme-dns-rust/config.toml&lt;br /&gt;
 Restart=on-failure&lt;br /&gt;
 AmbientCapabilities=CAP_NET_BIND_SERVICE&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
Depois de salvar execute o comando abaixo. Ele solicitará uma senha para administração do seu &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;, para uso em CLI:&amp;lt;pre&amp;gt;&lt;br /&gt;
# acme-dns-rust --config /etc/acme-dns-rust/config.toml users list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable acme-dns-rust&lt;br /&gt;
 # systemctl start acme-dns-rust.service&lt;br /&gt;
Após iniciar o serviço teremos as seguintes portas up: &#039;&#039;&#039;53/udp&#039;&#039;&#039;, &#039;&#039;&#039;53/tcp&#039;&#039;&#039; e a &#039;&#039;&#039;443/tcp&#039;&#039;&#039;. Esta última porta é para a comunicação &#039;&#039;&#039;API&#039;&#039;&#039; entre o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns&#039;&#039;&#039;. Para checar se o serviço está rodando:&lt;br /&gt;
 # systemctl status acme-dns-rust&lt;br /&gt;
[[Arquivo:Acme-dns-02.png.png|nenhum|miniaturadaimagem|1454x1454px]]&lt;br /&gt;
&lt;br /&gt;
Você também pode monitorar o serviço através do comando:&lt;br /&gt;
 # journalctl -u acme-dns-rust.service -f&lt;br /&gt;
Importante! Para funcionar, o serviço de DNS Autoritativo tem que estar configurado certinho. Depois que o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; estiver rodando você pode checar assim. Lembre-se de fazer com seus dados reais.&lt;br /&gt;
 # host auth.seudominio.com.br&lt;br /&gt;
 auth.seudominio.com.br has address 198.18.0.1&lt;br /&gt;
 auth.seudominio.com.br has IPv6 address 2001:db8::198:18:0:1&lt;br /&gt;
Se apresentar erro de &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039;, então algo não ficou bem configurado no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;, ou &#039;&#039;&#039;na configuração do seu acme-dns-rust&#039;&#039;&#039;. Dê uma revisada novamente aqui no artigo.&lt;br /&gt;
&lt;br /&gt;
Se tudo ocorreu bem, então você tem um &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039; rodando e pronto para armazenar os &#039;&#039;&#039;desafios TXT da Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CERTBOT e ACME-DNS-CLIENT-RUST ==&lt;br /&gt;
Agora vamos entrar na parte de como gerar um certificado TLS para o seu servidor, mesmo que ele possua apenas IP privado, sem abertura de portas e mais seguro. Para todo sistema que precisarmos gerar certificados, utilizaremos o &#039;&#039;&#039;certbot&#039;&#039;&#039; e do &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No diagrama deste artigo dou como exemplo um servidor Web HTTPS e um outro com aplicação corporativa mas você poderá gerar certificados para qualquer ambiente.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez nosso ambiente será um GNU/Linux Debian 13 (Trixie).&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install certbot git&lt;br /&gt;
 # cd /usr/local/src&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://github.com/gondimcodes/acme-dns-rust&amp;lt;/nowiki&amp;gt; ; cd acme-dns-rust/acme-dns-client-rust/ ; cargo build --release&lt;br /&gt;
 # mv target/release/acme-dns-client-rust /usr/local/bin/&lt;br /&gt;
Pronto! Instalamos o &#039;&#039;&#039;certbot&#039;&#039;&#039;, cliente ACME para fazer as solicitações e atualizações dos nossos certificados para a Let&#039;s Encrypt e também instalamos nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Registrando seu domínio e subdomínios que ira utilizar no seu servidor ==&lt;br /&gt;
Vamos supor que você tenha um ERP da empresa no IP 192.168.10.10 e que queira gerar o certificado para ele. Após fazer os passos acima, façamos nosso registro:&lt;br /&gt;
 # acme-dns-client-rust register -d erp.seudominio.com.br -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Esse comando acima vai registrar no seu acme-dns o registro para &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039; e ele vai te vai solicitar que crie um desafio &#039;&#039;&#039;CNAME&#039;&#039;&#039; apontando para o seu acme-dns-rust. No exemplo abaixo a saída vai ser parecida mas o &#039;&#039;&#039;CNAME&#039;&#039;&#039; diferente para você cadastrar no seu DNS Autoritativo. O &#039;&#039;&#039;acme-dns-client-rust ficará aguardando e testando até que você gere esse registro CNAME&#039;&#039;&#039;. Aqui não optei por usar o registro &#039;&#039;&#039;CAA&#039;&#039;&#039; (Certification Authority Authorization) que seria para só autorizar determinada autoridade certificadora à assinar seu certificado.&lt;br /&gt;
 # &#039;&#039;&#039;acme-dns-client register -d erp.seudominio.com.br -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 [*] New acme-dns account for domain seudominio.com.br successfully registered!&lt;br /&gt;
 &lt;br /&gt;
 Do you want acme-dns-client to monitor the CNAME record change? [Y/n]: Y&lt;br /&gt;
 &lt;br /&gt;
 To finalize the setup, you need to create a CNAME record pointing from _acme-challenge.erp.seudominio.com.br &lt;br /&gt;
 to the newly created acme-dns domain 42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 A correctly set up CNAME record should look like the following:&lt;br /&gt;
 &lt;br /&gt;
 _acme-challenge.erp.seudominio.com.br.   IN      CNAME   42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br.&lt;br /&gt;
 &lt;br /&gt;
 Waiting for CNAME record to be set up for domain erp.seudominio.com.br&lt;br /&gt;
 Querying the authoritative nameserver every 15 seconds.&lt;br /&gt;
 &lt;br /&gt;
 [*] CNAME record is now correctly set up!&lt;br /&gt;
 &lt;br /&gt;
 A CAA record allows you to control additional certificate issuance safeguards. The currently supported&lt;br /&gt;
 version allows the domain owner to control which certificate authorities are allowed to issue certificates for the domain in question.&lt;br /&gt;
 The certificate authorities MUST check and respect the CAA records in the validation process.&lt;br /&gt;
 &lt;br /&gt;
 There&#039;s also a standard (&amp;lt;nowiki&amp;gt;RFC 8657&amp;lt;/nowiki&amp;gt;) that extends the CAA record to limit the issuance of certificates to a specific validation &lt;br /&gt;
 method and/or to a specific ACME account. While they can be tested using staging environment of Let&#039;s Encrypt for example,&lt;br /&gt;
 they&#039;re not enabled in the production yet. It is still be worthwhile to configure them so you&#039;ll be protected when the feature gets enabled.&lt;br /&gt;
 Do you wish to set up a CAA record now? [y/N]: N&lt;br /&gt;
Vejam como é interessante seu funcionamento: O Let&#039;s Encrypt para confirmar que você é o dono do domínio, ele procura pelo &#039;&#039;&#039;TXT&#039;&#039;&#039; com o desafio em &#039;&#039;&#039;_acme-challenge.seudominio.com.br&#039;&#039;&#039; só que ele não está no seu DNS Autoritativo e sim no seu servidor acme-dns. O que o &#039;&#039;&#039;CNAME&#039;&#039;&#039; faz é repassar a consulta para o domínio &#039;&#039;&#039;42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br&#039;&#039;&#039; que está criado no seu &#039;&#039;&#039;acme-dns&#039;&#039;&#039;, que por sua vez contém o &#039;&#039;&#039;desafio TXT que a Let&#039;s Encrypt está procurando&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lembra que no início do artigo criamos o subdomínio &#039;&#039;&#039;auth.seudomínio.com.br&#039;&#039;&#039; e apontamos tudo que for para ele, consultar no &#039;&#039;&#039;acme-dns&#039;&#039;&#039;? Ou seja &#039;&#039;&#039;42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b&#039;&#039;&#039; é um subdomínio de &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. É confuso para quem nunca configurou um serviço de DNS mas se você realmente não está conseguindo entender, procure dar uma estudada sobre DNS (Domain Name System).&lt;br /&gt;
&lt;br /&gt;
Após conseguirmos registrar o domínio acima, passamos para o uso com o &#039;&#039;&#039;certbot&#039;&#039;&#039;, para que possamos solicitar nosso certificado digital para a Let&#039;s Encrypt.&lt;br /&gt;
&lt;br /&gt;
== Usando o certbot com o acme-dns-client ==&lt;br /&gt;
Abaixo estamos solicitamos ao &#039;&#039;&#039;certbot&#039;&#039;&#039; ,usando o nosso &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039;, para gerar o certificado TLS para o &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039;. O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; gerará um &#039;&#039;&#039;desafio TXT (DNS-01)&#039;&#039;&#039; para o &#039;&#039;&#039;erp.seudomínio.com.br&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; incluirá o registro no acme-dns fazendo com que a Let&#039;s Encrypt encontre o desafio e libere o certificado digital.&lt;br /&gt;
 # &#039;&#039;&#039;certbot certonly --manual --preferred-challenges dns --manual-auth-hook &#039;/usr/local/bin/acme-dns-client&#039; -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Enter email address (used for urgent renewal and security notices)&lt;br /&gt;
  (Enter &#039;c&#039; to cancel): noc@seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Please read the Terms of Service at&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf&amp;lt;/nowiki&amp;gt;. You must&lt;br /&gt;
 agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: Y&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
 share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
 partner of the Let&#039;s Encrypt project and the non-profit organization that&lt;br /&gt;
 develops Certbot? We&#039;d like to send you email about our work encrypting the web,&lt;br /&gt;
 EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: N&lt;br /&gt;
 Account registered.&lt;br /&gt;
 Requesting a certificate for erp.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 Successfully received certificate.&lt;br /&gt;
 Certificate is saved at: /etc/letsencrypt/live/erp.seudominio.com.br/fullchain.pem&lt;br /&gt;
 Key is saved at:         /etc/letsencrypt/live/erp.seudominio.com.br/privkey.pem&lt;br /&gt;
 This certificate expires on 2025-07-22.&lt;br /&gt;
 These files will be updated when the certificate renews.&lt;br /&gt;
 Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 If you like Certbot, please consider supporting our work by:&lt;br /&gt;
  * Donating to ISRG / Let&#039;s Encrypt:   &amp;lt;nowiki&amp;gt;https://letsencrypt.org/donate&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  * Donating to EFF:                    &amp;lt;nowiki&amp;gt;https://eff.org/donate-le&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Os certificados são gerados em /etc/letsencrypt e aí só usá-los em suas aplicações.  Para atualizar automaticamente os certificados basta colocar algo assim em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew &amp;amp;&amp;amp; /usr/bin/systemctl reload nginx.service&lt;br /&gt;
Acima estamos renovando o certificado todo dia 01 de cada mês às 00:00 e na sequência recarregando o nginx para conter o novo certificado. Você pode adaptar para a sua realidade.&lt;br /&gt;
&lt;br /&gt;
Espero que seja útil este artigo e que agora não tenhamos mais que usar certificados TLS auto-assinados que são feios, não passam segurança e não confirmam a identidade de quem está fornecendo o serviço. Coloque certificado TLS válido em todos os seus serviços e mantenha as boas práticas em dia.&lt;br /&gt;
&lt;br /&gt;
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos [[Sobre mim|aqui]].&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1170</id>
		<title>Certificado TLS com ACME-DNS e DNS-01</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1170"/>
		<updated>2026-07-10T14:55:33Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Diagrama exemplo ==&lt;br /&gt;
[[Arquivo:Acme-dns.drawio.png|semmoldura|685x685px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via &#039;&#039;&#039;HTTPS&#039;&#039;&#039;, servidores de envio e recebimento de e-mails (&#039;&#039;&#039;MTA&#039;&#039;&#039;s), clientes de e-mail (&#039;&#039;&#039;MUA&#039;&#039;&#039;s) quando se comunicam com os MTAs, DNS quando utilizamos &#039;&#039;&#039;DNSSEC&#039;&#039;&#039; e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando &#039;&#039;&#039;HTTP (80/tcp)&#039;&#039;&#039; e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum &#039;&#039;&#039;malware&#039;&#039;&#039; hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com &#039;&#039;&#039;criptografia assimétrica&#039;&#039;&#039; onde temos um par de chaves, a &#039;&#039;&#039;chave pública&#039;&#039;&#039; e uma &#039;&#039;&#039;chave privada&#039;&#039;&#039;. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as &#039;&#039;&#039;Autoridades Certificadoras (CA&#039;&#039;&#039;s&#039;&#039;&#039;)&#039;&#039;&#039;, elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;. Ela é uma opção gratuita e extremamente utilizada na Internet.&lt;br /&gt;
&lt;br /&gt;
== Como funciona a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; ==&lt;br /&gt;
Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039; lá no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.&lt;br /&gt;
&lt;br /&gt;
A Let&#039;s Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039;. Ela pode fazer isso de duas formas:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HTTP-01&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
No modelo de confirmação &#039;&#039;&#039;HTTP-01&#039;&#039;&#039; é necessário que a Let&#039;s Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com &#039;&#039;&#039;IP 192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;FD00::192:168:0:10&#039;&#039;&#039;. Aí nesse caso podemos tomar para uso a autenticação via &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usando DNS-01, a Let&#039;s Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let&#039;s Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar,  &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Meu artigo será exatamente sobre o uso do &#039;&#039;&#039;DNS-01&#039;&#039;&#039; e o &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ACME-DNS-RUST ==&lt;br /&gt;
O &#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust acme-dns-rust]&#039;&#039;&#039; é um micro servidor de DNS programado em &#039;&#039;&#039;Rust&#039;&#039;&#039; e que também tem o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; para comunicação com ele. O &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; terá a função de armazenar e atualizar os &#039;&#039;&#039;registros TXT de DNS&#039;&#039;&#039;, com os desafios gerados pela &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e este possui uma API HTTPS para se comunicar com o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar os seguintes programas neste artigo:&lt;br /&gt;
&lt;br /&gt;
* Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let&#039;s Encrypt.&lt;br /&gt;
* ACME-DNS-CLIENT-RUST, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.&lt;br /&gt;
* ACME-DNS-RUST, o serviço de DNS que armazenará os desafios para o seu servi__FORCARTDC__dor.&lt;br /&gt;
O funcionamento do conjunto &#039;&#039;&#039;acme-dns-rust/acme-dns-client-rust&#039;&#039;&#039; é bem simples, é necessário criarmos um &#039;&#039;&#039;subdomínio&#039;&#039;&#039; para a nossa gerência de desafios apontando para onde nosso &#039;&#039;&#039;servidor acme-dns-rust&#039;&#039;&#039; ficará rodando. Vamos usar para isso um sistema &#039;&#039;&#039;GNU/Linux Debian&#039;&#039;&#039; mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;:&lt;br /&gt;
 auth.seudominio.com.br.     IN NS ns1.auth.seudominio.com.br.&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN A 198.18.0.1&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN AAAA 2001:db8::198:18:0:1&lt;br /&gt;
Acima estamos criando nosso &#039;&#039;&#039;subdomínio auth&#039;&#039;&#039; e apontando para os &#039;&#039;&#039;IPs fictícios 198.18.0.1 e 2001:db8::198:18:0:1&#039;&#039;&#039; que é onde estará rodando nosso servidor &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Esse serviço uma vez rodando, você poderá usá-lo para criar &#039;&#039;&#039;certificados TLS usando Let&#039;s Encrypt DNS-01&#039;&#039;&#039; para qualquer domínio, seja ele público ou privado.&lt;br /&gt;
&lt;br /&gt;
Para que você não precise instalar o cargo do Rust e compilar o projeto, você pode usar os &#039;&#039;&#039;binários&#039;&#039;&#039; já compilados pelo &#039;&#039;&#039;CI/CD do GitHub&#039;&#039;&#039;: https://github.com/gondimcodes/acme-dns-rust/releases&lt;br /&gt;
&lt;br /&gt;
Basta descompactá-los e colocá-los em &#039;&#039;&#039;/usr/local/bin&#039;&#039;&#039;. Lá também tem os binários para &#039;&#039;&#039;FreeBSD&#039;&#039;&#039; se preferir.&lt;br /&gt;
&lt;br /&gt;
Agora falta pouco para termos rodando nosso &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Siga os passos abaixo:&lt;br /&gt;
 # useradd -r -s /bin/false acme-dns&lt;br /&gt;
 # mkdir -p /etc/acme-dns-rust&lt;br /&gt;
 # mkdir -p /var/lib/acme-dns-rust&lt;br /&gt;
Dentro do diretório &#039;&#039;&#039;/etc/acme-dns-rust&#039;&#039;&#039; criaremos um arquivo chamado &#039;&#039;&#039;config.toml&#039;&#039;&#039; e o conteúdo dele está configurado para o nosso exemplo, mas nesse caso é só você alterar as configurações para o seu uso em produção:&lt;br /&gt;
&lt;br /&gt;
Conteúdo de &#039;&#039;&#039;/etc/acme-dns-rust/config.toml&#039;&#039;&#039;:&lt;br /&gt;
 [general]&lt;br /&gt;
 # DNS interface. Note that systemd-resolved may reserve port 53 on 127.0.0.53&lt;br /&gt;
 # In this case acme-dns will error out and you will need to define the listening interface&lt;br /&gt;
 # for example: listen = &amp;quot;127.0.0.1:53&amp;quot;&lt;br /&gt;
 listen = &amp;quot;[::]:53&amp;quot;&lt;br /&gt;
 # protocol, &amp;quot;both&amp;quot;, &amp;quot;both4&amp;quot;, &amp;quot;both6&amp;quot;, &amp;quot;udp&amp;quot;, &amp;quot;udp4&amp;quot;, &amp;quot;udp6&amp;quot; or &amp;quot;tcp&amp;quot;, &amp;quot;tcp4&amp;quot;, &amp;quot;tcp6&amp;quot;&lt;br /&gt;
 protocol = &amp;quot;both&amp;quot;&lt;br /&gt;
 # domain name to serve the requests off of&lt;br /&gt;
 domain = &amp;quot;auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # zone name server&lt;br /&gt;
 nsname = &amp;quot;ns1.auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # admin email address, where @ is substituted with .&lt;br /&gt;
 nsadmin = &amp;quot;admin.seudominio.com.br&amp;quot;&lt;br /&gt;
 # predefined records served in addition to the TXT&lt;br /&gt;
 records = [&lt;br /&gt;
     # domain pointing to the public IP of your acme-dns server &lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. A 198.1.0.1&amp;quot;,&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. A 198.51.100.1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     # specify that auth.example.org will resolve any *.auth.example.org records&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. NS ns1.auth.seudominio.com.br.&amp;quot;,&lt;br /&gt;
 ]&lt;br /&gt;
 # debug messages from CORS etc&lt;br /&gt;
 debug = false&lt;br /&gt;
 &lt;br /&gt;
 [database]&lt;br /&gt;
 # Database engine to use, sqlite or postgres&lt;br /&gt;
 engine = &amp;quot;sqlite&amp;quot;&lt;br /&gt;
 # Connection string, filename for sqlite3 and postgres://$username:$password@$host/$db_name for postgres&lt;br /&gt;
 # Please note that the default Docker image uses path /var/lib/acme-dns/acme-dns.db for sqlite3&lt;br /&gt;
 connection = &amp;quot;/var/lib/acme-dns-rust/acme-dns.db&amp;quot;&lt;br /&gt;
 # connection = &amp;quot;postgres://user:password@localhost/acmedns_db&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [api]&lt;br /&gt;
 # listen ip eg. 127.0.0.1&lt;br /&gt;
 ip = &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
 # disable registration endpoint&lt;br /&gt;
 disable_registration = false&lt;br /&gt;
 # listen port, eg. 443 for default HTTPS&lt;br /&gt;
 port = &amp;quot;443&amp;quot;&lt;br /&gt;
 # possible values: &amp;quot;letsencrypt&amp;quot;, &amp;quot;letsencryptstaging&amp;quot;, &amp;quot;cert&amp;quot;, &amp;quot;none&amp;quot;&lt;br /&gt;
 tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;cert&amp;quot;&lt;br /&gt;
 tls_cert_privkey = &amp;quot;/etc/tls/example.org/privkey.pem&amp;quot;&lt;br /&gt;
 tls_cert_fullchain = &amp;quot;/etc/tls/example.org/fullchain.pem&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 acme_cache_dir = &amp;quot;api-certs&amp;quot;&lt;br /&gt;
 # optional e-mail address to which Let&#039;s Encrypt will send expiration notices for the API&#039;s cert&lt;br /&gt;
 notification_email = &amp;quot;&amp;quot;&lt;br /&gt;
 # CORS AllowOrigins, wildcards can be used&lt;br /&gt;
 corsorigins = [&lt;br /&gt;
     &amp;quot;*&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 # use HTTP header to get the client ip&lt;br /&gt;
 use_header = false&lt;br /&gt;
 # header name to pull the ip address / list of ip addresses from&lt;br /&gt;
 header_name = &amp;quot;X-Forwarded-For&amp;quot;&lt;br /&gt;
 # enable HSTS (HTTP Strict Transport Security)&lt;br /&gt;
 hsts_enabled = false&lt;br /&gt;
 # HSTS max age in seconds (default: 31536000 = 1 year)&lt;br /&gt;
 hsts_max_age = 31536000&lt;br /&gt;
 # HSTS include subdomains directive&lt;br /&gt;
 hsts_include_subdomains = false&lt;br /&gt;
 # HSTS preload directive&lt;br /&gt;
 hsts_preload = false&lt;br /&gt;
 # List of trusted reverse proxy IPs/CIDRs (used when use_header = true to prevent IP spoofing)&lt;br /&gt;
 # Example: [&amp;quot;127.0.0.1/32&amp;quot;, &amp;quot;10.0.0.0/8&amp;quot;]&lt;br /&gt;
 trusted_proxies = []&lt;br /&gt;
 # Max registration requests per minute per IP (0 = use global rate limiter only)&lt;br /&gt;
 register_rate_limit_per_min = 1&lt;br /&gt;
 &lt;br /&gt;
 [logconfig]&lt;br /&gt;
 # logging level: &amp;quot;error&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;info&amp;quot; or &amp;quot;debug&amp;quot;&lt;br /&gt;
 loglevel = &amp;quot;info&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O arquivo já possui comentários das opções de configuração para ajudá-lo a personalizar mais o serviço mas não entraremos em detalhe. Só buscar na documentação do projeto. Acima configuramos ele para funcionar com nossos dados fictícios, estará funcionando tanto via &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto via &#039;&#039;&#039;IPv6&#039;&#039;&#039; apontados para &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. Ele também já está configurado para solicitar para ele um certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; automaticamente.&lt;br /&gt;
&lt;br /&gt;
Após terminada a configuração acima, iniciaremos o serviço:&lt;br /&gt;
 # systemctl start acme-dns-rust.service&lt;br /&gt;
Após iniciar o serviço teremos as seguintes portas up: &#039;&#039;&#039;53/udp&#039;&#039;&#039;, &#039;&#039;&#039;53/tcp&#039;&#039;&#039; e a &#039;&#039;&#039;443/tcp&#039;&#039;&#039;. Esta última porta é para a comunicação &#039;&#039;&#039;API&#039;&#039;&#039; entre o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns&#039;&#039;&#039;. Para checar se o serviço está rodando:&lt;br /&gt;
 # systemctl status acme-dns-rust&lt;br /&gt;
[[Arquivo:Acme-dns-02.png.png|nenhum|miniaturadaimagem|1454x1454px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Importante! Para funcionar o serviço de DNS Autoritativo tem que estar configurado certinho. Depois que o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; estiver rodando você pode checar assim. Lembre-se de fazer com seus dados reais.&lt;br /&gt;
 # host auth.seudominio.com.br&lt;br /&gt;
 auth.seudominio.com.br has address 198.18.0.1&lt;br /&gt;
 auth.seudominio.com.br has IPv6 address 2001:db8::198:18:0:1&lt;br /&gt;
Se apresentar erro de &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039;, então algo não ficou bem configurado no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;, ou &#039;&#039;&#039;na configuração do seu acme-dns-rust&#039;&#039;&#039;. Dê uma revisada novamente aqui no artigo.&lt;br /&gt;
&lt;br /&gt;
Se tudo ocorreu bem, então você tem um &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039; rodando e pronto para armazenar os &#039;&#039;&#039;desafios TXT da Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CERTBOT e ACME-DNS-CLIENT-RUST ==&lt;br /&gt;
Agora vamos entrar na parte de como gerar um certificado TLS para o seu servidor, mesmo que ele possua apenas IP privado, sem abertura de portas e mais seguro. Para todo sistema que precisarmos gerar certificados, utilizaremos o &#039;&#039;&#039;certbot&#039;&#039;&#039; e do &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No diagrama deste artigo dou como exemplo um servidor Web HTTPS e um outro com aplicação corporativa mas você poderá gerar certificados para qualquer ambiente.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez nosso ambiente será um GNU/Linux Debian 13 (Trixie).&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install certbot git&lt;br /&gt;
 # cd /usr/local/src&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://github.com/gondimcodes/acme-dns-rust&amp;lt;/nowiki&amp;gt; ; cd acme-dns-rust/acme-dns-client-rust/ ; cargo build --release&lt;br /&gt;
 # mv target/release/acme-dns-client-rust /usr/local/bin/&lt;br /&gt;
Pronto! Instalamos o &#039;&#039;&#039;certbot&#039;&#039;&#039;, cliente ACME para fazer as solicitações e atualizações dos nossos certificados para a Let&#039;s Encrypt e também instalamos nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Registrando seu domínio e subdomínios que ira utilizar no seu servidor ==&lt;br /&gt;
Vamos supor que você tenha um ERP da empresa no IP 192.168.10.10 e que queira gerar o certificado para ele. Após fazer os passos acima, façamos nosso registro:&lt;br /&gt;
 # acme-dns-client-rust register -d erp.seudominio.com.br -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Esse comando acima vai registrar no seu acme-dns o registro para &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039; e ele vai te vai solicitar que crie um desafio &#039;&#039;&#039;CNAME&#039;&#039;&#039; apontando para o seu acme-dns-rust. No exemplo abaixo a saída vai ser parecida mas o &#039;&#039;&#039;CNAME&#039;&#039;&#039; diferente para você cadastrar no seu DNS Autoritativo. O &#039;&#039;&#039;acme-dns-client-rust ficará aguardando e testando até que você gere esse registro CNAME&#039;&#039;&#039;. Aqui não optei por usar o registro &#039;&#039;&#039;CAA&#039;&#039;&#039; (Certification Authority Authorization) que seria para só autorizar determinada autoridade certificadora à assinar seu certificado.&lt;br /&gt;
 # &#039;&#039;&#039;acme-dns-client register -d erp.seudominio.com.br -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 [*] New acme-dns account for domain seudominio.com.br successfully registered!&lt;br /&gt;
 &lt;br /&gt;
 Do you want acme-dns-client to monitor the CNAME record change? [Y/n]: Y&lt;br /&gt;
 &lt;br /&gt;
 To finalize the setup, you need to create a CNAME record pointing from _acme-challenge.erp.seudominio.com.br &lt;br /&gt;
 to the newly created acme-dns domain 42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 A correctly set up CNAME record should look like the following:&lt;br /&gt;
 &lt;br /&gt;
 _acme-challenge.erp.seudominio.com.br.   IN      CNAME   42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br.&lt;br /&gt;
 &lt;br /&gt;
 Waiting for CNAME record to be set up for domain erp.seudominio.com.br&lt;br /&gt;
 Querying the authoritative nameserver every 15 seconds.&lt;br /&gt;
 &lt;br /&gt;
 [*] CNAME record is now correctly set up!&lt;br /&gt;
 &lt;br /&gt;
 A CAA record allows you to control additional certificate issuance safeguards. The currently supported&lt;br /&gt;
 version allows the domain owner to control which certificate authorities are allowed to issue certificates for the domain in question.&lt;br /&gt;
 The certificate authorities MUST check and respect the CAA records in the validation process.&lt;br /&gt;
 &lt;br /&gt;
 There&#039;s also a standard (&amp;lt;nowiki&amp;gt;RFC 8657&amp;lt;/nowiki&amp;gt;) that extends the CAA record to limit the issuance of certificates to a specific validation &lt;br /&gt;
 method and/or to a specific ACME account. While they can be tested using staging environment of Let&#039;s Encrypt for example,&lt;br /&gt;
 they&#039;re not enabled in the production yet. It is still be worthwhile to configure them so you&#039;ll be protected when the feature gets enabled.&lt;br /&gt;
 Do you wish to set up a CAA record now? [y/N]: N&lt;br /&gt;
Vejam como é interessante seu funcionamento: O Let&#039;s Encrypt para confirmar que você é o dono do domínio, ele procura pelo &#039;&#039;&#039;TXT&#039;&#039;&#039; com o desafio em &#039;&#039;&#039;_acme-challenge.seudominio.com.br&#039;&#039;&#039; só que ele não está no seu DNS Autoritativo e sim no seu servidor acme-dns. O que o &#039;&#039;&#039;CNAME&#039;&#039;&#039; faz é repassar a consulta para o domínio &#039;&#039;&#039;42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br&#039;&#039;&#039; que está criado no seu &#039;&#039;&#039;acme-dns&#039;&#039;&#039;, que por sua vez contém o &#039;&#039;&#039;desafio TXT que a Let&#039;s Encrypt está procurando&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lembra que no início do artigo criamos o subdomínio &#039;&#039;&#039;auth.seudomínio.com.br&#039;&#039;&#039; e apontamos tudo que for para ele, consultar no &#039;&#039;&#039;acme-dns&#039;&#039;&#039;? Ou seja &#039;&#039;&#039;42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b&#039;&#039;&#039; é um subdomínio de &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. É confuso para quem nunca configurou um serviço de DNS mas se você realmente não está conseguindo entender, procure dar uma estudada sobre DNS (Domain Name System).&lt;br /&gt;
&lt;br /&gt;
Após conseguirmos registrar o domínio acima, passamos para o uso com o &#039;&#039;&#039;certbot&#039;&#039;&#039;, para que possamos solicitar nosso certificado digital para a Let&#039;s Encrypt.&lt;br /&gt;
&lt;br /&gt;
== Usando o certbot com o acme-dns-client ==&lt;br /&gt;
Abaixo estamos solicitamos ao &#039;&#039;&#039;certbot&#039;&#039;&#039; ,usando o nosso &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039;, para gerar o certificado TLS para o &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039;. O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; gerará um &#039;&#039;&#039;desafio TXT (DNS-01)&#039;&#039;&#039; para o &#039;&#039;&#039;erp.seudomínio.com.br&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; incluirá o registro no acme-dns fazendo com que a Let&#039;s Encrypt encontre o desafio e libere o certificado digital.&lt;br /&gt;
 # &#039;&#039;&#039;certbot certonly --manual --preferred-challenges dns --manual-auth-hook &#039;/usr/local/bin/acme-dns-client&#039; -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Enter email address (used for urgent renewal and security notices)&lt;br /&gt;
  (Enter &#039;c&#039; to cancel): noc@seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Please read the Terms of Service at&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf&amp;lt;/nowiki&amp;gt;. You must&lt;br /&gt;
 agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: Y&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
 share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
 partner of the Let&#039;s Encrypt project and the non-profit organization that&lt;br /&gt;
 develops Certbot? We&#039;d like to send you email about our work encrypting the web,&lt;br /&gt;
 EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: N&lt;br /&gt;
 Account registered.&lt;br /&gt;
 Requesting a certificate for erp.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 Successfully received certificate.&lt;br /&gt;
 Certificate is saved at: /etc/letsencrypt/live/erp.seudominio.com.br/fullchain.pem&lt;br /&gt;
 Key is saved at:         /etc/letsencrypt/live/erp.seudominio.com.br/privkey.pem&lt;br /&gt;
 This certificate expires on 2025-07-22.&lt;br /&gt;
 These files will be updated when the certificate renews.&lt;br /&gt;
 Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 If you like Certbot, please consider supporting our work by:&lt;br /&gt;
  * Donating to ISRG / Let&#039;s Encrypt:   &amp;lt;nowiki&amp;gt;https://letsencrypt.org/donate&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  * Donating to EFF:                    &amp;lt;nowiki&amp;gt;https://eff.org/donate-le&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Os certificados são gerados em /etc/letsencrypt e aí só usá-los em suas aplicações.  Para atualizar automaticamente os certificados basta colocar algo assim em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew &amp;amp;&amp;amp; /usr/bin/systemctl reload nginx.service&lt;br /&gt;
Acima estamos renovando o certificado todo dia 01 de cada mês às 00:00 e na sequência recarregando o nginx para conter o novo certificado. Você pode adaptar para a sua realidade.&lt;br /&gt;
&lt;br /&gt;
Espero que seja útil este artigo e que agora não tenhamos mais que usar certificados TLS auto-assinados que são feios, não passam segurança e não confirmam a identidade de quem está fornecendo o serviço. Coloque certificado TLS válido em todos os seus serviços e mantenha as boas práticas em dia.&lt;br /&gt;
&lt;br /&gt;
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos [[Sobre mim|aqui]].&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1169</id>
		<title>Certificado TLS com ACME-DNS e DNS-01</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1169"/>
		<updated>2026-07-10T14:42:30Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Diagrama exemplo ==&lt;br /&gt;
[[Arquivo:Acme-dns.drawio.png|semmoldura|685x685px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via &#039;&#039;&#039;HTTPS&#039;&#039;&#039;, servidores de envio e recebimento de e-mails (&#039;&#039;&#039;MTA&#039;&#039;&#039;s), clientes de e-mail (&#039;&#039;&#039;MUA&#039;&#039;&#039;s) quando se comunicam com os MTAs, DNS quando utilizamos &#039;&#039;&#039;DNSSEC&#039;&#039;&#039; e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando &#039;&#039;&#039;HTTP (80/tcp)&#039;&#039;&#039; e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum &#039;&#039;&#039;malware&#039;&#039;&#039; hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com &#039;&#039;&#039;criptografia assimétrica&#039;&#039;&#039; onde temos um par de chaves, a &#039;&#039;&#039;chave pública&#039;&#039;&#039; e uma &#039;&#039;&#039;chave privada&#039;&#039;&#039;. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as &#039;&#039;&#039;Autoridades Certificadoras (CA&#039;&#039;&#039;s&#039;&#039;&#039;)&#039;&#039;&#039;, elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;. Ela é uma opção gratuita e extremamente utilizada na Internet.&lt;br /&gt;
&lt;br /&gt;
== Como funciona a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; ==&lt;br /&gt;
Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039; lá no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.&lt;br /&gt;
&lt;br /&gt;
A Let&#039;s Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039;. Ela pode fazer isso de duas formas:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HTTP-01&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
No modelo de confirmação &#039;&#039;&#039;HTTP-01&#039;&#039;&#039; é necessário que a Let&#039;s Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com &#039;&#039;&#039;IP 192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;FD00::192:168:0:10&#039;&#039;&#039;. Aí nesse caso podemos tomar para uso a autenticação via &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usando DNS-01, a Let&#039;s Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let&#039;s Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar,  &#039;&#039;&#039;acme-dns&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Meu artigo será exatamente sobre o uso do &#039;&#039;&#039;DNS-01&#039;&#039;&#039; e o &#039;&#039;&#039;serviço acme-dns&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ACME-DNS-RUST ==&lt;br /&gt;
O &#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust acme-dns-rust]&#039;&#039;&#039; é um micro servidor de DNS programado em &#039;&#039;&#039;Rust&#039;&#039;&#039; e que também tem o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; que também iremos utilizar. O &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; terá a função de armazenar e atualizar os &#039;&#039;&#039;registros TXT de DNS&#039;&#039;&#039;, com os desafios gerados pela &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e este possui uma API HTTPS para se comunicar com o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar os seguintes programas neste artigo:&lt;br /&gt;
&lt;br /&gt;
* Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let&#039;s Encrypt.&lt;br /&gt;
* ACME-DNS-CLIENT-RUST, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.&lt;br /&gt;
* ACME-DNS-RUST, o serviço de DNS que armazenará os desafios para o seu servi__FORCARTDC__dor.&lt;br /&gt;
O funcionamento do conjunto &#039;&#039;&#039;acme-dns-rust/acme-dns-client-rust&#039;&#039;&#039; é bem simples, é necessário criarmos um &#039;&#039;&#039;subdomínio&#039;&#039;&#039; para a nossa gerência de desafios apontando para onde nosso &#039;&#039;&#039;servidor acme-dns-rust&#039;&#039;&#039; ficará rodando. Vamos usar para isso um sistema &#039;&#039;&#039;GNU/Linux Debian&#039;&#039;&#039; mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;:&lt;br /&gt;
 auth.seudominio.com.br.     IN NS ns1.auth.seudominio.com.br.&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN A 198.18.0.1&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN AAAA 2001:db8::198:18:0:1&lt;br /&gt;
Acima estamos criando nosso &#039;&#039;&#039;subdomínio auth&#039;&#039;&#039; e apontando para os &#039;&#039;&#039;IPs fictícios 198.18.0.1 e 2001:db8:198:0:1&#039;&#039;&#039; que é onde estará rodando nosso servidor acme-dns. Esse serviço uma vez rodando, você poderá usá-lo para criar &#039;&#039;&#039;certificados TLS usando Let&#039;s Encrypt DNS-01&#039;&#039;&#039; para qualquer domínio e servidor seu, seja ele público ou privado.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust/blob/main/INSTALL.md Aqui]&#039;&#039;&#039; você encontra os passos para instalar o &#039;&#039;&#039;cargo&#039;&#039;&#039; e como compilar o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Agora falta pouco para termos rodando nosso &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Siga os passos abaixo:&lt;br /&gt;
 # useradd -r -s /bin/false acme-dns&lt;br /&gt;
 # mkdir -p /etc/acme-dns-rust&lt;br /&gt;
 # mkdir -p /var/lib/acme-dns-rust&lt;br /&gt;
Dentro desse diretório &#039;&#039;&#039;/etc/acme-dns-rust&#039;&#039;&#039; criaremos um arquivo chamado &#039;&#039;&#039;config.toml&#039;&#039;&#039; e o conteúdo dele está configurado para o nosso exemplo, mas nesse caso é só você alterar as configurações para o seu uso em produção:&lt;br /&gt;
&lt;br /&gt;
Conteúdo de &#039;&#039;&#039;/etc/acme-dns-rust/config.toml&#039;&#039;&#039;:&lt;br /&gt;
 [general]&lt;br /&gt;
 # DNS interface. Note that systemd-resolved may reserve port 53 on 127.0.0.53&lt;br /&gt;
 # In this case acme-dns will error out and you will need to define the listening interface&lt;br /&gt;
 # for example: listen = &amp;quot;127.0.0.1:53&amp;quot;&lt;br /&gt;
 listen = &amp;quot;[::]:53&amp;quot;&lt;br /&gt;
 # protocol, &amp;quot;both&amp;quot;, &amp;quot;both4&amp;quot;, &amp;quot;both6&amp;quot;, &amp;quot;udp&amp;quot;, &amp;quot;udp4&amp;quot;, &amp;quot;udp6&amp;quot; or &amp;quot;tcp&amp;quot;, &amp;quot;tcp4&amp;quot;, &amp;quot;tcp6&amp;quot;&lt;br /&gt;
 protocol = &amp;quot;both&amp;quot;&lt;br /&gt;
 # domain name to serve the requests off of&lt;br /&gt;
 domain = &amp;quot;auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # zone name server&lt;br /&gt;
 nsname = &amp;quot;ns1.auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # admin email address, where @ is substituted with .&lt;br /&gt;
 nsadmin = &amp;quot;admin.seudominio.com.br&amp;quot;&lt;br /&gt;
 # predefined records served in addition to the TXT&lt;br /&gt;
 records = [&lt;br /&gt;
     # domain pointing to the public IP of your acme-dns server &lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. A 198.1.0.1&amp;quot;,&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. A 198.51.100.1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     # specify that auth.example.org will resolve any *.auth.example.org records&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. NS ns1.auth.seudominio.com.br.&amp;quot;,&lt;br /&gt;
 ]&lt;br /&gt;
 # debug messages from CORS etc&lt;br /&gt;
 debug = false&lt;br /&gt;
 &lt;br /&gt;
 [database]&lt;br /&gt;
 # Database engine to use, sqlite or postgres&lt;br /&gt;
 engine = &amp;quot;sqlite&amp;quot;&lt;br /&gt;
 # Connection string, filename for sqlite3 and postgres://$username:$password@$host/$db_name for postgres&lt;br /&gt;
 # Please note that the default Docker image uses path /var/lib/acme-dns/acme-dns.db for sqlite3&lt;br /&gt;
 connection = &amp;quot;/var/lib/acme-dns-rust/acme-dns.db&amp;quot;&lt;br /&gt;
 # connection = &amp;quot;postgres://user:password@localhost/acmedns_db&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [api]&lt;br /&gt;
 # listen ip eg. 127.0.0.1&lt;br /&gt;
 ip = &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
 # disable registration endpoint&lt;br /&gt;
 disable_registration = false&lt;br /&gt;
 # listen port, eg. 443 for default HTTPS&lt;br /&gt;
 port = &amp;quot;443&amp;quot;&lt;br /&gt;
 # possible values: &amp;quot;letsencrypt&amp;quot;, &amp;quot;letsencryptstaging&amp;quot;, &amp;quot;cert&amp;quot;, &amp;quot;none&amp;quot;&lt;br /&gt;
 tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;cert&amp;quot;&lt;br /&gt;
 tls_cert_privkey = &amp;quot;/etc/tls/example.org/privkey.pem&amp;quot;&lt;br /&gt;
 tls_cert_fullchain = &amp;quot;/etc/tls/example.org/fullchain.pem&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 acme_cache_dir = &amp;quot;api-certs&amp;quot;&lt;br /&gt;
 # optional e-mail address to which Let&#039;s Encrypt will send expiration notices for the API&#039;s cert&lt;br /&gt;
 notification_email = &amp;quot;&amp;quot;&lt;br /&gt;
 # CORS AllowOrigins, wildcards can be used&lt;br /&gt;
 corsorigins = [&lt;br /&gt;
     &amp;quot;*&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 # use HTTP header to get the client ip&lt;br /&gt;
 use_header = false&lt;br /&gt;
 # header name to pull the ip address / list of ip addresses from&lt;br /&gt;
 header_name = &amp;quot;X-Forwarded-For&amp;quot;&lt;br /&gt;
 # enable HSTS (HTTP Strict Transport Security)&lt;br /&gt;
 hsts_enabled = false&lt;br /&gt;
 # HSTS max age in seconds (default: 31536000 = 1 year)&lt;br /&gt;
 hsts_max_age = 31536000&lt;br /&gt;
 # HSTS include subdomains directive&lt;br /&gt;
 hsts_include_subdomains = false&lt;br /&gt;
 # HSTS preload directive&lt;br /&gt;
 hsts_preload = false&lt;br /&gt;
 &lt;br /&gt;
 [logconfig]&lt;br /&gt;
 # logging level: &amp;quot;error&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;info&amp;quot; or &amp;quot;debug&amp;quot;&lt;br /&gt;
 loglevel = &amp;quot;info&amp;quot;&lt;br /&gt;
 # possible values: stdout, file&lt;br /&gt;
 logtype = &amp;quot;stdout&amp;quot;&lt;br /&gt;
 # file path for logfile&lt;br /&gt;
 logfile = &amp;quot;./acme-dns.log&amp;quot;&lt;br /&gt;
 # format, either &amp;quot;json&amp;quot; or &amp;quot;text&amp;quot;&lt;br /&gt;
 logformat = &amp;quot;json&amp;quot;&lt;br /&gt;
O arquivo já possui comentários das opções de configuração para ajudá-lo a personalizar mais o serviço mas não entraremos em detalhe. Só buscar na documentação do projeto. Acima configuramos ele para funcionar com nossos dados fictícios, estará funcionando tanto via &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto via &#039;&#039;&#039;IPv6&#039;&#039;&#039; apontados para &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. Ele também já está configurado para solicitar para ele um certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; automaticamente.&lt;br /&gt;
&lt;br /&gt;
Após terminada a configuração acima, iniciaremos o serviço:&lt;br /&gt;
 # systemctl start acme-dns-rust.service&lt;br /&gt;
Após iniciar o serviço teremos as seguintes portas up: &#039;&#039;&#039;53/udp&#039;&#039;&#039;, &#039;&#039;&#039;53/tcp&#039;&#039;&#039; e a &#039;&#039;&#039;443/tcp&#039;&#039;&#039;. Esta última porta é para a comunicação &#039;&#039;&#039;API&#039;&#039;&#039; entre o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns&#039;&#039;&#039;. Para checar se o serviço está rodando:&lt;br /&gt;
 # systemctl status acme-dns-rust&lt;br /&gt;
[[Arquivo:Acme-dns-02.png.png|nenhum|miniaturadaimagem|1454x1454px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Importante! Para funcionar o serviço de DNS Autoritativo tem que estar configurado certinho. Depois que o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; estiver rodando você pode checar assim. Lembre-se de fazer com seus dados reais.&lt;br /&gt;
 # host auth.seudominio.com.br&lt;br /&gt;
 auth.seudominio.com.br has address 198.18.0.1&lt;br /&gt;
 auth.seudominio.com.br has IPv6 address 2001:db8::198:18:0:1&lt;br /&gt;
Se apresentar erro de &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039;, então algo não ficou bem configurado no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;, ou &#039;&#039;&#039;na configuração do seu acme-dns-rust&#039;&#039;&#039;. Dê uma revisada novamente aqui no artigo.&lt;br /&gt;
&lt;br /&gt;
Se tudo ocorreu bem, então você tem um &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039; rodando e pronto para armazenar os &#039;&#039;&#039;desafios TXT da Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CERTBOT e ACME-DNS-CLIENT-RUST ==&lt;br /&gt;
Agora vamos entrar na parte de como gerar um certificado TLS para o seu servidor, mesmo que ele possua apenas IP privado, sem abertura de portas e mais seguro. Para todo sistema que precisarmos gerar certificados, utilizaremos o &#039;&#039;&#039;certbot&#039;&#039;&#039; e do &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No diagrama deste artigo dou como exemplo um servidor Web HTTPS e um outro com aplicação corporativa mas você poderá gerar certificados para qualquer ambiente.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez nosso ambiente será um GNU/Linux Debian 13 (Trixie).&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install certbot git&lt;br /&gt;
 # cd /usr/local/src&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://github.com/gondimcodes/acme-dns-rust&amp;lt;/nowiki&amp;gt; ; cd acme-dns-rust/acme-dns-client-rust/ ; cargo build --release&lt;br /&gt;
 # mv target/release/acme-dns-client-rust /usr/local/bin/&lt;br /&gt;
Pronto! Instalamos o &#039;&#039;&#039;certbot&#039;&#039;&#039;, cliente ACME para fazer as solicitações e atualizações dos nossos certificados para a Let&#039;s Encrypt e também instalamos nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Registrando seu domínio e subdomínios que ira utilizar no seu servidor ==&lt;br /&gt;
Vamos supor que você tenha um ERP da empresa no IP 192.168.10.10 e que queira gerar o certificado para ele. Após fazer os passos acima, façamos nosso registro:&lt;br /&gt;
 # acme-dns-client-rust register -d erp.seudominio.com.br -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Esse comando acima vai registrar no seu acme-dns o registro para &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039; e ele vai te vai solicitar que crie um desafio &#039;&#039;&#039;CNAME&#039;&#039;&#039; apontando para o seu acme-dns-rust. No exemplo abaixo a saída vai ser parecida mas o &#039;&#039;&#039;CNAME&#039;&#039;&#039; diferente para você cadastrar no seu DNS Autoritativo. O &#039;&#039;&#039;acme-dns-client-rust ficará aguardando e testando até que você gere esse registro CNAME&#039;&#039;&#039;. Aqui não optei por usar o registro &#039;&#039;&#039;CAA&#039;&#039;&#039; (Certification Authority Authorization) que seria para só autorizar determinada autoridade certificadora à assinar seu certificado.&lt;br /&gt;
 # &#039;&#039;&#039;acme-dns-client register -d erp.seudominio.com.br -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 [*] New acme-dns account for domain seudominio.com.br successfully registered!&lt;br /&gt;
 &lt;br /&gt;
 Do you want acme-dns-client to monitor the CNAME record change? [Y/n]: Y&lt;br /&gt;
 &lt;br /&gt;
 To finalize the setup, you need to create a CNAME record pointing from _acme-challenge.erp.seudominio.com.br &lt;br /&gt;
 to the newly created acme-dns domain 42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 A correctly set up CNAME record should look like the following:&lt;br /&gt;
 &lt;br /&gt;
 _acme-challenge.erp.seudominio.com.br.   IN      CNAME   42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br.&lt;br /&gt;
 &lt;br /&gt;
 Waiting for CNAME record to be set up for domain erp.seudominio.com.br&lt;br /&gt;
 Querying the authoritative nameserver every 15 seconds.&lt;br /&gt;
 &lt;br /&gt;
 [*] CNAME record is now correctly set up!&lt;br /&gt;
 &lt;br /&gt;
 A CAA record allows you to control additional certificate issuance safeguards. The currently supported&lt;br /&gt;
 version allows the domain owner to control which certificate authorities are allowed to issue certificates for the domain in question.&lt;br /&gt;
 The certificate authorities MUST check and respect the CAA records in the validation process.&lt;br /&gt;
 &lt;br /&gt;
 There&#039;s also a standard (&amp;lt;nowiki&amp;gt;RFC 8657&amp;lt;/nowiki&amp;gt;) that extends the CAA record to limit the issuance of certificates to a specific validation &lt;br /&gt;
 method and/or to a specific ACME account. While they can be tested using staging environment of Let&#039;s Encrypt for example,&lt;br /&gt;
 they&#039;re not enabled in the production yet. It is still be worthwhile to configure them so you&#039;ll be protected when the feature gets enabled.&lt;br /&gt;
 Do you wish to set up a CAA record now? [y/N]: N&lt;br /&gt;
Vejam como é interessante seu funcionamento: O Let&#039;s Encrypt para confirmar que você é o dono do domínio, ele procura pelo &#039;&#039;&#039;TXT&#039;&#039;&#039; com o desafio em &#039;&#039;&#039;_acme-challenge.seudominio.com.br&#039;&#039;&#039; só que ele não está no seu DNS Autoritativo e sim no seu servidor acme-dns. O que o &#039;&#039;&#039;CNAME&#039;&#039;&#039; faz é repassar a consulta para o domínio &#039;&#039;&#039;42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br&#039;&#039;&#039; que está criado no seu &#039;&#039;&#039;acme-dns&#039;&#039;&#039;, que por sua vez contém o &#039;&#039;&#039;desafio TXT que a Let&#039;s Encrypt está procurando&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lembra que no início do artigo criamos o subdomínio &#039;&#039;&#039;auth.seudomínio.com.br&#039;&#039;&#039; e apontamos tudo que for para ele, consultar no &#039;&#039;&#039;acme-dns&#039;&#039;&#039;? Ou seja &#039;&#039;&#039;42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b&#039;&#039;&#039; é um subdomínio de &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. É confuso para quem nunca configurou um serviço de DNS mas se você realmente não está conseguindo entender, procure dar uma estudada sobre DNS (Domain Name System).&lt;br /&gt;
&lt;br /&gt;
Após conseguirmos registrar o domínio acima, passamos para o uso com o &#039;&#039;&#039;certbot&#039;&#039;&#039;, para que possamos solicitar nosso certificado digital para a Let&#039;s Encrypt.&lt;br /&gt;
&lt;br /&gt;
== Usando o certbot com o acme-dns-client ==&lt;br /&gt;
Abaixo estamos solicitamos ao &#039;&#039;&#039;certbot&#039;&#039;&#039; ,usando o nosso &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039;, para gerar o certificado TLS para o &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039;. O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; gerará um &#039;&#039;&#039;desafio TXT (DNS-01)&#039;&#039;&#039; para o &#039;&#039;&#039;erp.seudomínio.com.br&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; incluirá o registro no acme-dns fazendo com que a Let&#039;s Encrypt encontre o desafio e libere o certificado digital.&lt;br /&gt;
 # &#039;&#039;&#039;certbot certonly --manual --preferred-challenges dns --manual-auth-hook &#039;/usr/local/bin/acme-dns-client&#039; -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Enter email address (used for urgent renewal and security notices)&lt;br /&gt;
  (Enter &#039;c&#039; to cancel): noc@seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Please read the Terms of Service at&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf&amp;lt;/nowiki&amp;gt;. You must&lt;br /&gt;
 agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: Y&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
 share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
 partner of the Let&#039;s Encrypt project and the non-profit organization that&lt;br /&gt;
 develops Certbot? We&#039;d like to send you email about our work encrypting the web,&lt;br /&gt;
 EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: N&lt;br /&gt;
 Account registered.&lt;br /&gt;
 Requesting a certificate for erp.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 Successfully received certificate.&lt;br /&gt;
 Certificate is saved at: /etc/letsencrypt/live/erp.seudominio.com.br/fullchain.pem&lt;br /&gt;
 Key is saved at:         /etc/letsencrypt/live/erp.seudominio.com.br/privkey.pem&lt;br /&gt;
 This certificate expires on 2025-07-22.&lt;br /&gt;
 These files will be updated when the certificate renews.&lt;br /&gt;
 Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 If you like Certbot, please consider supporting our work by:&lt;br /&gt;
  * Donating to ISRG / Let&#039;s Encrypt:   &amp;lt;nowiki&amp;gt;https://letsencrypt.org/donate&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  * Donating to EFF:                    &amp;lt;nowiki&amp;gt;https://eff.org/donate-le&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Os certificados são gerados em /etc/letsencrypt e aí só usá-los em suas aplicações.  Para atualizar automaticamente os certificados basta colocar algo assim em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew &amp;amp;&amp;amp; /usr/bin/systemctl reload nginx.service&lt;br /&gt;
Acima estamos renovando o certificado todo dia 01 de cada mês às 00:00 e na sequência recarregando o nginx para conter o novo certificado. Você pode adaptar para a sua realidade.&lt;br /&gt;
&lt;br /&gt;
Espero que seja útil este artigo e que agora não tenhamos mais que usar certificados TLS auto-assinados que são feios, não passam segurança e não confirmam a identidade de quem está fornecendo o serviço. Coloque certificado TLS válido em todos os seus serviços e mantenha as boas práticas em dia.&lt;br /&gt;
&lt;br /&gt;
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos [[Sobre mim|aqui]].&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1168</id>
		<title>Certificado TLS com ACME-DNS e DNS-01</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Certificado_TLS_com_ACME-DNS_e_DNS-01&amp;diff=1168"/>
		<updated>2026-07-10T03:08:16Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Diagrama exemplo ==&lt;br /&gt;
[[Arquivo:Acme-dns.drawio.png|semmoldura|685x685px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via &#039;&#039;&#039;HTTPS&#039;&#039;&#039;, servidores de envio e recebimento de e-mails (&#039;&#039;&#039;MTA&#039;&#039;&#039;s), clientes de e-mail (&#039;&#039;&#039;MUA&#039;&#039;&#039;s) quando se comunicam com os MTAs, DNS quando utilizamos &#039;&#039;&#039;DNSSEC&#039;&#039;&#039; e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando &#039;&#039;&#039;HTTP (80/tcp)&#039;&#039;&#039; e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum &#039;&#039;&#039;malware&#039;&#039;&#039; hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com &#039;&#039;&#039;criptografia assimétrica&#039;&#039;&#039; onde temos um par de chaves, a &#039;&#039;&#039;chave pública&#039;&#039;&#039; e uma &#039;&#039;&#039;chave privada&#039;&#039;&#039;. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as &#039;&#039;&#039;Autoridades Certificadoras (CA&#039;&#039;&#039;s&#039;&#039;&#039;)&#039;&#039;&#039;, elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039;. Ela é uma opção gratuita e extremamente utilizada na Internet.&lt;br /&gt;
&lt;br /&gt;
== Como funciona a &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; ==&lt;br /&gt;
Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039; lá no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.&lt;br /&gt;
&lt;br /&gt;
A Let&#039;s Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o &#039;&#039;&#039;seudominio.com.br&#039;&#039;&#039;. Ela pode fazer isso de duas formas:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HTTP-01&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
No modelo de confirmação &#039;&#039;&#039;HTTP-01&#039;&#039;&#039; é necessário que a Let&#039;s Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com &#039;&#039;&#039;IP 192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;FC00::192:168:0:10&#039;&#039;&#039;. Aí nesse caso podemos tomar para uso a autenticação via &#039;&#039;&#039;DNS-01&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usando DNS-01, a Let&#039;s Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let&#039;s Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar,  &#039;&#039;&#039;acme-dns&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Meu artigo será exatamente sobre o uso do &#039;&#039;&#039;DNS-01&#039;&#039;&#039; e o &#039;&#039;&#039;serviço acme-dns&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ACME-DNS-RUST ==&lt;br /&gt;
O &#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust acme-dns-rust]&#039;&#039;&#039; é um micro servidor de DNS programado em &#039;&#039;&#039;Rust&#039;&#039;&#039; e que também tem o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039; que também iremos utilizar. O &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; terá a função de armazenar e atualizar os &#039;&#039;&#039;registros TXT de DNS&#039;&#039;&#039;, com os desafios gerados pela &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; e este possui uma API HTTPS para se comunicar com o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar os seguintes programas neste artigo:&lt;br /&gt;
&lt;br /&gt;
* Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let&#039;s Encrypt.&lt;br /&gt;
* ACME-DNS-CLIENT-RUST, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.&lt;br /&gt;
* ACME-DNS-RUST, o serviço de DNS que armazenará os desafios para o seu servi__FORCARTDC__dor.&lt;br /&gt;
O funcionamento do conjunto &#039;&#039;&#039;acme-dns-rust/acme-dns-client-rust&#039;&#039;&#039; é bem simples, é necessário criarmos um &#039;&#039;&#039;subdomínio&#039;&#039;&#039; para a nossa gerência de desafios apontando para onde nosso &#039;&#039;&#039;servidor acme-dns-rust&#039;&#039;&#039; ficará rodando. Vamos usar para isso um sistema &#039;&#039;&#039;GNU/Linux Debian&#039;&#039;&#039; mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;:&lt;br /&gt;
 auth.seudominio.com.br.     IN NS ns1.auth.seudominio.com.br.&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN A 198.18.0.1&lt;br /&gt;
 ns1.auth.seudominio.com.br. IN AAAA 2001:db8::198:18:0:1&lt;br /&gt;
Acima estamos criando nosso &#039;&#039;&#039;subdomínio auth&#039;&#039;&#039; e apontando para os &#039;&#039;&#039;IPs fictícios 198.18.0.1 e 2001:db8:198:0:1&#039;&#039;&#039; que é onde estará rodando nosso servidor acme-dns. Esse serviço uma vez rodando, você poderá usá-lo para criar &#039;&#039;&#039;certificados TLS usando Let&#039;s Encrypt DNS-01&#039;&#039;&#039; para qualquer domínio e servidor seu, seja ele público ou privado.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://github.com/gondimcodes/acme-dns-rust/blob/main/INSTALL.md Aqui]&#039;&#039;&#039; você encontra os passos para instalar o &#039;&#039;&#039;cargo&#039;&#039;&#039; e como compilar o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Agora falta pouco para termos rodando nosso &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039;. Siga os passos abaixo:&lt;br /&gt;
 # useradd -r -s /bin/false acme-dns&lt;br /&gt;
 # mkdir -p /etc/acme-dns-rust&lt;br /&gt;
 # mkdir -p /var/lib/acme-dns-rust&lt;br /&gt;
Dentro desse diretório &#039;&#039;&#039;/etc/acme-dns-rust&#039;&#039;&#039; criaremos um arquivo chamado &#039;&#039;&#039;config.toml&#039;&#039;&#039; e o conteúdo dele está configurado para o nosso exemplo, mas nesse caso é só você alterar as configurações para o seu uso em produção:&lt;br /&gt;
&lt;br /&gt;
Conteúdo de &#039;&#039;&#039;/etc/acme-dns-rust/config.toml&#039;&#039;&#039;:&lt;br /&gt;
 [general]&lt;br /&gt;
 # DNS interface. Note that systemd-resolved may reserve port 53 on 127.0.0.53&lt;br /&gt;
 # In this case acme-dns will error out and you will need to define the listening interface&lt;br /&gt;
 # for example: listen = &amp;quot;127.0.0.1:53&amp;quot;&lt;br /&gt;
 listen = &amp;quot;[::]:53&amp;quot;&lt;br /&gt;
 # protocol, &amp;quot;both&amp;quot;, &amp;quot;both4&amp;quot;, &amp;quot;both6&amp;quot;, &amp;quot;udp&amp;quot;, &amp;quot;udp4&amp;quot;, &amp;quot;udp6&amp;quot; or &amp;quot;tcp&amp;quot;, &amp;quot;tcp4&amp;quot;, &amp;quot;tcp6&amp;quot;&lt;br /&gt;
 protocol = &amp;quot;both&amp;quot;&lt;br /&gt;
 # domain name to serve the requests off of&lt;br /&gt;
 domain = &amp;quot;auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # zone name server&lt;br /&gt;
 nsname = &amp;quot;ns1.auth.seudominio.com.br&amp;quot;&lt;br /&gt;
 # admin email address, where @ is substituted with .&lt;br /&gt;
 nsadmin = &amp;quot;admin.seudominio.com.br&amp;quot;&lt;br /&gt;
 # predefined records served in addition to the TXT&lt;br /&gt;
 records = [&lt;br /&gt;
     # domain pointing to the public IP of your acme-dns server &lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. A 198.1.0.1&amp;quot;,&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. A 198.51.100.1&amp;quot;,&lt;br /&gt;
     &amp;quot;ns1.auth.seudominio.com.br. AAAA 2001:db8::198:18:0:1&amp;quot;,&lt;br /&gt;
     # specify that auth.example.org will resolve any *.auth.example.org records&lt;br /&gt;
     &amp;quot;auth.seudominio.com.br. NS ns1.auth.seudominio.com.br.&amp;quot;,&lt;br /&gt;
 ]&lt;br /&gt;
 # debug messages from CORS etc&lt;br /&gt;
 debug = false&lt;br /&gt;
 &lt;br /&gt;
 [database]&lt;br /&gt;
 # Database engine to use, sqlite or postgres&lt;br /&gt;
 engine = &amp;quot;sqlite&amp;quot;&lt;br /&gt;
 # Connection string, filename for sqlite3 and postgres://$username:$password@$host/$db_name for postgres&lt;br /&gt;
 # Please note that the default Docker image uses path /var/lib/acme-dns/acme-dns.db for sqlite3&lt;br /&gt;
 connection = &amp;quot;/var/lib/acme-dns-rust/acme-dns.db&amp;quot;&lt;br /&gt;
 # connection = &amp;quot;postgres://user:password@localhost/acmedns_db&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [api]&lt;br /&gt;
 # listen ip eg. 127.0.0.1&lt;br /&gt;
 ip = &amp;quot;0.0.0.0&amp;quot;&lt;br /&gt;
 # disable registration endpoint&lt;br /&gt;
 disable_registration = false&lt;br /&gt;
 # listen port, eg. 443 for default HTTPS&lt;br /&gt;
 port = &amp;quot;443&amp;quot;&lt;br /&gt;
 # possible values: &amp;quot;letsencrypt&amp;quot;, &amp;quot;letsencryptstaging&amp;quot;, &amp;quot;cert&amp;quot;, &amp;quot;none&amp;quot;&lt;br /&gt;
 tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;cert&amp;quot;&lt;br /&gt;
 tls_cert_privkey = &amp;quot;/etc/tls/example.org/privkey.pem&amp;quot;&lt;br /&gt;
 tls_cert_fullchain = &amp;quot;/etc/tls/example.org/fullchain.pem&amp;quot;&lt;br /&gt;
 # only used if tls = &amp;quot;letsencrypt&amp;quot;&lt;br /&gt;
 acme_cache_dir = &amp;quot;api-certs&amp;quot;&lt;br /&gt;
 # optional e-mail address to which Let&#039;s Encrypt will send expiration notices for the API&#039;s cert&lt;br /&gt;
 notification_email = &amp;quot;&amp;quot;&lt;br /&gt;
 # CORS AllowOrigins, wildcards can be used&lt;br /&gt;
 corsorigins = [&lt;br /&gt;
     &amp;quot;*&amp;quot;&lt;br /&gt;
 ]&lt;br /&gt;
 # use HTTP header to get the client ip&lt;br /&gt;
 use_header = false&lt;br /&gt;
 # header name to pull the ip address / list of ip addresses from&lt;br /&gt;
 header_name = &amp;quot;X-Forwarded-For&amp;quot;&lt;br /&gt;
 # enable HSTS (HTTP Strict Transport Security)&lt;br /&gt;
 hsts_enabled = false&lt;br /&gt;
 # HSTS max age in seconds (default: 31536000 = 1 year)&lt;br /&gt;
 hsts_max_age = 31536000&lt;br /&gt;
 # HSTS include subdomains directive&lt;br /&gt;
 hsts_include_subdomains = false&lt;br /&gt;
 # HSTS preload directive&lt;br /&gt;
 hsts_preload = false&lt;br /&gt;
 &lt;br /&gt;
 [logconfig]&lt;br /&gt;
 # logging level: &amp;quot;error&amp;quot;, &amp;quot;warning&amp;quot;, &amp;quot;info&amp;quot; or &amp;quot;debug&amp;quot;&lt;br /&gt;
 loglevel = &amp;quot;info&amp;quot;&lt;br /&gt;
 # possible values: stdout, file&lt;br /&gt;
 logtype = &amp;quot;stdout&amp;quot;&lt;br /&gt;
 # file path for logfile&lt;br /&gt;
 logfile = &amp;quot;./acme-dns.log&amp;quot;&lt;br /&gt;
 # format, either &amp;quot;json&amp;quot; or &amp;quot;text&amp;quot;&lt;br /&gt;
 logformat = &amp;quot;json&amp;quot;&lt;br /&gt;
O arquivo já possui comentários das opções de configuração para ajudá-lo a personalizar mais o serviço mas não entraremos em detalhe. Só buscar na documentação do projeto. Acima configuramos ele para funcionar com nossos dados fictícios, estará funcionando tanto via &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto via &#039;&#039;&#039;IPv6&#039;&#039;&#039; apontados para &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. Ele também já está configurado para solicitar para ele um certificado &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; automaticamente.&lt;br /&gt;
&lt;br /&gt;
Após terminada a configuração acima, iniciaremos o serviço:&lt;br /&gt;
 # systemctl start acme-dns-rust.service&lt;br /&gt;
Após iniciar o serviço teremos as seguintes portas up: &#039;&#039;&#039;53/udp&#039;&#039;&#039;, &#039;&#039;&#039;53/tcp&#039;&#039;&#039; e a &#039;&#039;&#039;443/tcp&#039;&#039;&#039;. Esta última porta é para a comunicação &#039;&#039;&#039;API&#039;&#039;&#039; entre o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns&#039;&#039;&#039;. Para checar se o serviço está rodando:&lt;br /&gt;
 # systemctl status acme-dns-rust&lt;br /&gt;
[[Arquivo:Acme-dns-02.png.png|nenhum|miniaturadaimagem|1454x1454px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Importante! Para funcionar o serviço de DNS Autoritativo tem que estar configurado certinho. Depois que o &#039;&#039;&#039;acme-dns-rust&#039;&#039;&#039; estiver rodando você pode checar assim. Lembre-se de fazer com seus dados reais.&lt;br /&gt;
 # host auth.seudominio.com.br&lt;br /&gt;
 auth.seudominio.com.br has address 198.18.0.1&lt;br /&gt;
 auth.seudominio.com.br has IPv6 address 2001:db8::198:18:0:1&lt;br /&gt;
Se apresentar erro de &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039;, então algo não ficou bem configurado no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039;, ou &#039;&#039;&#039;na configuração do seu acme-dns-rust&#039;&#039;&#039;. Dê uma revisada novamente aqui no artigo.&lt;br /&gt;
&lt;br /&gt;
Se tudo ocorreu bem, então você tem um &#039;&#039;&#039;serviço acme-dns-rust&#039;&#039;&#039; rodando e pronto para armazenar os &#039;&#039;&#039;desafios TXT da Let&#039;s Encrypt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CERTBOT e ACME-DNS-CLIENT-RUST ==&lt;br /&gt;
Agora vamos entrar na parte de como gerar um certificado TLS para o seu servidor, mesmo que ele possua apenas IP privado, sem abertura de portas e mais seguro. Para todo sistema que precisarmos gerar certificados, utilizaremos o &#039;&#039;&#039;certbot&#039;&#039;&#039; e do &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No diagrama deste artigo dou como exemplo um servidor Web HTTPS e um outro com aplicação corporativa mas você poderá gerar certificados para qualquer ambiente.&lt;br /&gt;
&lt;br /&gt;
Mais uma vez nosso ambiente será um GNU/Linux Debian 13 (Trixie).&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install certbot git&lt;br /&gt;
 # cd /usr/local/src&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://github.com/gondimcodes/acme-dns-rust&amp;lt;/nowiki&amp;gt; ; cd acme-dns-rust/acme-dns-client-rust/ ; cargo build --release&lt;br /&gt;
 # mv target/release/acme-dns-client-rust /usr/local/bin/&lt;br /&gt;
Pronto! Instalamos o &#039;&#039;&#039;certbot&#039;&#039;&#039;, cliente ACME para fazer as solicitações e atualizações dos nossos certificados para a Let&#039;s Encrypt e também instalamos nosso &#039;&#039;&#039;acme-dns-client-rust&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Registrando seu domínio e subdomínios que ira utilizar no seu servidor ==&lt;br /&gt;
Vamos supor que você tenha um ERP da empresa no IP 192.168.10.10 e que queira gerar o certificado para ele. Após fazer os passos acima, façamos nosso registro:&lt;br /&gt;
 # acme-dns-client-rust register -d erp.seudominio.com.br -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Esse comando acima vai registrar no seu acme-dns o registro para &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039; e ele vai te vai solicitar que crie um desafio &#039;&#039;&#039;CNAME&#039;&#039;&#039; apontando para o seu acme-dns-rust. No exemplo abaixo a saída vai ser parecida mas o &#039;&#039;&#039;CNAME&#039;&#039;&#039; diferente para você cadastrar no seu DNS Autoritativo. O &#039;&#039;&#039;acme-dns-client-rust ficará aguardando e testando até que você gere esse registro CNAME&#039;&#039;&#039;. Aqui não optei por usar o registro &#039;&#039;&#039;CAA&#039;&#039;&#039; (Certification Authority Authorization) que seria para só autorizar determinada autoridade certificadora à assinar seu certificado.&lt;br /&gt;
 # &#039;&#039;&#039;acme-dns-client register -d erp.seudominio.com.br -s &amp;lt;nowiki&amp;gt;https://auth.seudominio.com.br&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
 [*] New acme-dns account for domain seudominio.com.br successfully registered!&lt;br /&gt;
 &lt;br /&gt;
 Do you want acme-dns-client to monitor the CNAME record change? [Y/n]: Y&lt;br /&gt;
 &lt;br /&gt;
 To finalize the setup, you need to create a CNAME record pointing from _acme-challenge.erp.seudominio.com.br &lt;br /&gt;
 to the newly created acme-dns domain 42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 A correctly set up CNAME record should look like the following:&lt;br /&gt;
 &lt;br /&gt;
 _acme-challenge.erp.seudominio.com.br.   IN      CNAME   42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br.&lt;br /&gt;
 &lt;br /&gt;
 Waiting for CNAME record to be set up for domain erp.seudominio.com.br&lt;br /&gt;
 Querying the authoritative nameserver every 15 seconds.&lt;br /&gt;
 &lt;br /&gt;
 [*] CNAME record is now correctly set up!&lt;br /&gt;
 &lt;br /&gt;
 A CAA record allows you to control additional certificate issuance safeguards. The currently supported&lt;br /&gt;
 version allows the domain owner to control which certificate authorities are allowed to issue certificates for the domain in question.&lt;br /&gt;
 The certificate authorities MUST check and respect the CAA records in the validation process.&lt;br /&gt;
 &lt;br /&gt;
 There&#039;s also a standard (&amp;lt;nowiki&amp;gt;RFC 8657&amp;lt;/nowiki&amp;gt;) that extends the CAA record to limit the issuance of certificates to a specific validation &lt;br /&gt;
 method and/or to a specific ACME account. While they can be tested using staging environment of Let&#039;s Encrypt for example,&lt;br /&gt;
 they&#039;re not enabled in the production yet. It is still be worthwhile to configure them so you&#039;ll be protected when the feature gets enabled.&lt;br /&gt;
 Do you wish to set up a CAA record now? [y/N]: N&lt;br /&gt;
Vejam como é interessante seu funcionamento: O Let&#039;s Encrypt para confirmar que você é o dono do domínio, ele procura pelo &#039;&#039;&#039;TXT&#039;&#039;&#039; com o desafio em &#039;&#039;&#039;_acme-challenge.seudominio.com.br&#039;&#039;&#039; só que ele não está no seu DNS Autoritativo e sim no seu servidor acme-dns. O que o &#039;&#039;&#039;CNAME&#039;&#039;&#039; faz é repassar a consulta para o domínio &#039;&#039;&#039;42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b.auth.seudominio.com.br&#039;&#039;&#039; que está criado no seu &#039;&#039;&#039;acme-dns&#039;&#039;&#039;, que por sua vez contém o &#039;&#039;&#039;desafio TXT que a Let&#039;s Encrypt está procurando&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lembra que no início do artigo criamos o subdomínio &#039;&#039;&#039;auth.seudomínio.com.br&#039;&#039;&#039; e apontamos tudo que for para ele, consultar no &#039;&#039;&#039;acme-dns&#039;&#039;&#039;? Ou seja &#039;&#039;&#039;42fa6f9f-5a56-4985-bbd7-c8a0e0ce4e1b&#039;&#039;&#039; é um subdomínio de &#039;&#039;&#039;auth.seudominio.com.br&#039;&#039;&#039;. É confuso para quem nunca configurou um serviço de DNS mas se você realmente não está conseguindo entender, procure dar uma estudada sobre DNS (Domain Name System).&lt;br /&gt;
&lt;br /&gt;
Após conseguirmos registrar o domínio acima, passamos para o uso com o &#039;&#039;&#039;certbot&#039;&#039;&#039;, para que possamos solicitar nosso certificado digital para a Let&#039;s Encrypt.&lt;br /&gt;
&lt;br /&gt;
== Usando o certbot com o acme-dns-client ==&lt;br /&gt;
Abaixo estamos solicitamos ao &#039;&#039;&#039;certbot&#039;&#039;&#039; ,usando o nosso &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039;, para gerar o certificado TLS para o &#039;&#039;&#039;erp.seudominio.com.br&#039;&#039;&#039;. O &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; gerará um &#039;&#039;&#039;desafio TXT (DNS-01)&#039;&#039;&#039; para o &#039;&#039;&#039;erp.seudomínio.com.br&#039;&#039;&#039; e o &#039;&#039;&#039;acme-dns-client&#039;&#039;&#039; incluirá o registro no acme-dns fazendo com que a Let&#039;s Encrypt encontre o desafio e libere o certificado digital.&lt;br /&gt;
 # &#039;&#039;&#039;certbot certonly --manual --preferred-challenges dns --manual-auth-hook &#039;/usr/local/bin/acme-dns-client&#039; -d erp.seudominio.com.br&#039;&#039;&#039;&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Enter email address (used for urgent renewal and security notices)&lt;br /&gt;
  (Enter &#039;c&#039; to cancel): noc@seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Please read the Terms of Service at&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf&amp;lt;/nowiki&amp;gt;. You must&lt;br /&gt;
 agree in order to register with the ACME server. Do you agree?&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: Y&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Would you be willing, once your first certificate is successfully issued, to&lt;br /&gt;
 share your email address with the Electronic Frontier Foundation, a founding&lt;br /&gt;
 partner of the Let&#039;s Encrypt project and the non-profit organization that&lt;br /&gt;
 develops Certbot? We&#039;d like to send you email about our work encrypting the web,&lt;br /&gt;
 EFF news, campaigns, and ways to support digital freedom.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 (Y)es/(N)o: N&lt;br /&gt;
 Account registered.&lt;br /&gt;
 Requesting a certificate for erp.seudominio.com.br&lt;br /&gt;
 &lt;br /&gt;
 Successfully received certificate.&lt;br /&gt;
 Certificate is saved at: /etc/letsencrypt/live/erp.seudominio.com.br/fullchain.pem&lt;br /&gt;
 Key is saved at:         /etc/letsencrypt/live/erp.seudominio.com.br/privkey.pem&lt;br /&gt;
 This certificate expires on 2025-07-22.&lt;br /&gt;
 These files will be updated when the certificate renews.&lt;br /&gt;
 Certbot has set up a scheduled task to automatically renew this certificate in the background.&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 If you like Certbot, please consider supporting our work by:&lt;br /&gt;
  * Donating to ISRG / Let&#039;s Encrypt:   &amp;lt;nowiki&amp;gt;https://letsencrypt.org/donate&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  * Donating to EFF:                    &amp;lt;nowiki&amp;gt;https://eff.org/donate-le&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Os certificados são gerados em /etc/letsencrypt e aí só usá-los em suas aplicações.  Para atualizar automaticamente os certificados basta colocar algo assim em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew &amp;amp;&amp;amp; /usr/bin/systemctl reload nginx.service&lt;br /&gt;
Acima estamos renovando o certificado todo dia 01 de cada mês às 00:00 e na sequência recarregando o nginx para conter o novo certificado. Você pode adaptar para a sua realidade.&lt;br /&gt;
&lt;br /&gt;
Espero que seja útil este artigo e que agora não tenhamos mais que usar certificados TLS auto-assinados que são feios, não passam segurança e não confirmam a identidade de quem está fornecendo o serviço. Coloque certificado TLS válido em todos os seus serviços e mantenha as boas práticas em dia.&lt;br /&gt;
&lt;br /&gt;
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos [[Sobre mim|aqui]].&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Arquivo:Acme-dns-02.png.png&amp;diff=1167</id>
		<title>Arquivo:Acme-dns-02.png.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Arquivo:Acme-dns-02.png.png&amp;diff=1167"/>
		<updated>2026-07-10T02:56:09Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Acme-dns-02.png&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1166</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1166"/>
		<updated>2026-07-08T22:51:44Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as &#039;&#039;&#039;7 práticas do KINDNS&#039;&#039;&#039; utilizando containers do &#039;&#039;&#039;Docker&#039;&#039;&#039;. Vamos fazer um check list rápido do que contempla o projeto. Também temos uma versão para &#039;&#039;&#039;FreeBSD&#039;&#039;&#039; rodando em &#039;&#039;&#039;jails&#039;&#039;&#039; &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns-freebsd UNBOUND-KINDNS-FREEBSD]&#039;&#039;&#039;, meus agradecimentos especiais aos contribuidores &#039;&#039;&#039;Leonardo Amaral&#039;&#039;&#039; e &#039;&#039;&#039;Cleber Alves - CloudBSD&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prática 1&#039;&#039;&#039; - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. &#039;&#039;&#039;Unbound já atende por padrão&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 2&#039;&#039;&#039; - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. &#039;&#039;&#039;Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 3&#039;&#039;&#039; - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. &#039;&#039;&#039;Este projeto encontra-se com QNAME minimization já ativo&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 4&#039;&#039;&#039; - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. &#039;&#039;&#039;Unbound não faz Autoritativo, então OK também&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 5&#039;&#039;&#039; - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. &#039;&#039;&#039;Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 6&#039;&#039;&#039; - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. &#039;&#039;&#039;O projeto já entrega um container com Zabbix Agent2 7.0.x e um script para envio de métricas para o Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 7&#039;&#039;&#039; - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. &#039;&#039;&#039;Aqui também o projeto entrega o sistema preparado para DoT e DoH, só necessitando da configuração dos certificados TLS&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O projeto foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039; favorita. Como os serviços rodam em containers, ficam independentes de distro &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um pouco de conhecimento em administração GNU/Linux e Docker.&lt;br /&gt;
&lt;br /&gt;
Um sistema com 8 vCores e 16G de ram suporta +20.000 assinantes simultâneos.&lt;br /&gt;
&lt;br /&gt;
== Preparação antes de rodar o script ==&lt;br /&gt;
No topo do script &#039;&#039;&#039;unbound_kindns.sh&#039;&#039;&#039; existem algumas variáveis para configurarmos antes de sua execução:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CORES&amp;lt;/code&amp;gt;: Número de núcleos de CPU dedicados ao Unbound (define o parâmetro &amp;lt;code&amp;gt;num-threads&amp;lt;/code&amp;gt; na configuração do Unbound; padrão: &#039;&#039;&#039;4&#039;&#039;&#039;).&lt;br /&gt;
* &amp;lt;code&amp;gt;OSPF_INTERFACE&amp;lt;/code&amp;gt;: Interface física de rede utilizada para o roteamento &#039;&#039;&#039;OSPF&#039;&#039;&#039; (por exemplo, &amp;lt;code&amp;gt;ens20&amp;lt;/code&amp;gt;). Se deixado em branco, a implantação de &#039;&#039;&#039;OSPF/Anycast&#039;&#039;&#039; (container &#039;&#039;&#039;FRR&#039;&#039;&#039;) será ignorada, executando o sistema em modo autônomo (stand-alone).&lt;br /&gt;
* &amp;lt;code&amp;gt;APPARMOR&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; para desabilitar o AppArmor e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; para mantê-lo habilitado.&lt;br /&gt;
* &amp;lt;code&amp;gt;MITIGATIONS&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; para desabilitar as mitigações de CPU e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; para deixá-las no modo automático.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_HOSTNAME&amp;lt;/code&amp;gt;: Identificador do host no servidor Zabbix. Se deixado em branco, o script utilizará o &#039;&#039;&#039;hostname&#039;&#039;&#039; do sistema.&lt;br /&gt;
* &amp;lt;code&amp;gt;CERT_DOMAIN&amp;lt;/code&amp;gt;: Nome de domínio utilizado para os certificados SSL do Let&#039;s Encrypt (empregado na validação dos serviços &#039;&#039;&#039;DoH&#039;&#039;&#039; e &#039;&#039;&#039;DoT&#039;&#039;&#039;; padrão: &amp;lt;code&amp;gt;doh.brasil.com.br&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_HOST&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_ACTIVE&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix ativo (Active Zabbix Server).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_LISTENIP&amp;lt;/code&amp;gt;: Endereço IP de vinculação (binding) para o container do Zabbix Agent 2 escutar conexões (padrão: &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Executando a instalação ==&lt;br /&gt;
Ao executar como root &#039;&#039;&#039;./unbound_kindns.sh &amp;lt;hostname&amp;gt;&#039;&#039;&#039;, verá a tela do instalador abaixo onde fará todo o processo de baixar imagens, compilar os programas e criar os containers. Sim o &#039;&#039;&#039;Unbound&#039;&#039;&#039; que o projeto utiliza é o &#039;&#039;&#039;latest&#039;&#039;&#039; do próprio desenvolvedor &#039;&#039;&#039;NLnet Labs&#039;&#039;&#039;. &lt;br /&gt;
[[Arquivo:Unbound-kindns02.png|nenhum|miniaturadaimagem|1046x1046px]]&lt;br /&gt;
Tudo ocorrendo bem veremos a mensagem de &#039;&#039;&#039;Installation finished&#039;&#039;&#039;. Na sequência veremos sobre a administração do sistema.&lt;br /&gt;
&lt;br /&gt;
== Administrando o sistema ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Os arquivos de configuração do Unbound encontram-se em &#039;&#039;&#039;/var/lib/docker/volumes/unbound_config/_data/unbound.conf.d/&#039;&#039;&#039;. Nele existem 2 arquivos que precisam de atenção:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;controle-acesso.conf&#039;&#039;&#039;: esse contém as ACLs que liberam as consultas ao Unbound. Sugiro como fortalecimento da segurança, criar filtros Netfilter/IPTables ou Netfilter/NFTables para restringir os acessos.&lt;br /&gt;
* &#039;&#039;&#039;local.conf&#039;&#039;&#039;: esse é o principal arquivo de configuração do Unbound. Dê uma lida nesse outro &#039;&#039;&#039;[[DNS Recursivo Anycast HyperLocal|artigo]]&#039;&#039;&#039; meu, para entender alguns parâmetros importantes.&lt;br /&gt;
&lt;br /&gt;
Como checar se existem erros de syntax:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-checkconf /etc/unbound/unbound.conf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para recarregar as configurações sem zerar o cache e se não estiverem relacionadas com as interfaces:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-control reload_keep_cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/unbound &amp;amp;&amp;amp; docker compose restart unbound&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Os dois arquivos de configuração são:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/frr.conf&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/daemons&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para acessar o &#039;&#039;&#039;vtysh&#039;&#039;&#039; console:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it frr vtysh&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/frr &amp;amp;&amp;amp; docker compose restart frr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Chrony (NTP/NTS) ===&lt;br /&gt;
Os arquivos de configuração são esses:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/chrony.conf:&#039;&#039;&#039; configuração principal do Chrony.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/conf.d/ntp_acl.conf:&#039;&#039;&#039; ACLs para permitir quais dispositivos podem se conectar ao serviço NTP/NTS.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/sources.d/nic.sources:&#039;&#039;&#039; contém os servidores NTP/NTS, nesse caso os do NIC.br.&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/chrony &amp;amp;&amp;amp; docker compose restart chrony&#039;&#039;&#039;&lt;br /&gt;
Este projeto está configurado também para ser um servidor &#039;&#039;&#039;NTP/NTS&#039;&#039;&#039; para seus dispositivos de rede. Por padrão está liberado apenas consultas de redes privadas no arquivo &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/conf.d/ntp_acl.conf&#039;&#039;&#039;. Para liberar outras redes ou remover acessos, só alterar este arquivo e reiniciar o container do serviço.&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Arquivo de configuração:&lt;br /&gt;
&lt;br /&gt;
* /var/lib/docker/volumes/zabbix_agent2_config/_data/zabbix_agent2.conf&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* cd /usr/local/src/zabbix-agent2 &amp;amp;&amp;amp; docker compose restart zabbix-agent2&lt;br /&gt;
&lt;br /&gt;
Para checar se os serviços estão up:&lt;br /&gt;
 # docker ps&lt;br /&gt;
 CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS     NAMES&lt;br /&gt;
 72a2448e4cf9   zabbix/zabbix-agent2:alpine-7.0-latest   &amp;quot;/usr/bin/docker-ent…&amp;quot;   4 hours ago   Up 4 hours             zabbix-agent2&lt;br /&gt;
 ebb255934eee   unbound-unbound                          &amp;quot;/entrypoint.sh /usr…&amp;quot;   4 hours ago   Up 4 hours             unbound&lt;br /&gt;
 88a0b5138f0d   quay.io/frrouting/frr:10.0.1             &amp;quot;/sbin/tini -- /usr/…&amp;quot;   4 hours ago   Up 4 hours             frr&lt;br /&gt;
 6341b52b85e1   chrony-chrony                            &amp;quot;/usr/sbin/chronyd -…&amp;quot;   4 hours ago   Up 4 hours             chrony&lt;br /&gt;
&lt;br /&gt;
== Atualizando os serviços ==&lt;br /&gt;
Caso queria reinstalar ou atualizar os serviços siga os exemplos abaixo:&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
 cd /usr/local/src/unbound&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Edit as variáveis se for necessário em &#039;&#039;&#039;/etc/environment&#039;&#039;&#039; primeiro:&lt;br /&gt;
 cd /usr/local/src/zabbix-agent2&lt;br /&gt;
 docker compose pull             &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d            &lt;br /&gt;
&lt;br /&gt;
=== FRRouting (OSPFv2 e OSPFv3) ===&lt;br /&gt;
 cd /usr/local/src/frr&lt;br /&gt;
 docker compose pull              &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
 cd /usr/local/src/chrony&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
== Validações e testes ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Teste de recursividade:&lt;br /&gt;
 dig @127.0.0.1 google.com&lt;br /&gt;
 dig @::1 google.com&lt;br /&gt;
Inspecionando flags e versão do Unbound:&lt;br /&gt;
 docker exec -it unbound unbound -V&lt;br /&gt;
Logs ficam localizados aqui:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/log/unbound/unbound.log&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Consultando o OSPF:&lt;br /&gt;
 # Show active OSPFv2 (IPv4) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip ospf neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show active OSPFv3 (IPv6) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ipv6 ospf6 neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show routes learned via OSPF&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip route ospf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
Checando o serviço:&lt;br /&gt;
 # Clock synchronization status&lt;br /&gt;
 docker exec -it chrony chronyc tracking&lt;br /&gt;
 &lt;br /&gt;
 # Active NTP servers and sources&lt;br /&gt;
 docker exec -it chrony chronyc sources -v&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Para validar o serviço:&lt;br /&gt;
 # Test the agent directly from inside the container (Expected output: agent.ping [s|1])&lt;br /&gt;
 docker exec -it zabbix-agent2 zabbix_agent2 -t agent.ping&lt;br /&gt;
 &lt;br /&gt;
 # Verify if port 10050 is open/listening on the host using netcat (Expected: Connection to ... succeeded!)&lt;br /&gt;
 nc -zv 127.0.0.1 10050&lt;br /&gt;
 nc -zv ::1 10050&lt;br /&gt;
&lt;br /&gt;
== Configurações pós instalação ==&lt;br /&gt;
Em &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039; existe a seguinte linha comentada:&lt;br /&gt;
 #*/5 * * * *     root    /root/scripts/unboundSend.sh &amp;lt;&#039;&#039;&#039;ZBX_SERVER&#039;&#039;&#039;&amp;gt; &amp;lt;&#039;&#039;&#039;ZBX_HOSTNAME&#039;&#039;&#039;&amp;gt; 1&amp;gt; /dev/null&lt;br /&gt;
A linha acima após descomentada e reiniciado o cron, executa o script &#039;&#039;&#039;unboundSend.sh&#039;&#039;&#039; que de 5 em 5 minutos envia as estatísticas do Unbound para o Zabbix Server. O &#039;&#039;&#039;template&#039;&#039;&#039; para o Zabbix Server pode ser baixado &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Se você optou por um &#039;&#039;&#039;DNS Recursivo Anycast&#039;&#039;&#039;, existe um arquivo em &#039;&#039;&#039;/etc/cron.d/&#039;&#039;&#039; chamado &#039;&#039;&#039;teste_dns&#039;&#039;&#039;. Dentro dele tem uma chamada para o script &#039;&#039;&#039;/root/scripts/teste_dns.sh&#039;&#039;&#039; mas ela está comentada. Esse script testa se existe algum problema de recursividade no DNS e se tiver, ele desliga o &#039;&#039;&#039;FRR&#039;&#039;&#039; parando de anunciar os IPs que estão na &#039;&#039;&#039;loopback&#039;&#039;&#039; do host até que o problema seja resolvido. Isso faz com que os assinantes deste servidor migrem suas consultas para o próximo DNS Recursivo Anycast mais próximo.&lt;br /&gt;
O &#039;&#039;&#039;frr.conf&#039;&#039;&#039; já vem com uma configuração genérica esqueleto e precisa ser adaptada para sua rede. Abaixo a atenção:&lt;br /&gt;
 # Precisa ser alterado o md5&lt;br /&gt;
 ip ospf message-digest-key 5 md5 &#039;&#039;&#039;Cu3Xhmf2&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Alterar o router-id nos dois blocos abaixo&lt;br /&gt;
 router ospf&lt;br /&gt;
  ospf &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
  area 0 authentication message-digest&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
 router ospf6&lt;br /&gt;
  ospf6 &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;ISPFocus&#039;&#039;&#039; possui um sistema de administração para servidores &#039;&#039;&#039;DNS Recursivos Anycast&#039;&#039;&#039; deste projeto. Como por exemplo o &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039; que ajuda o administrador e o suporte, para inclusão, exclusão e consulta de bloqueios de domínios provenientes dos &#039;&#039;&#039;Ofícios&#039;&#039;&#039; &#039;&#039;&#039;Jurídicos&#039;&#039;&#039; e &#039;&#039;&#039;Anatel&#039;&#039;&#039;. Os bloqueios de domínios são replicados automaticamente para todos os servidores da rede através do &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039;. Gostaria de saber mais? Entre em contato por &#039;&#039;&#039;e-mail:&#039;&#039;&#039; &#039;&#039;&#039;contato@ispfocus.net.br&#039;&#039;&#039; ou por &#039;&#039;&#039;WhatsApp&#039;&#039;&#039; &#039;&#039;&#039;(22)99743-9060&#039;&#039;&#039;.&lt;br /&gt;
[[Arquivo:Rpz manager.png|nenhum|commoldura]]&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto UNBOUND-KINDNS ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o meu estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1165</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1165"/>
		<updated>2026-07-06T15:43:34Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as &#039;&#039;&#039;7 práticas do KINDNS&#039;&#039;&#039; utilizando containers do &#039;&#039;&#039;Docker&#039;&#039;&#039;. Vamos fazer um check list rápido do que contempla o projeto:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prática 1&#039;&#039;&#039; - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. &#039;&#039;&#039;Unbound já atende por padrão&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 2&#039;&#039;&#039; - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. &#039;&#039;&#039;Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 3&#039;&#039;&#039; - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. &#039;&#039;&#039;Este projeto encontra-se com QNAME minimization já ativo&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 4&#039;&#039;&#039; - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. &#039;&#039;&#039;Unbound não faz Autoritativo, então OK também&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 5&#039;&#039;&#039; - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. &#039;&#039;&#039;Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 6&#039;&#039;&#039; - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. &#039;&#039;&#039;O projeto já entrega um container com Zabbix Agent2 7.0.x e um script para envio de métricas para o Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 7&#039;&#039;&#039; - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. &#039;&#039;&#039;Aqui também o projeto entrega o sistema preparado para DoT e DoH, só necessitando da configuração dos certificados TLS&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O projeto foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039; favorita. Como os serviços rodam em containers, ficam independentes de distro &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um pouco de conhecimento em administração GNU/Linux e Docker.&lt;br /&gt;
&lt;br /&gt;
Um sistema com 8 vCores e 16G de ram suporta +20.000 assinantes simultâneos.&lt;br /&gt;
&lt;br /&gt;
== Preparação antes de rodar o script ==&lt;br /&gt;
No topo do script &#039;&#039;&#039;unbound_kindns.sh&#039;&#039;&#039; existem algumas variáveis para configurarmos antes de sua execução:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CORES&amp;lt;/code&amp;gt;: Número de núcleos de CPU dedicados ao Unbound (define o parâmetro &amp;lt;code&amp;gt;num-threads&amp;lt;/code&amp;gt; na configuração do Unbound; padrão: &#039;&#039;&#039;4&#039;&#039;&#039;).&lt;br /&gt;
* &amp;lt;code&amp;gt;OSPF_INTERFACE&amp;lt;/code&amp;gt;: Interface física de rede utilizada para o roteamento &#039;&#039;&#039;OSPF&#039;&#039;&#039; (por exemplo, &amp;lt;code&amp;gt;ens20&amp;lt;/code&amp;gt;). Se deixado em branco, a implantação de &#039;&#039;&#039;OSPF/Anycast&#039;&#039;&#039; (container &#039;&#039;&#039;FRR&#039;&#039;&#039;) será ignorada, executando o sistema em modo autônomo (stand-alone).&lt;br /&gt;
* &amp;lt;code&amp;gt;APPARMOR&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; para desabilitar o AppArmor e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; para mantê-lo habilitado.&lt;br /&gt;
* &amp;lt;code&amp;gt;MITIGATIONS&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; para desabilitar as mitigações de CPU e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; para deixá-las no modo automático.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_HOSTNAME&amp;lt;/code&amp;gt;: Identificador do host no servidor Zabbix. Se deixado em branco, o script utilizará o &#039;&#039;&#039;hostname&#039;&#039;&#039; do sistema.&lt;br /&gt;
* &amp;lt;code&amp;gt;CERT_DOMAIN&amp;lt;/code&amp;gt;: Nome de domínio utilizado para os certificados SSL do Let&#039;s Encrypt (empregado na validação dos serviços &#039;&#039;&#039;DoH&#039;&#039;&#039; e &#039;&#039;&#039;DoT&#039;&#039;&#039;; padrão: &amp;lt;code&amp;gt;doh.brasil.com.br&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_HOST&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_ACTIVE&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix ativo (Active Zabbix Server).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_LISTENIP&amp;lt;/code&amp;gt;: Endereço IP de vinculação (binding) para o container do Zabbix Agent 2 escutar conexões (padrão: &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Executando a instalação ==&lt;br /&gt;
Ao executar como root &#039;&#039;&#039;./unbound_kindns.sh &amp;lt;hostname&amp;gt;&#039;&#039;&#039;, verá a tela do instalador abaixo onde fará todo o processo de baixar imagens, compilar os programas e criar os containers. Sim o &#039;&#039;&#039;Unbound&#039;&#039;&#039; que o projeto utiliza é o &#039;&#039;&#039;latest&#039;&#039;&#039; do próprio desenvolvedor &#039;&#039;&#039;NLnet Labs&#039;&#039;&#039;. &lt;br /&gt;
[[Arquivo:Unbound-kindns02.png|nenhum|miniaturadaimagem|1046x1046px]]&lt;br /&gt;
Tudo ocorrendo bem veremos a mensagem de &#039;&#039;&#039;Installation finished&#039;&#039;&#039;. Na sequência veremos sobre a administração do sistema.&lt;br /&gt;
&lt;br /&gt;
== Administrando o sistema ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Os arquivos de configuração do Unbound encontram-se em &#039;&#039;&#039;/var/lib/docker/volumes/unbound_config/_data/unbound.conf.d/&#039;&#039;&#039;. Nele existem 2 arquivos que precisam de atenção:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;controle-acesso.conf&#039;&#039;&#039;: esse contém as ACLs que liberam as consultas ao Unbound. Sugiro como fortalecimento da segurança, criar filtros Netfilter/IPTables ou Netfilter/NFTables para restringir os acessos.&lt;br /&gt;
* &#039;&#039;&#039;local.conf&#039;&#039;&#039;: esse é o principal arquivo de configuração do Unbound. Dê uma lida nesse outro &#039;&#039;&#039;[[DNS Recursivo Anycast HyperLocal|artigo]]&#039;&#039;&#039; meu, para entender alguns parâmetros importantes.&lt;br /&gt;
&lt;br /&gt;
Como checar se existem erros de syntax:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-checkconf /etc/unbound/unbound.conf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para recarregar as configurações sem zerar o cache e se não estiverem relacionadas com as interfaces:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-control reload_keep_cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/unbound &amp;amp;&amp;amp; docker compose restart unbound&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Os dois arquivos de configuração são:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/frr.conf&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/daemons&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para acessar o &#039;&#039;&#039;vtysh&#039;&#039;&#039; console:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it frr vtysh&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/frr &amp;amp;&amp;amp; docker compose restart frr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Chrony (NTP/NTS) ===&lt;br /&gt;
Os arquivos de configuração são esses:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/chrony.conf:&#039;&#039;&#039; configuração principal do Chrony.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/conf.d/ntp_acl.conf:&#039;&#039;&#039; ACLs para permitir quais dispositivos podem se conectar ao serviço NTP/NTS.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/sources.d/nic.sources:&#039;&#039;&#039; contém os servidores NTP/NTS, nesse caso os do NIC.br.&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/chrony &amp;amp;&amp;amp; docker compose restart chrony&#039;&#039;&#039;&lt;br /&gt;
Este projeto está configurado também para ser um servidor &#039;&#039;&#039;NTP/NTS&#039;&#039;&#039; para seus dispositivos de rede. Por padrão está liberado apenas consultas de redes privadas no arquivo &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/conf.d/ntp_acl.conf&#039;&#039;&#039;. Para liberar outras redes ou remover acessos, só alterar este arquivo e reiniciar o container do serviço.&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Arquivo de configuração:&lt;br /&gt;
&lt;br /&gt;
* /var/lib/docker/volumes/zabbix_agent2_config/_data/zabbix_agent2.conf&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* cd /usr/local/src/zabbix-agent2 &amp;amp;&amp;amp; docker compose restart zabbix-agent2&lt;br /&gt;
&lt;br /&gt;
Para checar se os serviços estão up:&lt;br /&gt;
 # docker ps&lt;br /&gt;
 CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS     NAMES&lt;br /&gt;
 72a2448e4cf9   zabbix/zabbix-agent2:alpine-7.0-latest   &amp;quot;/usr/bin/docker-ent…&amp;quot;   4 hours ago   Up 4 hours             zabbix-agent2&lt;br /&gt;
 ebb255934eee   unbound-unbound                          &amp;quot;/entrypoint.sh /usr…&amp;quot;   4 hours ago   Up 4 hours             unbound&lt;br /&gt;
 88a0b5138f0d   quay.io/frrouting/frr:10.0.1             &amp;quot;/sbin/tini -- /usr/…&amp;quot;   4 hours ago   Up 4 hours             frr&lt;br /&gt;
 6341b52b85e1   chrony-chrony                            &amp;quot;/usr/sbin/chronyd -…&amp;quot;   4 hours ago   Up 4 hours             chrony&lt;br /&gt;
&lt;br /&gt;
== Atualizando os serviços ==&lt;br /&gt;
Caso queria reinstalar ou atualizar os serviços siga os exemplos abaixo:&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
 cd /usr/local/src/unbound&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Edit as variáveis se for necessário em &#039;&#039;&#039;/etc/environment&#039;&#039;&#039; primeiro:&lt;br /&gt;
 cd /usr/local/src/zabbix-agent2&lt;br /&gt;
 docker compose pull             &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d            &lt;br /&gt;
&lt;br /&gt;
=== FRRouting (OSPFv2 e OSPFv3) ===&lt;br /&gt;
 cd /usr/local/src/frr&lt;br /&gt;
 docker compose pull              &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
 cd /usr/local/src/chrony&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
== Validações e testes ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Teste de recursividade:&lt;br /&gt;
 dig @127.0.0.1 google.com&lt;br /&gt;
 dig @::1 google.com&lt;br /&gt;
Inspecionando flags e versão do Unbound:&lt;br /&gt;
 docker exec -it unbound unbound -V&lt;br /&gt;
Logs ficam localizados aqui:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/log/unbound/unbound.log&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Consultando o OSPF:&lt;br /&gt;
 # Show active OSPFv2 (IPv4) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip ospf neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show active OSPFv3 (IPv6) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ipv6 ospf6 neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show routes learned via OSPF&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip route ospf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
Checando o serviço:&lt;br /&gt;
 # Clock synchronization status&lt;br /&gt;
 docker exec -it chrony chronyc tracking&lt;br /&gt;
 &lt;br /&gt;
 # Active NTP servers and sources&lt;br /&gt;
 docker exec -it chrony chronyc sources -v&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Para validar o serviço:&lt;br /&gt;
 # Test the agent directly from inside the container (Expected output: agent.ping [s|1])&lt;br /&gt;
 docker exec -it zabbix-agent2 zabbix_agent2 -t agent.ping&lt;br /&gt;
 &lt;br /&gt;
 # Verify if port 10050 is open/listening on the host using netcat (Expected: Connection to ... succeeded!)&lt;br /&gt;
 nc -zv 127.0.0.1 10050&lt;br /&gt;
 nc -zv ::1 10050&lt;br /&gt;
&lt;br /&gt;
== Configurações pós instalação ==&lt;br /&gt;
Em &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039; existe a seguinte linha comentada:&lt;br /&gt;
 #*/5 * * * *     root    /root/scripts/unboundSend.sh &amp;lt;&#039;&#039;&#039;ZBX_SERVER&#039;&#039;&#039;&amp;gt; &amp;lt;&#039;&#039;&#039;ZBX_HOSTNAME&#039;&#039;&#039;&amp;gt; 1&amp;gt; /dev/null&lt;br /&gt;
A linha acima após descomentada e reiniciado o cron, executa o script &#039;&#039;&#039;unboundSend.sh&#039;&#039;&#039; que de 5 em 5 minutos envia as estatísticas do Unbound para o Zabbix Server. O &#039;&#039;&#039;template&#039;&#039;&#039; para o Zabbix Server pode ser baixado &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Se você optou por um &#039;&#039;&#039;DNS Recursivo Anycast&#039;&#039;&#039;, existe um arquivo em &#039;&#039;&#039;/etc/cron.d/&#039;&#039;&#039; chamado &#039;&#039;&#039;teste_dns&#039;&#039;&#039;. Dentro dele tem uma chamada para o script &#039;&#039;&#039;/root/scripts/teste_dns.sh&#039;&#039;&#039; mas ela está comentada. Esse script testa se existe algum problema de recursividade no DNS e se tiver, ele desliga o &#039;&#039;&#039;FRR&#039;&#039;&#039; parando de anunciar os IPs que estão na &#039;&#039;&#039;loopback&#039;&#039;&#039; do host até que o problema seja resolvido. Isso faz com que os assinantes deste servidor migrem suas consultas para o próximo DNS Recursivo Anycast mais próximo.&lt;br /&gt;
O &#039;&#039;&#039;frr.conf&#039;&#039;&#039; já vem com uma configuração genérica esqueleto e precisa ser adaptada para sua rede. Abaixo a atenção:&lt;br /&gt;
 # Precisa ser alterado o md5&lt;br /&gt;
 ip ospf message-digest-key 5 md5 &#039;&#039;&#039;Cu3Xhmf2&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Alterar o router-id nos dois blocos abaixo&lt;br /&gt;
 router ospf&lt;br /&gt;
  ospf &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
  area 0 authentication message-digest&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
 router ospf6&lt;br /&gt;
  ospf6 &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;ISPFocus&#039;&#039;&#039; possui um sistema de administração para servidores &#039;&#039;&#039;DNS Recursivos Anycast&#039;&#039;&#039; deste projeto. Como por exemplo o &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039; que ajuda o administrador e o suporte, para inclusão, exclusão e consulta de bloqueios de domínios provenientes dos &#039;&#039;&#039;Ofícios&#039;&#039;&#039; &#039;&#039;&#039;Jurídicos&#039;&#039;&#039; e &#039;&#039;&#039;Anatel&#039;&#039;&#039;. Os bloqueios de domínios são replicados automaticamente para todos os servidores da rede através do &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039;. Gostaria de saber mais? Entre em contato por &#039;&#039;&#039;e-mail:&#039;&#039;&#039; &#039;&#039;&#039;contato@ispfocus.net.br&#039;&#039;&#039; ou por &#039;&#039;&#039;WhatsApp&#039;&#039;&#039; &#039;&#039;&#039;(22)99743-9060&#039;&#039;&#039;.&lt;br /&gt;
[[Arquivo:Rpz manager.png|nenhum|commoldura]]&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto UNBOUND-KINDNS ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o meu estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1164</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1164"/>
		<updated>2026-07-06T03:47:06Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as &#039;&#039;&#039;7 práticas do KINDNS&#039;&#039;&#039; utilizando containers do &#039;&#039;&#039;Docker&#039;&#039;&#039;. Vamos fazer um check list rápido do que contempla o projeto:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prática 1&#039;&#039;&#039; - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. &#039;&#039;&#039;Unbound já atende por padrão&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 2&#039;&#039;&#039; - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. &#039;&#039;&#039;Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 3&#039;&#039;&#039; - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. &#039;&#039;&#039;Este projeto encontra-se com QNAME minimization já ativo&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 4&#039;&#039;&#039; - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. &#039;&#039;&#039;Unbound não faz Autoritativo, então OK também&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 5&#039;&#039;&#039; - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. &#039;&#039;&#039;Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 6&#039;&#039;&#039; - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. &#039;&#039;&#039;O projeto já entrega um container com Zabbix Agent2 7.0.x e um script para envio de métricas para o Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 7&#039;&#039;&#039; - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. &#039;&#039;&#039;Aqui também o projeto entrega o sistema preparado para DoT e DoH, só necessitando da configuração dos certificados TLS&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O projeto foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039; favorita. Como os serviços rodam em containers, ficam independentes de distro &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um pouco de conhecimento em administração GNU/Linux e Docker.&lt;br /&gt;
&lt;br /&gt;
Um sistema com 8 vCores e 16G de ram suporta +20.000 assinantes simultâneos.&lt;br /&gt;
&lt;br /&gt;
== Preparação antes de rodar o script ==&lt;br /&gt;
No topo do script &#039;&#039;&#039;unbound_kindns.sh&#039;&#039;&#039; existem algumas variáveis para configurarmos antes de sua execução:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CORES&amp;lt;/code&amp;gt;: Número de núcleos de CPU dedicados ao Unbound (define o parâmetro &amp;lt;code&amp;gt;num-threads&amp;lt;/code&amp;gt; na configuração do Unbound; padrão: &#039;&#039;&#039;4&#039;&#039;&#039;).&lt;br /&gt;
* &amp;lt;code&amp;gt;OSPF_INTERFACE&amp;lt;/code&amp;gt;: Interface física de rede utilizada para o roteamento &#039;&#039;&#039;OSPF&#039;&#039;&#039; (por exemplo, &amp;lt;code&amp;gt;ens20&amp;lt;/code&amp;gt;). Se deixado em branco, a implantação de &#039;&#039;&#039;OSPF/Anycast&#039;&#039;&#039; (container &#039;&#039;&#039;FRR&#039;&#039;&#039;) será ignorada, executando o sistema em modo autônomo (stand-alone).&lt;br /&gt;
* &amp;lt;code&amp;gt;APPARMOR&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; para desabilitar o AppArmor e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; para mantê-lo habilitado.&lt;br /&gt;
* &amp;lt;code&amp;gt;MITIGATIONS&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; para desabilitar as mitigações de CPU e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; para deixá-las no modo automático.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_HOSTNAME&amp;lt;/code&amp;gt;: Identificador do host no servidor Zabbix. Se deixado em branco, o script utilizará o &#039;&#039;&#039;hostname&#039;&#039;&#039; do sistema.&lt;br /&gt;
* &amp;lt;code&amp;gt;CERT_DOMAIN&amp;lt;/code&amp;gt;: Nome de domínio utilizado para os certificados SSL do Let&#039;s Encrypt (empregado na validação dos serviços &#039;&#039;&#039;DoH&#039;&#039;&#039; e &#039;&#039;&#039;DoT&#039;&#039;&#039;; padrão: &amp;lt;code&amp;gt;doh.brasil.com.br&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_HOST&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_ACTIVE&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix ativo (Active Zabbix Server).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_LISTENIP&amp;lt;/code&amp;gt;: Endereço IP de vinculação (binding) para o container do Zabbix Agent 2 escutar conexões (padrão: &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Executando a instalação ==&lt;br /&gt;
Ao executar como root &#039;&#039;&#039;./unbound_kindns.sh &amp;lt;hostname&amp;gt;&#039;&#039;&#039;, verá a tela do instalador abaixo onde fará todo o processo de baixar imagens, compilar os programas e criar os containers. Sim o &#039;&#039;&#039;Unbound&#039;&#039;&#039; que o projeto utiliza é o &#039;&#039;&#039;latest&#039;&#039;&#039; do próprio desenvolvedor &#039;&#039;&#039;NLnet Labs&#039;&#039;&#039;. &lt;br /&gt;
[[Arquivo:Unbound-kindns02.png|nenhum|miniaturadaimagem|1046x1046px]]&lt;br /&gt;
Tudo ocorrendo bem veremos a mensagem de &#039;&#039;&#039;Installation finished&#039;&#039;&#039;. Na sequência veremos sobre a administração do sistema.&lt;br /&gt;
&lt;br /&gt;
== Administrando o sistema ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Os arquivos de configuração do Unbound encontram-se em &#039;&#039;&#039;/var/lib/docker/volumes/unbound_config/_data/unbound.conf.d/&#039;&#039;&#039;. Nele existem 2 arquivos que precisam de atenção:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;controle-acesso.conf&#039;&#039;&#039;: esse contém as ACLs que liberam as consultas ao Unbound. Sugiro como fortalecimento da segurança, criar filtros Netfilter/IPTables ou Netfilter/NFTables para restringir os acessos.&lt;br /&gt;
* &#039;&#039;&#039;local.conf&#039;&#039;&#039;: esse é o principal arquivo de configuração do Unbound. Dê uma lida nesse outro &#039;&#039;&#039;[[DNS Recursivo Anycast HyperLocal|artigo]]&#039;&#039;&#039; meu, para entender alguns parâmetros importantes.&lt;br /&gt;
&lt;br /&gt;
Como checar se existem erros de syntax:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-checkconf /etc/unbound/unbound.conf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para recarregar as configurações sem zerar o cache e se não estiverem relacionadas com as interfaces:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-control reload_keep_cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/unbound &amp;amp;&amp;amp; docker compose restart unbound&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Os dois arquivos de configuração são:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/frr.conf&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/daemons&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para acessar o &#039;&#039;&#039;vtysh&#039;&#039;&#039; console:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it frr vtysh&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/frr &amp;amp;&amp;amp; docker compose restart frr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Chrony (NTP/NTS) ===&lt;br /&gt;
Os arquivos de configuração são esses:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/chrony.conf:&#039;&#039;&#039; configuração principal do Chrony.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/conf.d/ntp_acl.conf:&#039;&#039;&#039; ACLs para permitir quais dispositivos podem se conectar ao serviço NTP/NTS.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/sources.d/nic.sources:&#039;&#039;&#039; contém os servidores NTP/NTS, nesse caso os do NIC.br.&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/chrony &amp;amp;&amp;amp; docker compose restart chrony&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Arquivo de configuração:&lt;br /&gt;
&lt;br /&gt;
* /var/lib/docker/volumes/zabbix_agent2_config/_data/zabbix_agent2.conf&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* cd /usr/local/src/zabbix-agent2 &amp;amp;&amp;amp; docker compose restart zabbix-agent2&lt;br /&gt;
&lt;br /&gt;
Para checar se os serviços estão up:&lt;br /&gt;
 # docker ps&lt;br /&gt;
 CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS     NAMES&lt;br /&gt;
 72a2448e4cf9   zabbix/zabbix-agent2:alpine-7.0-latest   &amp;quot;/usr/bin/docker-ent…&amp;quot;   4 hours ago   Up 4 hours             zabbix-agent2&lt;br /&gt;
 ebb255934eee   unbound-unbound                          &amp;quot;/entrypoint.sh /usr…&amp;quot;   4 hours ago   Up 4 hours             unbound&lt;br /&gt;
 88a0b5138f0d   quay.io/frrouting/frr:10.0.1             &amp;quot;/sbin/tini -- /usr/…&amp;quot;   4 hours ago   Up 4 hours             frr&lt;br /&gt;
 6341b52b85e1   chrony-chrony                            &amp;quot;/usr/sbin/chronyd -…&amp;quot;   4 hours ago   Up 4 hours             chrony&lt;br /&gt;
&lt;br /&gt;
== Atualizando os serviços ==&lt;br /&gt;
Caso queria reinstalar ou atualizar os serviços siga os exemplos abaixo:&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
 cd /usr/local/src/unbound&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Edit as variáveis se for necessário em &#039;&#039;&#039;/etc/environment&#039;&#039;&#039; primeiro:&lt;br /&gt;
 cd /usr/local/src/zabbix-agent2&lt;br /&gt;
 docker compose pull             &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d            &lt;br /&gt;
&lt;br /&gt;
=== FRRouting (OSPFv2 e OSPFv3) ===&lt;br /&gt;
 cd /usr/local/src/frr&lt;br /&gt;
 docker compose pull              &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
 cd /usr/local/src/chrony&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
== Validações e testes ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Teste de recursividade:&lt;br /&gt;
 dig @127.0.0.1 google.com&lt;br /&gt;
 dig @::1 google.com&lt;br /&gt;
Inspecionando flags e versão do Unbound:&lt;br /&gt;
 docker exec -it unbound unbound -V&lt;br /&gt;
Logs ficam localizados aqui:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/log/unbound/unbound.log&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Consultando o OSPF:&lt;br /&gt;
 # Show active OSPFv2 (IPv4) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip ospf neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show active OSPFv3 (IPv6) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ipv6 ospf6 neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show routes learned via OSPF&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip route ospf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
Checando o serviço:&lt;br /&gt;
 # Clock synchronization status&lt;br /&gt;
 docker exec -it chrony chronyc tracking&lt;br /&gt;
 &lt;br /&gt;
 # Active NTP servers and sources&lt;br /&gt;
 docker exec -it chrony chronyc sources -v&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Para validar o serviço:&lt;br /&gt;
 # Test the agent directly from inside the container (Expected output: agent.ping [s|1])&lt;br /&gt;
 docker exec -it zabbix-agent2 zabbix_agent2 -t agent.ping&lt;br /&gt;
 &lt;br /&gt;
 # Verify if port 10050 is open/listening on the host using netcat (Expected: Connection to ... succeeded!)&lt;br /&gt;
 nc -zv 127.0.0.1 10050&lt;br /&gt;
 nc -zv ::1 10050&lt;br /&gt;
&lt;br /&gt;
== Configurações pós instalação ==&lt;br /&gt;
Em &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039; existe a seguinte linha comentada:&lt;br /&gt;
 #*/5 * * * *     root    /root/scripts/unboundSend.sh &amp;lt;&#039;&#039;&#039;ZBX_SERVER&#039;&#039;&#039;&amp;gt; &amp;lt;&#039;&#039;&#039;ZBX_HOSTNAME&#039;&#039;&#039;&amp;gt; 1&amp;gt; /dev/null&lt;br /&gt;
A linha acima após descomentada e reiniciado o cron, executa o script &#039;&#039;&#039;unboundSend.sh&#039;&#039;&#039; que de 5 em 5 minutos envia as estatísticas do Unbound para o Zabbix Server. O &#039;&#039;&#039;template&#039;&#039;&#039; para o Zabbix Server pode ser baixado &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Se você optou por um &#039;&#039;&#039;DNS Recursivo Anycast&#039;&#039;&#039;, existe um arquivo em &#039;&#039;&#039;/etc/cron.d/&#039;&#039;&#039; chamado &#039;&#039;&#039;teste_dns&#039;&#039;&#039;. Dentro dele tem uma chamada para o script &#039;&#039;&#039;/root/scripts/teste_dns.sh&#039;&#039;&#039; mas ela está comentada. Esse script testa se existe algum problema de recursividade no DNS e se tiver, ele desliga o &#039;&#039;&#039;FRR&#039;&#039;&#039; parando de anunciar os IPs que estão na &#039;&#039;&#039;loopback&#039;&#039;&#039; do host até que o problema seja resolvido. Isso faz com que os assinantes deste servidor migrem suas consultas para o próximo DNS Recursivo Anycast mais próximo.&lt;br /&gt;
O &#039;&#039;&#039;frr.conf&#039;&#039;&#039; já vem com uma configuração genérica esqueleto e precisa ser adaptada para sua rede. Abaixo a atenção:&lt;br /&gt;
 # Precisa ser alterado o md5&lt;br /&gt;
 ip ospf message-digest-key 5 md5 &#039;&#039;&#039;Cu3Xhmf2&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Alterar o router-id nos dois blocos abaixo&lt;br /&gt;
 router ospf&lt;br /&gt;
  ospf &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
  area 0 authentication message-digest&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
 router ospf6&lt;br /&gt;
  ospf6 &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;ISPFocus&#039;&#039;&#039; possui um sistema de administração para servidores &#039;&#039;&#039;DNS Recursivos Anycast&#039;&#039;&#039; deste projeto. Como por exemplo o &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039; que ajuda o administrador e o suporte, para inclusão, exclusão e consulta de bloqueios de domínios provenientes dos &#039;&#039;&#039;Ofícios&#039;&#039;&#039; &#039;&#039;&#039;Jurídicos&#039;&#039;&#039; e &#039;&#039;&#039;Anatel&#039;&#039;&#039;. Os bloqueios de domínios são replicados automaticamente para todos os servidores da rede através do &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039;. Gostaria de saber mais? Entre em contato por &#039;&#039;&#039;e-mail:&#039;&#039;&#039; &#039;&#039;&#039;contato@ispfocus.net.br&#039;&#039;&#039; ou por &#039;&#039;&#039;WhatsApp&#039;&#039;&#039; &#039;&#039;&#039;(22)99743-9060&#039;&#039;&#039;.&lt;br /&gt;
[[Arquivo:Rpz manager.png|nenhum|commoldura]]&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto UNBOUND-KINDNS ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o meu estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Servicos_de_Redes_e_Servidores&amp;diff=1163</id>
		<title>Servicos de Redes e Servidores</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Servicos_de_Redes_e_Servidores&amp;diff=1163"/>
		<updated>2026-07-06T03:46:25Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Arquivo:Diagrama redes.png|nenhum|miniaturadaimagem]][[Unbound-kindns|UNBOUND-KINDS]]&lt;br /&gt;
&lt;br /&gt;
[[DNS Recursivo Anycast HyperLocal|DNS Recursivo Anycast com Hyperlocal]]&lt;br /&gt;
&lt;br /&gt;
[[Servidor Logs CGNAT|Servidor de logs CGNAT]]&lt;br /&gt;
&lt;br /&gt;
[[RPKI|RPKI (Resource Public Key Infrastructure)]]&lt;br /&gt;
&lt;br /&gt;
[[CGNAT na prática]]&lt;br /&gt;
&lt;br /&gt;
[[Certificado TLS com ACME-DNS e DNS-01]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=P%C3%A1gina_principal&amp;diff=1162</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=P%C3%A1gina_principal&amp;diff=1162"/>
		<updated>2026-07-06T03:45:30Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Arquivo:Pascal.png|esquerda|semmoldura|554x554px]]&lt;br /&gt;
&lt;br /&gt;
= Bem vindo à Wiki ISPUP! =&lt;br /&gt;
Durante 29 anos trabalhando como &#039;&#039;&#039;sysadmin&#039;&#039;&#039; em ambientes &#039;&#039;&#039;Unix Like&#039;&#039;&#039; e com Redes em Provedores de Internet, acabei guardando algum conhecimento e essa Wiki é uma forma de disponibilizar para a comunidade, uma fonte de consulta de soluções para diversos problemas que encontrei ao longo da minha vida como profissional. Espero que te ajude assim como sempre me ajudou. Tenho muita documentação para postar aqui e por isso irei revisar e disponibilizar aos poucos. Vamos dar um UP! no seu ISP?&lt;br /&gt;
&lt;br /&gt;
Aqui veremos assuntos relacionados a &#039;&#039;&#039;Servidores GNU/Linux&#039;&#039;&#039;, &#039;&#039;&#039;Telecom&#039;&#039;&#039;, &#039;&#039;&#039;Serviços de Redes&#039;&#039;&#039;, &#039;&#039;&#039;Segurança da Informação&#039;&#039;&#039; e &#039;&#039;&#039;Boas Práticas&#039;&#039;&#039;. Os artigos e documentações serão voltados paras as comunidades &#039;&#039;&#039;ISP (Internet Service Provider)&#039;&#039;&#039;, &#039;&#039;&#039;ITP (Internet Transit Provider)&#039;&#039;&#039; e &#039;&#039;&#039;Debian&#039;&#039;&#039;.  &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Enquanto for &amp;quot;&#039;&#039;&#039;pequeno&#039;&#039;&#039;&amp;quot;, precisa pensar como um &amp;quot;&#039;&#039;&#039;grande&#039;&#039;&#039;&amp;quot;: precisa pensar nas boas práticas, se estruturar para o futuro e aí quando crescer e ficar &amp;quot;&#039;&#039;&#039;grande&#039;&#039;&#039;&amp;quot;, precisará pensar como um &amp;quot;&#039;&#039;&#039;pequeno&#039;&#039;&#039;&amp;quot;, para continuar melhorando a sua agilidade nos processos, na qualidade do atendimento e nos serviços entregues aos seus clientes.  &lt;br /&gt;
&lt;br /&gt;
As boas práticas trazem: &#039;&#039;&#039;segurança&#039;&#039;&#039;, &#039;&#039;&#039;credibilidade&#039;&#039;&#039;, &#039;&#039;&#039;estabilidade&#039;&#039;&#039; e &#039;&#039;&#039;qualidade&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;UNIX is very simple, it just needs a genius to understand its simplicity.&amp;quot;&#039;&#039;&#039; Dennis Ritchie.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Índice ==&lt;br /&gt;
* [[Artigos Tecnicos|Artigos Técnicos]]&lt;br /&gt;
* [[Servicos de Redes e Servidores|Serviços de Redes e Servidores]]&lt;br /&gt;
* [[Dicas Tecnicas|Dicas Técnicas]]&lt;br /&gt;
* [[Links Uteis|Links úteis]]&lt;br /&gt;
* [[Sobre mim]]&lt;br /&gt;
&lt;br /&gt;
== Destaques ==&lt;br /&gt;
[[Unbound-kindns|UNBOUND-KINDNS]]&lt;br /&gt;
&lt;br /&gt;
[[Debian Cluster CEPH]]&lt;br /&gt;
&lt;br /&gt;
[[Autenticacao TOTP Radius Tacacs Debian|Autenticação TOTP + Radius/Tacacs no Debian]]&lt;br /&gt;
&lt;br /&gt;
[[SSH SERVER 2FA|SSH Server com Autenticação 2FA]]&lt;br /&gt;
&lt;br /&gt;
[[Certificado TLS com ACME-DNS e DNS-01]]&lt;br /&gt;
&lt;br /&gt;
[[RPKI|RPKI (Resource Public Key Infrastructure)]]&lt;br /&gt;
&lt;br /&gt;
[[Recomendacao Mitigacao DDoS|Recomendações sobre Mitigação DDoS]]&lt;br /&gt;
&lt;br /&gt;
[[DNS Recursivo Anycast HyperLocal|DNS Recursivo Anycast com Hyperlocal]]&lt;br /&gt;
&lt;br /&gt;
[[Static Loop|Static Loop - um erro que pode matar seu ISP/ITP]]&lt;br /&gt;
&lt;br /&gt;
[[Portas Amplificacao DDoS|Portas de Amplificação DDoS e Botnets]]&lt;br /&gt;
&lt;br /&gt;
[[Servidor Logs CGNAT|Servidor de logs CGNAT]]&lt;br /&gt;
&lt;br /&gt;
[[Template Servidor Debian|Template de Servidor Debian GNU/Linux]]&lt;br /&gt;
&lt;br /&gt;
[[Policy Based Routing|Policy Based Routing (PBR)]]&lt;br /&gt;
&lt;br /&gt;
[[Compilando Bash|Compilando Shell Scripts com o SHC]]&lt;br /&gt;
&lt;br /&gt;
[[PHPIPAM|DCIM/IPAM com phpIPAM]]&lt;br /&gt;
&lt;br /&gt;
[[MSMTP com OAuth2|MSMTP com OAuth2 no Debian 12]]&lt;br /&gt;
&lt;br /&gt;
[[Geolocalizacao|Geolocalização e a Internet]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Debian powered.png|miniaturadaimagem|83x83px]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1161</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1161"/>
		<updated>2026-07-06T03:44:13Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as &#039;&#039;&#039;7 práticas do KINDNS&#039;&#039;&#039; utilizando containers do &#039;&#039;&#039;Docker&#039;&#039;&#039;. Vamos fazer um check list rápido do que contempla o projeto:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prática 1&#039;&#039;&#039; - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. &#039;&#039;&#039;Unbound já atende por padrão&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 2&#039;&#039;&#039; - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. &#039;&#039;&#039;Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 3&#039;&#039;&#039; - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. &#039;&#039;&#039;Este projeto encontra-se com QNAME minimization já ativo&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 4&#039;&#039;&#039; - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. &#039;&#039;&#039;Unbound não faz Autoritativo, então OK também&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 5&#039;&#039;&#039; - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. &#039;&#039;&#039;Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 6&#039;&#039;&#039; - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. &#039;&#039;&#039;O projeto já entrega um container com Zabbix Agent2 7.0.x e um script para envio de métricas para o Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 7&#039;&#039;&#039; - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. &#039;&#039;&#039;Aqui também o projeto entrega o sistema preparado para DoT e DoH, só necessitando da configuração dos certificados TLS&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O projeto foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039; favorita. Como os serviços rodam em containers, ficam independentes de distro &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um pouco de conhecimento em administração GNU/Linux e Docker.&lt;br /&gt;
&lt;br /&gt;
Um sistema com 8 vCores e 16G de ram suporta +20.000 assinantes simultâneos.&lt;br /&gt;
&lt;br /&gt;
== Preparação antes de rodar o script ==&lt;br /&gt;
No topo do script &#039;&#039;&#039;unbound_kindns.sh&#039;&#039;&#039; existem algumas variáveis para configurarmos antes de sua execução:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CORES&amp;lt;/code&amp;gt;: Número de núcleos de CPU dedicados ao Unbound (define o parâmetro &amp;lt;code&amp;gt;num-threads&amp;lt;/code&amp;gt; na configuração do Unbound; padrão: &#039;&#039;&#039;4&#039;&#039;&#039;).&lt;br /&gt;
* &amp;lt;code&amp;gt;OSPF_INTERFACE&amp;lt;/code&amp;gt;: Interface física de rede utilizada para o roteamento &#039;&#039;&#039;OSPF&#039;&#039;&#039; (por exemplo, &amp;lt;code&amp;gt;ens20&amp;lt;/code&amp;gt;). Se deixado em branco, a implantação de &#039;&#039;&#039;OSPF/Anycast&#039;&#039;&#039; (container &#039;&#039;&#039;FRR&#039;&#039;&#039;) será ignorada, executando o sistema em modo autônomo (stand-alone).&lt;br /&gt;
* &amp;lt;code&amp;gt;APPARMOR&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; para desabilitar o AppArmor e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; para mantê-lo habilitado.&lt;br /&gt;
* &amp;lt;code&amp;gt;MITIGATIONS&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; para desabilitar as mitigações de CPU e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; para deixá-las no modo automático.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_HOSTNAME&amp;lt;/code&amp;gt;: Identificador do host no servidor Zabbix. Se deixado em branco, o script utilizará o &#039;&#039;&#039;hostname&#039;&#039;&#039; do sistema.&lt;br /&gt;
* &amp;lt;code&amp;gt;CERT_DOMAIN&amp;lt;/code&amp;gt;: Nome de domínio utilizado para os certificados SSL do Let&#039;s Encrypt (empregado na validação dos serviços &#039;&#039;&#039;DoH&#039;&#039;&#039; e &#039;&#039;&#039;DoT&#039;&#039;&#039;; padrão: &amp;lt;code&amp;gt;doh.brasil.com.br&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_HOST&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_ACTIVE&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix ativo (Active Zabbix Server).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_LISTENIP&amp;lt;/code&amp;gt;: Endereço IP de vinculação (binding) para o container do Zabbix Agent 2 escutar conexões (padrão: &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Executando a instalação ==&lt;br /&gt;
Ao executar como root &#039;&#039;&#039;./unbound_kindns.sh &amp;lt;hostname&amp;gt;&#039;&#039;&#039;, verá a tela do instalador abaixo onde fará todo o processo de baixar imagens, compilar os programas e criar os containers. Sim o &#039;&#039;&#039;Unbound&#039;&#039;&#039; que o projeto utiliza é o &#039;&#039;&#039;latest&#039;&#039;&#039; do próprio desenvolvedor &#039;&#039;&#039;NLnet Labs&#039;&#039;&#039;. &lt;br /&gt;
[[Arquivo:Unbound-kindns02.png|nenhum|miniaturadaimagem|1046x1046px]]&lt;br /&gt;
Tudo ocorrendo bem veremos a mensagem de &#039;&#039;&#039;Installation finished&#039;&#039;&#039;. Na sequência veremos sobre a administração do sistema.&lt;br /&gt;
&lt;br /&gt;
== Administrando o sistema ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Os arquivos de configuração do Unbound encontram-se em &#039;&#039;&#039;/var/lib/docker/volumes/unbound_config/_data/unbound.conf.d/&#039;&#039;&#039;. Nele existem 2 arquivos que precisam de atenção:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;controle-acesso.conf&#039;&#039;&#039;: esse contém as ACLs que liberam as consultas ao Unbound. Sugiro como fortalecimento da segurança, criar filtros Netfilter/IPTables ou Netfilter/NFTables para restringir os acessos.&lt;br /&gt;
* &#039;&#039;&#039;local.conf&#039;&#039;&#039;: esse é o principal arquivo de configuração do Unbound. Dê uma lida nesse outro &#039;&#039;&#039;[[DNS Recursivo Anycast HyperLocal|artigo]]&#039;&#039;&#039; meu, para entender alguns parâmetros importantes.&lt;br /&gt;
&lt;br /&gt;
Como checar se existem erros de syntax:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-checkconf /etc/unbound/unbound.conf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para recarregar as configurações sem zerar o cache e se não estiverem relacionadas com as interfaces:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-control reload_keep_cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/unbound &amp;amp;&amp;amp; docker compose restart unbound&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Os dois arquivos de configuração são:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/frr.conf&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/daemons&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para acessar o &#039;&#039;&#039;vtysh&#039;&#039;&#039; console:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it frr vtysh&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/frr &amp;amp;&amp;amp; docker compose restart frr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Chrony (NTP/NTS) ===&lt;br /&gt;
Os arquivos de configuração são esses:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/chrony.conf:&#039;&#039;&#039; configuração principal do Chrony.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/conf.d/ntp_acl.conf:&#039;&#039;&#039; ACLs para permitir quais dispositivos podem se conectar ao serviço NTP/NTS.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/sources.d/nic.sources:&#039;&#039;&#039; contém os servidores NTP/NTS, nesse caso os do NIC.br.&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/chrony &amp;amp;&amp;amp; docker compose restart chrony&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Arquivo de configuração:&lt;br /&gt;
&lt;br /&gt;
* /var/lib/docker/volumes/zabbix_agent2_config/_data/zabbix_agent2.conf&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* cd /usr/local/src/zabbix-agent2 &amp;amp;&amp;amp; docker compose restart zabbix-agent2&lt;br /&gt;
&lt;br /&gt;
Para checar se os serviços estão up:&lt;br /&gt;
 # docker ps&lt;br /&gt;
 CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS     NAMES&lt;br /&gt;
 72a2448e4cf9   zabbix/zabbix-agent2:alpine-7.0-latest   &amp;quot;/usr/bin/docker-ent…&amp;quot;   4 hours ago   Up 4 hours             zabbix-agent2&lt;br /&gt;
 ebb255934eee   unbound-unbound                          &amp;quot;/entrypoint.sh /usr…&amp;quot;   4 hours ago   Up 4 hours             unbound&lt;br /&gt;
 88a0b5138f0d   quay.io/frrouting/frr:10.0.1             &amp;quot;/sbin/tini -- /usr/…&amp;quot;   4 hours ago   Up 4 hours             frr&lt;br /&gt;
 6341b52b85e1   chrony-chrony                            &amp;quot;/usr/sbin/chronyd -…&amp;quot;   4 hours ago   Up 4 hours             chrony&lt;br /&gt;
&lt;br /&gt;
== Atualizando os serviços ==&lt;br /&gt;
Caso queria reinstalar ou atualizar os serviços siga os exemplos abaixo:&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
 cd /usr/local/src/unbound&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Edit as variáveis se for necessário em &#039;&#039;&#039;/etc/environment&#039;&#039;&#039; primeiro:&lt;br /&gt;
 cd /usr/local/src/zabbix-agent2&lt;br /&gt;
 docker compose pull             &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d            &lt;br /&gt;
&lt;br /&gt;
=== FRRouting (OSPFv2 e OSPFv3) ===&lt;br /&gt;
 cd /usr/local/src/frr&lt;br /&gt;
 docker compose pull              &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
 cd /usr/local/src/chrony&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
== Validações e testes ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Teste de recursividade:&lt;br /&gt;
 dig @127.0.0.1 google.com&lt;br /&gt;
 dig @::1 google.com&lt;br /&gt;
Inspecionando flags e versão do Unbound:&lt;br /&gt;
 docker exec -it unbound unbound -V&lt;br /&gt;
Logs ficam localizados aqui:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/log/unbound/unbound.log&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Consultando o OSPF:&lt;br /&gt;
 # Show active OSPFv2 (IPv4) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip ospf neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show active OSPFv3 (IPv6) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ipv6 ospf6 neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show routes learned via OSPF&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip route ospf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
Checando o serviço:&lt;br /&gt;
 # Clock synchronization status&lt;br /&gt;
 docker exec -it chrony chronyc tracking&lt;br /&gt;
 &lt;br /&gt;
 # Active NTP servers and sources&lt;br /&gt;
 docker exec -it chrony chronyc sources -v&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Para validar o serviço:&lt;br /&gt;
 # Test the agent directly from inside the container (Expected output: agent.ping [s|1])&lt;br /&gt;
 docker exec -it zabbix-agent2 zabbix_agent2 -t agent.ping&lt;br /&gt;
 &lt;br /&gt;
 # Verify if port 10050 is open/listening on the host using netcat (Expected: Connection to ... succeeded!)&lt;br /&gt;
 nc -zv 127.0.0.1 10050&lt;br /&gt;
 nc -zv ::1 10050&lt;br /&gt;
&lt;br /&gt;
== Configurações pós instalação ==&lt;br /&gt;
Em &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039; existe a seguinte linha comentada:&lt;br /&gt;
 #*/5 * * * *     root    /root/scripts/unboundSend.sh &amp;lt;&#039;&#039;&#039;ZBX_SERVER&#039;&#039;&#039;&amp;gt; &amp;lt;&#039;&#039;&#039;ZBX_HOSTNAME&#039;&#039;&#039;&amp;gt; 1&amp;gt; /dev/null&lt;br /&gt;
A linha acima após descomentada e reiniciado o cron, executa o script &#039;&#039;&#039;unboundSend.sh&#039;&#039;&#039; que de 5 em 5 minutos envia as estatísticas do Unbound para o Zabbix Server. O &#039;&#039;&#039;template&#039;&#039;&#039; para o Zabbix Server pode ser baixado &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Se você optou por um &#039;&#039;&#039;DNS Recursivo Anycast&#039;&#039;&#039;, existe um arquivo em &#039;&#039;&#039;/etc/cron.d/&#039;&#039;&#039; chamado &#039;&#039;&#039;teste_dns&#039;&#039;&#039;. Dentro dele tem uma chamada para o script &#039;&#039;&#039;/root/scripts/teste_dns.sh&#039;&#039;&#039; mas ela está comentada. Esse script testa se existe algum problema de recursividade no DNS e se tiver, ele desliga o &#039;&#039;&#039;FRR&#039;&#039;&#039; parando de anunciar os IPs que estão na &#039;&#039;&#039;loopback&#039;&#039;&#039; do host até que o problema seja resolvido. Isso faz com que os assinantes deste servidor migrem suas consultas para o próximo DNS Recursivo Anycast mais próximo.&lt;br /&gt;
O &#039;&#039;&#039;frr.conf&#039;&#039;&#039; já vem com uma configuração genérica esqueleto e precisa ser adaptada para sua rede. Abaixo a atenção:&lt;br /&gt;
 # Precisa ser alterado o md5&lt;br /&gt;
 ip ospf message-digest-key 5 md5 &#039;&#039;&#039;Cu3Xhmf2&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Alterar o router-id nos dois blocos abaixo&lt;br /&gt;
 router ospf&lt;br /&gt;
  ospf &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
  area 0 authentication message-digest&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
 router ospf6&lt;br /&gt;
  ospf6 &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;ISPFocus&#039;&#039;&#039; possui um sistema de administração para servidores &#039;&#039;&#039;DNS Recursivos Anycast&#039;&#039;&#039; deste projeto. Como por exemplo o &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039; que ajuda o administrador e o suporte, para inclusão, exclusão e consulta de bloqueios de domínios provenientes dos &#039;&#039;&#039;Ofícios&#039;&#039;&#039; &#039;&#039;&#039;Jurídicos&#039;&#039;&#039; e &#039;&#039;&#039;Anatel&#039;&#039;&#039;. Os bloqueios de domínios são replicados automaticamente para todos os servidores da rede através do &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039;. Gostaria de saber mais? Entre em contato por &#039;&#039;&#039;e-mail:&#039;&#039;&#039; &#039;&#039;&#039;contato@ispfocus.net.br&#039;&#039;&#039; ou por &#039;&#039;&#039;WhatsApp&#039;&#039;&#039; &#039;&#039;&#039;(22)99743-9060&#039;&#039;&#039;.&lt;br /&gt;
[[Arquivo:Rpz manager.png|nenhum|commoldura]]&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto UNBOUND-KINDNS ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o meu estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]&lt;br /&gt;
[[Categoria:Artigos Técnicos]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1160</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1160"/>
		<updated>2026-07-06T03:42:15Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as &#039;&#039;&#039;7 práticas do KINDNS&#039;&#039;&#039; utilizando containers do &#039;&#039;&#039;Docker&#039;&#039;&#039;. Vamos fazer um check list rápido do que contempla o projeto:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prática 1&#039;&#039;&#039; - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. &#039;&#039;&#039;Unbound já atende por padrão&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 2&#039;&#039;&#039; - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. &#039;&#039;&#039;Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 3&#039;&#039;&#039; - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. &#039;&#039;&#039;Este projeto encontra-se com QNAME minimization já ativo&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 4&#039;&#039;&#039; - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. &#039;&#039;&#039;Unbound não faz Autoritativo, então OK também&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 5&#039;&#039;&#039; - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. &#039;&#039;&#039;Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 6&#039;&#039;&#039; - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. &#039;&#039;&#039;O projeto já entrega um container com Zabbix Agent2 7.0.x e um script para envio de métricas para o Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 7&#039;&#039;&#039; - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. &#039;&#039;&#039;Aqui também o projeto entrega o sistema preparado para DoT e DoH, só necessitando da configuração dos certificados TLS&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O projeto foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039; favorita. Como os serviços rodam em containers, ficam independentes de distro &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um pouco de conhecimento em administração GNU/Linux e Docker.&lt;br /&gt;
&lt;br /&gt;
Um sistema com 8 vCores e 16G de ram suporta +20.000 assinantes simultâneos.&lt;br /&gt;
&lt;br /&gt;
== Preparação antes de rodar o script ==&lt;br /&gt;
No topo do script &#039;&#039;&#039;unbound_kindns.sh&#039;&#039;&#039; existem algumas variáveis para configurarmos antes de sua execução:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CORES&amp;lt;/code&amp;gt;: Número de núcleos de CPU dedicados ao Unbound (define o parâmetro &amp;lt;code&amp;gt;num-threads&amp;lt;/code&amp;gt; na configuração do Unbound; padrão: &#039;&#039;&#039;4&#039;&#039;&#039;).&lt;br /&gt;
* &amp;lt;code&amp;gt;OSPF_INTERFACE&amp;lt;/code&amp;gt;: Interface física de rede utilizada para o roteamento &#039;&#039;&#039;OSPF&#039;&#039;&#039; (por exemplo, &amp;lt;code&amp;gt;ens20&amp;lt;/code&amp;gt;). Se deixado em branco, a implantação de &#039;&#039;&#039;OSPF/Anycast&#039;&#039;&#039; (container &#039;&#039;&#039;FRR&#039;&#039;&#039;) será ignorada, executando o sistema em modo autônomo (stand-alone).&lt;br /&gt;
* &amp;lt;code&amp;gt;APPARMOR&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; para desabilitar o AppArmor e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; para mantê-lo habilitado.&lt;br /&gt;
* &amp;lt;code&amp;gt;MITIGATIONS&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; para desabilitar as mitigações de CPU e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; para deixá-las no modo automático.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_HOSTNAME&amp;lt;/code&amp;gt;: Identificador do host no servidor Zabbix. Se deixado em branco, o script utilizará o &#039;&#039;&#039;hostname&#039;&#039;&#039; do sistema.&lt;br /&gt;
* &amp;lt;code&amp;gt;CERT_DOMAIN&amp;lt;/code&amp;gt;: Nome de domínio utilizado para os certificados SSL do Let&#039;s Encrypt (empregado na validação dos serviços &#039;&#039;&#039;DoH&#039;&#039;&#039; e &#039;&#039;&#039;DoT&#039;&#039;&#039;; padrão: &amp;lt;code&amp;gt;doh.brasil.com.br&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_HOST&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_ACTIVE&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix ativo (Active Zabbix Server).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_LISTENIP&amp;lt;/code&amp;gt;: Endereço IP de vinculação (binding) para o container do Zabbix Agent 2 escutar conexões (padrão: &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Executando a instalação ==&lt;br /&gt;
Ao executar como root &#039;&#039;&#039;./unbound_kindns.sh &amp;lt;hostname&amp;gt;&#039;&#039;&#039;, verá a tela do instalador abaixo onde fará todo o processo de baixar imagens, compilar os programas e criar os containers. Sim o &#039;&#039;&#039;Unbound&#039;&#039;&#039; que o projeto utiliza é o &#039;&#039;&#039;latest&#039;&#039;&#039; do próprio desenvolvedor &#039;&#039;&#039;NLnet Labs&#039;&#039;&#039;. &lt;br /&gt;
[[Arquivo:Unbound-kindns02.png|nenhum|miniaturadaimagem|1046x1046px]]&lt;br /&gt;
Tudo ocorrendo bem veremos a mensagem de &#039;&#039;&#039;Installation finished&#039;&#039;&#039;. Na sequência veremos sobre a administração do sistema.&lt;br /&gt;
&lt;br /&gt;
== Administrando o sistema ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Os arquivos de configuração do Unbound encontram-se em &#039;&#039;&#039;/var/lib/docker/volumes/unbound_config/_data/unbound.conf.d/&#039;&#039;&#039;. Nele existem 2 arquivos que precisam de atenção:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;controle-acesso.conf&#039;&#039;&#039;: esse contém as ACLs que liberam as consultas ao Unbound. Sugiro como fortalecimento da segurança, criar filtros Netfilter/IPTables ou Netfilter/NFTables para restringir os acessos.&lt;br /&gt;
* &#039;&#039;&#039;local.conf&#039;&#039;&#039;: esse é o principal arquivo de configuração do Unbound. Dê uma lida nesse outro &#039;&#039;&#039;[[DNS Recursivo Anycast HyperLocal|artigo]]&#039;&#039;&#039; meu, para entender alguns parâmetros importantes.&lt;br /&gt;
&lt;br /&gt;
Como checar se existem erros de syntax:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-checkconf /etc/unbound/unbound.conf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para recarregar as configurações sem zerar o cache e se não estiverem relacionadas com as interfaces:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-control reload_keep_cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/unbound &amp;amp;&amp;amp; docker compose restart unbound&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Os dois arquivos de configuração são:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/frr.conf&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/daemons&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para acessar o &#039;&#039;&#039;vtysh&#039;&#039;&#039; console:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it frr vtysh&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/frr &amp;amp;&amp;amp; docker compose restart frr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Chrony (NTP/NTS) ===&lt;br /&gt;
Os arquivos de configuração são esses:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/chrony.conf:&#039;&#039;&#039; configuração principal do Chrony.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/conf.d/ntp_acl.conf:&#039;&#039;&#039; ACLs para permitir quais dispositivos podem se conectar ao serviço NTP/NTS.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/sources.d/nic.sources:&#039;&#039;&#039; contém os servidores NTP/NTS, nesse caso os do NIC.br.&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/chrony &amp;amp;&amp;amp; docker compose restart chrony&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Arquivo de configuração:&lt;br /&gt;
&lt;br /&gt;
* /var/lib/docker/volumes/zabbix_agent2_config/_data/zabbix_agent2.conf&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* cd /usr/local/src/zabbix-agent2 &amp;amp;&amp;amp; docker compose restart zabbix-agent2&lt;br /&gt;
&lt;br /&gt;
Para checar se os serviços estão up:&lt;br /&gt;
 # docker ps&lt;br /&gt;
 CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS     NAMES&lt;br /&gt;
 72a2448e4cf9   zabbix/zabbix-agent2:alpine-7.0-latest   &amp;quot;/usr/bin/docker-ent…&amp;quot;   4 hours ago   Up 4 hours             zabbix-agent2&lt;br /&gt;
 ebb255934eee   unbound-unbound                          &amp;quot;/entrypoint.sh /usr…&amp;quot;   4 hours ago   Up 4 hours             unbound&lt;br /&gt;
 88a0b5138f0d   quay.io/frrouting/frr:10.0.1             &amp;quot;/sbin/tini -- /usr/…&amp;quot;   4 hours ago   Up 4 hours             frr&lt;br /&gt;
 6341b52b85e1   chrony-chrony                            &amp;quot;/usr/sbin/chronyd -…&amp;quot;   4 hours ago   Up 4 hours             chrony&lt;br /&gt;
&lt;br /&gt;
== Atualizando os serviços ==&lt;br /&gt;
Caso queria reinstalar ou atualizar os serviços siga os exemplos abaixo:&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
 cd /usr/local/src/unbound&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Edit as variáveis se for necessário em &#039;&#039;&#039;/etc/environment&#039;&#039;&#039; primeiro:&lt;br /&gt;
 cd /usr/local/src/zabbix-agent2&lt;br /&gt;
 docker compose pull             &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d            &lt;br /&gt;
&lt;br /&gt;
=== FRRouting (OSPFv2 e OSPFv3) ===&lt;br /&gt;
 cd /usr/local/src/frr&lt;br /&gt;
 docker compose pull              &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
 cd /usr/local/src/chrony&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
== Validações e testes ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Teste de recursividade:&lt;br /&gt;
 dig @127.0.0.1 google.com&lt;br /&gt;
 dig @::1 google.com&lt;br /&gt;
Inspecionando flags e versão do Unbound:&lt;br /&gt;
 docker exec -it unbound unbound -V&lt;br /&gt;
Logs ficam localizados aqui:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/log/unbound/unbound.log&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Consultando o OSPF:&lt;br /&gt;
 # Show active OSPFv2 (IPv4) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip ospf neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show active OSPFv3 (IPv6) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ipv6 ospf6 neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show routes learned via OSPF&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip route ospf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
Checando o serviço:&lt;br /&gt;
 # Clock synchronization status&lt;br /&gt;
 docker exec -it chrony chronyc tracking&lt;br /&gt;
 &lt;br /&gt;
 # Active NTP servers and sources&lt;br /&gt;
 docker exec -it chrony chronyc sources -v&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Para validar o serviço:&lt;br /&gt;
 # Test the agent directly from inside the container (Expected output: agent.ping [s|1])&lt;br /&gt;
 docker exec -it zabbix-agent2 zabbix_agent2 -t agent.ping&lt;br /&gt;
 &lt;br /&gt;
 # Verify if port 10050 is open/listening on the host using netcat (Expected: Connection to ... succeeded!)&lt;br /&gt;
 nc -zv 127.0.0.1 10050&lt;br /&gt;
 nc -zv ::1 10050&lt;br /&gt;
&lt;br /&gt;
== Configurações pós instalação ==&lt;br /&gt;
Em &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039; existe a seguinte linha comentada:&lt;br /&gt;
 #*/5 * * * *     root    /root/scripts/unboundSend.sh &amp;lt;&#039;&#039;&#039;ZBX_SERVER&#039;&#039;&#039;&amp;gt; &amp;lt;&#039;&#039;&#039;ZBX_HOSTNAME&#039;&#039;&#039;&amp;gt; 1&amp;gt; /dev/null&lt;br /&gt;
A linha acima após descomentada e reiniciado o cron, executa o script &#039;&#039;&#039;unboundSend.sh&#039;&#039;&#039; que de 5 em 5 minutos envia as estatísticas do Unbound para o Zabbix Server. O &#039;&#039;&#039;template&#039;&#039;&#039; para o Zabbix Server pode ser baixado &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Se você optou por um &#039;&#039;&#039;DNS Recursivo Anycast&#039;&#039;&#039;, existe um arquivo em &#039;&#039;&#039;/etc/cron.d/&#039;&#039;&#039; chamado &#039;&#039;&#039;teste_dns&#039;&#039;&#039;. Dentro dele tem uma chamada para o script &#039;&#039;&#039;/root/scripts/teste_dns.sh&#039;&#039;&#039; mas ela está comentada. Esse script testa se existe algum problema de recursividade no DNS e se tiver, ele desliga o &#039;&#039;&#039;FRR&#039;&#039;&#039; parando de anunciar os IPs que estão na &#039;&#039;&#039;loopback&#039;&#039;&#039; do host até que o problema seja resolvido. Isso faz com que os assinantes deste servidor migrem suas consultas para o próximo DNS Recursivo Anycast mais próximo.&lt;br /&gt;
O &#039;&#039;&#039;frr.conf&#039;&#039;&#039; já vem com uma configuração genérica esqueleto e precisa ser adaptada para sua rede. Abaixo a atenção:&lt;br /&gt;
 # Precisa ser alterado o md5&lt;br /&gt;
 ip ospf message-digest-key 5 md5 &#039;&#039;&#039;Cu3Xhmf2&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Alterar o router-id nos dois blocos abaixo&lt;br /&gt;
 router ospf&lt;br /&gt;
  ospf &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
  area 0 authentication message-digest&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
 router ospf6&lt;br /&gt;
  ospf6 &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;ISPFocus&#039;&#039;&#039; possui um sistema de administração para servidores &#039;&#039;&#039;DNS Recursivos Anycast&#039;&#039;&#039; deste projeto. Como por exemplo o &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039; que ajuda o administrador e o suporte, para inclusão, exclusão e consulta de bloqueios de domínios provenientes dos &#039;&#039;&#039;Ofícios&#039;&#039;&#039; &#039;&#039;&#039;Jurídicos&#039;&#039;&#039; e &#039;&#039;&#039;Anatel&#039;&#039;&#039;. Os bloqueios de domínios são replicados automaticamente para todos os servidores da rede através do &#039;&#039;&#039;RPZ Manager&#039;&#039;&#039;. Gostaria de saber mais? Entre em contato por &#039;&#039;&#039;e-mail:&#039;&#039;&#039; &#039;&#039;&#039;contato@ispfocus.net.br&#039;&#039;&#039; ou por &#039;&#039;&#039;WhatsApp&#039;&#039;&#039; &#039;&#039;&#039;(22)99743-9060&#039;&#039;&#039;.&lt;br /&gt;
[[Arquivo:Rpz manager.png|nenhum|commoldura]]&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto UNBOUND-KINDNS ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o meu estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Arquivo:Rpz_manager.png&amp;diff=1159</id>
		<title>Arquivo:Rpz manager.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Arquivo:Rpz_manager.png&amp;diff=1159"/>
		<updated>2026-07-06T03:39:59Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;rpz_manager&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1158</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1158"/>
		<updated>2026-07-06T03:26:37Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as &#039;&#039;&#039;7 práticas do KINDNS&#039;&#039;&#039; utilizando containers do &#039;&#039;&#039;Docker&#039;&#039;&#039;. Vamos fazer um check list rápido do que contempla o projeto:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prática 1&#039;&#039;&#039; - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. &#039;&#039;&#039;Unbound já atende por padrão&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 2&#039;&#039;&#039; - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. &#039;&#039;&#039;Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 3&#039;&#039;&#039; - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. &#039;&#039;&#039;Este projeto encontra-se com QNAME minimization já ativo&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 4&#039;&#039;&#039; - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. &#039;&#039;&#039;Unbound não faz Autoritativo, então OK também&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 5&#039;&#039;&#039; - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. &#039;&#039;&#039;Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 6&#039;&#039;&#039; - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. &#039;&#039;&#039;O projeto já entrega um container com Zabbix Agent2 7.0.x e um script para envio de métricas para o Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 7&#039;&#039;&#039; - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. &#039;&#039;&#039;Aqui também o projeto entrega o sistema preparado para DoT e DoH, só necessitando da configuração dos certificados TLS&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O projeto foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039; favorita. Como os serviços rodam em containers, ficam independentes de distro &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um pouco de conhecimento em administração GNU/Linux e Docker.&lt;br /&gt;
&lt;br /&gt;
Um sistema com 8 vCores e 16G de ram suporta +20.000 assinantes simultâneos.&lt;br /&gt;
&lt;br /&gt;
== Preparação antes de rodar o script ==&lt;br /&gt;
No topo do script &#039;&#039;&#039;unbound_kindns.sh&#039;&#039;&#039; existem algumas variáveis para configurarmos antes de sua execução:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CORES&amp;lt;/code&amp;gt;: Número de núcleos de CPU dedicados ao Unbound (define o parâmetro &amp;lt;code&amp;gt;num-threads&amp;lt;/code&amp;gt; na configuração do Unbound; padrão: &#039;&#039;&#039;4&#039;&#039;&#039;).&lt;br /&gt;
* &amp;lt;code&amp;gt;OSPF_INTERFACE&amp;lt;/code&amp;gt;: Interface física de rede utilizada para o roteamento &#039;&#039;&#039;OSPF&#039;&#039;&#039; (por exemplo, &amp;lt;code&amp;gt;ens20&amp;lt;/code&amp;gt;). Se deixado em branco, a implantação de &#039;&#039;&#039;OSPF/Anycast&#039;&#039;&#039; (container &#039;&#039;&#039;FRR&#039;&#039;&#039;) será ignorada, executando o sistema em modo autônomo (stand-alone).&lt;br /&gt;
* &amp;lt;code&amp;gt;APPARMOR&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; para desabilitar o AppArmor e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; para mantê-lo habilitado.&lt;br /&gt;
* &amp;lt;code&amp;gt;MITIGATIONS&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; para desabilitar as mitigações de CPU e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; para deixá-las no modo automático.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_HOSTNAME&amp;lt;/code&amp;gt;: Identificador do host no servidor Zabbix. Se deixado em branco, o script utilizará o &#039;&#039;&#039;hostname&#039;&#039;&#039; do sistema.&lt;br /&gt;
* &amp;lt;code&amp;gt;CERT_DOMAIN&amp;lt;/code&amp;gt;: Nome de domínio utilizado para os certificados SSL do Let&#039;s Encrypt (empregado na validação dos serviços &#039;&#039;&#039;DoH&#039;&#039;&#039; e &#039;&#039;&#039;DoT&#039;&#039;&#039;; padrão: &amp;lt;code&amp;gt;doh.brasil.com.br&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_HOST&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_ACTIVE&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix ativo (Active Zabbix Server).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_LISTENIP&amp;lt;/code&amp;gt;: Endereço IP de vinculação (binding) para o container do Zabbix Agent 2 escutar conexões (padrão: &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Executando a instalação ==&lt;br /&gt;
Ao executar como root &#039;&#039;&#039;./unbound_kindns.sh &amp;lt;hostname&amp;gt;&#039;&#039;&#039;, verá a tela do instalador abaixo onde fará todo o processo de baixar imagens, compilar os programas e criar os containers. Sim o &#039;&#039;&#039;Unbound&#039;&#039;&#039; que o projeto utiliza é o &#039;&#039;&#039;latest&#039;&#039;&#039; do próprio desenvolvedor &#039;&#039;&#039;NLnet Labs&#039;&#039;&#039;. &lt;br /&gt;
[[Arquivo:Unbound-kindns02.png|nenhum|miniaturadaimagem|1046x1046px]]&lt;br /&gt;
Tudo ocorrendo bem veremos a mensagem de &#039;&#039;&#039;Installation finished&#039;&#039;&#039;. Na sequência veremos sobre a administração do sistema.&lt;br /&gt;
&lt;br /&gt;
== Administrando o sistema ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Os arquivos de configuração do Unbound encontram-se em &#039;&#039;&#039;/var/lib/docker/volumes/unbound_config/_data/unbound.conf.d/&#039;&#039;&#039;. Nele existem 2 arquivos que precisam de atenção:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;controle-acesso.conf&#039;&#039;&#039;: esse contém as ACLs que liberam as consultas ao Unbound. Sugiro como fortalecimento da segurança, criar filtros Netfilter/IPTables ou Netfilter/NFTables para restringir os acessos.&lt;br /&gt;
* &#039;&#039;&#039;local.conf&#039;&#039;&#039;: esse é o principal arquivo de configuração do Unbound. Dê uma lida nesse outro &#039;&#039;&#039;[[DNS Recursivo Anycast HyperLocal|artigo]]&#039;&#039;&#039; meu, para entender alguns parâmetros importantes.&lt;br /&gt;
&lt;br /&gt;
Como checar se existem erros de syntax:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-checkconf /etc/unbound/unbound.conf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para recarregar as configurações sem zerar o cache e se não estiverem relacionadas com as interfaces:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-control reload_keep_cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/unbound &amp;amp;&amp;amp; docker compose restart unbound&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Os dois arquivos de configuração são:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/frr.conf&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/daemons&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para acessar o &#039;&#039;&#039;vtysh&#039;&#039;&#039; console:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it frr vtysh&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/frr &amp;amp;&amp;amp; docker compose restart frr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Chrony (NTP/NTS) ===&lt;br /&gt;
Os arquivos de configuração são esses:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/chrony.conf:&#039;&#039;&#039; configuração principal do Chrony.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/conf.d/ntp_acl.conf:&#039;&#039;&#039; ACLs para permitir quais dispositivos podem se conectar ao serviço NTP/NTS.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/sources.d/nic.sources:&#039;&#039;&#039; contém os servidores NTP/NTS, nesse caso os do NIC.br.&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/chrony &amp;amp;&amp;amp; docker compose restart chrony&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Arquivo de configuração:&lt;br /&gt;
&lt;br /&gt;
* /var/lib/docker/volumes/zabbix_agent2_config/_data/zabbix_agent2.conf&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* cd /usr/local/src/zabbix-agent2 &amp;amp;&amp;amp; docker compose restart zabbix-agent2&lt;br /&gt;
&lt;br /&gt;
Para checar se os serviços estão up:&lt;br /&gt;
 # docker ps&lt;br /&gt;
 CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS     NAMES&lt;br /&gt;
 72a2448e4cf9   zabbix/zabbix-agent2:alpine-7.0-latest   &amp;quot;/usr/bin/docker-ent…&amp;quot;   4 hours ago   Up 4 hours             zabbix-agent2&lt;br /&gt;
 ebb255934eee   unbound-unbound                          &amp;quot;/entrypoint.sh /usr…&amp;quot;   4 hours ago   Up 4 hours             unbound&lt;br /&gt;
 88a0b5138f0d   quay.io/frrouting/frr:10.0.1             &amp;quot;/sbin/tini -- /usr/…&amp;quot;   4 hours ago   Up 4 hours             frr&lt;br /&gt;
 6341b52b85e1   chrony-chrony                            &amp;quot;/usr/sbin/chronyd -…&amp;quot;   4 hours ago   Up 4 hours             chrony&lt;br /&gt;
&lt;br /&gt;
== Atualizando os serviços ==&lt;br /&gt;
Caso queria reinstalar ou atualizar os serviços siga os exemplos abaixo:&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
 cd /usr/local/src/unbound&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Edit as variáveis se for necessário em &#039;&#039;&#039;/etc/environment&#039;&#039;&#039; primeiro:&lt;br /&gt;
 cd /usr/local/src/zabbix-agent2&lt;br /&gt;
 docker compose pull             &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d            &lt;br /&gt;
&lt;br /&gt;
=== FRRouting (OSPFv2 e OSPFv3) ===&lt;br /&gt;
 cd /usr/local/src/frr&lt;br /&gt;
 docker compose pull              &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
 cd /usr/local/src/chrony&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
== Validações e testes ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Teste de recursividade:&lt;br /&gt;
 dig @127.0.0.1 google.com&lt;br /&gt;
 dig @::1 google.com&lt;br /&gt;
Inspecionando flags e versão do Unbound:&lt;br /&gt;
 docker exec -it unbound unbound -V&lt;br /&gt;
Logs ficam localizados aqui:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/log/unbound/unbound.log&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Consultando o OSPF:&lt;br /&gt;
 # Show active OSPFv2 (IPv4) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip ospf neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show active OSPFv3 (IPv6) neighbors&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ipv6 ospf6 neighbor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Show routes learned via OSPF&lt;br /&gt;
 docker exec -it frr vtysh -c &amp;quot;show ip route ospf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
Checando o serviço:&lt;br /&gt;
 # Clock synchronization status&lt;br /&gt;
 docker exec -it chrony chronyc tracking&lt;br /&gt;
 &lt;br /&gt;
 # Active NTP servers and sources&lt;br /&gt;
 docker exec -it chrony chronyc sources -v&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Para validar o serviço:&lt;br /&gt;
 # Test the agent directly from inside the container (Expected output: agent.ping [s|1])&lt;br /&gt;
 docker exec -it zabbix-agent2 zabbix_agent2 -t agent.ping&lt;br /&gt;
 &lt;br /&gt;
 # Verify if port 10050 is open/listening on the host using netcat (Expected: Connection to ... succeeded!)&lt;br /&gt;
 nc -zv 127.0.0.1 10050&lt;br /&gt;
 nc -zv ::1 10050&lt;br /&gt;
&lt;br /&gt;
== Configurações pós instalação ==&lt;br /&gt;
Em &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039; existe a seguinte linha comentada:&lt;br /&gt;
 #*/5 * * * *     root    /root/scripts/unboundSend.sh &amp;lt;&#039;&#039;&#039;ZBX_SERVER&#039;&#039;&#039;&amp;gt; &amp;lt;&#039;&#039;&#039;ZBX_HOSTNAME&#039;&#039;&#039;&amp;gt; 1&amp;gt; /dev/null&lt;br /&gt;
A linha acima após descomentada e reiniciado o cron, executa o script &#039;&#039;&#039;unboundSend.sh&#039;&#039;&#039; que de 5 em 5 minutos envia as estatísticas do Unbound para o Zabbix Server. O &#039;&#039;&#039;template&#039;&#039;&#039; para o Zabbix Server pode ser baixado &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Se você optou por um &#039;&#039;&#039;DNS Recursivo Anycast&#039;&#039;&#039;, existe um arquivo em &#039;&#039;&#039;/etc/cron.d/&#039;&#039;&#039; chamado &#039;&#039;&#039;teste_dns&#039;&#039;&#039;. Dentro dele tem uma chamada para o script &#039;&#039;&#039;/root/scripts/teste_dns.sh&#039;&#039;&#039; mas ela está comentada. Esse script testa se existe algum problema de recursividade no DNS e se tiver, ele desliga o &#039;&#039;&#039;FRR&#039;&#039;&#039; parando de anunciar os IPs que estão na &#039;&#039;&#039;loopback&#039;&#039;&#039; do host até que o problema seja resolvido. Isso faz com que os assinantes deste servidor migrem suas consultas para o próximo DNS Recursivo Anycast mais próximo.&lt;br /&gt;
O &#039;&#039;&#039;frr.conf&#039;&#039;&#039; já vem com uma configuração genérica esqueleto e precisa ser adaptada para sua rede. Abaixo a atenção:&lt;br /&gt;
 # Precisa ser alterado o md5&lt;br /&gt;
 ip ospf message-digest-key 5 md5 &#039;&#039;&#039;Cu3Xhmf2&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Alterar o router-id nos dois blocos abaixo&lt;br /&gt;
 router ospf&lt;br /&gt;
  ospf &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
  area 0 authentication message-digest&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
 router ospf6&lt;br /&gt;
  ospf6 &#039;&#039;&#039;router-id 172.20.24.14&#039;&#039;&#039;&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1157</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1157"/>
		<updated>2026-07-06T02:46:15Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as &#039;&#039;&#039;7 práticas do KINDNS&#039;&#039;&#039; utilizando containers do &#039;&#039;&#039;Docker&#039;&#039;&#039;. Vamos fazer um check list rápido do que contempla o projeto:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prática 1&#039;&#039;&#039; - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. &#039;&#039;&#039;Unbound já atende por padrão&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 2&#039;&#039;&#039; - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. &#039;&#039;&#039;Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 3&#039;&#039;&#039; - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. &#039;&#039;&#039;Este projeto encontra-se com QNAME minimization já ativo&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 4&#039;&#039;&#039; - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. &#039;&#039;&#039;Unbound não faz Autoritativo, então OK também&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 5&#039;&#039;&#039; - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. &#039;&#039;&#039;Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 6&#039;&#039;&#039; - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. &#039;&#039;&#039;O projeto já entrega um container com Zabbix Agent2 7.0.x e um script para envio de métricas para o Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 7&#039;&#039;&#039; - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. &#039;&#039;&#039;Aqui também o projeto entrega o sistema preparado para DoT e DoH, só necessitando da configuração dos certificados TLS&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O projeto foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039; favorita. Como os serviços rodam em containers, ficam independentes de distro &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um pouco de conhecimento em administração GNU/Linux e Docker.&lt;br /&gt;
&lt;br /&gt;
Um sistema com 8 vCores e 16G de ram suporta +20.000 assinantes simultâneos.&lt;br /&gt;
&lt;br /&gt;
== Preparação antes de rodar o script ==&lt;br /&gt;
No topo do script &#039;&#039;&#039;unbound_kindns.sh&#039;&#039;&#039; existem algumas variáveis para configurarmos antes de sua execução:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CORES&amp;lt;/code&amp;gt;: Número de núcleos de CPU dedicados ao Unbound (define o parâmetro &amp;lt;code&amp;gt;num-threads&amp;lt;/code&amp;gt; na configuração do Unbound; padrão: &#039;&#039;&#039;4&#039;&#039;&#039;).&lt;br /&gt;
* &amp;lt;code&amp;gt;OSPF_INTERFACE&amp;lt;/code&amp;gt;: Interface física de rede utilizada para o roteamento &#039;&#039;&#039;OSPF&#039;&#039;&#039; (por exemplo, &amp;lt;code&amp;gt;ens20&amp;lt;/code&amp;gt;). Se deixado em branco, a implantação de &#039;&#039;&#039;OSPF/Anycast&#039;&#039;&#039; (container &#039;&#039;&#039;FRR&#039;&#039;&#039;) será ignorada, executando o sistema em modo autônomo (stand-alone).&lt;br /&gt;
* &amp;lt;code&amp;gt;APPARMOR&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; para desabilitar o AppArmor e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; para mantê-lo habilitado.&lt;br /&gt;
* &amp;lt;code&amp;gt;MITIGATIONS&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; para desabilitar as mitigações de CPU e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; para deixá-las no modo automático.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_HOSTNAME&amp;lt;/code&amp;gt;: Identificador do host no servidor Zabbix. Se deixado em branco, o script utilizará o &#039;&#039;&#039;hostname&#039;&#039;&#039; do sistema.&lt;br /&gt;
* &amp;lt;code&amp;gt;CERT_DOMAIN&amp;lt;/code&amp;gt;: Nome de domínio utilizado para os certificados SSL do Let&#039;s Encrypt (empregado na validação dos serviços &#039;&#039;&#039;DoH&#039;&#039;&#039; e &#039;&#039;&#039;DoT&#039;&#039;&#039;; padrão: &amp;lt;code&amp;gt;doh.brasil.com.br&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_HOST&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_ACTIVE&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix ativo (Active Zabbix Server).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_LISTENIP&amp;lt;/code&amp;gt;: Endereço IP de vinculação (binding) para o container do Zabbix Agent 2 escutar conexões (padrão: &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Executando a instalação ==&lt;br /&gt;
Ao executar como root &#039;&#039;&#039;./unbound_kindns.sh &amp;lt;hostname&amp;gt;&#039;&#039;&#039;, verá a tela do instalador abaixo onde fará todo o processo de baixar imagens, compilar os programas e criar os containers. Sim o &#039;&#039;&#039;Unbound&#039;&#039;&#039; que o projeto utiliza é o &#039;&#039;&#039;latest&#039;&#039;&#039; do próprio desenvolvedor &#039;&#039;&#039;NLnet Labs&#039;&#039;&#039;. &lt;br /&gt;
[[Arquivo:Unbound-kindns02.png|nenhum|miniaturadaimagem|1046x1046px]]&lt;br /&gt;
Tudo ocorrendo bem veremos a mensagem de &#039;&#039;&#039;Installation finished&#039;&#039;&#039;. Na sequência veremos sobre a administração do sistema.&lt;br /&gt;
&lt;br /&gt;
== Administrando o sistema ==&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
Os arquivos de configuração do Unbound encontram-se em &#039;&#039;&#039;/var/lib/docker/volumes/unbound_config/_data/unbound.conf.d/&#039;&#039;&#039;. Nele existem 2 arquivos que precisam de atenção:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;controle-acesso.conf&#039;&#039;&#039;: esse contém as ACLs que liberam as consultas ao Unbound. Sugiro como fortalecimento da segurança, criar filtros Netfilter/IPTables ou Netfilter/NFTables para restringir os acessos.&lt;br /&gt;
* &#039;&#039;&#039;local.conf&#039;&#039;&#039;: esse é o principal arquivo de configuração do Unbound. Dê uma lida nesse outro &#039;&#039;&#039;[[DNS Recursivo Anycast HyperLocal|artigo]]&#039;&#039;&#039; meu, para entender alguns parâmetros importantes.&lt;br /&gt;
&lt;br /&gt;
Como checar se existem erros de syntax:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-checkconf /etc/unbound/unbound.conf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para recarregar as configurações sem zerar o cache e se não estiverem relacionadas com as interfaces:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it unbound unbound-control reload_keep_cache&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/unbound &amp;amp;&amp;amp; docker compose restart unbound&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== FRRouting ===&lt;br /&gt;
Os dois arquivos de configuração são:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/frr.conf&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/frr_config/_data/daemons&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para acessar o &#039;&#039;&#039;vtysh&#039;&#039;&#039; console:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;docker exec -it frr vtysh&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/frr &amp;amp;&amp;amp; docker compose restart frr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Chrony (NTP/NTS) ===&lt;br /&gt;
Os arquivos de configuração são esses:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/chrony.conf:&#039;&#039;&#039; configuração principal do Chrony.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/conf.d/ntp_acl.conf:&#039;&#039;&#039; ACLs para permitir quais dispositivos podem se conectar ao serviço NTP/NTS.&lt;br /&gt;
* &#039;&#039;&#039;/var/lib/docker/volumes/chrony_config/_data/sources.d/nic.sources:&#039;&#039;&#039; contém os servidores NTP/NTS, nesse caso os do NIC.br.&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cd /usr/local/src/chrony &amp;amp;&amp;amp; docker compose restart chrony&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Arquivo de configuração:&lt;br /&gt;
&lt;br /&gt;
* /var/lib/docker/volumes/zabbix_agent2_config/_data/zabbix_agent2.conf&lt;br /&gt;
&lt;br /&gt;
Para reiniciar o serviço:&lt;br /&gt;
&lt;br /&gt;
* cd /usr/local/src/zabbix-agent2 &amp;amp;&amp;amp; docker compose restart zabbix-agent2&lt;br /&gt;
&lt;br /&gt;
Para checar se os serviços estão up:&lt;br /&gt;
 # docker ps&lt;br /&gt;
 CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS     NAMES&lt;br /&gt;
 72a2448e4cf9   zabbix/zabbix-agent2:alpine-7.0-latest   &amp;quot;/usr/bin/docker-ent…&amp;quot;   4 hours ago   Up 4 hours             zabbix-agent2&lt;br /&gt;
 ebb255934eee   unbound-unbound                          &amp;quot;/entrypoint.sh /usr…&amp;quot;   4 hours ago   Up 4 hours             unbound&lt;br /&gt;
 88a0b5138f0d   quay.io/frrouting/frr:10.0.1             &amp;quot;/sbin/tini -- /usr/…&amp;quot;   4 hours ago   Up 4 hours             frr&lt;br /&gt;
 6341b52b85e1   chrony-chrony                            &amp;quot;/usr/sbin/chronyd -…&amp;quot;   4 hours ago   Up 4 hours             chrony&lt;br /&gt;
&lt;br /&gt;
== Atualizando os serviços ==&lt;br /&gt;
Caso queria reinstalar ou atualizar os serviços siga os exemplos abaixo:&lt;br /&gt;
&lt;br /&gt;
=== Unbound ===&lt;br /&gt;
 # cd /usr/local/src/unbound&lt;br /&gt;
 # docker compose down&lt;br /&gt;
 # docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
=== Zabbix Agent 2 ===&lt;br /&gt;
Edit as variáveis se for necessário em &#039;&#039;&#039;/etc/environment&#039;&#039;&#039; primeiro:&lt;br /&gt;
 cd /usr/local/src/zabbix-agent2&lt;br /&gt;
 docker compose pull             &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d            &lt;br /&gt;
&lt;br /&gt;
=== FRRouting (OSPFv2 e OSPFv3) ===&lt;br /&gt;
 cd /usr/local/src/frr&lt;br /&gt;
 docker compose pull              &lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
&lt;br /&gt;
=== Chrony ===&lt;br /&gt;
 cd /usr/local/src/chrony&lt;br /&gt;
 docker compose down&lt;br /&gt;
 docker compose up -d --build&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1156</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1156"/>
		<updated>2026-07-05T22:34:13Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as &#039;&#039;&#039;7 práticas do KINDNS&#039;&#039;&#039; utilizando containers do &#039;&#039;&#039;Docker&#039;&#039;&#039;. Vamos fazer um check list rápido do que contempla o projeto:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prática 1&#039;&#039;&#039; - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. &#039;&#039;&#039;Unbound já atende por padrão&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 2&#039;&#039;&#039; - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. &#039;&#039;&#039;Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 3&#039;&#039;&#039; - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. &#039;&#039;&#039;Este projeto encontra-se com QNAME minimization já ativo&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 4&#039;&#039;&#039; - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. &#039;&#039;&#039;Unbound não faz Autoritativo, então OK também&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 5&#039;&#039;&#039; - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. &#039;&#039;&#039;Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 6&#039;&#039;&#039; - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. &#039;&#039;&#039;O projeto já entrega um container com Zabbix Agent2 7.0.x e um script para envio de métricas para o Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 7&#039;&#039;&#039; - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. &#039;&#039;&#039;Aqui também o projeto entrega o sistema preparado para DoT e DoH, só necessitando da configuração dos certificados TLS&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O projeto foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039; favorita. Como os serviços rodam em containers, ficam independentes de distro &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um sistema com 8 vCores e 16G de ram suporta +20.000 assinantes simultâneos.&lt;br /&gt;
&lt;br /&gt;
== Preparação antes de rodar o script ==&lt;br /&gt;
No topo do script &#039;&#039;&#039;unbound_kindns.sh&#039;&#039;&#039; existem algumas variáveis para configurarmos antes de sua execução:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CORES&amp;lt;/code&amp;gt;: Número de núcleos de CPU dedicados ao Unbound (define o parâmetro &amp;lt;code&amp;gt;num-threads&amp;lt;/code&amp;gt; na configuração do Unbound; padrão: &#039;&#039;&#039;4&#039;&#039;&#039;).&lt;br /&gt;
* &amp;lt;code&amp;gt;OSPF_INTERFACE&amp;lt;/code&amp;gt;: Interface física de rede utilizada para o roteamento &#039;&#039;&#039;OSPF&#039;&#039;&#039; (por exemplo, &amp;lt;code&amp;gt;ens20&amp;lt;/code&amp;gt;). Se deixado em branco, a implantação de &#039;&#039;&#039;OSPF/Anycast&#039;&#039;&#039; (container &#039;&#039;&#039;FRR&#039;&#039;&#039;) será ignorada, executando o sistema em modo autônomo (stand-alone).&lt;br /&gt;
* &amp;lt;code&amp;gt;APPARMOR&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; para desabilitar o AppArmor e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; para mantê-lo habilitado.&lt;br /&gt;
* &amp;lt;code&amp;gt;MITIGATIONS&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; para desabilitar as mitigações de CPU e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; para deixá-las no modo automático.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_HOSTNAME&amp;lt;/code&amp;gt;: Identificador do host no servidor Zabbix. Se deixado em branco, o script utilizará o &#039;&#039;&#039;hostname&#039;&#039;&#039; do sistema.&lt;br /&gt;
* &amp;lt;code&amp;gt;CERT_DOMAIN&amp;lt;/code&amp;gt;: Nome de domínio utilizado para os certificados SSL do Let&#039;s Encrypt (empregado na validação dos serviços &#039;&#039;&#039;DoH&#039;&#039;&#039; e &#039;&#039;&#039;DoT&#039;&#039;&#039;; padrão: &amp;lt;code&amp;gt;doh.brasil.com.br&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_HOST&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_ACTIVE&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix ativo (Active Zabbix Server).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_LISTENIP&amp;lt;/code&amp;gt;: Endereço IP de vinculação (binding) para o container do Zabbix Agent 2 escutar conexões (padrão: &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Executando a instalação ==&lt;br /&gt;
Ao executar como root &#039;&#039;&#039;./unbound_kindns.sh &amp;lt;hostname&amp;gt;&#039;&#039;&#039;, verá a tela do instalador abaixo onde fará todo o processo de baixar imagens, compilar os programas e criar os containers. Sim o &#039;&#039;&#039;Unbound&#039;&#039;&#039; que o projeto utiliza é o &#039;&#039;&#039;latest&#039;&#039;&#039; do próprio desenvolvedor &#039;&#039;&#039;NLnet Labs&#039;&#039;&#039;. &lt;br /&gt;
[[Arquivo:Unbound-kindns02.png|nenhum|miniaturadaimagem|1046x1046px]]&lt;br /&gt;
Tudo ocorrendo bem veremos a mensagem de &#039;&#039;&#039;Installation finished&#039;&#039;&#039;. Na sequência veremos sobre a administração do sistema.&lt;br /&gt;
&lt;br /&gt;
== Administrando o sistema ==&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1155</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1155"/>
		<updated>2026-07-05T22:31:56Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as &#039;&#039;&#039;7 práticas do KINDNS&#039;&#039;&#039; utilizando containers do &#039;&#039;&#039;Docker&#039;&#039;&#039;. Vamos fazer um check list rápido do que contempla o projeto:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Prática 1&#039;&#039;&#039; - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. &#039;&#039;&#039;Unbound já atende por padrão&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 2&#039;&#039;&#039; - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. &#039;&#039;&#039;Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 3&#039;&#039;&#039; - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. &#039;&#039;&#039;Este projeto encontra-se com QNAME minimization já ativo&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 4&#039;&#039;&#039; - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. &#039;&#039;&#039;Unbound não faz Autoritativo, então OK também&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 5&#039;&#039;&#039; - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. &#039;&#039;&#039;Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 6&#039;&#039;&#039; - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. &#039;&#039;&#039;O projeto já entrega um container com Zabbix Agent2 7.0.x e um script para envio de métricas para o Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prática 7&#039;&#039;&#039; - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. &#039;&#039;&#039;Aqui também o projeto entrega o sistema preparado para DoT e DoH, só necessitando da configuração dos certificados TLS&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O projeto foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039; favorita. Como os serviços rodam em containers, ficam independentes de distro &#039;&#039;&#039;GNU/Linux&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um sistema com 8 vCores e 16G de ram suporta +20.000 assinantes simultâneos.&lt;br /&gt;
&lt;br /&gt;
== Preparação antes de rodar o script ==&lt;br /&gt;
No topo do script &#039;&#039;&#039;unbound_kindns.sh&#039;&#039;&#039; existem algumas variáveis para configurarmos antes de sua execução:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CORES&amp;lt;/code&amp;gt;: Número de núcleos de CPU dedicados ao Unbound (define o parâmetro &amp;lt;code&amp;gt;num-threads&amp;lt;/code&amp;gt; na configuração do Unbound; padrão: &#039;&#039;&#039;4&#039;&#039;&#039;).&lt;br /&gt;
* &amp;lt;code&amp;gt;OSPF_INTERFACE&amp;lt;/code&amp;gt;: Interface física de rede utilizada para o roteamento &#039;&#039;&#039;OSPF&#039;&#039;&#039; (por exemplo, &amp;lt;code&amp;gt;ens20&amp;lt;/code&amp;gt;). Se deixado em branco, a implantação de &#039;&#039;&#039;OSPF/Anycast&#039;&#039;&#039; (container &#039;&#039;&#039;FRR&#039;&#039;&#039;) será ignorada, executando o sistema em modo autônomo (stand-alone).&lt;br /&gt;
* &amp;lt;code&amp;gt;APPARMOR&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; para desabilitar o AppArmor e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; para mantê-lo habilitado.&lt;br /&gt;
* &amp;lt;code&amp;gt;MITIGATIONS&amp;lt;/code&amp;gt;: Defina como &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt; para desabilitar as mitigações de CPU e obter o máximo desempenho, ou como &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt; para deixá-las no modo automático.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_HOSTNAME&amp;lt;/code&amp;gt;: Identificador do host no servidor Zabbix. Se deixado em branco, o script utilizará o &#039;&#039;&#039;hostname&#039;&#039;&#039; do sistema.&lt;br /&gt;
* &amp;lt;code&amp;gt;CERT_DOMAIN&amp;lt;/code&amp;gt;: Nome de domínio utilizado para os certificados SSL do Let&#039;s Encrypt (empregado na validação dos serviços &#039;&#039;&#039;DoH&#039;&#039;&#039; e &#039;&#039;&#039;DoT&#039;&#039;&#039;; padrão: &amp;lt;code&amp;gt;doh.brasil.com.br&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_HOST&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix.&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_SERVER_ACTIVE&amp;lt;/code&amp;gt;: Endereço IP do servidor Zabbix ativo (Active Zabbix Server).&lt;br /&gt;
* &amp;lt;code&amp;gt;ZBX_LISTENIP&amp;lt;/code&amp;gt;: Endereço IP de vinculação (binding) para o container do Zabbix Agent 2 escutar conexões (padrão: &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Executando a instalação ==&lt;br /&gt;
Ao executar &#039;&#039;&#039;./unbound_kindns.sh &amp;lt;hostname&amp;gt;&#039;&#039;&#039;, verá a tela do instalador abaixo onde fará todo o processo de baixar imagens, compilar os programas e criar os containers. Sim o &#039;&#039;&#039;Unbound&#039;&#039;&#039; que o projeto utiliza é o &#039;&#039;&#039;latest&#039;&#039;&#039; do próprio desenvolvedor &#039;&#039;&#039;NLnet Labs&#039;&#039;&#039;. &lt;br /&gt;
[[Arquivo:Unbound-kindns02.png|nenhum|miniaturadaimagem|1046x1046px]]&lt;br /&gt;
Tudo ocorrendo bem veremos a mensagem de &#039;&#039;&#039;Installation finished&#039;&#039;&#039;. Na sequência veremos sobre a administração do sistema.&lt;br /&gt;
&lt;br /&gt;
== Administrando o sistema ==&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Arquivo:Unbound-kindns02.png&amp;diff=1154</id>
		<title>Arquivo:Unbound-kindns02.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Arquivo:Unbound-kindns02.png&amp;diff=1154"/>
		<updated>2026-07-05T22:28:31Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;unbound-kindns02&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1153</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1153"/>
		<updated>2026-07-05T21:40:43Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as 7 práticas do KINDNS. Vamos fazer um check list rápido:&lt;br /&gt;
&lt;br /&gt;
* Prática 1 - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. Unbound já atende por padrão.&lt;br /&gt;
* Prática 2 - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS.&lt;br /&gt;
* Prática 3 - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. Este projeto encontra-se com QNAME minimization já ativo.&lt;br /&gt;
* Prática 4 - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. Unbound não faz Autoritativo, então OK também.&lt;br /&gt;
* Prática 5 - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast.&lt;br /&gt;
* Prática 6 - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. O projeto já entrega um container com &#039;&#039;&#039;Zabbix Agent2&#039;&#039;&#039; 7.0.x e um script para envio de métricas para o &#039;&#039;&#039;Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* Prática 7 - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. Aqui também o projeto entrega o sistema preparado para &#039;&#039;&#039;DoT&#039;&#039;&#039; e &#039;&#039;&#039;DoH&#039;&#039;&#039;, só necessitando da configuração dos certificados TLS. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O script de instalação foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição GNU/Linux favorita. Como os serviços rodam em containers, ficam independentes de distro GNU/Linux.&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
== ❤️ Apoie este projeto ==&lt;br /&gt;
Este projeto é desenvolvido e mantido no meu tempo livre.&lt;br /&gt;
&lt;br /&gt;
Se ele foi útil para você, considere fazer uma contribuição para ajudar a manter o desenvolvimento ativo — e o estoque de café em dia. ☕&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL 💙 Contribuir via PayPal]{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1152</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1152"/>
		<updated>2026-07-05T21:39:06Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as 7 práticas do KINDNS. Vamos fazer um check list rápido:&lt;br /&gt;
&lt;br /&gt;
* Prática 1 - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. Unbound já atende por padrão.&lt;br /&gt;
* Prática 2 - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS.&lt;br /&gt;
* Prática 3 - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. Este projeto encontra-se com QNAME minimization já ativo.&lt;br /&gt;
* Prática 4 - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. Unbound não faz Autoritativo, então OK também.&lt;br /&gt;
* Prática 5 - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast.&lt;br /&gt;
* Prática 6 - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. O projeto já entrega um container com &#039;&#039;&#039;Zabbix Agent2&#039;&#039;&#039; 7.0.x e um script para envio de métricas para o &#039;&#039;&#039;Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* Prática 7 - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. Aqui também o projeto entrega o sistema preparado para &#039;&#039;&#039;DoT&#039;&#039;&#039; e &#039;&#039;&#039;DoH&#039;&#039;&#039;, só necessitando da configuração dos certificados TLS. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O script de instalação foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição GNU/Linux favorita. Como os serviços rodam em containers, ficam independentes de distro GNU/Linux.&lt;br /&gt;
&lt;br /&gt;
== Apoie este projeto ==&lt;br /&gt;
Se este projeto foi útil para você e deseja contribuir com seu desenvolvimento, considere fazer uma doação.&lt;br /&gt;
&lt;br /&gt;
[https://www.paypal.com/donate/?hosted_button_id=7LD8SPXNF2KH2 ❤️ Doar via PayPal]{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1151</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1151"/>
		<updated>2026-07-05T21:37:53Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]https://www.paypal.com/donate/?business=7LD8SPXNF2KH2&amp;amp;no_recurring=0&amp;amp;item_name=Sua+contribui%C3%A7%C3%A3o+ajuda+a+manter+meu+estoque+de+caf%C3%A9+em+dia+%3A%29&amp;amp;currency_code=BRL&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir as práticas do &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de dificuldade entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as 7 práticas do KINDNS. Vamos fazer um check list rápido:&lt;br /&gt;
&lt;br /&gt;
* Prática 1 - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. Unbound já atende por padrão.&lt;br /&gt;
* Prática 2 - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS.&lt;br /&gt;
* Prática 3 - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. Este projeto encontra-se com QNAME minimization já ativo.&lt;br /&gt;
* Prática 4 - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. Unbound não faz Autoritativo, então OK também.&lt;br /&gt;
* Prática 5 - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast.&lt;br /&gt;
* Prática 6 - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. O projeto já entrega um container com &#039;&#039;&#039;Zabbix Agent2&#039;&#039;&#039; 7.0.x e um script para envio de métricas para o &#039;&#039;&#039;Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* Prática 7 - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. Aqui também o projeto entrega o sistema preparado para &#039;&#039;&#039;DoT&#039;&#039;&#039; e &#039;&#039;&#039;DoH&#039;&#039;&#039;, só necessitando da configuração dos certificados TLS. &lt;br /&gt;
&lt;br /&gt;
== Requisitos ==&lt;br /&gt;
O script de instalação foi concebido para rodar em um &#039;&#039;&#039;GNU/Linux Debian 13 (Trixie)&#039;&#039;&#039; mas fique à vontade para modificá-lo para sua distribuição GNU/Linux favorita. Como os serviços rodam em containers, ficam independentes de distro GNU/Linux.&lt;br /&gt;
&lt;br /&gt;
{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1150</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1150"/>
		<updated>2026-07-05T21:10:16Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir o &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de implementação entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as 7 práticas do KINDNS. Vamos fazer um check list rápido:&lt;br /&gt;
&lt;br /&gt;
* Prática 1 - A validação DNSSEC deve estar obrigatoriamente habilitada nos resolvedores recursivos. Unbound já atende por padrão.&lt;br /&gt;
* Prática 2 - Regras de ACL devem ser obrigatoriamente utilizadas para restringir quem pode enviar consultas recursivas aos seus resolvedores/validadores DNS. Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS.&lt;br /&gt;
* Prática 3 - A minimização de QNAME (QNAME Minimization) deve estar obrigatoriamente habilitada para mitigar o vazamento de nomes de domínio. Este projeto encontra-se com QNAME minimization já ativo.&lt;br /&gt;
* Prática 4 - Os serviços DNS autoritativo e recursivo não devem coexistir no mesmo servidor DNS. Unbound não faz Autoritativo, então OK também.&lt;br /&gt;
* Prática 5 - Os seus serviços de resolução recursiva devem possuir resiliência, utilizando pelo menos dois servidores distintos, considerando critérios de diversidade. Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast.&lt;br /&gt;
* Prática 6 - O monitoramento dos serviços, servidores e equipamentos de rede que compõem a sua infraestrutura DNS deve ser obrigatoriamente implementado. O projeto já entrega um container com &#039;&#039;&#039;Zabbix Agent2&#039;&#039;&#039; 7.0.x e um script para envio de métricas para o &#039;&#039;&#039;Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* Prática 7 - DoT (DNS-over-TLS) ou DoH (DNS-over-HTTPS) deveriam estar habilitados. A implantação de qualquer um deles é a forma mais simples de proteger contra interceptação (eavesdropping), manipulação de consultas DNS e ataques do tipo homem-no-meio (Man-in-the-Middle), por meio da criptografia das consultas DNS entre o resolvedor stub e o resolvedor recursivo, ou entre um resolvedor encaminhador (forwarder) e um resolvedor recursivo. Aqui também o projeto entrega o sistema preparado para &#039;&#039;&#039;DoT&#039;&#039;&#039; e &#039;&#039;&#039;DoH&#039;&#039;&#039;, só necessitando da configuração dos certificados TLS. &lt;br /&gt;
{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1149</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1149"/>
		<updated>2026-07-05T20:00:16Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Servidores de DNS Recursivos precisam ser bem configurados e atender a alguns requisitos de segurança e boas práticas. Como definição para essas ações podemos seguir o &#039;&#039;&#039;KINDNS&#039;&#039;&#039; da &#039;&#039;&#039;ICANN&#039;&#039;&#039;, descritos [https://kindns.org/shared-private-resolvers/ &#039;&#039;&#039;aqui&#039;&#039;&#039;]. Para diminuir a curva de implementação entre instalação e configuração, criei um projeto no &#039;&#039;&#039;GitHub&#039;&#039;&#039; chamado &#039;&#039;&#039;[https://github.com/gondimcodes/unbound-kindns UNBOUND-KINDNS].&#039;&#039;&#039; O projeto tem como objetivo facilitar a instalação de um sistema, para atender as 7 práticas do KINDNS. Vamos fazer um check list rápido:&lt;br /&gt;
&lt;br /&gt;
* Prática 1 - DNSSEC validation &#039;&#039;&#039;MUST&#039;&#039;&#039; be enabled for recursive resolvers. Unbound já atende por padrão.&lt;br /&gt;
* Prática 2 - ACL statements &#039;&#039;&#039;MUST&#039;&#039;&#039; be used to restrict who may send recursive queries to your DNS resolvers/validators. Este projeto possui arquivos de ACLs para liberar apenas quem pode consultar seu DNS.&lt;br /&gt;
* Prática 3 - QNAME minimization &#039;&#039;&#039;MUST&#039;&#039;&#039; be enabled to mitigate leakage of domain names. Este projeto encontra-se com QNAME minimization já ativo.&lt;br /&gt;
* Prática 4 - Authoritative and recursive DNS service &#039;&#039;&#039;MUST NOT&#039;&#039;&#039; coexist on the same DNS server. Unbound não faz Autoritativo, então OK também.&lt;br /&gt;
* Prática 5 - Your recursion services &#039;&#039;&#039;MUST&#039;&#039;&#039; have resilience by using at least two distinct servers that take diversity into consideration. Este projeto te permite configurar  DNS(s) Primário e Secundário ou uma rede de DNS(s) Anycast.&lt;br /&gt;
* Prática 6 - Monitoring of the services, servers, and network equipment that make up your DNS infrastructure &#039;&#039;&#039;MUST&#039;&#039;&#039; be implemented. O projeto já entrega um container com &#039;&#039;&#039;Zabbix Agent2&#039;&#039;&#039; 7.0.x e um script para envio de métricas para o &#039;&#039;&#039;Zabbix Server&#039;&#039;&#039;. O template para o Zabbix Server encontra-se &#039;&#039;&#039;[https://github.com/gondimcodes/template_zabbix_dns_unbound aqui]&#039;&#039;&#039;.&lt;br /&gt;
* Prática 7 - DoT (DNS-over-TLS) or DoH (DNS-over-HTTPS) &#039;&#039;&#039;SHOULD&#039;&#039;&#039; be enabled. Deploying either is the easiest way to protect against eavesdropping and manipulation of DNS queries and man-in-the-middle attacks by encrypting DNS queries between stub and recursive resolvers, or between a forwarding and recursive resolver. Aqui também o projeto entrega o sistema preparado para &#039;&#039;&#039;DoT&#039;&#039;&#039; e &#039;&#039;&#039;DoH&#039;&#039;&#039;, só necessitando da configuração dos certificados TLS. &lt;br /&gt;
{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1148</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1148"/>
		<updated>2026-07-05T19:32:15Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
[[Arquivo:Unbound-kindns01.png|nenhum|miniaturadaimagem|825x825px]]&lt;br /&gt;
&lt;br /&gt;
{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Arquivo:Unbound-kindns01.png&amp;diff=1147</id>
		<title>Arquivo:Unbound-kindns01.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Arquivo:Unbound-kindns01.png&amp;diff=1147"/>
		<updated>2026-07-05T19:31:25Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Unbound-kindns01&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1146</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1146"/>
		<updated>2026-07-05T19:26:45Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EXIBETITULO:UNBOUND-KINDNS}}&lt;br /&gt;
tes&lt;br /&gt;
&lt;br /&gt;
{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1145</id>
		<title>Unbound-kindns</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Unbound-kindns&amp;diff=1145"/>
		<updated>2026-07-05T19:25:55Z</updated>

		<summary type="html">&lt;p&gt;Gondim: Criou página com &amp;#039;tes  {{ORDENACAOPADRAO:UNBOUND-KINDNS}}&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;tes&lt;br /&gt;
&lt;br /&gt;
{{ORDENACAOPADRAO:UNBOUND-KINDNS}}&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=DNS_Recursivo_Anycast_HyperLocal&amp;diff=1144</id>
		<title>DNS Recursivo Anycast HyperLocal</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=DNS_Recursivo_Anycast_HyperLocal&amp;diff=1144"/>
		<updated>2026-07-03T01:07:14Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:DNS Recursivo Anycast com Hyperlocal}}&lt;br /&gt;
&lt;br /&gt;
== Introdução ==&lt;br /&gt;
Você sabe como funciona a Internet? Essa é uma pergunta que meu amigo &#039;&#039;&#039;Thiago Ayub&#039;&#039;&#039; sempre faz aos seus candidatos à vagas de emprego e não importa o quanto tenham de experiência em &#039;&#039;&#039;Engenharia de Redes&#039;&#039;&#039;, todos sempre travam nesse momento. Todos estão sempre prontos e preparados para resolver os problemas mais cabeludos em &#039;&#039;&#039;BGP&#039;&#039;&#039;, &#039;&#039;&#039;OSPF&#039;&#039;&#039;, &#039;&#039;&#039;MPLS&#039;&#039;&#039;, etc mas travam com essa simples pergunta. Para contextualizar e visualizarmos melhor vamos nos atentar à imagem abaixo e uma explicação simplificada de como funciona:&lt;br /&gt;
[[Arquivo:Dns hierarquia.png|esquerda|commoldura]]&lt;br /&gt;
Tudo começa com um usuário sentado confortavelmente e querendo acessar um conteúdo disponível na Internet. Ele digita em seu navegador preferido a URL: &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;https://wiki.ispup.com.br&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1)&amp;lt;/big&amp;gt;&#039;&#039;&#039; &amp;lt;big&amp;gt;O&amp;lt;/big&amp;gt; &amp;lt;big&amp;gt;navegador irá requisitar do &#039;&#039;&#039;DNS Recursivo&#039;&#039;&#039; utilizado pelo usuário, o &#039;&#039;&#039;endereço IP&#039;&#039;&#039; que responde pelo nome &#039;&#039;&#039;wiki.&#039;&#039;&#039;&amp;lt;/big&amp;gt;&#039;&#039;&#039;ispup.com.br&#039;&#039;&#039;&amp;lt;big&amp;gt;. Isso porque todos os acessos se dão na Internet através do &#039;&#039;&#039;endereço&#039;&#039;&#039; &#039;&#039;&#039;IP&#039;&#039;&#039; e não através do &#039;&#039;&#039;nome&#039;&#039;&#039;. Imaginem se tivéssemos que decorar os endereços IPs de todos os sites e serviços que quiséssemos acessar na Internet?&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;2)&#039;&#039;&#039; Nosso DNS Recursivo checa se a informação consta em seu cache.&amp;lt;/big&amp;gt; Se a informação existir ela é devolvida ao navegador do usuário e aí este consegue acessar o site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3)&#039;&#039;&#039; Do contrário o DNS Recursivo pergunta ao &#039;&#039;&#039;Root Server&#039;&#039;&#039; quem é o &#039;&#039;&#039;TLD (Top Level Domain)&#039;&#039;&#039; responsável para atender a requisição.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4)&#039;&#039;&#039; O &#039;&#039;&#039;Root Server&#039;&#039;&#039; informa ao DNS Recursivo o endereço do &#039;&#039;&#039;TLD responsável&#039;&#039;&#039;. No Brasil o &#039;&#039;&#039;TLD&#039;&#039;&#039; responsável pelo &#039;&#039;&#039;.br&#039;&#039;&#039; seria o &#039;&#039;&#039;Registro.br&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5)&#039;&#039;&#039; O DNS Recursivo pergunta ao &#039;&#039;&#039;TLD&#039;&#039;&#039; sobre &#039;&#039;&#039;wiki.ispup.com.br&#039;&#039;&#039; e este responde com os endereços IP dos &#039;&#039;&#039;DNS Autoritativos&#039;&#039;&#039; responsáveis pelo domínio &#039;&#039;&#039;ispup.com.br.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6)&#039;&#039;&#039; O DNS Recursivo pergunta aos &#039;&#039;&#039;DNS Autoritativos&#039;&#039;&#039; pelo &#039;&#039;&#039;wiki.ispup.com.br&#039;&#039;&#039; e este responde com o &#039;&#039;&#039;endereço IP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7)&#039;&#039;&#039; Por último o DNS Recursivo devolve a informação para o navegador do usuário.&lt;br /&gt;
&lt;br /&gt;
Como que se dá a comunicação entre os &#039;&#039;&#039;DNS(s) Recursivos, Root Servers, TLDs&#039;&#039;&#039; e &#039;&#039;&#039;Autoritativos&#039;&#039;&#039;? Como que o navegador do usuário, após receber o IP do site, consegue chegar no servidor que tem o conteúdo? Isso só é possível devido ao protocolo chamado &#039;&#039;&#039;BGP (Border Gateway Protocol)&#039;&#039;&#039;, todos os caminhos que conhecemos como rotas de destino, são anunciadas por milhares de participantes na &#039;&#039;&#039;Internet&#039;&#039;&#039; conhecidos como &#039;&#039;&#039;AS (Autonomous System)&#039;&#039;&#039;, esses participantes se interligam para disponibilizar conteúdos e acessos pelo mundo aos milhares de usuários. É uma imensa rede colaborativa formada por Empresas, Universidades, Governos e todos que queiram se interconectar. Percebam que sem o &#039;&#039;&#039;BGP&#039;&#039;&#039;, que serve de caminho para chegarmos nos conteúdos e sem o &#039;&#039;&#039;DNS (Domain Name System)&#039;&#039;&#039; para traduzir o nome para o endereço IP, a &#039;&#039;&#039;Internet&#039;&#039;&#039; não funcionaria e por isso precisamos cuidar muito bem desses dois serviços.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Mas não acaba por aí. O &#039;&#039;&#039;DNS Recursivo&#039;&#039;&#039; tem um papel muito importante para o Provedor de Internet e que envolve segurança, qualidade de acesso à Internet e a disponibilidade do serviço entregue ao cliente. Quando bem configurado acelera as consultas dos acessos graças ao seu cache interno, mas para que isso seja percebido pelo assinante, é necessário que esteja o mais próximo possível do seu cliente.&lt;br /&gt;
&lt;br /&gt;
==Um erro que destrói a qualidade do nosso serviço ==&lt;br /&gt;
Um erro muito comum que muitas operadoras cometem é utilizar DNS Recursivo externo, como o &#039;&#039;&#039;8.8.8.8&#039;&#039;&#039;, &#039;&#039;&#039;1.1.1.1&#039;&#039;&#039; e outros, para seus clientes. Quanto mais próximo dos seus clientes, mais qualidade de serviço estará entregando a eles. Conteúdos serão entregues mais rapidamente pois serão resolvidos e armazenados em caches locais e não consultados remotamente na Internet. Para falar mais sobre isso, te convido leitor desse documento, que assista essa palestra do &#039;&#039;&#039;Thiago Ayub&#039;&#039;&#039; no &#039;&#039;&#039;GTER 51/GTS 37&#039;&#039;&#039; (2022) &#039;&#039;&#039;8.888 MOTIVOS PARA NÃO USAR DNS RECURSIVO EXTERNO EM SEU AS&#039;&#039;&#039;: https://www.youtube.com/watch?v=Rsvpu5uF2Io  &lt;br /&gt;
&lt;br /&gt;
==Objetivo==&lt;br /&gt;
O objetivo desta documentação não é te ensinar tudo sobre &#039;&#039;&#039;DNS&#039;&#039;&#039;, &#039;&#039;&#039;BGP&#039;&#039;&#039;, &#039;&#039;&#039;OSPF&#039;&#039;&#039; e nem tão pouco sobre GNU/Linux e sim te mostrar um exemplo de servidor DNS Recursivo implementado pensando em segurança, qualidade e resiliência. Usaremos em todas as nossas documentações o [https://www.debian.org/ Debian GNU/Linux], por ser uma distribuição que considero uma obra de arte criada por uma enorme comunidade séria, com vasta experiência de anos, qualidade no empacotamento dos programas, estável e com uma equipe de segurança excelente e ativa. Caso você leitor, utilize alguma outra distribuição GNU/Linux, todo conteúdo apresentado aqui pode ser aplicado em outras distros, desde que respeitando as particularidades de cada uma.&lt;br /&gt;
&lt;br /&gt;
Aqui construiremos um sistema do tipo &#039;&#039;&#039;Anycast&#039;&#039;&#039;, ou seja, terás o serviço rodando em diversas localidades da sua Rede utilizando o mesmo endereçamento IP e que atenderá seu cliente mais próximo. Em caso de falhas, seus clientes automaticamente e de forma transparente continuarão consultando o DNS mais próximo deles. Para que ele funcione dessa forma você precisará ter uma &#039;&#039;&#039;Rede OSPF&#039;&#039;&#039; implementada no seu Provedor Internet ou algum outro protocolo como por exemplo o &#039;&#039;&#039;ISIS,&#039;&#039;&#039; mas esse documento não irá abordar o &#039;&#039;&#039;ISIS&#039;&#039;&#039;. Também utilizaremos o &#039;&#039;&#039;Hyperlocal&#039;&#039;&#039; como recurso adicional para gerar algumas proteções de segurança e velocidade na resposta relacionada aos servidores de DNS Raiz da Internet.&lt;br /&gt;
&lt;br /&gt;
==Diagrama==&lt;br /&gt;
Para exemplificar nosso servidor de DNS Recursivo, usaremos como base das explicações um diagrama demonstrando o uso do DNS Recursivo em uma Rede fictícia. Adotaremos IPs privados e reservados para demonstrar todo o ambiente do Provedor de Internet.&lt;br /&gt;
[[Arquivo:Image2.png|esquerda|miniaturadaimagem|762x762px]]&lt;br /&gt;
Nesse diagrama podemos observar alguns detalhes técnicos como por exemplo: existem &#039;&#039;&#039;3 servidores de DNS Recursivo&#039;&#039;&#039; posicionados em locais diferentes, que poderiam estar em bairros diferentes e até em cidades diferentes. Em cada servidor teremos &#039;&#039;&#039;4 loopbacks&#039;&#039;&#039; com os IPs:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.10.10.10/32 - fd00::10:10:10:10/128&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.10.9.9/32 - fd00::10:10:9:9/128&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Esses IPs serão entregues pelos concentradores &#039;&#039;&#039;PPPoE&#039;&#039;&#039; ou &#039;&#039;&#039;IPoE&#039;&#039;&#039; (&#039;&#039;&#039;BNG&#039;&#039;&#039;) para seus clientes como &#039;&#039;&#039;DNS primário&#039;&#039;&#039; e &#039;&#039;&#039;secundário&#039;&#039;&#039;. Podemos usar IPs privados como DNS primário e secundário em um ambiente real? Sim podemos, desde que não sejam IPs que possam ter problemas com as redes privadas dos clientes. Ex.: rede do cliente usando &#039;&#039;&#039;192.168.0.0/24&#039;&#039;&#039;. Se entregarmos o DNS sendo &#039;&#039;&#039;192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;192.168.0.20&#039;&#039;&#039; teremos problemas e o cliente ficará sem Internet, porque &#039;&#039;&#039;192.168.0.10&#039;&#039;&#039; e &#039;&#039;&#039;192.168.0.20&#039;&#039;&#039; fazem parte da rede &#039;&#039;&#039;192.168.0.0/24&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Agora entregando &#039;&#039;&#039;10.10.10.10&#039;&#039;&#039;, &#039;&#039;&#039;10.10.9.9, fd00::10:10:10:10 e fd00::10:10:9:9&#039;&#039;&#039; não teríamos problemas com a rede &#039;&#039;&#039;192.168.0.0/24&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Motivos para usarmos IPs privados:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*O principal motivo está relacionado com a segurança, uma vez que sendo um IP privado, não pode sofrer ataques DDoS direcionados diretamente para ele, vindos da Internet.&lt;br /&gt;
*Nem mesmo o cliente da sua rede conhece os &#039;&#039;&#039;IPs públicos&#039;&#039;&#039; utilizados para recursividade na Internet.&lt;br /&gt;
*Memorizar os IPs &#039;&#039;&#039;10.10.10.10&#039;&#039;&#039; e &#039;&#039;&#039;10.10.9.9&#039;&#039;&#039; é tão fácil quanto memorizar o &#039;&#039;&#039;8.8.8.8&#039;&#039;&#039; e o &#039;&#039;&#039;1.1.1.1&#039;&#039;&#039;. Mais fácil para o seu técnico guardar essa informação e utilizar onde for necessário.&lt;br /&gt;
&lt;br /&gt;
Cada servidor DNS Recursivo possui um &#039;&#039;&#039;IPv4 público&#039;&#039;&#039;, aqui representado por &#039;&#039;&#039;198.18.x.x/27&#039;&#039;&#039; e um &#039;&#039;&#039;IPv6 global&#039;&#039;&#039; representado por um IP dentro do prefixo &#039;&#039;&#039;2001:db8::/32&#039;&#039;&#039;. Cada servidor precisa ter os seus próprios IPs e são através destes IPs que as consultas de DNS serão realizadas na Internet.&lt;br /&gt;
&lt;br /&gt;
Nessa topologia usando &#039;&#039;&#039;Anycast&#039;&#039;&#039;, o cliente será sempre atendido pelo &#039;&#039;&#039;DNS Recursivo&#039;&#039;&#039; mais próximo, desde que os pesos no &#039;&#039;&#039;OSPF&#039;&#039;&#039; estejam ajustados corretamente.          &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Dados do servidor==&lt;br /&gt;
Podemos utilizar um sistema virtualizado ou não. Sistemas virtualizados são bem vindos pois são mais simples quando precisamos fazer backups, levantar outros sistemas sem complicações e se precisarmos restaurar rapidamente algum sistema que ficou indisponível por algum motivo. A configuração abaixo tem capacidade para atender algo em torno a &#039;&#039;&#039;50.000 assinantes ou mais&#039;&#039;&#039;. O DNS Recursivo é um serviço que pode ser utilizado até mesmo em um &#039;&#039;&#039;Raspberry Pi&#039;&#039;&#039; e atender operações pequenas, nesse caso com o intuito de economizar energia e espaço. Nosso foco aqui é montar uma rede de &#039;&#039;&#039;DNS Recursivo Anycast com HyperLocal&#039;&#039;&#039;. Como comentei acima o servidor deve ficar o mais próximo dos clientes para termos a &#039;&#039;&#039;menor latência possível&#039;&#039;&#039; e &#039;&#039;&#039;sempre menor que 5ms&#039;&#039;&#039; entre o cliente e o servidor.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!CPU&lt;br /&gt;
!Memória&lt;br /&gt;
!Disco&lt;br /&gt;
!Sistema&lt;br /&gt;
|-&lt;br /&gt;
|2.4Ghz 8 cores&lt;br /&gt;
|16G DDR4&lt;br /&gt;
|30G&lt;br /&gt;
|Debian 13 amd64 (Trixie)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Softwares utilizados ==&lt;br /&gt;
&lt;br /&gt;
*Debian 13 amd64 (Trixie) instalação mínima.&lt;br /&gt;
&lt;br /&gt;
*[https://frrouting.org/ FRRouting].&lt;br /&gt;
*Unbound.&lt;br /&gt;
* Chrony (NTP/NTS).&lt;br /&gt;
*Shell script em bash.&lt;br /&gt;
&lt;br /&gt;
== Funcionalidades que teremos==&lt;br /&gt;
&lt;br /&gt;
*Sistema em Anycast.&lt;br /&gt;
*Hyperlocal.&lt;br /&gt;
*Controle de acesso por &amp;lt;abbr&amp;gt;ACL&amp;lt;/abbr&amp;gt;.&lt;br /&gt;
*RPZ (Response Policy Zone).&lt;br /&gt;
*Bloqueio de consultas do tipo ANY.&lt;br /&gt;
*QNAME minimization habilitado. (habilitado por default no Unbound)&lt;br /&gt;
*Recursividade em IPv4 e IPv6.&lt;br /&gt;
*DNSSEC habilitado.&lt;br /&gt;
* &amp;lt;abbr&amp;gt;DoH (DNS&amp;lt;/abbr&amp;gt; over HTTPS) habilitado.&lt;br /&gt;
&lt;br /&gt;
==Monitoramento==&lt;br /&gt;
O monitoramento é algo bem específico e não é o foco deste documento mas é extremamente importante que você monitore seus servidores de DNS por alguma ferramenta como o Zabbix. Aqui mostrarei apenas como enviar as informações para o Zabbix. Algumas coisas que você deveria monitorar nos servidores de DNS Recursivo:&lt;br /&gt;
&lt;br /&gt;
*Serviço do unbound parou.&lt;br /&gt;
*Perda de pacotes.&lt;br /&gt;
*Latência alta de pacotes.&lt;br /&gt;
*Lentidão na resolução de queries.&lt;br /&gt;
* CPU alta.&lt;br /&gt;
*Load alto.&lt;br /&gt;
* Memória com uso alto.&lt;br /&gt;
*Disco com pouco espaço.&lt;br /&gt;
* Queda brusca nas queries.&lt;br /&gt;
* A recursividade parou de funcionar.&lt;br /&gt;
*A recursividade voltou a funcionar.&lt;br /&gt;
&lt;br /&gt;
Este abaixo é um exemplo de monitoramento de um sistema de DNS Recursivo que atende 50.000 assinantes:&lt;br /&gt;
[[Arquivo:Grafana dns.png|nenhum|miniaturadaimagem|1468x1468px]]&lt;br /&gt;
&lt;br /&gt;
==Configurando a Rede==&lt;br /&gt;
Nossa documentação será baseada no diagrama apresentado acima e por isso configuraremos apenas um dos três servidores, porque os outros serão configurados da mesma forma, só que com dados diferentes. Para tanto assumirei que já temos um sistema Debian instalado com o mínimo de pacotes e somente com sshd, para que possamos acessar remotamente mais tarde. &#039;&#039;&#039;Não instale um ambiente gráfico no servidor&#039;&#039;&#039;, você não deve querer fazer isso por diversos motivos e os principais: primeiro porque não é um Desktop e segundo porque o ambiente gráfico devoraria toda a memória com recursos que não seriam úteis aqui.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;/etc/network/interfaces&#039;&#039;&#039; deixaremos assim:&lt;br /&gt;
 # This file describes the network interfaces available on your system&lt;br /&gt;
 # and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
  &lt;br /&gt;
 source /etc/network/interfaces.d/*&lt;br /&gt;
  &lt;br /&gt;
 # The loopback network interface&lt;br /&gt;
 auto lo&lt;br /&gt;
 iface lo inet loopback&lt;br /&gt;
  &lt;br /&gt;
 auto lo:0&lt;br /&gt;
 iface lo:0 inet static&lt;br /&gt;
       address 10.10.10.10/32&lt;br /&gt;
  &lt;br /&gt;
 auto lo:1&lt;br /&gt;
 iface lo:1 inet static&lt;br /&gt;
       address 10.10.9.9/32&lt;br /&gt;
 &lt;br /&gt;
 auto lo:2&lt;br /&gt;
 iface lo:2 inet6 static&lt;br /&gt;
       address fd00::10:10:10:10/128&lt;br /&gt;
 &lt;br /&gt;
 auto lo:3&lt;br /&gt;
 iface lo:3 inet6 static&lt;br /&gt;
       address fd00::10:10:9:9/128&lt;br /&gt;
  &lt;br /&gt;
 # The primary network interface&lt;br /&gt;
 auto ens18&lt;br /&gt;
 iface ens18 inet static&lt;br /&gt;
         address 198.18.1.10/27&lt;br /&gt;
         gateway 198.18.1.1&lt;br /&gt;
  &lt;br /&gt;
 iface ens18 inet6 static&lt;br /&gt;
         address 2001:db8::faca:198:18:1:10/64&lt;br /&gt;
         gateway 2001:db8::faca:198:18:1:1&lt;br /&gt;
  &lt;br /&gt;
 # The secondary network interface&lt;br /&gt;
 auto ens18:0&lt;br /&gt;
 iface ens18:0 inet static&lt;br /&gt;
         address 172.16.0.6/30&lt;br /&gt;
Nesse cenário temos as quatro &#039;&#039;&#039;loopbacks&#039;&#039;&#039; com os IPs &#039;&#039;&#039;10.10.10.10&#039;&#039;&#039;, &#039;&#039;&#039;10.10.9.9, fd00::10:10:10:10&#039;&#039;&#039; e &#039;&#039;&#039;fd00::10:10:9:9&#039;&#039;&#039; que serão anunciados via OSPF para a rede e serem entregues aos clientes via BNG. Os IPs &#039;&#039;&#039;198.18.1.10&#039;&#039;&#039; e &#039;&#039;&#039;2001:db8::faca:198:18:1:10&#039;&#039;&#039; serão usados para fazerem a recursividade na Internet tanto em IPv4 quanto em IPv6. Esses IPs não devem ser divulgados para clientes; os IPs públicos são dedicados apenas para essa finalidade.&lt;br /&gt;
&lt;br /&gt;
==Configuração dos repositórios Debian==&lt;br /&gt;
&lt;br /&gt;
Deixe o arquivo &#039;&#039;&#039;/etc/apt/sources.list.d/debian.sources&#039;&#039;&#039; conforme abaixo:&lt;br /&gt;
 Types: deb&lt;br /&gt;
 URIs: &amp;lt;nowiki&amp;gt;http://security.debian.org/debian-security/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 Suites: trixie-security&lt;br /&gt;
 Components: main contrib non-free non-free-firmware&lt;br /&gt;
 Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg&lt;br /&gt;
 &lt;br /&gt;
 Types: deb&lt;br /&gt;
 URIs: &amp;lt;nowiki&amp;gt;http://deb.debian.org/debian/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 Suites: trixie&lt;br /&gt;
 Components: main contrib non-free non-free-firmware&lt;br /&gt;
 Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg&lt;br /&gt;
 &lt;br /&gt;
 Types: deb&lt;br /&gt;
 URIs: &amp;lt;nowiki&amp;gt;http://deb.debian.org/debian/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 Suites: trixie-updates&lt;br /&gt;
 Components: main contrib non-free non-free-firmware&lt;br /&gt;
 Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg&lt;br /&gt;
&lt;br /&gt;
Deixe o arquivo &#039;&#039;&#039;/etc/apt/sources.list.d/debian-backports.sources&#039;&#039;&#039; conforme abaixo:&lt;br /&gt;
 Types: deb&lt;br /&gt;
 URIs: &amp;lt;nowiki&amp;gt;http://deb.debian.org/debian/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 Suites: trixie-backports&lt;br /&gt;
 Components: main contrib non-free non-free-firmware&lt;br /&gt;
 Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg&lt;br /&gt;
&lt;br /&gt;
 # rm /etc/apt/sources.list&lt;br /&gt;
Após a configuração vamos instalar alguns pacotes necessários e outros úteis:&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt full-upgrade&lt;br /&gt;
 # apt install net-tools nftables htop iotop sipcalc tcpdump curl gnupg rsync wget host dnsutils mtr-tiny bmon sudo tmux whois ethtool dnstop irqbalance&lt;br /&gt;
&lt;br /&gt;
==Fazendo algum tuning no sistema==&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;/etc/sysctl.d/100-tuning.conf&#039;&#039;&#039; adicionamos essas instruções:&lt;br /&gt;
 net.core.rmem_max = 2147483647&lt;br /&gt;
 net.core.wmem_max = 2147483647&lt;br /&gt;
 net.ipv4.tcp_rmem = 4096 87380 2147483647&lt;br /&gt;
 net.ipv4.tcp_wmem = 4096 65536 2147483647&lt;br /&gt;
 net.netfilter.nf_conntrack_buckets = 512000&lt;br /&gt;
 net.netfilter.nf_conntrack_max = 4096000&lt;br /&gt;
 vm.swappiness=10&lt;br /&gt;
Estamos fazendo algumas melhorias de memória, algumas relacionadas a &#039;&#039;&#039;conntrack&#039;&#039;&#039; porque se for usar um filtro de pacotes stateful, como o &#039;&#039;&#039;Netfilter/IPTables&#039;&#039;&#039; ou &#039;&#039;&#039;Netfilter/NFTables&#039;&#039;&#039;, o valor default da tabela é pequeno e dependendo da situação, se estourar essa tabela, as consultas de DNS terão problemas também. O DNS Recursivo não deve ficar aberto para qualquer um na Internet, ele deve ser liberado apenas para seus clientes. Podemos fazer através das ACLs do Unbound e pelo filtro de pacotes. O último parâmetro diz respeito ao uso de swap, por padrão o Debian permite o uso de swap após 40% do uso da memória, nesse caso estamos dizendo para o sistema usar o swap com 90% de uso da memória.&lt;br /&gt;
&lt;br /&gt;
Precisamos adicionar o módulo &#039;&#039;&#039;nf_conntrack&#039;&#039;&#039; em &#039;&#039;&#039;/etc/modules&#039;&#039;&#039; para que seja carregado em tempo de boot, senão os parâmetros de &#039;&#039;&#039;conntrack&#039;&#039;&#039; que colocamos em &#039;&#039;&#039;/etc/sysctl.conf&#039;&#039;&#039; não serão carregados.&lt;br /&gt;
 # echo nf_conntrack &amp;gt;&amp;gt; /etc/modules&lt;br /&gt;
 # modprobe nf_conntrack&lt;br /&gt;
 # sysctl -p&lt;br /&gt;
&lt;br /&gt;
== Instalando o FRRouting ==&lt;br /&gt;
&lt;br /&gt;
O FRRouting é o programa que usaremos para fazer os anúncios das nossas loopbacks via OSPF. Nesse documento usaremos a versão 10.x:&lt;br /&gt;
 # apt install frr frr-doc frr-pythontools&lt;br /&gt;
Aconselho depois de instalar os pacotes, marcá-los para não atualizar juntamente com os demais pacotes, isso é para evitar de ocorrer alguma atualização no FRRouting, que torne o serviço instável por algum motivo. Não que isso vá ocorrer, mas é melhor fazer essa atualização quando realmente for necessário.&lt;br /&gt;
 # apt-mark hold frr frr-doc frr-pythontools&lt;br /&gt;
Após esse comando acima, o sistema manterá a instalação original do pacote intacta. Para desbloquear basta executar o comando abaixo:&lt;br /&gt;
 # apt-mark unhold frr frr-doc frr-pythontools&lt;br /&gt;
&lt;br /&gt;
== Removendo o APPARMOR==&lt;br /&gt;
O &#039;&#039;&#039;APPARMOR&#039;&#039;&#039; às vezes causa mais problemas que solução e se não for fazer uma completa configuração nele, é melhor desabilitá-lo. Para fazer isso efetivamente, o procedimento é esse abaixo:&lt;br /&gt;
 # mkdir -p /etc/default/grub.d&lt;br /&gt;
 # echo &#039;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;$GRUB_CMDLINE_LINUX_DEFAULT apparmor=0&amp;quot;&#039; | tee /etc/default/grub.d/apparmor.cfg&lt;br /&gt;
 # update-grub&lt;br /&gt;
 # reboot&lt;br /&gt;
&lt;br /&gt;
==Instalando o Unbound==&lt;br /&gt;
Nesse momento ainda não iremos configurar o Unbound, apenas instalar o pacote e acertar o ambiente. Vamos instalar o unbound do backports porque este já possui suporte ao DoH que veremos mais à frente.&lt;br /&gt;
 # apt install unbound dns-root-data&lt;br /&gt;
 # mkdir -p /var/log/unbound&lt;br /&gt;
 # touch /var/log/unbound/unbound.log&lt;br /&gt;
 # chown -R unbound:unbound /var/log/unbound/&lt;br /&gt;
 # systemctl restart unbound&lt;br /&gt;
Configurando o logrotate:&lt;br /&gt;
 cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/logrotate.d/unbound&lt;br /&gt;
 /var/log/unbound/unbound.log {&lt;br /&gt;
     rotate 5&lt;br /&gt;
     weekly&lt;br /&gt;
     postrotate&lt;br /&gt;
         unbound-control log_reopen&lt;br /&gt;
     endscript&lt;br /&gt;
 }&lt;br /&gt;
 EOF&lt;br /&gt;
Reiniciando o serviço:&lt;br /&gt;
 # systemctl restart logrotate.service&lt;br /&gt;
&lt;br /&gt;
== Desabilitando THP (Transparente Huge Pages) em arquitetura AMD64 ==&lt;br /&gt;
No Debian o &#039;&#039;&#039;THP&#039;&#039;&#039; vem habilitado como &#039;&#039;&#039;always&#039;&#039;&#039; e o &#039;&#039;&#039;unbound&#039;&#039;&#039; por trabalhar bastante com alterações do cache em memória, isso pode acabar causando um consumo crescente de uso de RAM sem necessidade. É uma boa prática desabilitá-lo com os passos abaixo:&lt;br /&gt;
&lt;br /&gt;
https://github.com/NLnetLabs/unbound/issues/724&lt;br /&gt;
 cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/systemd/system/disable-thp.service&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Desabilita Transparent Huge Pages (THP)&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=oneshot&lt;br /&gt;
 ExecStart=/bin/sh -c &amp;quot;echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/enabled&amp;quot;&lt;br /&gt;
 ExecStart=/bin/sh -c &amp;quot;echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/defrag&amp;quot;&lt;br /&gt;
 RemainAfterExit=yes&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 EOF&lt;br /&gt;
Acima configuramos o serviço &#039;&#039;&#039;disable-thp.service&#039;&#039;&#039; para desabilitar o &#039;&#039;&#039;THP&#039;&#039;&#039; e abaixo habilitamos no &#039;&#039;&#039;systemd&#039;&#039;&#039; e iniciamos:&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now disable-thp&lt;br /&gt;
&lt;br /&gt;
== Preparando o monitoramento do seu DNS Recursivo ==&lt;br /&gt;
O monitoramento do seu DNS Recursivo é muito importante e para isso vamos usar um &#039;&#039;&#039;template para Zabbix&#039;&#039;&#039;, que modifiquei juntamente com o seu shell script e que enviará os dados para o seu Zabbix server via &#039;&#039;&#039;zabbix-sender&#039;&#039;&#039;. O projeto original está aqui &#039;&#039;&#039;https://github.com/jeftedelima/Unbound-DNS&amp;lt;nowiki/&amp;gt;.&#039;&#039;&#039; O xml alterado está aqui &#039;&#039;&#039;https://github.com/gondimcodes/template_zabbix_dns_unbound&#039;&#039;&#039;. Embora seja antigo é perfeitamente importável no Zabbix 6.0, por exemplo.&lt;br /&gt;
&lt;br /&gt;
Teremos um shell script que você precisará colocar no seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;. No exemplo abaixo assumi que o shell script está em &#039;&#039;&#039;/root/scripts&#039;&#039;&#039;. De 5 em 5 minutos os dados serão enviados para o seu Zabbix server.&lt;br /&gt;
 */5 * * * *     root    /root/scripts/unboundSend.sh &#039;&#039;&#039;IP_zabbix_server&#039;&#039;&#039; &#039;&#039;&#039;nome_do_host&#039;&#039;&#039; 1&amp;gt; /dev/null&lt;br /&gt;
Na linha acima, troque o &#039;&#039;&#039;IP_zabbix_server&#039;&#039;&#039; pelo &#039;&#039;&#039;IP do seu servidor Zabbix&#039;&#039;&#039; e o &#039;&#039;&#039;nome_do_host&#039;&#039;&#039; pelo &#039;&#039;&#039;hostname&#039;&#039;&#039; &#039;&#039;&#039;do seu DNS Recursivo&#039;&#039;&#039;. Você precisará instalar o pacote &#039;&#039;&#039;zabbix-sender&#039;&#039;&#039; no seu DNS Recursivo pois ele será usado para enviar os dados para o Zabbix server. &lt;br /&gt;
&lt;br /&gt;
Abaixo o &#039;&#039;&#039;unboundSend.sh&#039;&#039;&#039; também alterado com inclusão de mais dados:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #       @Jefte de Lima Ferreira&lt;br /&gt;
 #       jeftedelima at gmail dot com&lt;br /&gt;
 #       CRON Example&lt;br /&gt;
 #       Contributor: Marcelo Gondim - gondim at gmail dot com&lt;br /&gt;
 #       */5   **** root sh /home/dir/unboundSend.sh 192.168.10.1 Unbound 1&amp;gt; /dev/null&lt;br /&gt;
  &lt;br /&gt;
 if [ -z ${1} ] || [ -z ${2} ] ; then&lt;br /&gt;
         echo &amp;quot;You need to specify the IP address of zabbix server and hostname of your DNS Unbound on zabbix&amp;quot;&lt;br /&gt;
         echo &amp;quot;Usage example: ./unboundSend.sh 192.168.10.1 UnboundServer&amp;quot;&lt;br /&gt;
         exit 1&lt;br /&gt;
 fi&lt;br /&gt;
  &lt;br /&gt;
 # ZABBIX_SERVER IP&lt;br /&gt;
 IP_ZABBIX=$1&lt;br /&gt;
 # NAME Unbound on Zabbix&lt;br /&gt;
 NAME_HOST=$2&lt;br /&gt;
 DIR_TEMP=/var/tmp/&lt;br /&gt;
 FILE=&amp;quot;${DIR_TEMP}dump_unbound_control_stats.txt&amp;quot;&lt;br /&gt;
 FILE_PREV=&amp;quot;${DIR_TEMP}unboundSend.${NAME_HOST}.last_vals.txt&amp;quot;&lt;br /&gt;
 STATE_TS=&amp;quot;${DIR_TEMP}unboundSend.${NAME_HOST}.last_ts&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 # --- Tempo decorrido real ---&lt;br /&gt;
 NOW=$(date +%s)&lt;br /&gt;
 ELAPSED=300&lt;br /&gt;
 FIRST_RUN=1&lt;br /&gt;
 if [ -f &amp;quot;${STATE_TS}&amp;quot; ]; then&lt;br /&gt;
     PREV_TS=$(cat &amp;quot;${STATE_TS}&amp;quot;)&lt;br /&gt;
     if [ -n &amp;quot;${PREV_TS}&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;${PREV_TS}&amp;quot; -gt 0 ] 2&amp;gt;/dev/null; then&lt;br /&gt;
         ELAPSED=$(( NOW - PREV_TS ))&lt;br /&gt;
         FIRST_RUN=0&lt;br /&gt;
         if [ &amp;quot;${ELAPSED}&amp;quot; -le 0 ]; then&lt;br /&gt;
             ELAPSED=300&lt;br /&gt;
             FIRST_RUN=1&lt;br /&gt;
         fi&lt;br /&gt;
     fi&lt;br /&gt;
 fi&lt;br /&gt;
  &lt;br /&gt;
 # Coleta estatísticas usando o stats_noreset&lt;br /&gt;
 unbound-control stats_noreset &amp;gt; ${FILE}&lt;br /&gt;
 echo &amp;quot;${NOW}&amp;quot; &amp;gt; &amp;quot;${STATE_TS}&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 TOTAL_NUM_QUERIES=$(cat ${FILE} | grep -w &#039;total.num.queries&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 TOTAL_NUM_CACHEHITS=$(cat ${FILE} | grep -w &#039;total.num.cachehits&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 TOTAL_NUM_CACHEMISS=$(cat ${FILE} | grep -w &#039;total.num.cachemiss&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 TOTAL_NUM_PREFETCH=$(cat ${FILE} | grep -w &#039;total.num.prefetch&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 TOTAL_NUM_RECURSIVEREPLIES=$(cat ${FILE} | grep -w &#039;total.num.recursivereplies&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
  &lt;br /&gt;
 TOTAL_REQ_MAX=$(cat ${FILE} | grep -w &#039;total.requestlist.max&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 TOTAL_REQ_AVG=$(cat ${FILE} | grep -w &#039;total.requestlist.avg&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 TOTAL_REQ_OVERWRITTEN=$(cat ${FILE} | grep -w &#039;total.requestlist.overwritten&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 TOTAL_REQ_EXCEEDED=$(cat ${FILE} | grep -w &#039;total.requestlist.exceeded&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 TOTAL_REQ_CURRENT_ALL=$(cat ${FILE} | grep -w &#039;total.requestlist.current.all&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 TOTAL_REQ_CURRENT_USER=$(cat ${FILE} | grep -w &#039;total.requestlist.current.user&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
  &lt;br /&gt;
 TOTAL_TCPUSAGE=$(cat ${FILE} | grep -w &#039;total.tcpusage&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
  &lt;br /&gt;
 NUM_QUERY_TYPE_A=$(cat ${FILE} | grep -w &#039;num.query.type.A&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_NS=$(cat ${FILE} | grep -w &#039;num.query.type.NS&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_MX=$(cat ${FILE} | grep -w &#039;num.query.type.MX&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_TXT=$(cat ${FILE} | grep -w &#039;num.query.type.TXT&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_PTR=$(cat ${FILE} | grep -w &#039;num.query.type.PTR&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_AAAA=$(cat ${FILE} | grep -w &#039;num.query.type.AAAA&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_SRV=$(cat ${FILE} | grep -w &#039;num.query.type.SRV&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_SOA=$(cat ${FILE} | grep -w &#039;num.query.type.SOA&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_HTTPS=$(cat ${FILE} | grep -w &#039;num.query.type.HTTPS&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_TYPE0=$(cat ${FILE} | grep -w &#039;num.query.type.TYPE0&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_CNAME=$(cat ${FILE} | grep -w &#039;num.query.type.CNAME&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_WKS=$(cat ${FILE} | grep -w &#039;num.query.type.WKS&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_HINFO=$(cat ${FILE} | grep -w &#039;num.query.type.HINFO&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_X25=$(cat ${FILE} | grep -w &#039;num.query.type.X25&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_NAPTR=$(cat ${FILE} | grep -w &#039;num.query.type.NAPTR&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_DS=$(cat ${FILE} | grep -w &#039;num.query.type.DS&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_DNSKEY=$(cat ${FILE} | grep -w &#039;num.query.type.DNSKEY&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_TLSA=$(cat ${FILE} | grep -w &#039;num.query.type.TLSA&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_SVCB=$(cat ${FILE} | grep -w &#039;num.query.type.SVCB&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_SPF=$(cat ${FILE} | grep -w &#039;num.query.type.SPF&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_ANY=$(cat ${FILE} | grep -w &#039;num.query.type.ANY&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_QUERY_TYPE_OTHER=$(cat ${FILE} | grep -w &#039;num.query.type.other&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
  &lt;br /&gt;
 NUM_ANSWER_RCODE_NOERROR=$(cat ${FILE} | grep -w &#039;num.answer.rcode.NOERROR&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_ANSWER_RCODE_NXDOMAIN=$(cat ${FILE} | grep -w &#039;num.answer.rcode.NXDOMAIN&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_ANSWER_RCODE_SERVFAIL=$(cat ${FILE} | grep -w &#039;num.answer.rcode.SERVFAIL&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_ANSWER_RCODE_REFUSED=$(cat ${FILE} | grep -w &#039;num.answer.rcode.REFUSED&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_ANSWER_RCODE_nodata=$(cat ${FILE} | grep -w &#039;num.answer.rcode.nodata&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
 NUM_ANSWER_secure=$(cat ${FILE} | grep -w &#039;num.answer.secure&#039; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
  &lt;br /&gt;
 # Função para calcular o delta e enviar a taxa em segundos&lt;br /&gt;
 send_rate() {&lt;br /&gt;
     local file_key=&amp;quot;$1&amp;quot;&lt;br /&gt;
     local zbx_key=&amp;quot;$2&amp;quot;&lt;br /&gt;
     local cur_val=&amp;quot;$3&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
     # Se for a primeira execução ou arquivo anterior não existe, não envia taxas&lt;br /&gt;
     if [ &amp;quot;${FIRST_RUN}&amp;quot; -eq 1 ] || [ ! -f &amp;quot;${FILE_PREV}&amp;quot; ]; then&lt;br /&gt;
         return&lt;br /&gt;
     fi&lt;br /&gt;
  &lt;br /&gt;
     local prev_val&lt;br /&gt;
     prev_val=$(cat &amp;quot;${FILE_PREV}&amp;quot; | grep -w &amp;quot;${file_key}&amp;quot; | cut -d &#039;=&#039; -f2)&lt;br /&gt;
     prev_val=${prev_val:-0}&lt;br /&gt;
  &lt;br /&gt;
     # Garante que são inteiros antes de comparar&lt;br /&gt;
     if ! [[ &amp;quot;$cur_val&amp;quot; =~ ^[0-9]+$ ]]; then cur_val=0; fi&lt;br /&gt;
     if ! [[ &amp;quot;$prev_val&amp;quot; =~ ^[0-9]+$ ]]; then prev_val=0; fi&lt;br /&gt;
  &lt;br /&gt;
     # Calcula delta (tratando restarts do Unbound)&lt;br /&gt;
     local diff&lt;br /&gt;
     if [ &amp;quot;$cur_val&amp;quot; -ge &amp;quot;$prev_val&amp;quot; ]; then&lt;br /&gt;
         diff=$(( cur_val - prev_val ))&lt;br /&gt;
     else&lt;br /&gt;
         diff=&amp;quot;$cur_val&amp;quot;&lt;br /&gt;
     fi&lt;br /&gt;
  &lt;br /&gt;
     # LC_NUMERIC=C garante que a divisão saia com ponto (.) em vez de vírgula (,)&lt;br /&gt;
     local rate&lt;br /&gt;
     rate=$(LC_NUMERIC=C awk -v d=&amp;quot;${diff}&amp;quot; -v e=&amp;quot;${ELAPSED}&amp;quot; &#039;BEGIN{ printf &amp;quot;%.4f&amp;quot;, d/e }&#039;)&lt;br /&gt;
     zabbix_sender -z &amp;quot;${IP_ZABBIX}&amp;quot; -s &amp;quot;${NAME_HOST}&amp;quot; -k &amp;quot;${zbx_key}&amp;quot; -o &amp;quot;${rate}&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 #       Sending info to zabbix_server.&lt;br /&gt;
 send_rate total.num.queries          total.num.queries          &amp;quot;${TOTAL_NUM_QUERIES}&amp;quot;&lt;br /&gt;
 send_rate total.num.cachehits        total.num.cachehits        &amp;quot;${TOTAL_NUM_CACHEHITS}&amp;quot;&lt;br /&gt;
 send_rate total.num.cachemiss        total.num.cachemiss        &amp;quot;${TOTAL_NUM_CACHEMISS}&amp;quot;&lt;br /&gt;
 send_rate total.num.prefetch         total.num.prefetch         &amp;quot;${TOTAL_NUM_PREFETCH}&amp;quot;&lt;br /&gt;
 send_rate total.num.recursivereplies total.num.recursivereplies &amp;quot;${TOTAL_NUM_RECURSIVEREPLIES}&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 # Gauges enviam o valor bruto instantâneo&lt;br /&gt;
 zabbix_sender -z ${IP_ZABBIX} -s ${NAME_HOST} -k total.requestlist.max          -o &amp;quot;${TOTAL_REQ_MAX:-0}&amp;quot;          &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 zabbix_sender -z ${IP_ZABBIX} -s ${NAME_HOST} -k total.requestlist.avg          -o &amp;quot;${TOTAL_REQ_AVG:-0}&amp;quot;          &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 zabbix_sender -z ${IP_ZABBIX} -s ${NAME_HOST} -k total.requestlist.current.all  -o &amp;quot;${TOTAL_REQ_CURRENT_ALL:-0}&amp;quot;  &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 zabbix_sender -z ${IP_ZABBIX} -s ${NAME_HOST} -k total.requestlist.current.user -o &amp;quot;${TOTAL_REQ_CURRENT_USER:-0}&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 zabbix_sender -z ${IP_ZABBIX} -s ${NAME_HOST} -k total.tcpusage                 -o &amp;quot;${TOTAL_TCPUSAGE:-0}&amp;quot;                 &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
  &lt;br /&gt;
 send_rate total.requestlist.overwritten total.requestlist.overwritten &amp;quot;${TOTAL_REQ_OVERWRITTEN}&amp;quot;&lt;br /&gt;
 send_rate total.requestlist.exceeded    total.requestlist.exceeded    &amp;quot;${TOTAL_REQ_EXCEEDED}&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 send_rate num.query.type.A     num.query.a     &amp;quot;${NUM_QUERY_TYPE_A}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.NS    num.query.ns    &amp;quot;${NUM_QUERY_TYPE_NS}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.MX    num.query.mx    &amp;quot;${NUM_QUERY_TYPE_MX}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.TXT   num.query.txt   &amp;quot;${NUM_QUERY_TYPE_TXT}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.PTR   num.query.ptr   &amp;quot;${NUM_QUERY_TYPE_PTR}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.AAAA  num.query.aaaa  &amp;quot;${NUM_QUERY_TYPE_AAAA}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.SRV   num.query.srv   &amp;quot;${NUM_QUERY_TYPE_SRV}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.SOA   num.query.soa   &amp;quot;${NUM_QUERY_TYPE_SOA}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.HTTPS num.query.https &amp;quot;${NUM_QUERY_TYPE_HTTPS}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.TYPE0 num.query.type0 &amp;quot;${NUM_QUERY_TYPE_TYPE0}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.CNAME num.query.cname &amp;quot;${NUM_QUERY_TYPE_CNAME}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.WKS   num.query.wks   &amp;quot;${NUM_QUERY_TYPE_WKS}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.HINFO num.query.hinfo &amp;quot;${NUM_QUERY_TYPE_HINFO}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.X25   num.query.X25   &amp;quot;${NUM_QUERY_TYPE_X25}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.NAPTR num.query.naptr &amp;quot;${NUM_QUERY_TYPE_NAPTR}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.DS    num.query.ds    &amp;quot;${NUM_QUERY_TYPE_DS}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.DNSKEY num.query.dnskey &amp;quot;${NUM_QUERY_TYPE_DNSKEY}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.TLSA  num.query.tlsa  &amp;quot;${NUM_QUERY_TYPE_TLSA}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.SVCB  num.query.svcb  &amp;quot;${NUM_QUERY_TYPE_SVCB}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.SPF   num.query.spf   &amp;quot;${NUM_QUERY_TYPE_SPF}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.ANY   num.query.any   &amp;quot;${NUM_QUERY_TYPE_ANY}&amp;quot;&lt;br /&gt;
 send_rate num.query.type.other num.query.other &amp;quot;${NUM_QUERY_TYPE_OTHER}&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 send_rate num.answer.rcode.NOERROR  num.answer.rcode.NOERROR  &amp;quot;${NUM_ANSWER_RCODE_NOERROR}&amp;quot;&lt;br /&gt;
 send_rate num.answer.rcode.NXDOMAIN num.answer.rcode.NXDOMAIN &amp;quot;${NUM_ANSWER_RCODE_NXDOMAIN}&amp;quot;&lt;br /&gt;
 send_rate num.answer.rcode.SERVFAIL num.answer.rcode.SERVFAIL &amp;quot;${NUM_ANSWER_RCODE_SERVFAIL}&amp;quot;&lt;br /&gt;
 send_rate num.answer.rcode.REFUSED  num.answer.rcode.REFUSED  &amp;quot;${NUM_ANSWER_RCODE_REFUSED}&amp;quot;&lt;br /&gt;
 send_rate num.answer.rcode.nodata   num.answer.rcode.nodata   &amp;quot;${NUM_ANSWER_RCODE_nodata}&amp;quot;&lt;br /&gt;
 send_rate num.answer.secure         num.answer.secure         &amp;quot;${NUM_ANSWER_secure}&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 # Salva arquivo atual para servir como base na próxima execução&lt;br /&gt;
 cp &amp;quot;${FILE}&amp;quot; &amp;quot;${FILE_PREV}&amp;quot;&lt;br /&gt;
No Zabbix será registrado dados como esses abaixo e posteriormente pode ser montado um Grafana com eles:&lt;br /&gt;
[[Arquivo:Zabbix dns01.png|nenhum|commoldura]]&lt;br /&gt;
[[Arquivo:Zabbix dns02.png|nenhum|commoldura]]&lt;br /&gt;
[[Arquivo:Zabbix dns03.png|nenhum|commoldura]]&lt;br /&gt;
[[Arquivo:Zabbix dns04.png|nenhum|commoldura]]&lt;br /&gt;
&lt;br /&gt;
==Mantendo a hora certa==&lt;br /&gt;
&lt;br /&gt;
Vamos instalar agora o Chrony para manter a data e hora certas no sistema:&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt install chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após a instalação do Chrony edite o arquivo /etc/chrony/chrony.conf, comente e a linha abaixo e adicione seus servidores NTP. Caso não tenha servidores NTP, estou colocando os do NIC.br aqui.&lt;br /&gt;
 #pool 2.debian.pool.ntp.org iburst&lt;br /&gt;
 server a.st1.ntp.br iburst nts&lt;br /&gt;
 server b.st1.ntp.br iburst nts&lt;br /&gt;
 server c.st1.ntp.br iburst nts&lt;br /&gt;
 server d.st1.ntp.br iburst nts&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart chronyd.service&lt;br /&gt;
Cheque com o &#039;&#039;&#039;chronyc&#039;&#039;&#039; se os servidores estão OK:&lt;br /&gt;
 # chronyc sourcestats&lt;br /&gt;
 Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev&lt;br /&gt;
 ==============================================================================&lt;br /&gt;
 a.st1.ntp.br               10   5  155m     -0.027      0.030    -71us    51us&lt;br /&gt;
 b.st1.ntp.br               11   7  344m     +0.068      0.079    +23ms   382us&lt;br /&gt;
 c.st1.ntp.br                6   3  344m     +0.026      0.037   -124us    92us&lt;br /&gt;
 200.20.186.76               9   3  138m     -0.022      0.031   +172us    42us&lt;br /&gt;
&lt;br /&gt;
 # chronyc sources&lt;br /&gt;
 MS Name/IP address         Stratum Poll Reach LastRx Last sample&lt;br /&gt;
 ===============================================================================&lt;br /&gt;
 ^* a.st1.ntp.br                  1  10   377   588   +487us[ +397us] +/-   12ms&lt;br /&gt;
 ^- b.st1.ntp.br                  2  10   377   830    +23ms[  +23ms] +/-   49ms&lt;br /&gt;
 ^+ c.st1.ntp.br                  2  10    21  1038   -147us[ -242us] +/-   17ms&lt;br /&gt;
 ^+ 200.20.186.76                 1  10   377  1032   +381us[ +285us] +/-   15ms&lt;br /&gt;
&lt;br /&gt;
== Configurando o FRRouting==&lt;br /&gt;
Nesse ponto iremos configurar o &#039;&#039;&#039;FRRouting&#039;&#039;&#039; para enviar os IPs das &#039;&#039;&#039;loopbacks&#039;&#039;&#039; e o &#039;&#039;&#039;/30&#039;&#039;&#039; para o nosso PE do diagrama. Em &#039;&#039;&#039;/etc/frr/daemons&#039;&#039;&#039; habilite o parâmetro conforme abaixo:&lt;br /&gt;
 ospfd=yes&lt;br /&gt;
 ospf6d=yes&lt;br /&gt;
Edite o arquivo &#039;&#039;&#039;/etc/frr/frr.conf&#039;&#039;&#039; e deixe com o conteúdo abaixo, para ficar conforme nosso diagrama do projeto. Apenas troque &#039;&#039;&#039;&amp;lt;SENHA&amp;gt;&#039;&#039;&#039; por uma senha para fechar o OSPF com mais segurança. Essa senha deve ser usada dos dois lados.&lt;br /&gt;
 frr version 10.3&lt;br /&gt;
 frr defaults traditional&lt;br /&gt;
 hostname dns-recursivo-01&lt;br /&gt;
 log syslog informational&lt;br /&gt;
 no ip forwarding&lt;br /&gt;
 no ipv6 forwarding&lt;br /&gt;
 service integrated-vtysh-config&lt;br /&gt;
 !&lt;br /&gt;
 interface ens18&lt;br /&gt;
  ip ospf area 0.0.0.0&lt;br /&gt;
  ip ospf message-digest-key 5 md5 &amp;lt;SENHA&amp;gt;&lt;br /&gt;
  ip ospf network point-to-point&lt;br /&gt;
  ipv6 ospf6 area 0.0.0.0&lt;br /&gt;
  ipv6 ospf6 network point-to-point&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
 interface lo&lt;br /&gt;
  description LOOPBACKS&lt;br /&gt;
  ip ospf area 0.0.0.0&lt;br /&gt;
  ip ospf passive&lt;br /&gt;
  ipv6 ospf6 area 0.0.0.0&lt;br /&gt;
  ipv6 ospf6 passive&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
 router ospf&lt;br /&gt;
  ospf router-id 172.16.0.6&lt;br /&gt;
  area 0.0.0.0 authentication message-digest&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
 router ospf6&lt;br /&gt;
  ospf6 router-id 172.16.0.6&lt;br /&gt;
 exit&lt;br /&gt;
 !&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart frr.service&lt;br /&gt;
Cheque se está tudo OK com o OSPF e verifique no PE se está recebendo os prefixos anunciados.&lt;br /&gt;
 # vtysh -c &#039;show ip ospf neighbor&#039;&lt;br /&gt;
 &lt;br /&gt;
 Neighbor ID     Pri State           Up Time         Dead Time Address         Interface                        RXmtL RqstL DBsmL&lt;br /&gt;
 172.16.0.5     1 Full/-          10m49s            35.310s 172.16.0.5   ens18:172.16.0.6                  0     0     0&lt;br /&gt;
&lt;br /&gt;
 # vtysh -c &#039;show ipv6 ospf6 neighbor&#039;&lt;br /&gt;
 Neighbor ID     Pri    DeadTime    State/IfState         Duration I/F[State]&lt;br /&gt;
 172.16.0.5       1    00:00:39     Full/PointToPoint 25d22:55:58 ens18[PointToPoint&lt;br /&gt;
&lt;br /&gt;
 # vtysh -c &#039;show ip ospf neighbor detail&#039;&lt;br /&gt;
 &lt;br /&gt;
  Neighbor 172.16.0.5, interface address 172.16.0.5&lt;br /&gt;
     In the area 0.0.0.0 via interface ens18&lt;br /&gt;
     Neighbor priority is 1, State is Full/-, 5 state changes&lt;br /&gt;
     Most recent state change statistics:&lt;br /&gt;
       Progressive change 21w3d15h ago&lt;br /&gt;
     DR is 0.0.0.0, BDR is 0.0.0.0&lt;br /&gt;
     Options 18 *|-|-|EA|-|-|E|-&lt;br /&gt;
     Dead timer due in 34.685s&lt;br /&gt;
     Database Summary List 0&lt;br /&gt;
     Link State Request List 0&lt;br /&gt;
     Link State Retransmission List 0&lt;br /&gt;
     Thread Inactivity Timer on&lt;br /&gt;
     Thread Database Description Retransmision off&lt;br /&gt;
     Thread Link State Request Retransmission on&lt;br /&gt;
     Thread Link State Update Retransmission on&lt;br /&gt;
 &lt;br /&gt;
     Graceful restart Helper info:&lt;br /&gt;
       Graceful Restart HELPER Status : None&lt;br /&gt;
&lt;br /&gt;
 # vtysh -c &#039;show ipv6 ospf6 neighbor detail&#039;&lt;br /&gt;
  Neighbor 172.16.0.5%ens18&lt;br /&gt;
     Area 0.0.0.0 via interface ens18 (ifindex 4)&lt;br /&gt;
     His IfIndex: 60 Link-local address: fe80::469b:c1ff:fed6:43ee&lt;br /&gt;
     State Full for a duration of 25d22:57:14&lt;br /&gt;
     His choice of DR/BDR 0.0.0.0/0.0.0.0, Priority 1&lt;br /&gt;
     DbDesc status: Master SeqNum: 0xb94b0000&lt;br /&gt;
     Summary-List: 0 LSAs&lt;br /&gt;
     Request-List: 0 LSAs&lt;br /&gt;
     Retrans-List: 0 LSAs&lt;br /&gt;
     0 Pending LSAs for DbDesc in Time 00:00:00 [thread off]&lt;br /&gt;
     0 Pending LSAs for LSReq in Time 00:00:00 [thread off]&lt;br /&gt;
     0 Pending LSAs for LSUpdate in Time 00:00:00 [thread off]&lt;br /&gt;
     0 Pending LSAs for LSAck in Time 00:00:00 [thread off]&lt;br /&gt;
     Authentication header not present&lt;br /&gt;
&lt;br /&gt;
==Configurando o Unbound==&lt;br /&gt;
Abaixo a configuração que usaremos nos servidores atentando para o detalhe do &#039;&#039;&#039;num-threads&#039;&#039;&#039;, esse deve ter o valor igual ao número de CPUs do servidor.&lt;br /&gt;
&lt;br /&gt;
Também os IPs utilizados em &#039;&#039;&#039;outgoing-interface&#039;&#039;&#039; que serão diferentes em cada servidor, esses serão os IPs usados para &#039;&#039;&#039;recursividade&#039;&#039;&#039;. Consulte o manual do Unbound para obter mais informações sobre cada parâmetro listado na configuração.&lt;br /&gt;
&lt;br /&gt;
O tuning no Unbound pode ser alterado conforme abaixo:&lt;br /&gt;
 num-threads = nº CPUs&lt;br /&gt;
 so-reuseport = yes&lt;br /&gt;
 *-slabs = potência de 2 próximo ao num-threads&lt;br /&gt;
 msg-cache-size = 1g (quantidade de memória pra usar de cache)&lt;br /&gt;
 rrset-cache-size = 2 * msg-cache-size&lt;br /&gt;
 outgoing-range = 8192&lt;br /&gt;
 num-queries-per-thread = 4096&lt;br /&gt;
 so-rcvbuf e so-sndbuf = 4m ou 8m para servidores com muita requisição&lt;br /&gt;
Agora vamos criar nosso arquivo de configuração base em &#039;&#039;&#039;/etc/unbound/unbound.conf.d/local.conf&#039;&#039;&#039;:&lt;br /&gt;
 server:&lt;br /&gt;
         verbosity: 1&lt;br /&gt;
         statistics-interval: 0&lt;br /&gt;
         statistics-cumulative: no&lt;br /&gt;
         extended-statistics: yes&lt;br /&gt;
         num-threads: 8&lt;br /&gt;
         serve-expired: yes&lt;br /&gt;
         interface: 127.0.0.1&lt;br /&gt;
         interface: 10.10.10.10&lt;br /&gt;
         interface: 10.10.9.9&lt;br /&gt;
         interface: 172.16.0.6&lt;br /&gt;
         interface: fd00::10:10:10:10&lt;br /&gt;
         interface: fd00::10:10:9:9&lt;br /&gt;
         interface: ::1&lt;br /&gt;
         interface-automatic: no&lt;br /&gt;
         outgoing-interface: 198.18.1.10&lt;br /&gt;
         outgoing-interface: 2001:db8::faca:198:18:1:10&lt;br /&gt;
         outgoing-range: 8192&lt;br /&gt;
         outgoing-num-tcp: 1024&lt;br /&gt;
         incoming-num-tcp: 2048&lt;br /&gt;
         so-rcvbuf: 4m&lt;br /&gt;
         so-sndbuf: 4m&lt;br /&gt;
         so-reuseport: yes&lt;br /&gt;
         edns-buffer-size: 1232&lt;br /&gt;
         msg-cache-size: 512m&lt;br /&gt;
         msg-cache-slabs: 4&lt;br /&gt;
         num-queries-per-thread: 4096&lt;br /&gt;
         rrset-cache-size: 1g&lt;br /&gt;
         rrset-cache-slabs: 4&lt;br /&gt;
         infra-cache-slabs: 4&lt;br /&gt;
         do-ip4: yes&lt;br /&gt;
         do-ip6: yes&lt;br /&gt;
         do-udp: yes&lt;br /&gt;
         do-tcp: yes&lt;br /&gt;
         chroot: &amp;quot;&amp;quot;&lt;br /&gt;
         username: &amp;quot;unbound&amp;quot;&lt;br /&gt;
         directory: &amp;quot;/etc/unbound&amp;quot;&lt;br /&gt;
         logfile: &amp;quot;/var/log/unbound/unbound.log&amp;quot;&lt;br /&gt;
         use-syslog: no&lt;br /&gt;
         log-time-ascii: yes&lt;br /&gt;
         log-queries: no&lt;br /&gt;
         pidfile: &amp;quot;/var/run/unbound.pid&amp;quot;&lt;br /&gt;
         root-hints: &amp;quot;/usr/share/dns/root.hints&amp;quot;&lt;br /&gt;
         hide-identity: yes&lt;br /&gt;
         hide-version: yes&lt;br /&gt;
         unwanted-reply-threshold: 10000000&lt;br /&gt;
         prefetch: yes&lt;br /&gt;
         prefetch-key: yes&lt;br /&gt;
         rrset-roundrobin: yes&lt;br /&gt;
         minimal-responses: yes&lt;br /&gt;
         module-config: &amp;quot;respip validator iterator&amp;quot;&lt;br /&gt;
         val-clean-additional: yes&lt;br /&gt;
         val-log-level: 1&lt;br /&gt;
         key-cache-slabs: 4&lt;br /&gt;
         deny-any: yes&lt;br /&gt;
         cache-min-ttl: 60&lt;br /&gt;
         key-cache-size: 128m&lt;br /&gt;
         neg-cache-size: 64m&lt;br /&gt;
         cache-max-ttl: 86400&lt;br /&gt;
         infra-cache-numhosts: 100000&lt;br /&gt;
         access-control: 198.18.0.0/22 allow&lt;br /&gt;
         access-control: 2001:db8::/32 allow&lt;br /&gt;
  &lt;br /&gt;
 rpz:&lt;br /&gt;
   name: rpz.block.host.local.zone&lt;br /&gt;
   zonefile: /etc/unbound/rpz.block.hosts.zone&lt;br /&gt;
   rpz-action-override: nxdomain&lt;br /&gt;
  &lt;br /&gt;
 python:&lt;br /&gt;
  &lt;br /&gt;
 auth-zone:&lt;br /&gt;
     name: &amp;quot;.&amp;quot;&lt;br /&gt;
     master: &amp;quot;b.root-servers.net&amp;quot;&lt;br /&gt;
     master: &amp;quot;c.root-servers.net&amp;quot;&lt;br /&gt;
     master: &amp;quot;d.root-servers.net&amp;quot;&lt;br /&gt;
     master: &amp;quot;f.root-servers.net&amp;quot;&lt;br /&gt;
     master: &amp;quot;g.root-servers.net&amp;quot;&lt;br /&gt;
     master: &amp;quot;k.root-servers.net&amp;quot;&lt;br /&gt;
     master: &amp;quot;lax.xfr.dns.icann.org&amp;quot;&lt;br /&gt;
     master: &amp;quot;iad.xfr.dns.icann.org&amp;quot;&lt;br /&gt;
     fallback-enabled: yes&lt;br /&gt;
     for-downstream: no&lt;br /&gt;
     for-upstream: yes&lt;br /&gt;
     zonefile: &amp;quot;/var/lib/unbound/root.zone&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 auth-zone:&lt;br /&gt;
     name: &amp;quot;arpa.&amp;quot;&lt;br /&gt;
     master: &amp;quot;lax.xfr.dns.icann.org&amp;quot;&lt;br /&gt;
     master: &amp;quot;iad.xfr.dns.icann.org&amp;quot;&lt;br /&gt;
     fallback-enabled: yes&lt;br /&gt;
     for-downstream: no&lt;br /&gt;
     for-upstream: yes&lt;br /&gt;
     zonefile: &amp;quot;/var/lib/unbound/arpa.zone&amp;quot;&lt;br /&gt;
No parâmetro &#039;&#039;&#039;interface&#039;&#039;&#039; colocamos os IPs que serão usados para consulta dos clientes como o &#039;&#039;&#039;10.10.10.10&#039;&#039;&#039;, &#039;&#039;&#039;10.10.9.9, fd00::10:10:10:10 e fd00::10:10:9:9&#039;&#039;&#039;. Ali repare que coloquei também o IP privado &#039;&#039;&#039;172.16.0.6&#039;&#039;&#039;, isso porque cada servidor terá o seu IP privado e este deve ser usado pelo seu sistema de monitoramento para checar cada servidor. No &#039;&#039;&#039;outgoing-interface&#039;&#039;&#039; teremos os IPs, tanto &#039;&#039;&#039;IPv4&#039;&#039;&#039; quanto &#039;&#039;&#039;IPv6&#039;&#039;&#039;, para que seja feita a recursividade na Internet utilizando eles. Não tem &#039;&#039;&#039;IPv6&#039;&#039;&#039; ainda na sua rede? Dê uma olhada nesse artigo. Outro parâmetro importante é o &#039;&#039;&#039;access-control&#039;&#039;&#039; e é através dele que liberamos os prefixos IP para consultarem no nosso DNS Recursivo. No exemplo estou liberando todo o prefixo &#039;&#039;&#039;198.18.0.0/22&#039;&#039;&#039; e o prefixo &#039;&#039;&#039;2001:db8::/32&#039;&#039;&#039;. Além da ACL no Unbound, recomendo que crie um filtro de pacotes com iptables ou nftables protegendo seu sistema e liberando as portas &#039;&#039;&#039;53/UDP&#039;&#039;&#039;, &#039;&#039;&#039;53/TCP,&#039;&#039;&#039; &#039;&#039;&#039;443/TCP e 853/TCP&#039;&#039;&#039; apenas para seus clientes. Falarei sobre a &#039;&#039;&#039;443/TCP e 853/TCP&#039;&#039;&#039; mais para frente nessa mesma documentação.&lt;br /&gt;
&lt;br /&gt;
Agora criaremos o arquivo &#039;&#039;&#039;RPZ&#039;&#039;&#039; (&#039;&#039;&#039;Response Policy Zones&#039;&#039;&#039;). Esse arquivo contém os sites que serão bloqueados via &#039;&#039;&#039;&amp;lt;abbr&amp;gt;DNS&amp;lt;/abbr&amp;gt; Recursivo&#039;&#039;&#039;. São aqueles sites que às vezes você recebe um Ofício da Justiça solicitando o bloqueio deles. Não entrarei no mérito da efetividade desses bloqueios, porque muitos de vocês sabem que tecnicamente, existem formas de se fazer um bypass através desses bloqueios. Contudo vamos deixar nosso ambiente preparado para esses bloqueios e por isso crie o arquivo &#039;&#039;&#039;/etc/unbound/rpz.block.hosts.zone&#039;&#039;&#039; com esse conteúdo de exemplo:&lt;br /&gt;
 $TTL 2h&lt;br /&gt;
 @ IN SOA localhost. root.localhost. (2 6h 1h 1w 2h)&lt;br /&gt;
   IN NS  localhost.&lt;br /&gt;
 ; RPZ manual block hosts&lt;br /&gt;
 *.josedascoves.com CNAME .&lt;br /&gt;
 josedascoves.com CNAME .&lt;br /&gt;
No exemplo acima estamos bloqueando qualquer consulta de DNS para &#039;&#039;&#039;josedascoves.com&#039;&#039;&#039; ou qualquer coisa &#039;&#039;&#039;.josedascoves.com&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Para testar podemos fazer assim do próprio servidor:&lt;br /&gt;
 # host josedascoves.com ::1&lt;br /&gt;
 Using domain server:&lt;br /&gt;
 Name: ::1&lt;br /&gt;
 Address: ::1#53&lt;br /&gt;
 Aliases:&lt;br /&gt;
 &lt;br /&gt;
 Host josedascoves.com not found: 3(NXDOMAIN)&lt;br /&gt;
Se a resposta for &#039;&#039;&#039;NXDOMAIN&#039;&#039;&#039; então está funcionando o bloqueio. Para incluir novos bloqueios basta adicionar os domínios, um abaixo do outro, conforme o exemplo que coloquei no arquivo RPZ.&lt;br /&gt;
&lt;br /&gt;
==Acertando o resolv.conf==&lt;br /&gt;
Vamos modificar nosso /etc/resolv.conf para utilizar DNS externo. Sim você deve estar se perguntando em qual situação isso seria utilizado. Primeiro entenda que o Unbound não irá utilizar o DNS externo para fazer as consultas na Internet e sim, qualquer teste que você faça do servidor precisará apontar para o Unbound usando os IPs &#039;&#039;&#039;127.0.0.1&#039;&#039;&#039; ou &#039;&#039;&#039;::1&#039;&#039;&#039;. Faremos isso pela seguinte situação: imagine que o daemon unbound morreu mas você ainda continua com conectividade na Internet. Você conseguiria acessar qualquer local na Internet através do IP mas não através do hostname porque não conseguiria resolver nomes, seu unbound estaria fora do ar. Imagine ainda que você gostaria que seu servidor te avisasse do problema via Telegram ou e-mail. Por isso estamos utilizando um DNS externo no &#039;&#039;&#039;/etc/resolv.conf&#039;&#039;&#039;, apenas para essas situações. Se você não quiser utilizar desse recurso, pode usar o &#039;&#039;&#039;127.0.0.1&#039;&#039;&#039; e &#039;&#039;&#039;::1&#039;&#039;&#039; no lugar.&lt;br /&gt;
 nameserver 8.8.8.8&lt;br /&gt;
 nameserver 8.8.4.4&lt;br /&gt;
 nameserver 2001:4860:4860::8888&lt;br /&gt;
&lt;br /&gt;
==Script de teste de recursividade==&lt;br /&gt;
Estamos montando uma &#039;&#039;&#039;Rede de DNS Recursivo Anycast&#039;&#039;&#039;, então é muito importante que você monitore essa rede para saber se algum node morreu e iniciar o troubleshooting, resolver o problema e levantar o sistema novamente. Tudo isso é importante mas o cliente não deve ficar esperando até você resolver o problema, seu sistema precisa ser inteligente o suficiente para se remover da Rede quando tiver um problema e se inserir novamente, quando o problema estiver sido solucionado. Se você montar uma Rede de DNS e um dos nodes apresentar algum problema, todos os clientes atendidos por aquele node migrarão automaticamente e transparentemente para outro &#039;&#039;&#039;DNS Recursivo Anycast&#039;&#039;&#039; mais próximo. Isso se chama &#039;&#039;&#039;disponibilidade&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
O script &#039;&#039;&#039;/root/scripts/checa_dns.sh&#039;&#039;&#039; abaixo tem a função de fazer os testes de recursividade e checar se o daemon do unbound continua rodando. Se algo acontecer, ele para o anúncio do &#039;&#039;&#039;10.10.10.10&#039;&#039;&#039; e &#039;&#039;&#039;10.10.9.9&#039;&#039;&#039; e retorna eles quando tudo estiver resolvido. &lt;br /&gt;
 # mkdir /root/scripts&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/env bash&lt;br /&gt;
 #Script para teste de DNS v2.1&lt;br /&gt;
 #-----------------------------------------------------------------------&lt;br /&gt;
 #Informe um domínio por linha:&lt;br /&gt;
 dominios_testar=(&lt;br /&gt;
 www.google.com&lt;br /&gt;
 www.terra.com.br&lt;br /&gt;
 www.uol.com.br&lt;br /&gt;
 www.globo.com&lt;br /&gt;
 www.facebook.com&lt;br /&gt;
 www.youtube.com&lt;br /&gt;
 www.twitch.com&lt;br /&gt;
 www.discord.com&lt;br /&gt;
 www.debian.org&lt;br /&gt;
 www.redhat.com&lt;br /&gt;
 )&lt;br /&gt;
 corte_taxa_falha=100 #Porcentagem de falha para executar uma ação&lt;br /&gt;
 #-----------------------------------------------------------------------&lt;br /&gt;
 remove_ospf() {&lt;br /&gt;
    habilitado=&amp;quot;`vtysh -c &#039;show run&#039; | grep \&amp;quot;LOOPBACKS\&amp;quot;`&amp;quot;&lt;br /&gt;
    if [ &amp;quot;$habilitado&amp;quot; != &amp;quot;&amp;quot; ]; then&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;no description&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;no ip ospf area 0.0.0.0&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;no ip ospf passive&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;no ipv6 ospf6 area 0.0.0.0&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;no ipv6 ospf6 passive&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       echo &amp;quot;Servidor $HOSTNAME morreu!&amp;quot; | /usr/local/sbin/telegram-notify --error --text -&lt;br /&gt;
    fi&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 adiciona_ospf() {&lt;br /&gt;
    habilitado=&amp;quot;`vtysh -c &#039;show run&#039; | grep \&amp;quot;LOOPBACKS\&amp;quot;`&amp;quot;&lt;br /&gt;
    if [ &amp;quot;$habilitado&amp;quot; == &amp;quot;&amp;quot; ]; then&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;description LOOPBACKS&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;ip ospf area 0.0.0.0&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;ip ospf passive&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;ipv6 ospf6 area 0.0.0.0&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       vtysh -c &#039;conf t&#039; -c &#039;interface lo&#039; -c &#039;ipv6 ospf6 passive&#039; -c &#039;end&#039; -c &#039;wr&#039;&lt;br /&gt;
       echo &amp;quot;Servidor $HOSTNAME retornou do inferno!&amp;quot; | /usr/local/sbin/telegram-notify --success --text -&lt;br /&gt;
    fi&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 systemctl status unbound &amp;amp;&amp;gt; /dev/null;&lt;br /&gt;
 if [ $? -ne 0 ]; then&lt;br /&gt;
    echo &amp;quot;Servidor $HOSTNAME morreu DNS mas tentando levantar!&amp;quot; | /usr/local/sbin/telegram-notify --error --text -&lt;br /&gt;
    systemctl restart unbound&lt;br /&gt;
    systemctl status unbound &amp;amp;&amp;gt; /dev/null;&lt;br /&gt;
    if [ $? -ne 0 ]; then&lt;br /&gt;
       remove_ospf&lt;br /&gt;
       exit&lt;br /&gt;
    fi&lt;br /&gt;
    echo &amp;quot;Servidor $HOSTNAME servico DNS voltou mas tinha morrido!&amp;quot; | /usr/local/sbin/telegram-notify --success --text -&lt;br /&gt;
 fi&lt;br /&gt;
  &lt;br /&gt;
 qt_falhas=0&lt;br /&gt;
 qt_total=&amp;quot;${#dominios_testar[@]}&amp;quot;&lt;br /&gt;
 echo &amp;quot;total_dominios: $qt_total&amp;quot;&lt;br /&gt;
 for site in &amp;quot;${dominios_testar[@]}&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
   unbound-control flush $site &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
   resolver=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
   echo -e &amp;quot; - dominio $site - $resolver - \c&amp;quot;&lt;br /&gt;
   host $site $resolver &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
   if [ $? -ne 0 ]; then&lt;br /&gt;
      ((qt_falhas++))&lt;br /&gt;
      echo -e &amp;quot;[Falhou]&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
      echo -e &amp;quot;[OK]&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
 done&lt;br /&gt;
  &lt;br /&gt;
 taxa_falha=$((qt_falhas*100/qt_total))&lt;br /&gt;
 echo &amp;quot;Falhas $qt_falhas/$qt_total ($taxa_falha%)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 if [ &amp;quot;$taxa_falha&amp;quot; -ge &amp;quot;$corte_taxa_falha&amp;quot; ]; then&lt;br /&gt;
    remove_ospf&lt;br /&gt;
    exit&lt;br /&gt;
 fi&lt;br /&gt;
 adiciona_ospf&lt;br /&gt;
Se rodarmos o script manualmente veremos isto:&lt;br /&gt;
 # /root/scripts/checa_dns.sh&lt;br /&gt;
 total_dominios: 10&lt;br /&gt;
  - dominio www.google.com - 127.0.0.1 - [OK]&lt;br /&gt;
  - dominio www.terra.com.br - 127.0.0.1 - [OK]&lt;br /&gt;
  - dominio www.uol.com.br - 127.0.0.1 - [OK]&lt;br /&gt;
  - dominio www.globo.com - 127.0.0.1 - [OK]&lt;br /&gt;
  - dominio www.facebook.com - 127.0.0.1 - [OK]&lt;br /&gt;
  - dominio www.youtube.com - 127.0.0.1 - [OK]&lt;br /&gt;
  - dominio www.twitch.com - 127.0.0.1 - [OK]&lt;br /&gt;
  - dominio www.discord.com - 127.0.0.1 - [OK]&lt;br /&gt;
  - dominio www.debian.org - 127.0.0.1 - [OK]&lt;br /&gt;
  - dominio www.redhat.com - 127.0.0.1 - [OK]&lt;br /&gt;
 Falhas 0/10 (0%)&lt;br /&gt;
Se acontecer 100% de falhas o script irá remover os anúncios do OSPF. Se o daemon do unbound morrer, ele tentará reiniciá-lo. Se tudo normalizar o script irá retornar os anúncios para o OSPF. Deixei comentado no script as partes que enviariam uma notificação para o Telegram. Existem diversas documentações sobre isso na Internet, eu mesmo tenho uma. Assim que eu publicar aqui, atualizo essa documentação e sinta-se à vontade de modificar como desejar.&lt;br /&gt;
 # chmod 700 /root/scripts/checa_dns.sh&lt;br /&gt;
Adicione a linha abaixo em seu &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039;:&lt;br /&gt;
 */1 *   * * *   root    /root/scripts/checa_dns.sh&lt;br /&gt;
&lt;br /&gt;
== Habilitando o DoH (&amp;lt;abbr&amp;gt;DNS&amp;lt;/abbr&amp;gt; over HTTPS) - opcional ==&lt;br /&gt;
Para habilitar o &#039;&#039;&#039;DoH&#039;&#039;&#039; no Unbound é bem simples. O recurso do &#039;&#039;&#039;DoH&#039;&#039;&#039; vem para trazer mais segurança e privacidade para o usuário. É um recurso muito pouco utilizado ainda mas que seu cliente pode vir a pedir algum dia. &lt;br /&gt;
&lt;br /&gt;
Você precisará gerar certificados SSL legítimos e para isso você poderá usar o &#039;&#039;&#039;Let&#039;s Encrypt&#039;&#039;&#039; só que de uma forma não tão convencional.&lt;br /&gt;
&lt;br /&gt;
Na sequência vamos instalar o Let&#039;s Encrypt para gerarmos nosso certificado SSL:&lt;br /&gt;
 # apt install letsencrypt&lt;br /&gt;
Escolha um &#039;&#039;&#039;hostname&#039;&#039;&#039; para ser usado no nosso &#039;&#039;&#039;DoH&#039;&#039;&#039; e aponte ele no seu DNS Autoritativo para seus IPs 10.10.10.10 e 10.10.9.9. Aqui vamos usar o seguinte como exemplo: &#039;&#039;&#039;doh.ispup.com.br&#039;&#039;&#039;. Para gerarmos nosso certificado iremos usar o tipo &#039;&#039;&#039;DNS-01&#039;&#039;&#039;, ele não necessita que tenhamos um servidor web rodando no servidor e nem tão pouco levanta um serviço na porta 80 para checar o hostname. Ele utiliza o DNS como validador e vai te solicitar que crie um registro &#039;&#039;&#039;CNAME&#039;&#039;&#039; no seu &#039;&#039;&#039;DNS Autoritativo&#039;&#039;&#039; para provar que você tem o controle sobre aquele hostname. Antes disso vamos instalar um programa em Python para podermos automatizar nossa renovação de certificado no futuro. Esse programa se encontra [https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py &#039;&#039;&#039;aqui&#039;&#039;&#039;] mas vou deixá-lo abaixo já modificado o interpretador. &lt;br /&gt;
&lt;br /&gt;
Crie o arquivo &#039;&#039;&#039;/etc/letsencrypt/acme-dns-auth.py&#039;&#039;&#039; com o conteúdo abaixo:&lt;br /&gt;
 #!/usr/bin/env python3&lt;br /&gt;
 import json&lt;br /&gt;
 import os&lt;br /&gt;
 import requests&lt;br /&gt;
 import sys&lt;br /&gt;
 &lt;br /&gt;
 ### EDIT THESE: Configuration values ###&lt;br /&gt;
 &lt;br /&gt;
 # URL to acme-dns instance&lt;br /&gt;
 ACMEDNS_URL = &amp;quot;&amp;lt;nowiki&amp;gt;https://auth.acme-dns.io&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
 # Path for acme-dns credential storage&lt;br /&gt;
 STORAGE_PATH = &amp;quot;/etc/letsencrypt/acmedns.json&amp;quot;&lt;br /&gt;
 # Whitelist for address ranges to allow the updates from&lt;br /&gt;
 # Example: ALLOW_FROM = [&amp;quot;192.168.10.0/24&amp;quot;, &amp;quot;::1/128&amp;quot;]&lt;br /&gt;
 ALLOW_FROM = []&lt;br /&gt;
 # Force re-registration. Overwrites the already existing acme-dns accounts.&lt;br /&gt;
 FORCE_REGISTER = False&lt;br /&gt;
 &lt;br /&gt;
 ###   DO NOT EDIT BELOW THIS POINT   ###&lt;br /&gt;
 ###         HERE BE DRAGONS          ###&lt;br /&gt;
 &lt;br /&gt;
 DOMAIN = os.environ[&amp;quot;CERTBOT_DOMAIN&amp;quot;]&lt;br /&gt;
 if DOMAIN.startswith(&amp;quot;*.&amp;quot;):&lt;br /&gt;
     DOMAIN = DOMAIN[2:]&lt;br /&gt;
 VALIDATION_DOMAIN = &amp;quot;_acme-challenge.&amp;quot;+DOMAIN&lt;br /&gt;
 VALIDATION_TOKEN = os.environ[&amp;quot;CERTBOT_VALIDATION&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 class AcmeDnsClient(object):&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
     Handles the communication with ACME-DNS API&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     def __init__(self, acmedns_url):&lt;br /&gt;
         self.acmedns_url = acmedns_url&lt;br /&gt;
 &lt;br /&gt;
     def register_account(self, allowfrom):&lt;br /&gt;
         &amp;quot;&amp;quot;&amp;quot;Registers a new ACME-DNS account&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
         if allowfrom:&lt;br /&gt;
             # Include whitelisted networks to the registration call&lt;br /&gt;
             reg_data = {&amp;quot;allowfrom&amp;quot;: allowfrom}&lt;br /&gt;
             res = requests.post(self.acmedns_url+&amp;quot;/register&amp;quot;,&lt;br /&gt;
                                 data=json.dumps(reg_data))&lt;br /&gt;
         else:&lt;br /&gt;
             res = requests.post(self.acmedns_url+&amp;quot;/register&amp;quot;)&lt;br /&gt;
         if res.status_code == 201:&lt;br /&gt;
             # The request was successful&lt;br /&gt;
             return res.json()&lt;br /&gt;
         else:&lt;br /&gt;
             # Encountered an error&lt;br /&gt;
             msg = (&amp;quot;Encountered an error while trying to register a new acme-dns &amp;quot;&lt;br /&gt;
                    &amp;quot;account. HTTP status {}, Response body: {}&amp;quot;)&lt;br /&gt;
             print(msg.format(res.status_code, res.text))&lt;br /&gt;
             sys.exit(1)&lt;br /&gt;
 &lt;br /&gt;
     def update_txt_record(self, account, txt):&lt;br /&gt;
         &amp;quot;&amp;quot;&amp;quot;Updates the TXT challenge record to ACME-DNS subdomain.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
         update = {&amp;quot;subdomain&amp;quot;: account[&#039;subdomain&#039;], &amp;quot;txt&amp;quot;: txt}&lt;br /&gt;
         headers = {&amp;quot;X-Api-User&amp;quot;: account[&#039;username&#039;],&lt;br /&gt;
                    &amp;quot;X-Api-Key&amp;quot;: account[&#039;password&#039;],&lt;br /&gt;
                    &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;}&lt;br /&gt;
         res = requests.post(self.acmedns_url+&amp;quot;/update&amp;quot;,&lt;br /&gt;
                             headers=headers,&lt;br /&gt;
                             data=json.dumps(update))&lt;br /&gt;
         if res.status_code == 200:&lt;br /&gt;
             # Successful update&lt;br /&gt;
             return&lt;br /&gt;
         else:&lt;br /&gt;
             msg = (&amp;quot;Encountered an error while trying to update TXT record in &amp;quot;&lt;br /&gt;
                    &amp;quot;acme-dns. \n&amp;quot;&lt;br /&gt;
                    &amp;quot;------- Request headers:\n{}\n&amp;quot;&lt;br /&gt;
                    &amp;quot;------- Request body:\n{}\n&amp;quot;&lt;br /&gt;
                    &amp;quot;------- Response HTTP status: {}\n&amp;quot;&lt;br /&gt;
                    &amp;quot;------- Response body: {}&amp;quot;)&lt;br /&gt;
             s_headers = json.dumps(headers, indent=2, sort_keys=True)&lt;br /&gt;
             s_update = json.dumps(update, indent=2, sort_keys=True)&lt;br /&gt;
             s_body = json.dumps(res.json(), indent=2, sort_keys=True)&lt;br /&gt;
             print(msg.format(s_headers, s_update, res.status_code, s_body))&lt;br /&gt;
             sys.exit(1)&lt;br /&gt;
 &lt;br /&gt;
 class Storage(object):&lt;br /&gt;
     def __init__(self, storagepath):&lt;br /&gt;
         self.storagepath = storagepath&lt;br /&gt;
         self._data = self.load()&lt;br /&gt;
 &lt;br /&gt;
     def load(self):&lt;br /&gt;
         &amp;quot;&amp;quot;&amp;quot;Reads the storage content from the disk to a dict structure&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
         data = dict()&lt;br /&gt;
         filedata = &amp;quot;&amp;quot;&lt;br /&gt;
         try:&lt;br /&gt;
             with open(self.storagepath, &#039;r&#039;) as fh:&lt;br /&gt;
                 filedata = fh.read()&lt;br /&gt;
         except IOError as e:&lt;br /&gt;
             if os.path.isfile(self.storagepath):&lt;br /&gt;
                 # Only error out if file exists, but cannot be read&lt;br /&gt;
                 print(&amp;quot;ERROR: Storage file exists but cannot be read&amp;quot;)&lt;br /&gt;
                 sys.exit(1)&lt;br /&gt;
         try:&lt;br /&gt;
             data = json.loads(filedata)&lt;br /&gt;
         except ValueError:&lt;br /&gt;
             if len(filedata) &amp;gt; 0:&lt;br /&gt;
                 # Storage file is corrupted&lt;br /&gt;
                 print(&amp;quot;ERROR: Storage JSON is corrupted&amp;quot;)&lt;br /&gt;
                 sys.exit(1)&lt;br /&gt;
         return data&lt;br /&gt;
 &lt;br /&gt;
     def save(self):&lt;br /&gt;
         &amp;quot;&amp;quot;&amp;quot;Saves the storage content to disk&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
         serialized = json.dumps(self._data)&lt;br /&gt;
         try:&lt;br /&gt;
             with os.fdopen(os.open(self.storagepath,&lt;br /&gt;
                                    os.O_WRONLY | os.O_CREAT, 0o600), &#039;w&#039;) as fh:&lt;br /&gt;
                 fh.truncate()&lt;br /&gt;
                 fh.write(serialized)&lt;br /&gt;
         except IOError as e:&lt;br /&gt;
             print(&amp;quot;ERROR: Could not write storage file.&amp;quot;)&lt;br /&gt;
             sys.exit(1)&lt;br /&gt;
 &lt;br /&gt;
     def put(self, key, value):&lt;br /&gt;
         &amp;quot;&amp;quot;&amp;quot;Puts the configuration value to storage and sanitize it&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
         # If wildcard domain, remove the wildcard part as this will use the&lt;br /&gt;
         # same validation record name as the base domain&lt;br /&gt;
         if key.startswith(&amp;quot;*.&amp;quot;):&lt;br /&gt;
             key = key[2:]&lt;br /&gt;
         self._data[key] = value&lt;br /&gt;
 &lt;br /&gt;
     def fetch(self, key):&lt;br /&gt;
         &amp;quot;&amp;quot;&amp;quot;Gets configuration value from storage&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
         try:&lt;br /&gt;
             return self._data[key]&lt;br /&gt;
         except KeyError:&lt;br /&gt;
             return None&lt;br /&gt;
 &lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
     # Init&lt;br /&gt;
     client = AcmeDnsClient(ACMEDNS_URL)&lt;br /&gt;
     storage = Storage(STORAGE_PATH)&lt;br /&gt;
 &lt;br /&gt;
     # Check if an account already exists in storage&lt;br /&gt;
     account = storage.fetch(DOMAIN)&lt;br /&gt;
     if FORCE_REGISTER or not account:&lt;br /&gt;
         # Create and save the new account&lt;br /&gt;
         account = client.register_account(ALLOW_FROM)&lt;br /&gt;
         storage.put(DOMAIN, account)&lt;br /&gt;
         storage.save()&lt;br /&gt;
 &lt;br /&gt;
         # Display the notification for the user to update the main zone&lt;br /&gt;
         msg = &amp;quot;Please add the following CNAME record to your main DNS zone:\n{}&amp;quot;&lt;br /&gt;
         cname = &amp;quot;{} CNAME {}.&amp;quot;.format(VALIDATION_DOMAIN, account[&amp;quot;fulldomain&amp;quot;])&lt;br /&gt;
         print(msg.format(cname))&lt;br /&gt;
 &lt;br /&gt;
     # Update the TXT record in acme-dns instance&lt;br /&gt;
     client.update_txt_record(account, VALIDATION_TOKEN)&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /etc/letsencrypt/acme-dns-auth.py&lt;br /&gt;
Usaremos a seguinte instrução para criar nosso certificado:&lt;br /&gt;
 # certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d doh.ispup.com.br&lt;br /&gt;
 Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
 Plugins selected: Authenticator manual, Installer None&lt;br /&gt;
 Cert is due for renewal, auto-renewing...&lt;br /&gt;
 Renewing an existing certificate for doh.ispup.com.br.br&lt;br /&gt;
 Performing the following challenges:&lt;br /&gt;
 dns-01 challenge for doh.ispup.com.br&lt;br /&gt;
 Running manual-auth-hook command: /etc/letsencrypt/acme-dns-auth.py&lt;br /&gt;
 Output from manual-auth-hook command acme-dns-auth.py:&lt;br /&gt;
 Please add the following CNAME record to your main DNS zone:&lt;br /&gt;
 _acme-challenge.doh.ispup.com.br CNAME b555d682-7b50-45d9-a92f-3c3d187dd4e7.auth.acme-dns.io.&lt;br /&gt;
 &lt;br /&gt;
 Waiting for verification...&lt;br /&gt;
 &lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Challenges loaded. Press continue to submit to CA. Pass &amp;quot;-v&amp;quot; for more info about&lt;br /&gt;
 challenges.&lt;br /&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
 Press Enter to Continue&lt;br /&gt;
Nesse momento você cria o registro &#039;&#039;&#039;CNAME&#039;&#039;&#039; no seu DNS Autoritativo conforme ele solicitou: &#039;&#039;&#039;_acme-challenge.doh.ispup.com.br IN CNAME b555d682-7b50-45d9-a92f-3c3d187dd4e7.auth.acme-dns.io.&#039;&#039;&#039; e somente depois de criado e checado no DNS, você pressiona o &#039;&#039;&#039;Enter&#039;&#039;&#039; para continuar. Você pode checar dessa forma:&lt;br /&gt;
 # host -t cname _acme-challenge.doh.ispup.com.br&lt;br /&gt;
 _acme-challenge.doh.ispup.com.br is an alias for b555d682-7b50-45d9-a92f-3c3d187dd4e7.auth.acme-dns.io.&lt;br /&gt;
Para que nosso certificado seja automaticamente renovado colocaremos no &#039;&#039;&#039;/etc/crontab&#039;&#039;&#039; a seguinte linha abaixo:&lt;br /&gt;
 00 00   1 * *   root    /usr/bin/certbot -q renew --deploy-hook &amp;quot;/usr/sbin/unbound-control reload_keep_cache&amp;quot;&lt;br /&gt;
Acima temos a instrução para renovação automática do certificado. Repare que você vai precisar também copiar esse certificado para seus outros servidores, escolha um servidor para manter o certificado sempre atualizado e crie um script  que faça a mesma cópia remotamente para os outros servidores. O &#039;&#039;&#039;scp&#039;&#039;&#039; e o &#039;&#039;&#039;rsync&#039;&#039;&#039; são seus aliados nisso.&lt;br /&gt;
&lt;br /&gt;
===Configurando o Unbound===&lt;br /&gt;
Em nosso &#039;&#039;&#039;/etc/unbound/unbound.conf.d/local.conf&#039;&#039;&#039;, adicionaremos no bloco &amp;quot;&#039;&#039;&#039;server:&#039;&#039;&#039;&amp;quot; o seguinte:&lt;br /&gt;
 interface: 10.10.10.10@443 &lt;br /&gt;
 interface: 10.10.9.9@443&lt;br /&gt;
 interface: fd00::10:10:10:10@443&lt;br /&gt;
 interface: fd00::10:10:9:9@443 &lt;br /&gt;
 tls-service-key: &amp;quot;/etc/letsencrypt/live/doh.ispup.com.br/privkey.pem&amp;quot; &lt;br /&gt;
 tls-service-pem: &amp;quot;/etc/letsencrypt/live/doh.ispup.com.br/fullchain.pem&amp;quot;&lt;br /&gt;
Para usar o recurso do &#039;&#039;&#039;DoH&#039;&#039;&#039; você precisará habilitar o recurso no seu navegador e informar a URL. Vou colocar o exemplo do &#039;&#039;&#039;Google Chrome&#039;&#039;&#039;: Digite &#039;&#039;&#039;chrome://settings/security?search=dns&#039;&#039;&#039; no seu Chrome e ative &#039;&#039;&#039;Usar DNS seguro&#039;&#039;&#039;, selecione &#039;&#039;&#039;Personalizado&#039;&#039;&#039; e adicione nossa URL:&lt;br /&gt;
[[Arquivo:Doh 2.png|nenhum|miniaturadaimagem|612x612px]]&lt;br /&gt;
&lt;br /&gt;
==Finalizando==&lt;br /&gt;
Aqui finalizamos nosso projeto para uma Rede de DNS(s) Recursivos Anycast com Hyperlocal. Esse projeto é escalável, seguro, resiliente e você entregará muito mais qualidade de Internet para o seu cliente. Pare de entregar o &#039;&#039;&#039;8.8.8.8&#039;&#039;&#039; para os seus clientes, você está contribuindo para uma Internet mais lenta, sem a qualidade que o seu cliente merece. Investi meu tempo, que é muito pouco, para deixar esse documento para a comunidade, para você melhorar o seu ISP, para dar um UP! nele, então vamos começar 2023 com o pé direito. O que acha?&lt;br /&gt;
&lt;br /&gt;
Como prova de conceito, uma imagem abaixo onde temos uma Rede em produção de DNS(s) Recursivos Anycast e apontando exatamente o momento em que houve alguma situação que fez com que as queries de DNS, convergissem de um node para outro, de forma transparente e automática para o cliente. Podemos notar também que ao ser resolvido o problema, o tráfego retornou para o seu node correto:&lt;br /&gt;
[[Arquivo:Convergencia.png|nenhum|miniaturadaimagem|1053x1053px]]&lt;br /&gt;
&lt;br /&gt;
==KINDNS (Stands for Knowledge-Sharing and Instantiating Norms for DNS and Naming Security)==&lt;br /&gt;
Achou que havia terminado? Agora que você tem a capacidade de montar uma &#039;&#039;&#039;Rede de DNS Recursivo&#039;&#039;&#039; com todas essas features acima, com todas as ferramentas que foram comentadas, o que acha de certificar o que fez?&lt;br /&gt;
&lt;br /&gt;
Assim como o [https://www.manrs.org/ MANRS] veio para certificar nosso sistema de roteamento na Internet, agora temos o [https://kindns.org/ KINDNS] para certificar que nossos sistemas de DNS estão bem feitos e dentro dos padrões de segurança. Existem &#039;&#039;&#039;7 ações&#039;&#039;&#039; que podem ser certificadas para nossos DNS Recursivos e estão aqui em https://kindns.org/shared-private-resolvers/. Com essa nossa documentação, se bem aplicada, você pode se candidatar ao KINDNS e ter seu ASN listado aqui https://kindns.org/participants/&lt;br /&gt;
&lt;br /&gt;
Obter e manter o &#039;&#039;&#039;MANRS&#039;&#039;&#039; e &#039;&#039;&#039;KINDNS&#039;&#039;&#039; demonstra seu compromisso com as Boas Práticas, contribui para termos uma &#039;&#039;&#039;Internet&#039;&#039;&#039; mais segura e te abre portas para novos negócios que possam exigir essas conformidades.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos [[Sobre mim|aqui]].&lt;br /&gt;
&lt;br /&gt;
__INDEXAR____FORCARTDC__&lt;br /&gt;
[[Categoria:Serviços de Redes e Servidores]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Portas_Amplificacao_DDoS&amp;diff=1143</id>
		<title>Portas Amplificacao DDoS</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Portas_Amplificacao_DDoS&amp;diff=1143"/>
		<updated>2026-06-14T16:44:25Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Portas de Amplificação DDoS e Botnets}}&lt;br /&gt;
__TOC__&lt;br /&gt;
[[Arquivo:Criminal-bandit-hacker-scaled-1.jpg|miniaturadaimagem|nenhum|459x459px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Introdução==&lt;br /&gt;
Para contextualizar nosso artigo precisamos entender basicamente que: &#039;&#039;&#039;amplificação&#039;&#039;&#039; é quando perguntamos algo para algum serviço (porta) e a resposta retornada, é maior que o tamanho da pergunta. Tendo isso em mente, existem alguns &#039;&#039;&#039;serviços abertos na Internet&#039;&#039;&#039; com essa característica e são explorados para realizarem o que conhecemos como &#039;&#039;&#039;Ataques de&#039;&#039;&#039; &#039;&#039;&#039;DDoS (Distributed Denial of Service)&#039;&#039;&#039;. Sabem aqueles ataques que costumam derrubar nossa &#039;&#039;&#039;Operação de Internet&#039;&#039;&#039;, causando indisponibilidade de acesso para nossos assinantes? São esses serviços mal configurados e abertos na Internet, que munem fortemente os cibercriminosos, que usam esses serviços abertos como ferramentas para esse propósito. Não se engane se você acha que na sua Rede, não possa existir esses serviços abertos e que ninguém estaria usando-os para executar esses ataques. Estamos acostumados a sempre reclamar de ataques recebidos, mas você já parou para pensar que você pode estar sendo usado como &#039;&#039;&#039;vetor de ataque&#039;&#039;&#039; e com isso, &#039;&#039;&#039;inconscientemente&#039;&#039;&#039;, atacando alguém na Internet? Tirando o fato da imperícia de quem configurou erradamente o serviço, deixando-o &#039;&#039;&#039;vulnerável&#039;&#039;&#039;, &#039;&#039;&#039;exposto&#039;&#039;&#039; e &#039;&#039;&#039;suscetível&#039;&#039;&#039; a ser explorado, essa pessoa é tanto vítima quanto você.&lt;br /&gt;
&lt;br /&gt;
== Consequências ==&lt;br /&gt;
Quando somos usados como &#039;&#039;&#039;vetor de ataque&#039;&#039;&#039;, nossa Rede se torna instável, nossos clientes reclamam de lentidão no acesso à Internet, nosso &#039;&#039;&#039;Call Center&#039;&#039;&#039; fica atarefado com solicitações que provavelmente eles não conseguirão identificar a causa raiz do problema. Como resultado teremos um aumento da insatisfação dos nossos clientes e muitos cancelamentos (&#039;&#039;&#039;churn&#039;&#039;&#039;). Para evitarmos todos esses males, resolvi escrever esse artigo dando dicas e explicando maneiras de fixarmos esses problemas.&lt;br /&gt;
&lt;br /&gt;
Quanto às &#039;&#039;&#039;Botnets,&#039;&#039;&#039; existem sistemas que foram comprometidos e podem estar sendo explorados para alguma atividade ilícita e que também poderá prejudicar a sua Operação de Internet. Esses casos também precisam ser tratados.&lt;br /&gt;
&lt;br /&gt;
==Portas de Amplificação e de Botnets mais conhecidas==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!&#039;&#039;&#039;Porta&#039;&#039;&#039;&lt;br /&gt;
!Descrição&lt;br /&gt;
|-&lt;br /&gt;
|DNS (53/udp)&lt;br /&gt;
|Servidores de DNS Recursivos abertos para o mundo. Não podemos confundir com o serviço de DNS Autoritativo (53/UDP/TCP), este precisa estar aberto à consultas dos domínios de sua autoridade.&lt;br /&gt;
|-&lt;br /&gt;
|SNMP (161/udp)&lt;br /&gt;
|&#039;&#039;&#039;Simple Network Management Protocol&#039;&#039;&#039; ou como costumo brincar dizendo que o significado seria: &#039;&#039;&#039;Security is Not My Problem&#039;&#039;&#039;. Este serviço é muito usado para monitorarmos nossos ativos de Redes e Servidores.&lt;br /&gt;
|-&lt;br /&gt;
|NTP (123/udp)&lt;br /&gt;
|&#039;&#039;&#039;Network Time Protocol&#039;&#039;&#039; é um serviço bastante importante para mantermos nossos sistemas com data e hora corretos.&lt;br /&gt;
|-&lt;br /&gt;
|SSDP (1900/udp)&lt;br /&gt;
|&#039;&#039;&#039;Simple Service Discovery Protocol&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|PORTMAP (111/udp)&lt;br /&gt;
|Daemon que atribui portas dinamicamente para serviços &#039;&#039;&#039;RPC&#039;&#039;&#039; &#039;&#039;&#039;(Remote Procedure Call)&#039;&#039;&#039; como &#039;&#039;&#039;NIS (Network Information Service)&#039;&#039;&#039; e o &#039;&#039;&#039;NFS (Network File System)&#039;&#039;&#039; comumente usados em sistemas Unix Like.&lt;br /&gt;
|-&lt;br /&gt;
|NETBIOS (137/udp)&lt;br /&gt;
|&#039;&#039;&#039;Network Basic Input/Output System&#039;&#039;&#039;, faz parte dos serviços de compartilhamento de Redes baseadas em Microsoft Windows.&lt;br /&gt;
|-&lt;br /&gt;
|UBNT (10001/udp)&lt;br /&gt;
|Serviço de &#039;&#039;&#039;Device Discovery&#039;&#039;&#039; habilitado nos equipamentos da Ubiquiti.&lt;br /&gt;
|-&lt;br /&gt;
|MDNS (5353/udp)&lt;br /&gt;
|Multicast DNS.&lt;br /&gt;
|-&lt;br /&gt;
|LDAP (389/udp)&lt;br /&gt;
|Serviço &#039;&#039;&#039;Lightweight Directory Access Protocol&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|CHARGEN (19/udp)&lt;br /&gt;
|&#039;&#039;&#039;Character Generator Protocol&#039;&#039;&#039;, é um protocolo usado para fins de teste, depuração e medição. Esse serviço gera datagramas contendo um número aleatório de caracteres entre 0 e 252, sempre que requisitado.&lt;br /&gt;
|-&lt;br /&gt;
|QOTD (17/udp)&lt;br /&gt;
|&#039;&#039;&#039;Quote Of The Day&#039;&#039;&#039; outro serviço de teste e medição.&lt;br /&gt;
|-&lt;br /&gt;
|MEMCACHED (11211/udp)&lt;br /&gt;
|Serviço de cache para aceleração de aplicativos Web.&lt;br /&gt;
|-&lt;br /&gt;
|WS-DISCOVERY (3702/udp)&lt;br /&gt;
|&#039;&#039;&#039;Web Services Dynamic Discovery Protocol&#039;&#039;&#039;, é um protocolo de descoberta multicast para localizar serviços em uma Rede local.&lt;br /&gt;
|-&lt;br /&gt;
|TFTP (69/udp)&lt;br /&gt;
|Trivial File Transfer Protocol, é um protocolo bastante utilizado por ativos de redes para por exemplo, transferir uma atualização de firmware.&lt;br /&gt;
|-&lt;br /&gt;
|CoAP (5683/udp)&lt;br /&gt;
|&#039;&#039;&#039;Constrained Application Protocol&#039;&#039;&#039;, é um protocolo de comunicação usado por dispositivos de Internet que possuem pouco recurso de hardware.&lt;br /&gt;
|-&lt;br /&gt;
|SLP (427/udp)&lt;br /&gt;
|&#039;&#039;&#039;Service Location Protocol,&#039;&#039;&#039; é um protocolo que permite computadores e outros dispositivos encontrarem serviços em uma rede local sem a necessidade de configuração prévia.&lt;br /&gt;
|-&lt;br /&gt;
|ARMS (3283/udp)&lt;br /&gt;
|&#039;&#039;&#039;Apple Remote Management Service&#039;&#039;&#039;, serviço utilizado pela Apple para prover acesso remoto e gerenciamento de dispositivos rodando MacOS.&lt;br /&gt;
|-&lt;br /&gt;
|DHCPDiscover (37810/udp)&lt;br /&gt;
|&#039;&#039;&#039;Dynamic Host Configuration Protocol Discover&#039;&#039;&#039;, protocolo utilizado para gerenciar equipamentos DVR.&lt;br /&gt;
|-&lt;br /&gt;
|MT4145 (4145/tcp)&lt;br /&gt;
|Serviço de SOCKS habilitado na porta 4145/tcp, normalmente visto em equipamentos Mikrotiks comprometidos e abusados por Botnet.&lt;br /&gt;
|-&lt;br /&gt;
|MT5678 (5678/tcp)&lt;br /&gt;
|Serviço de SOCKS4 habilitado na porta 5678/tcp, visto em Mikrotiks comprometidos e sendo abusados pela Meris Botnet .&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Como saber se temos Portas de Amplificação DDoS e de Botnets em nossa Rede? ==&lt;br /&gt;
Primeiramente saiba que existem entidades que se preocupam com a segurança da &#039;&#039;&#039;Internet&#039;&#039;&#039; e que tem como objetivo extinguir a exposição desses serviços de amplificação da &#039;&#039;&#039;Internet&#039;&#039;&#039;. Uma entidade que podemos citar é o [https://www.shadowserver.org/news/the-scannings-will-continue-until-the-internet-improves/ &#039;&#039;&#039;ShadowServer&#039;&#039;&#039;] e a outra já conhecemos muito bem, que é o nosso valoroso [https://bcp.nic.br/i+seg/acoes/amplificacao/ &#039;&#039;&#039;CERT.br&#039;&#039;&#039;]. Uma maneira bem fácil e simples de sermos reportados sobre esses problemas de segurança, é mantendo nosso &#039;&#039;&#039;Contato de Segurança&#039;&#039;&#039; atualizado no &#039;&#039;&#039;Registro.br&#039;&#039;&#039;. Mostrarei abaixo em telas de exemplo o quanto isso é fácil. Você precisará de ter a &#039;&#039;&#039;credencial de acesso do seu ASN&#039;&#039;&#039; no [https://registro.br/ &#039;&#039;&#039;Registro.br&#039;&#039;&#039;] e já ter criado um &#039;&#039;&#039;ID com seus dados&#039;&#039;&#039; e &#039;&#039;&#039;e-mail,&#039;&#039;&#039; que será usado pelo &#039;&#039;&#039;CERT.br&#039;&#039;&#039; para enviar as &#039;&#039;&#039;notificações de incidentes&#039;&#039;&#039;.&lt;br /&gt;
[[Arquivo:Registrobr1.png|miniaturadaimagem|691x691px|esquerda]][[Arquivo:Registrobr6.png|miniaturadaimagem|691x691px|nenhum]]&lt;br /&gt;
[[Arquivo:Registrobr3.png|miniaturadaimagem|691x691px|esquerda]][[Arquivo:Registrobr4.png|nenhum|miniaturadaimagem|691x691px]]&lt;br /&gt;
[[Arquivo:Registrobr7.png|esquerda|miniaturadaimagem|691x691px]][[Arquivo:Registrobr5.png|miniaturadaimagem|691x691px|nenhum]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== O que vem depois ==&lt;br /&gt;
Após acertar seu contato de segurança, você começará a receber e-mails do &#039;&#039;&#039;CERT.br&#039;&#039;&#039; e de &#039;&#039;&#039;outros ASNs&#039;&#039;&#039; sempre que houver algum incidente de segurança envolvendo o seu ASN e &#039;&#039;&#039;notificações&#039;&#039;&#039; sobre as &#039;&#039;&#039;portas de amplificação/botnets&#039;&#039;&#039;, abertas em sua Rede, inclusive com cada e-mail referente a qual porta está aberta, com o esclarecimento técnico sobre os riscos e instruções de como testar e checar se o problema foi resolvido. Perceba que agora você não estará mais cego quanto aos problemas de segurança que sua Rede vem sofrendo e tenha certeza de que quanto mais limpa ela estiver, mais qualidade de serviço estará entregando ao seu cliente, diminuindo a quantidade de chamados em seu Call Center e consequentemente diminuindo seu &#039;&#039;&#039;churn&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de e-mail que você receberá para cada serviço aberto:&lt;br /&gt;
[[Arquivo:Certbr.png|nenhum|miniaturadaimagem|1122x1122px]]&lt;br /&gt;
&lt;br /&gt;
Até aqui te expliquei sobre o problema, o que ele pode causar ao seu negócio e te mostrei como passar a enxergá-los. Mas como tratá-los?&lt;br /&gt;
&lt;br /&gt;
== Tratando a causa raiz ==&lt;br /&gt;
Como alguns devem ter percebido, nessa nossa relação de portas de amplificação existem portas que se forem bloqueadas te causarão dor de cabeça e muitas reclamações. Vou citar apenas como exemplo: &#039;&#039;&#039;DNS&#039;&#039;&#039;, &#039;&#039;&#039;SNMP&#039;&#039;&#039; e &#039;&#039;&#039;NTP&#039;&#039;&#039;. Três serviços que se você não tiver cuidado, poderá impactar seus assinantes. Temos que entender que podemos ter 2 tipos de clientes: o &#039;&#039;&#039;residencial&#039;&#039;&#039; e o &#039;&#039;&#039;corporativo&#039;&#039;&#039;. O cliente residencial é mais simples de se resolver porque provavelmente ele não terá um servidor DNS rodando em sua residência, nem um SNMP e tão pouco um servidor NTP, porém o serviço de NTP não pode simplesmente ser bloqueado devido sua natureza de funcionamento e necessidade dos dispositivos, na residência, de manterem-se com a data e horário corretos.&lt;br /&gt;
&lt;br /&gt;
Já o cliente corporativo pode possuir todos esses serviços rodando e nesse caso faz-se necessário um maior entendimento junto ao cliente. O que quero dizer com isso é que para ambos os casos, você precisa elaborar um &#039;&#039;&#039;Plano de Ação&#039;&#039;&#039; para tratar cada caso, buscando sempre o resultado mais eficaz e sem causar indisponibilidade para seu cliente. O que vou propor nesse artigo são duas das formas de se tratar o problema, mas precisamos ter bom senso na hora da decisão e termos certeza de como implementar a solução tecnicamente.&lt;br /&gt;
&lt;br /&gt;
A informação contendo os IPs da nossa Rede que estão com as Portas de Amplificação abertas já temos em mãos, agora precisamos tratá-la. Tenho 2 propostas em mente:&lt;br /&gt;
&lt;br /&gt;
* Identificar os clientes com as falhas de segurança e contatá-los um a um, explicar sobre o problema, o que isso pode afetá-los e ajudá-los a resolver a situação. Essa seria a maneira mais correta, uma boa prática, porque implica em melhorar a cultura de segurança, fazendo todos entenderem sobre os riscos envolvidos e aumentando o senso de cuidado. Em contra partida é uma ação muito trabalhosa e dependendo da quantidade de clientes pode ser muito demorada.&lt;br /&gt;
* Aplicar filtros e controles de acordo com o perfil do cliente. Para se ter um resultado mais rápido e efetivo podemos aplicar filtros em nossos &#039;&#039;&#039;BNGs&#039;&#039;&#039;, bloqueando as Portas de Amplificação &#039;&#039;&#039;sempre no sentido Internet para o cliente&#039;&#039;&#039;, mas com alguns cuidados que citarei ainda. Observando sempre os casos de clientes corporativos e que podem necessitar de um tratamento separado.&lt;br /&gt;
&lt;br /&gt;
== Estratégia de bloqueio das Portas de Amplificação/Botnet ==&lt;br /&gt;
Faremos o bloqueio de todas as Portas de Amplificação citadas na tabela desse artigo, sempre no sentido Internet para o cliente. Isso é muito importante! O &#039;&#039;&#039;serviço NTP&#039;&#039;&#039; terá um tratamento diferenciado porque não podemos apenas bloquear o serviço, precisaremos fazer um &#039;&#039;&#039;rate-limit&#039;&#039;&#039; e uma &#039;&#039;&#039;condição especial&#039;&#039;&#039; para que seja feito o drop dos pacotes. Como a quantidade de vendors é grande e cada Provedor escolhe o melhor para a sua Operação, trouxe aqui como exemplo regras para &#039;&#039;&#039;Mikrotik RouterOS&#039;&#039;&#039;, basta entender a lógica como vou explicar e procurar fazer o mesmo em seu equipamento, seja de qual fabricante for. Escolhi este vendor como exemplo pois além de ser muito utilizado no mercado, devido ao seu custo x benefício, será mais fácil de explicar o funcionamento. Entendendo como funciona, você pode implementar no seu Cisco, Huawei, Juniper, etc.&lt;br /&gt;
&lt;br /&gt;
== As regras de bloqueio no RouterOS ==&lt;br /&gt;
 /ip firewall raw&lt;br /&gt;
 add action=drop chain=prerouting comment=&amp;quot;# BLOQUEIA NTP DE ORIGEM NAO NTP&amp;quot; dst-port=123 in-interface=!all-ppp protocol=udp src-port=!123&lt;br /&gt;
 add action=drop chain=prerouting comment=&amp;quot;# DROP ABUSO NTP&amp;quot; limit=!2M,2M:bit protocol=udp src-port=123&lt;br /&gt;
 add action=drop chain=prerouting comment=&amp;quot;# DROP PORTAS UDP DE AMPLIFICACAO&amp;quot; dst-port=53,161,1900,111,137,10001,5353,389 in-interface=!all-ppp protocol=udp&lt;br /&gt;
 add action=drop chain=prerouting comment=&amp;quot;# DROP PORTAS UDP DE AMPLIFICACAO&amp;quot; dst-port=19,17,11211,3702,69,5683,3283,37810 in-interface=!all-ppp protocol=udp&lt;br /&gt;
 add action=drop chain=prerouting comment=&amp;quot;# DROP PORTAS TCP BOTNET&amp;quot; dst-port=4145,5678 in-interface=!all-ppp protocol=tcp tcp-flags=syn&lt;br /&gt;
Estamos fazendo os bloqueios na tabela &#039;&#039;&#039;raw&#039;&#039;&#039; por ocupar menos processamento do sistema e sabemos o quanto isso é importante no RouterOS. Essas regras estão sendo aplicadas em um BNG concentrador PPPoE onde:&lt;br /&gt;
&lt;br /&gt;
* Na primeira linha &#039;&#039;&#039;ADD&#039;&#039;&#039; estamos bloqueando qualquer pacote entrando por qualquer &#039;&#039;&#039;interface que&#039;&#039;&#039; &#039;&#039;&#039;não seja PPP&#039;&#039;&#039;, ou seja, que viria da Internet sentido o cliente, que está atrás de uma interface do tipo PPP. Ainda analisando esse filtro, somente entraria nessa regra se a &#039;&#039;&#039;porta origem&#039;&#039;&#039; do pacote &#039;&#039;&#039;não for a 123/udp&#039;&#039;&#039; e com &#039;&#039;&#039;destino a porta&#039;&#039;&#039; &#039;&#039;&#039;123/udp&#039;&#039;&#039;. Temos que concordar que se um dispositivo do cliente solicitar um sincronismo com algum servidor NTP na Internet, este responderá através da porta 123/udp. Não deve chegar para o cliente uma resposta com origem diferente da porta 123/udp. Por que isso? Algumas implementações do serviço NTP disparam requisições com porta origem 123 ao invés de uma porta origem &amp;gt;= 1024.&lt;br /&gt;
* Na segunda linha &#039;&#039;&#039;ADD&#039;&#039;&#039; estamos fazendo um &#039;&#039;&#039;rate-limit de até 2Mbps&#039;&#039;&#039; para qualquer pacote com a &#039;&#039;&#039;porta origem 123/udp&#039;&#039;&#039; e para &#039;&#039;&#039;qualquer destino&#039;&#039;&#039;. Para evitar que a exploração da vulnerabilidade do serviço cause excesso de tráfego na conexão.&lt;br /&gt;
* A terceira linha &#039;&#039;&#039;ADD&#039;&#039;&#039; bloqueamos o restante das portas udp de amplificação mas com a seguinte condição: pacotes que entrem por qualquer &#039;&#039;&#039;interface que não seja PPP&#039;&#039;&#039;, novamente definindo o sentido Internet para o cliente e que as portas de destino sejam a nossa lista restante de portas de amplificação.&lt;br /&gt;
* Por último no quarto &#039;&#039;&#039;ADD&#039;&#039;&#039;, bloqueamos as portas &#039;&#039;&#039;TCP de Botnet 4145 e 5678&#039;&#039;&#039;, de pacotes que entrem por qualquer interface que não seja do tipo PPP, com destino elas mas com uma condição do &#039;&#039;&#039;pacote estar setado com a tcp flag SYN&#039;&#039;&#039;, que indica um pedido de início de conexão. Se tem alguém na Internet tentando se conectar nessas portas TCP e o sistema por trás for um RouterOS, algo não está bem.&lt;br /&gt;
&lt;br /&gt;
== Checando se o problema foi resolvido ==&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;Obs.: atualmente eu criei uma ferramenta muito mais poderosa e completa que esta abaixo. caso tenha interesse em conhecer e utilizar visite: &#039;&#039;&#039;https://github.com/gondimcodes/ampscan&#039;&#039;&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Após aplicarmos os filtros, checaremos se os IPs estão com as portas de amplificação fechadas e para isso fiz um &#039;&#039;&#039;shell script em bash&#039;&#039;&#039;, que usa alguns pacotes para validarmos o serviço. Como sempre estou usando para os nossos artigos a distribuição Debian GNU/Linux. Procure separar um ambiente para instalar esses pacotes e servir como base de testes. O ideal é que esteja de fora na Internet e sem qualquer bloqueio de Operadoras para esses testes poderem funcionar. Para usar o &#039;&#039;&#039;rpcinfo&#039;&#039;&#039; precisaremos do pacote &#039;&#039;&#039;rpcbind&#039;&#039;&#039; instalado, que após a instalação levantará o serviço rpc (111/udp) e na sequência iremos desabilitá-lo.&lt;br /&gt;
 # apt install nmap bind9-host bind9-dnsutils bsdextrautils netcat snmp samba-common-bin rpcbind ntp ldap-utils curl&lt;br /&gt;
&lt;br /&gt;
 # systemctl stop rpcbind.service&lt;br /&gt;
 # systemctl stop rpcbind.socket&lt;br /&gt;
 # systemctl disable rpcbind.service&lt;br /&gt;
 # systemctl disable rpcbind.socket&lt;br /&gt;
O script dei o nome de &#039;&#039;&#039;amplicacao.sh&#039;&#039;&#039; mas fica ao seu critério chamá-lo como quiser. Ele se encontra aqui no Github: &#039;&#039;&#039;https://github.com/gondimcodes/amplificacao&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para usar é bem simples. No exemplo abaixo fiz um cheque no 8.8.8.8:&lt;br /&gt;
[[Arquivo:Amplificacao.png|nenhum|miniaturadaimagem|654x654px]]&lt;br /&gt;
Se você quiser checar apenas um serviço se está aberto, podemos fornecer após o IP, o nome do serviço queremos testar seguindo essa lista de opções:&lt;br /&gt;
&lt;br /&gt;
* netbios&lt;br /&gt;
* rpc&lt;br /&gt;
* arms&lt;br /&gt;
* tftp&lt;br /&gt;
* dns&lt;br /&gt;
* mdns&lt;br /&gt;
* ssdp&lt;br /&gt;
* snmp&lt;br /&gt;
* ntp&lt;br /&gt;
* ldap&lt;br /&gt;
* ubnt&lt;br /&gt;
* chargen&lt;br /&gt;
* qotd&lt;br /&gt;
* memcached&lt;br /&gt;
* ws-discovery&lt;br /&gt;
* coap&lt;br /&gt;
* mt4145&lt;br /&gt;
* mt5678&lt;br /&gt;
* dhcpdiscover&lt;br /&gt;
&lt;br /&gt;
Para fazer o teste de apenas um serviço, só observar o exemplo abaixo:&lt;br /&gt;
[[Arquivo:Amplificacao2.png|nenhum|miniaturadaimagem|560x560px]]&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
Agora que sabemos o que são as Portas de Amplificação DDoS, os riscos para a nossa Operação de Internet, sabemos como ter visibilidade do problema e como checar e tratar esse problema; você ainda vai continuar deixando isso te afetar ou vamos dar aquele UP! na sua Operação e entregar mais qualidade de serviço para seus assinantes?&lt;br /&gt;
&lt;br /&gt;
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos [[Sobre mim|aqui]].&lt;br /&gt;
__FORCARTDC__&lt;br /&gt;
[[Categoria:Artigos Técnicos]]&lt;br /&gt;
__INDEXAR__&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Sobre_mim&amp;diff=1142</id>
		<title>Sobre mim</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Sobre_mim&amp;diff=1142"/>
		<updated>2026-04-28T21:38:39Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Marcelo Gondim da Cunha ===&lt;br /&gt;
[[Arquivo:Gondim perfil2026.png|esquerda|miniaturadaimagem|246x246px]]&lt;br /&gt;
&#039;&#039;&#039;Contribuições e trabalhos:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Administração de Sistemas Unix-Like desde 1996.&lt;br /&gt;
* Consultor na Conectiva S/A - Unidade Rio em 2000.&lt;br /&gt;
* Autor do projeto TuxFrw - https://github.com/gondimcodes/tuxfrw e https://github.com/gondimcodes/tuxfrw-nft&lt;br /&gt;
* Administração de sistemas BSD pela FreeBSD Brasil em 2010.&lt;br /&gt;
* Direção do AS53135 - Nettel Telecomunicações entre 2003 e 2021 atingindo a marca de 41.000 assinantes. Gerando qualidade na entrega de serviços e implantando boas práticas como: &lt;br /&gt;
&lt;br /&gt;
a) IPv6.&lt;br /&gt;
&lt;br /&gt;
b) MANRS.&lt;br /&gt;
&lt;br /&gt;
c) RPKI.&lt;br /&gt;
&lt;br /&gt;
d) CPEs com firmware baseada na BCOP &amp;lt;nowiki&amp;gt;https://www.m3aawg.org/sites/default/files/lac-bcop-1-m3aawg-v1-portuguese-final.pdf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SOC Specialist na Brasil TecPar (AS262907) de 2022 a 2025. Um milhão de clientes. Responsável pelas estratégias de mitigação anti-DDoS atendendo as Operações de RJ, SP, RS, SC, MT e MS. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Palestras ministradas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Semana da Informática UERJ 2002 - TuxFrw.&lt;br /&gt;
* CONISLI 2003 - TuxFrw.&lt;br /&gt;
* CONISLI 2004 - Fazendo compras com Gentoo Linux - Palestra sobre a distribuição Linux e suas ferramentas fantásticas.&lt;br /&gt;
* CONISLI 2004 - OpenVPN - Palestra sobre como criar VPNs seguras com OpenVPN e diferenças entre ele e o IPSec.&lt;br /&gt;
* CONISLI 2005 - SPoP (Security Point of Presence) com OpenVPN - Como utilizar túneis encriptados do OpenVPN para acessar a Internet de forma segura, onde quer que esteja.&lt;br /&gt;
* SECOMP 2005 UNIFEI - TuxFrw.&lt;br /&gt;
&lt;br /&gt;
* Debconf19 2019 - [https://debconf19.debconf.org/talks/4-debian-na-vida-de-uma-operadora-de-telecom/ Debian na vida de uma operadora de Telecom], [https://www.youtube.com/watch?v=vQSTslUZy8k&amp;amp;list=PLYUtdmpYPTTJDtwgD8AtxzFJ9t_URhFMK&amp;amp;index=35 vídeo] e [https://salsa.debian.org/debconf-team/public/share/debconf19/raw/master/slides/4-debian-na-vida-de-uma-operadora-de-telecom.pdf?inline=false pdf].&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=5uOFtkplDts FiqueEmCasaUseDebian - CGNAT com NFTables] e [https://www.youtube.com/watch?v=Wz2IAg6MMlU SysAdmin apps].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Artigos desenvolvidos para a comunidade do Brasil Peering Fórum:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/CGNAT_na_pratica CGNAT na pratica].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Acesso_via_IPv6_Link-Local Acesso via IPv6 Link-Local].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/MANRS MANRS].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/CGNAT_Bulk_Port_Allocation_com_DPDK CGNAT Bulk Port Allocation com DPDK].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Servidor_de_Logs Servidor de Logs].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/DNS_Recursivo_Anycast_Hyperlocal DNS Anycast com Hyperlocal].&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Portas_de_Amplifica%C3%A7%C3%A3o_DDoS_e_Botnets Portas de Amplificação DDoS e Botnets]&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Static_Loop_-_um_erro_que_pode_matar_seu_ISP/ITP Static Loop - um erro que pode matar seu ISP/ITP]&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Recomenda%C3%A7%C3%B5es_sobre_Mitiga%C3%A7%C3%A3o_DDoS Recomendações sobre Mitigação DDoS]&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Vazamento_de_prefixos_na_mitiga%C3%A7%C3%A3o_DDoS Vazamento de prefixos na mitigação DDoS]&lt;br /&gt;
* [https://wiki.brasilpeeringforum.org/w/Identificando_e_neutralizando_uma_Botnet Identificando e neutralizando uma Botnet]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [https://bit.ly/2saumHK Segurança de roteamento: MANRS (Mutually Agreed Norms for Routing Security) - Tutoriais NIC.br em 09/12/2019].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://www.manrs.org/about/advisory-group/members/ MANRS Advisory Group Member (2020-2021)]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=oahQkGx8urY &#039;&#039;&#039;Live sobre MANRS com Leonardo Furtado&#039;&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
Criação da Wiki ISPUP! em 24/12/2022.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semana de Capacitação 6 do NIC.br 28/04/2023&#039;&#039;&#039; - &amp;quot;&#039;&#039;&#039;CONCEITOS E IMPLEMENTAÇÃO DE CGNAT&amp;quot;&#039;&#039;&#039;. Material [https://semanacap.bcp.nic.br/6-online/ aqui] e vídeo aula [https://www.youtube.com/watch?v=1q7J3NkQVSc aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semana de Capacitação 10 do NIC.br 01/07/2025&#039;&#039;&#039; - &amp;quot;&#039;&#039;&#039;Teste para padrões técnicos modernos de Internet e segurança: IPv6, DNSSEC, TLS, HTTPS e HSTS&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;.&#039;&#039;&#039; Material [https://semanacap.bcp.nic.br/semana-de-capacitacao-online-edicao-10-2025/ aqui] e vídeo aula [https://www.youtube.com/watch?v=55RBnGQhi2o aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IX Fórum Regional Sudeste (Rio de Janeiro) 24/10/2025&#039;&#039;&#039; com a palestra &amp;quot;&#039;&#039;&#039;Segurança com o pé direito&#039;&#039;&#039;&amp;quot; pode ser baixada [https://regional.forum.ix.br/files/apresentacao/arquivo/2307/gondim.pdf aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fórum BCOP-ICANN Edição Especial DNS 19/12/2025&#039;&#039;&#039; com o painel &amp;quot;&#039;&#039;&#039;DNS em Ação: Como os provedores estão implantando as Boas Práticas&amp;quot;&#039;&#039;&#039; com &#039;&#039;&#039;apresentação&#039;&#039;&#039; [https://forumbcop.nic.br/files/apresentacao/arquivo/2428/DNS_KINDNS_Reduzido.pdf aqui] e vídeo [https://www.youtube.com/live/GnYK9UOLXr4?t=10257s aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fórum BCOP Fortaleza&#039;&#039;&#039; com a palestra: &amp;quot;&#039;&#039;&#039;Recomendações de segurança para provedores&amp;quot;&#039;&#039;&#039; com apresentação [https://fortaleza.forumbcop.nic.br/files/apresentacao/arquivo/2487/Marcelo_Gondim_Recomendacoes_seguranca_provedores.pdf aqui] e vídeo [https://youtu.be/Qjgb7P3cG8k?t=9237 aqui]&#039;&#039;&#039;.&#039;&#039;&#039; Os arquivos anexos de configuração: [https://fortaleza.forumbcop.nic.br/files/apresentacao/arquivo/2489/Marcelo_Gondim_filtros_edge_huawei.pdf filtros_edge_huawei], [https://fortaleza.forumbcop.nic.br/files/apresentacao/arquivo/2490/spoofer.pdf spoofer] e [https://fortaleza.forumbcop.nic.br/files/apresentacao/arquivo/2491/filtros_bng_huawei.pdf filtros_bng_huawei]. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Moeda recebida pelo NIC.br por contribuir com conhecimento palestrando na Semana de Infraestrutura da Internet no Brasil em 2025:&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Moeda1.jpg|nenhum|miniaturadaimagem|407x407px]]&lt;br /&gt;
&#039;&#039;&#039;Moeda comemorativa de 5 anos recebida pelo NIC.br em 2025 por contribuir com conhecimento para a Semana de Capacitação e Camada 8:&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Moeda2.jpg|nenhum|miniaturadaimagem|407x407px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Moeda IX Fórum Fortaleza 2026:&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Frum-bcop-fortaleza-2026 55178462504 o.jpg|esquerda|miniaturadaimagem|470x470px]]&lt;br /&gt;
[[Arquivo:Frum-bcop-fortaleza-2026 55178206816 o.jpg|nenhum|miniaturadaimagem|447x447px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Webinar:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Proteção e Mitigação de ataques DDoS em 10/09/2024 às 20:00 UTC -3. Site da chamada [https://gdg.community.dev/events/details/google-gdg-sinop-presents-webinar-ao-vivo-protecao-e-mitigacao-de-ataques-ddos/ aqui] e o vídeo da live no Youtube [https://www.youtube.com/live/7VIaoDQaLQE aqui].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Podcast:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/live/x4fxtma4eyQ Segurança de Rede e Infraestrutura para 2025: Preparando os ISPs para o futuro!] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Contatos:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Telegram: &#039;&#039;&#039;@Marcelo_Gondim&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WhatsApp: +55 (22) 99743-9060&lt;br /&gt;
&lt;br /&gt;
E-mail: &#039;&#039;&#039;gondim at gmail.com&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Linkedin: https://www.linkedin.com/in/marcelo-gondim-sysadmin/&lt;br /&gt;
&lt;br /&gt;
Meu Github: https://github.com/gondimcodes&lt;br /&gt;
==Mini-CV==&lt;br /&gt;
&#039;&#039;&#039;Marcelo Gondim&#039;&#039;&#039; começou sua carreira como desenvolvedor de software em COBOL e Clipper entre 1992 e 1995. Em 1996 foi responsável por desenvolver um sistema concorrente com o RENPAC da Embratel para acesso ao SISCOMEX e implantou a Internet para fins comerciais na empresa DATABRAS. Trabalhou como consultor e instrutor de GNU/Linux na Conectiva S/A em 2000. Em 2003 se tornou consultor de diversos Provedores de Internet na Região dos Lagos - RJ e onde acabou se tornando CTO da Nettel Telecomunicações (AS53135) com 42.000 assinantes. Implantou IPv6 iniciando em 2013 e se tornou participante do MANRS com diversas contribuições com artigos e palestras. Trabalhou como Especialista em Redes e SOC (Security Operations Center) na Brasil TecPar AS262907 entre 2022 e 2025, onde implementou boas práticas, tratamentos de incidentes relacionados ao ASN, desenvolveu as estratégias de Mitigação DDoS e uma Rede de DNS Recursivo Anycast espalhada pelo RS, RJ, SP, SC MT e MS, também certificada KINDNS. Fundador da empresa ISPFocus especializada em Tecnologia da Informação e boas práticas para ISPs.&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Arquivo:Gondim_perfil2026.png&amp;diff=1141</id>
		<title>Arquivo:Gondim perfil2026.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Arquivo:Gondim_perfil2026.png&amp;diff=1141"/>
		<updated>2026-04-28T21:37:49Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gondim_perfil2026&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1140</id>
		<title>Debian Cluster CEPH</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1140"/>
		<updated>2026-04-16T16:57:30Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
Este artigo tem como foco explicar como adicionar um Debian GNU/Linux em um Proxmox Cluster + HA com 2 nodes. Como muitos sabem, um &#039;&#039;&#039;Cluster&#039;&#039;&#039; deve ser composto de no &#039;&#039;&#039;mínimo 3 nodes&#039;&#039;&#039; para que possa dar segurança, existir &#039;&#039;&#039;quorum&#039;&#039;&#039; e quando usamos &#039;&#039;&#039;CEPH&#039;&#039;&#039; também precisamos de pelo menos 3 nodes com &#039;&#039;&#039;OSDs&#039;&#039;&#039; para termos uma estabilidade e segurança no sistema. O problema é quando se quer fazer  isso com apenas 2 servidores Proxmox. Comprar um terceiro servidor às vezes ainda não está nos planos mas você tem uma máquina parada, onde você pode adicionar 2 SSDs e com 4G de ram você pode adicionar ela no &#039;&#039;&#039;Cluster&#039;&#039;&#039; para servir de quorum e de disco &#039;&#039;&#039;CEPH&#039;&#039;&#039;.  Dessa maneira você consegue com 2 servidores &#039;&#039;&#039;Proxmox&#039;&#039;&#039; e uma máquina que chamei de &#039;&#039;&#039;Quorum Device&#039;&#039;&#039;, colocar em produção um Cluster com HA funcional.&lt;br /&gt;
&lt;br /&gt;
== Diagrama ==&lt;br /&gt;
O diagrama abaixo será o ambiente de exemplo mas não falaremos de como construir um Cluster + HA com Proxmox. Nesse caso você precisará ter os 2 servidores já instalados e configurados em &#039;&#039;&#039;Cluster&#039;&#039;&#039; com &#039;&#039;&#039;CEPH&#039;&#039;&#039;. Aqui vamos apenas mostrar como adicionar um Debian GNU/Linux nesse Cluster e no CEPH.&lt;br /&gt;
[[Arquivo:Diagrama cluster ceph.png|nenhum|miniaturadaimagem|522x522px]]&lt;br /&gt;
&lt;br /&gt;
== Pré-requisitos ==&lt;br /&gt;
&lt;br /&gt;
* Debian GNU/Linux 13 (Trixie).&lt;br /&gt;
* Uma máquina com 4G ou 8G de ram.&lt;br /&gt;
* 1 SSD para instalar o sistema.&lt;br /&gt;
* 1 SSD para servir de &#039;&#039;&#039;OSD&#039;&#039;&#039; no &#039;&#039;&#039;CEPH&#039;&#039;&#039;.&lt;br /&gt;
*3 interfaces de rede. Uma para o acesso, outra para o &#039;&#039;&#039;Cluster&#039;&#039;&#039; e outra para o &#039;&#039;&#039;CEPH&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Configurando o Qdevice no Debian ==&lt;br /&gt;
Uma vez instalado o Debian, precisamos configurar as 3 interfaces para a comunicação com seu Cluster Proxmox. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
* ens18 - IP 10.254.254.27/24 GW 10.254.254.1 (essa seria a interface com acesso à Internet para instalar os programas).&lt;br /&gt;
* ens19 - IP 192.168.1.3/24 (interface que deve se comunicar com a rede do Cluster, com os IPs dos nodes 192.168.1.1 e 192.168.1.2.&lt;br /&gt;
* ens20 - IP 192.168.2.3/24 (interface que se comunica com a rede CEPH, com os IPs 192.168.2.1 e 192.168.2.2.&lt;br /&gt;
&lt;br /&gt;
Precisamos configurar o serviço SSHD para permitir conexão com root, pois o Proxmox vai precisar acessar o Debian. Para isso altere o arquivo &#039;&#039;&#039;/etc/ssh/sshd_config&#039;&#039;&#039; o parâmetro abaixo:&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
Reinicie o serviço:&lt;br /&gt;
 # systemctl restart sshd&lt;br /&gt;
No Debian vamos instalar o pacote &#039;&#039;&#039;corosync-qnetd&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qnetd&lt;br /&gt;
Nos dois servidores Proxmox, no nosso exemplo PVE01 e PVE02 instalaremos o pacote &#039;&#039;&#039;corosync-qdevice&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qdevice&lt;br /&gt;
Agora vá para o shell do seu &#039;&#039;&#039;Proxmox principal&#039;&#039;&#039;, no meu caso o &#039;&#039;&#039;PVE01&#039;&#039;&#039; e adicione o Debian ao Cluster com o seguinte comando: &lt;br /&gt;
 # pvecm qdevice setup 192.168.1.3&lt;br /&gt;
Com o comando &#039;&#039;&#039;pvecm status&#039;&#039;&#039; podemos ver como está o quorum e se tudo ocorreu bem, verá que agora temos 3 votos no lugar de 2 e um &#039;&#039;&#039;Qdevice&#039;&#039;&#039; no membership:&lt;br /&gt;
[[Arquivo:Qdevice.png|nenhum|miniaturadaimagem|748x748px]]&lt;br /&gt;
Agora em se tratando de Cluster, você tem o mínimo de votantes para o bom funcionamento e usando uma máquina simples com Debian.&lt;br /&gt;
&lt;br /&gt;
== Adicionando um CEPH monitor e OSD ==&lt;br /&gt;
Agora precisamos tornar nosso &#039;&#039;&#039;CEPH&#039;&#039;&#039; saudável também e para isso vamos instalar os pacotes do CEPH do Proxmox no Debian. O CEPH precisa ser da mesma versão usada no Cluster Proxmox. Para os meus testes utilizei um &#039;&#039;&#039;Cluster Proxmox 9&#039;&#039;&#039; no &#039;&#039;&#039;PVE01&#039;&#039;&#039; e &#039;&#039;&#039;PVE02&#039;&#039;&#039; que utiliza o &#039;&#039;&#039;CEPH Squid 19.2&#039;&#039;&#039;. Então vamos adicionar o repositório:&lt;br /&gt;
 # echo &amp;quot;deb &amp;lt;nowiki&amp;gt;http://download.proxmox.com/debian/ceph-squid&amp;lt;/nowiki&amp;gt; trixie no-subscription&amp;quot; &amp;gt; /etc/apt/sources.list.d/ceph.list&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg&amp;lt;/nowiki&amp;gt; -O /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg&lt;br /&gt;
Instalando os pacotes do CEPH:&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install ceph ceph-common&lt;br /&gt;
Antes de prosseguir adicione no &#039;&#039;&#039;/etc/hosts&#039;&#039;&#039; do Debian:&lt;br /&gt;
 192.168.2.1 node1&lt;br /&gt;
 192.168.2.2 node2&lt;br /&gt;
 192.168.2.3 nodeq&lt;br /&gt;
Estou chamando nosso &#039;&#039;&#039;Quorum Device&#039;&#039;&#039; com o hostname &#039;&#039;&#039;nodeq&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Agora precisaremos executar algumas tarefas no nosso &#039;&#039;&#039;PVE01&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon getmap -o /tmp/monmap&lt;br /&gt;
 &lt;br /&gt;
 # monmaptool \&lt;br /&gt;
   --add nodeq 192.168.2.3:6789 \&lt;br /&gt;
   /tmp/monmap&lt;br /&gt;
Vamos checar se adicionamos o &#039;&#039;&#039;nodeq&#039;&#039;&#039; ao &#039;&#039;&#039;monmap&#039;&#039;&#039; com o comando: &#039;&#039;&#039;monmaptool --print /tmp/monmap&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Monmap.png|nenhum|miniaturadaimagem|677x677px]]&lt;br /&gt;
Vamos gerar o &#039;&#039;&#039;keyring&#039;&#039;&#039; para usarmos no Debian:&lt;br /&gt;
 # ceph auth get mon. -o /tmp/ceph.mon.keyring&lt;br /&gt;
Agora precisamos copiar todos os arquivos necessários do &#039;&#039;&#039;PVE01&#039;&#039;&#039; para o nosso Debian:&lt;br /&gt;
 # scp /tmp/monmap root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /tmp/ceph.mon.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/ceph.conf root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/priv/ceph.client.admin.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 &lt;br /&gt;
 # scp /var/lib/ceph/bootstrap-osd/ceph.keyring \&lt;br /&gt;
 root@192.168.2.3:/var/lib/ceph/bootstrap-osd/&lt;br /&gt;
&#039;&#039;&#039;Atenção&#039;&#039;&#039; &#039;&#039;&#039;agora&#039;&#039;&#039; pois vamos no nosso Debian alterar o arquivo &#039;&#039;&#039;/etc/ceph/ceph.conf&#039;&#039;&#039;. Primeiro modifique  o parâmetro abaixo para incluir o IP &#039;&#039;&#039;192.168.2.3&#039;&#039;&#039;:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
Modifique os dois parâmetros abaixo e deixe eles iguais a estes:&amp;lt;pre&amp;gt;&lt;br /&gt;
[client]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&lt;br /&gt;
[client.crash]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt;Adicione no final deste mesmo arquivo a configuração abaixo:&amp;lt;pre&amp;gt;&lt;br /&gt;
[mon.nodeq]&lt;br /&gt;
	public_addr = 192.168.2.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;Ainda no &#039;&#039;&#039;Debian&#039;&#039;&#039; execute os comandos abaixo para prepararmos o ambiente pro &#039;&#039;&#039;CEPH&#039;&#039;&#039;:&lt;br /&gt;
 # mkdir -p /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown ceph:ceph /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chmod 750 /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
Vamos criar o monitor:&lt;br /&gt;
 # ceph-mon --mkfs \&lt;br /&gt;
 -i nodeq \&lt;br /&gt;
 --monmap /etc/ceph/monmap \&lt;br /&gt;
 --keyring /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 &lt;br /&gt;
 # chown -R ceph: /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown -R ceph: /etc/ceph/&lt;br /&gt;
 # chmod 640 /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 # chmod 640 /etc/ceph/monmap&lt;br /&gt;
Este é o momento crucial para que tenhamos mais um monitor no nosso CEPH do Proxmox:&lt;br /&gt;
 # systemctl enable ceph-mon@nodeq&lt;br /&gt;
 # systemctl start ceph-mon@nodeq&lt;br /&gt;
Precisamos checar se o serviço subiu com o comando: &#039;&#039;&#039;systemctl status ceph-mon@nodeq&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se aparecer algo assim então parabéns, até aqui foi tudo OK:&lt;br /&gt;
[[Arquivo:Nodeq ceph.png|nenhum|miniaturadaimagem|806x806px]]Volte no Proxmox PVE01 e altere o &#039;&#039;&#039;/etc/pve/ceph.conf&#039;&#039;&#039; modificando para:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
E adicionando no final do arquivo:&lt;br /&gt;
 [mon.nodeq]&lt;br /&gt;
         public_addr = 192.168.2.3&lt;br /&gt;
Agora ativamos, ainda no &#039;&#039;&#039;Proxmox PVE01&#039;&#039;&#039;, o &#039;&#039;&#039;msgr2&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon enable-msgr2&lt;br /&gt;
No Debian reinicie o serviço:&lt;br /&gt;
 # systemctl restart ceph-mon@nodeq&lt;br /&gt;
No &#039;&#039;&#039;Proxmox&#039;&#039;&#039; em &#039;&#039;&#039;CEPH&#039;&#039;&#039; verá um novo Monitor adicionado:&lt;br /&gt;
[[Arquivo:Mon ceph.png|nenhum|miniaturadaimagem|598x598px]]&lt;br /&gt;
&lt;br /&gt;
== Adicionando o OSD no Debian ==&lt;br /&gt;
Agora vamos aos procedimentos para usarmos aquele SSD como OSD no CEPH. Vamos supor que o &#039;&#039;&#039;SSD livre&#039;&#039;&#039; seja o &#039;&#039;&#039;/dev/sdb&#039;&#039;&#039;:&lt;br /&gt;
 # apt install gdisk util-linux&lt;br /&gt;
 &lt;br /&gt;
 # wipefs -a /dev/sdb&lt;br /&gt;
 # sgdisk --zap-all /dev/sdb&lt;br /&gt;
&lt;br /&gt;
Feito isso só precisamos criar o volume CEPH com o comando:&lt;br /&gt;
 # ceph-volume lvm create --data /dev/sdb&lt;br /&gt;
Se tudo foi bem, nesse momento verá o &#039;&#039;&#039;OSD&#039;&#039;&#039; no seu &#039;&#039;&#039;Cluster Proxmox&#039;&#039;&#039;:&lt;br /&gt;
[[Arquivo:Osd img.png|nenhum|miniaturadaimagem|1234x1234px]]&lt;br /&gt;
Olhando a saúde do nosso Cluster veremos:&lt;br /&gt;
[[Arquivo:Resultado ceph.png|nenhum|miniaturadaimagem|1235x1235px]]&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
Aqui vemos em funcionamento um &#039;&#039;&#039;Cluster Proxmox + HA&#039;&#039;&#039; com 2 nós apenas e uma máquina Debian servindo como apoio no funcionamento e segurança do Cluster.&lt;br /&gt;
&lt;br /&gt;
Gostou do artigo? Compartilhe!&lt;br /&gt;
&lt;br /&gt;
Autor: [[Sobre mim|Marcelo Gondim]]&lt;br /&gt;
[[Categoria:Artigos Técnicos]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1139</id>
		<title>Debian Cluster CEPH</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1139"/>
		<updated>2026-04-16T16:57:20Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
Este artigo tem como foco explicar como adicionar um Debian GNU/Linux em um Proxmox Cluster + HA com 2 nodes. Como muitos sabem, um &#039;&#039;&#039;Cluster&#039;&#039;&#039; deve ser composto de no &#039;&#039;&#039;mínimo 3 nodes&#039;&#039;&#039; para que possa dar segurança, existir &#039;&#039;&#039;quorum&#039;&#039;&#039; e quando usamos &#039;&#039;&#039;CEPH&#039;&#039;&#039; também precisamos de pelo menos 3 nodes com &#039;&#039;&#039;OSDs&#039;&#039;&#039; para termos uma estabilidade e segurança no sistema. O problema é quando se quer fazer  isso com apenas 2 servidores Proxmox. Comprar um terceiro servidor às vezes ainda não está nos planos mas você tem uma máquina parada, onde você pode adicionar 2 SSDs e com 4G de ram você pode adicionar ela no &#039;&#039;&#039;Cluster&#039;&#039;&#039; para servir de quorum e de disco &#039;&#039;&#039;CEPH&#039;&#039;&#039;.  Dessa maneira você consegue com 2 servidores &#039;&#039;&#039;Proxmox&#039;&#039;&#039; e uma máquina que chamei de &#039;&#039;&#039;Quorum Device&#039;&#039;&#039;, colocar em produção um Cluster com HA funcional.t&lt;br /&gt;
&lt;br /&gt;
== Diagrama ==&lt;br /&gt;
O diagrama abaixo será o ambiente de exemplo mas não falaremos de como construir um Cluster + HA com Proxmox. Nesse caso você precisará ter os 2 servidores já instalados e configurados em &#039;&#039;&#039;Cluster&#039;&#039;&#039; com &#039;&#039;&#039;CEPH&#039;&#039;&#039;. Aqui vamos apenas mostrar como adicionar um Debian GNU/Linux nesse Cluster e no CEPH.&lt;br /&gt;
[[Arquivo:Diagrama cluster ceph.png|nenhum|miniaturadaimagem|522x522px]]&lt;br /&gt;
&lt;br /&gt;
== Pré-requisitos ==&lt;br /&gt;
&lt;br /&gt;
* Debian GNU/Linux 13 (Trixie).&lt;br /&gt;
* Uma máquina com 4G ou 8G de ram.&lt;br /&gt;
* 1 SSD para instalar o sistema.&lt;br /&gt;
* 1 SSD para servir de &#039;&#039;&#039;OSD&#039;&#039;&#039; no &#039;&#039;&#039;CEPH&#039;&#039;&#039;.&lt;br /&gt;
*3 interfaces de rede. Uma para o acesso, outra para o &#039;&#039;&#039;Cluster&#039;&#039;&#039; e outra para o &#039;&#039;&#039;CEPH&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Configurando o Qdevice no Debian ==&lt;br /&gt;
Uma vez instalado o Debian, precisamos configurar as 3 interfaces para a comunicação com seu Cluster Proxmox. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
* ens18 - IP 10.254.254.27/24 GW 10.254.254.1 (essa seria a interface com acesso à Internet para instalar os programas).&lt;br /&gt;
* ens19 - IP 192.168.1.3/24 (interface que deve se comunicar com a rede do Cluster, com os IPs dos nodes 192.168.1.1 e 192.168.1.2.&lt;br /&gt;
* ens20 - IP 192.168.2.3/24 (interface que se comunica com a rede CEPH, com os IPs 192.168.2.1 e 192.168.2.2.&lt;br /&gt;
&lt;br /&gt;
Precisamos configurar o serviço SSHD para permitir conexão com root, pois o Proxmox vai precisar acessar o Debian. Para isso altere o arquivo &#039;&#039;&#039;/etc/ssh/sshd_config&#039;&#039;&#039; o parâmetro abaixo:&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
Reinicie o serviço:&lt;br /&gt;
 # systemctl restart sshd&lt;br /&gt;
No Debian vamos instalar o pacote &#039;&#039;&#039;corosync-qnetd&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qnetd&lt;br /&gt;
Nos dois servidores Proxmox, no nosso exemplo PVE01 e PVE02 instalaremos o pacote &#039;&#039;&#039;corosync-qdevice&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qdevice&lt;br /&gt;
Agora vá para o shell do seu &#039;&#039;&#039;Proxmox principal&#039;&#039;&#039;, no meu caso o &#039;&#039;&#039;PVE01&#039;&#039;&#039; e adicione o Debian ao Cluster com o seguinte comando: &lt;br /&gt;
 # pvecm qdevice setup 192.168.1.3&lt;br /&gt;
Com o comando &#039;&#039;&#039;pvecm status&#039;&#039;&#039; podemos ver como está o quorum e se tudo ocorreu bem, verá que agora temos 3 votos no lugar de 2 e um &#039;&#039;&#039;Qdevice&#039;&#039;&#039; no membership:&lt;br /&gt;
[[Arquivo:Qdevice.png|nenhum|miniaturadaimagem|748x748px]]&lt;br /&gt;
Agora em se tratando de Cluster, você tem o mínimo de votantes para o bom funcionamento e usando uma máquina simples com Debian.&lt;br /&gt;
&lt;br /&gt;
== Adicionando um CEPH monitor e OSD ==&lt;br /&gt;
Agora precisamos tornar nosso &#039;&#039;&#039;CEPH&#039;&#039;&#039; saudável também e para isso vamos instalar os pacotes do CEPH do Proxmox no Debian. O CEPH precisa ser da mesma versão usada no Cluster Proxmox. Para os meus testes utilizei um &#039;&#039;&#039;Cluster Proxmox 9&#039;&#039;&#039; no &#039;&#039;&#039;PVE01&#039;&#039;&#039; e &#039;&#039;&#039;PVE02&#039;&#039;&#039; que utiliza o &#039;&#039;&#039;CEPH Squid 19.2&#039;&#039;&#039;. Então vamos adicionar o repositório:&lt;br /&gt;
 # echo &amp;quot;deb &amp;lt;nowiki&amp;gt;http://download.proxmox.com/debian/ceph-squid&amp;lt;/nowiki&amp;gt; trixie no-subscription&amp;quot; &amp;gt; /etc/apt/sources.list.d/ceph.list&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg&amp;lt;/nowiki&amp;gt; -O /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg&lt;br /&gt;
Instalando os pacotes do CEPH:&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install ceph ceph-common&lt;br /&gt;
Antes de prosseguir adicione no &#039;&#039;&#039;/etc/hosts&#039;&#039;&#039; do Debian:&lt;br /&gt;
 192.168.2.1 node1&lt;br /&gt;
 192.168.2.2 node2&lt;br /&gt;
 192.168.2.3 nodeq&lt;br /&gt;
Estou chamando nosso &#039;&#039;&#039;Quorum Device&#039;&#039;&#039; com o hostname &#039;&#039;&#039;nodeq&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Agora precisaremos executar algumas tarefas no nosso &#039;&#039;&#039;PVE01&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon getmap -o /tmp/monmap&lt;br /&gt;
 &lt;br /&gt;
 # monmaptool \&lt;br /&gt;
   --add nodeq 192.168.2.3:6789 \&lt;br /&gt;
   /tmp/monmap&lt;br /&gt;
Vamos checar se adicionamos o &#039;&#039;&#039;nodeq&#039;&#039;&#039; ao &#039;&#039;&#039;monmap&#039;&#039;&#039; com o comando: &#039;&#039;&#039;monmaptool --print /tmp/monmap&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Monmap.png|nenhum|miniaturadaimagem|677x677px]]&lt;br /&gt;
Vamos gerar o &#039;&#039;&#039;keyring&#039;&#039;&#039; para usarmos no Debian:&lt;br /&gt;
 # ceph auth get mon. -o /tmp/ceph.mon.keyring&lt;br /&gt;
Agora precisamos copiar todos os arquivos necessários do &#039;&#039;&#039;PVE01&#039;&#039;&#039; para o nosso Debian:&lt;br /&gt;
 # scp /tmp/monmap root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /tmp/ceph.mon.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/ceph.conf root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/priv/ceph.client.admin.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 &lt;br /&gt;
 # scp /var/lib/ceph/bootstrap-osd/ceph.keyring \&lt;br /&gt;
 root@192.168.2.3:/var/lib/ceph/bootstrap-osd/&lt;br /&gt;
&#039;&#039;&#039;Atenção&#039;&#039;&#039; &#039;&#039;&#039;agora&#039;&#039;&#039; pois vamos no nosso Debian alterar o arquivo &#039;&#039;&#039;/etc/ceph/ceph.conf&#039;&#039;&#039;. Primeiro modifique  o parâmetro abaixo para incluir o IP &#039;&#039;&#039;192.168.2.3&#039;&#039;&#039;:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
Modifique os dois parâmetros abaixo e deixe eles iguais a estes:&amp;lt;pre&amp;gt;&lt;br /&gt;
[client]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&lt;br /&gt;
[client.crash]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt;Adicione no final deste mesmo arquivo a configuração abaixo:&amp;lt;pre&amp;gt;&lt;br /&gt;
[mon.nodeq]&lt;br /&gt;
	public_addr = 192.168.2.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;Ainda no &#039;&#039;&#039;Debian&#039;&#039;&#039; execute os comandos abaixo para prepararmos o ambiente pro &#039;&#039;&#039;CEPH&#039;&#039;&#039;:&lt;br /&gt;
 # mkdir -p /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown ceph:ceph /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chmod 750 /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
Vamos criar o monitor:&lt;br /&gt;
 # ceph-mon --mkfs \&lt;br /&gt;
 -i nodeq \&lt;br /&gt;
 --monmap /etc/ceph/monmap \&lt;br /&gt;
 --keyring /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 &lt;br /&gt;
 # chown -R ceph: /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown -R ceph: /etc/ceph/&lt;br /&gt;
 # chmod 640 /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 # chmod 640 /etc/ceph/monmap&lt;br /&gt;
Este é o momento crucial para que tenhamos mais um monitor no nosso CEPH do Proxmox:&lt;br /&gt;
 # systemctl enable ceph-mon@nodeq&lt;br /&gt;
 # systemctl start ceph-mon@nodeq&lt;br /&gt;
Precisamos checar se o serviço subiu com o comando: &#039;&#039;&#039;systemctl status ceph-mon@nodeq&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se aparecer algo assim então parabéns, até aqui foi tudo OK:&lt;br /&gt;
[[Arquivo:Nodeq ceph.png|nenhum|miniaturadaimagem|806x806px]]Volte no Proxmox PVE01 e altere o &#039;&#039;&#039;/etc/pve/ceph.conf&#039;&#039;&#039; modificando para:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
E adicionando no final do arquivo:&lt;br /&gt;
 [mon.nodeq]&lt;br /&gt;
         public_addr = 192.168.2.3&lt;br /&gt;
Agora ativamos, ainda no &#039;&#039;&#039;Proxmox PVE01&#039;&#039;&#039;, o &#039;&#039;&#039;msgr2&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon enable-msgr2&lt;br /&gt;
No Debian reinicie o serviço:&lt;br /&gt;
 # systemctl restart ceph-mon@nodeq&lt;br /&gt;
No &#039;&#039;&#039;Proxmox&#039;&#039;&#039; em &#039;&#039;&#039;CEPH&#039;&#039;&#039; verá um novo Monitor adicionado:&lt;br /&gt;
[[Arquivo:Mon ceph.png|nenhum|miniaturadaimagem|598x598px]]&lt;br /&gt;
&lt;br /&gt;
== Adicionando o OSD no Debian ==&lt;br /&gt;
Agora vamos aos procedimentos para usarmos aquele SSD como OSD no CEPH. Vamos supor que o &#039;&#039;&#039;SSD livre&#039;&#039;&#039; seja o &#039;&#039;&#039;/dev/sdb&#039;&#039;&#039;:&lt;br /&gt;
 # apt install gdisk util-linux&lt;br /&gt;
 &lt;br /&gt;
 # wipefs -a /dev/sdb&lt;br /&gt;
 # sgdisk --zap-all /dev/sdb&lt;br /&gt;
&lt;br /&gt;
Feito isso só precisamos criar o volume CEPH com o comando:&lt;br /&gt;
 # ceph-volume lvm create --data /dev/sdb&lt;br /&gt;
Se tudo foi bem, nesse momento verá o &#039;&#039;&#039;OSD&#039;&#039;&#039; no seu &#039;&#039;&#039;Cluster Proxmox&#039;&#039;&#039;:&lt;br /&gt;
[[Arquivo:Osd img.png|nenhum|miniaturadaimagem|1234x1234px]]&lt;br /&gt;
Olhando a saúde do nosso Cluster veremos:&lt;br /&gt;
[[Arquivo:Resultado ceph.png|nenhum|miniaturadaimagem|1235x1235px]]&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
Aqui vemos em funcionamento um &#039;&#039;&#039;Cluster Proxmox + HA&#039;&#039;&#039; com 2 nós apenas e uma máquina Debian servindo como apoio no funcionamento e segurança do Cluster.&lt;br /&gt;
&lt;br /&gt;
Gostou do artigo? Compartilhe!&lt;br /&gt;
&lt;br /&gt;
Autor: [[Sobre mim|Marcelo Gondim]]&lt;br /&gt;
[[Categoria:Artigos Técnicos]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Artigos_Tecnicos&amp;diff=1138</id>
		<title>Artigos Tecnicos</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Artigos_Tecnicos&amp;diff=1138"/>
		<updated>2026-04-12T20:50:26Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Artigos Técnicos}}&lt;br /&gt;
[[Arquivo:Tecnico.png|nenhum|miniaturadaimagem]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[IPv6 Por onde comecar|IPv6 - Por onde começar]]&lt;br /&gt;
&lt;br /&gt;
[[Debian Cluster CEPH]]&lt;br /&gt;
&lt;br /&gt;
[[Autenticacao TOTP Radius Tacacs Debian|Autenticação TOTP + Radius/Tacacs no Debian]]&lt;br /&gt;
&lt;br /&gt;
[[Static Loop|Static Loop - um erro que pode matar seu ISP/ITP]]&lt;br /&gt;
&lt;br /&gt;
[[Portas Amplificacao DDoS|Portas de Amplificação DDoS e Botnets]]&lt;br /&gt;
&lt;br /&gt;
[[POC DNS Anycast TCP|PoC - Quebra do TCP em DNS Anycast Balanceado]]&lt;br /&gt;
&lt;br /&gt;
[[Template Servidor Debian|Template de Servidor Debian GNU/Linux]]&lt;br /&gt;
&lt;br /&gt;
[[Policy Based Routing|Policy Based Routing (PBR)]]&lt;br /&gt;
&lt;br /&gt;
[[PHPIPAM|DCIM/IPAM com phpIPAM]]&lt;br /&gt;
&lt;br /&gt;
[[Vazamento de prefixos na mitigação DDoS]]&lt;br /&gt;
&lt;br /&gt;
[[Enviando mensagens para o Discord]]&lt;br /&gt;
&lt;br /&gt;
[[Recomendacao Mitigacao DDoS|Recomendações sobre Mitigação DDoS]]&lt;br /&gt;
&lt;br /&gt;
[[Identificando e neutralizando uma Botnet]]&lt;br /&gt;
&lt;br /&gt;
[[MSMTP com OAuth2|MSMTP com OAuth2 no Debian 12]]&lt;br /&gt;
&lt;br /&gt;
[[Geolocalizacao|Geolocalização e a Internet]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Artigos_Tecnicos&amp;diff=1137</id>
		<title>Artigos Tecnicos</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Artigos_Tecnicos&amp;diff=1137"/>
		<updated>2026-04-12T20:49:35Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Artigos Técnicos}}&lt;br /&gt;
[[Arquivo:Tecnico.png|nenhum|miniaturadaimagem]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[IPv6 Por onde comecar|IPv6 - Por onde começar]]&lt;br /&gt;
&lt;br /&gt;
[[Debian Cluster CEPH]]&lt;br /&gt;
&lt;br /&gt;
[[Static Loop|Static Loop - um erro que pode matar seu ISP/ITP]]&lt;br /&gt;
&lt;br /&gt;
[[Portas Amplificacao DDoS|Portas de Amplificação DDoS e Botnets]]&lt;br /&gt;
&lt;br /&gt;
[[POC DNS Anycast TCP|PoC - Quebra do TCP em DNS Anycast Balanceado]]&lt;br /&gt;
&lt;br /&gt;
[[Template Servidor Debian|Template de Servidor Debian GNU/Linux]]&lt;br /&gt;
&lt;br /&gt;
[[Policy Based Routing|Policy Based Routing (PBR)]]&lt;br /&gt;
&lt;br /&gt;
[[PHPIPAM|DCIM/IPAM com phpIPAM]]&lt;br /&gt;
&lt;br /&gt;
[[Vazamento de prefixos na mitigação DDoS]]&lt;br /&gt;
&lt;br /&gt;
[[Enviando mensagens para o Discord]]&lt;br /&gt;
&lt;br /&gt;
[[Recomendacao Mitigacao DDoS|Recomendações sobre Mitigação DDoS]]&lt;br /&gt;
&lt;br /&gt;
[[Identificando e neutralizando uma Botnet]]&lt;br /&gt;
&lt;br /&gt;
[[MSMTP com OAuth2|MSMTP com OAuth2 no Debian 12]]&lt;br /&gt;
&lt;br /&gt;
[[Geolocalizacao|Geolocalização e a Internet]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1136</id>
		<title>Debian Cluster CEPH</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1136"/>
		<updated>2026-04-10T16:46:10Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
Este artigo tem como foco explicar como adicionar um Debian GNU/Linux em um Proxmox Cluster + HA com 2 nodes. Como muitos sabem, um &#039;&#039;&#039;Cluster&#039;&#039;&#039; deve ser composto de no &#039;&#039;&#039;mínimo 3 nodes&#039;&#039;&#039; para que possa dar segurança, existir &#039;&#039;&#039;quorum&#039;&#039;&#039; e quando usamos &#039;&#039;&#039;CEPH&#039;&#039;&#039; também precisamos de pelo menos 3 nodes com &#039;&#039;&#039;OSDs&#039;&#039;&#039; para termos uma estabilidade e segurança no sistema. O problema é quando se quer fazer  isso com apenas 2 servidores Proxmox. Comprar um terceiro servidor às vezes ainda não está nos planos mas você tem uma máquina parada, onde você pode adicionar 2 SSDs e com 4G de ram você pode adicionar ela no &#039;&#039;&#039;Cluster&#039;&#039;&#039; para servir de quorum e de disco &#039;&#039;&#039;CEPH&#039;&#039;&#039;.  Dessa maneira você consegue com 2 servidores &#039;&#039;&#039;Proxmox&#039;&#039;&#039; e uma máquina que chamei de &#039;&#039;&#039;Quorum Device&#039;&#039;&#039;, colocar em produção um Cluster com HA funcional.&lt;br /&gt;
&lt;br /&gt;
== Diagrama ==&lt;br /&gt;
O diagrama abaixo será o ambiente de exemplo mas não falaremos de como construir um Cluster + HA com Proxmox. Nesse caso você precisará ter os 2 servidores já instalados e configurados em &#039;&#039;&#039;Cluster&#039;&#039;&#039; com &#039;&#039;&#039;CEPH&#039;&#039;&#039;. Aqui vamos apenas mostrar como adicionar um Debian GNU/Linux nesse Cluster e no CEPH.&lt;br /&gt;
[[Arquivo:Diagrama cluster ceph.png|nenhum|miniaturadaimagem|522x522px]]&lt;br /&gt;
&lt;br /&gt;
== Pré-requisitos ==&lt;br /&gt;
&lt;br /&gt;
* Debian GNU/Linux 13 (Trixie).&lt;br /&gt;
* Uma máquina com 4G ou 8G de ram.&lt;br /&gt;
* 1 SSD para instalar o sistema.&lt;br /&gt;
* 1 SSD para servir de &#039;&#039;&#039;OSD&#039;&#039;&#039; no &#039;&#039;&#039;CEPH&#039;&#039;&#039;.&lt;br /&gt;
*3 interfaces de rede. Uma para o acesso, outra para o &#039;&#039;&#039;Cluster&#039;&#039;&#039; e outra para o &#039;&#039;&#039;CEPH&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Configurando o Qdevice no Debian ==&lt;br /&gt;
Uma vez instalado o Debian, precisamos configurar as 3 interfaces para a comunicação com seu Cluster Proxmox. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
* ens18 - IP 10.254.254.27/24 GW 10.254.254.1 (essa seria a interface com acesso à Internet para instalar os programas).&lt;br /&gt;
* ens19 - IP 192.168.1.3/24 (interface que deve se comunicar com a rede do Cluster, com os IPs dos nodes 192.168.1.1 e 192.168.1.2.&lt;br /&gt;
* ens20 - IP 192.168.2.3/24 (interface que se comunica com a rede CEPH, com os IPs 192.168.2.1 e 192.168.2.2.&lt;br /&gt;
&lt;br /&gt;
Precisamos configurar o serviço SSHD para permitir conexão com root, pois o Proxmox vai precisar acessar o Debian. Para isso altere o arquivo &#039;&#039;&#039;/etc/ssh/sshd_config&#039;&#039;&#039; o parâmetro abaixo:&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
Reinicie o serviço:&lt;br /&gt;
 # systemctl restart sshd&lt;br /&gt;
No Debian vamos instalar o pacote &#039;&#039;&#039;corosync-qnetd&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qnetd&lt;br /&gt;
Nos dois servidores Proxmox, no nosso exemplo PVE01 e PVE02 instalaremos o pacote &#039;&#039;&#039;corosync-qdevice&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qdevice&lt;br /&gt;
Agora vá para o shell do seu &#039;&#039;&#039;Proxmox principal&#039;&#039;&#039;, no meu caso o &#039;&#039;&#039;PVE01&#039;&#039;&#039; e adicione o Debian ao Cluster com o seguinte comando: &lt;br /&gt;
 # pvecm qdevice setup 192.168.1.3&lt;br /&gt;
Com o comando &#039;&#039;&#039;pvecm status&#039;&#039;&#039; podemos ver como está o quorum e se tudo ocorreu bem, verá que agora temos 3 votos no lugar de 2 e um &#039;&#039;&#039;Qdevice&#039;&#039;&#039; no membership:&lt;br /&gt;
[[Arquivo:Qdevice.png|nenhum|miniaturadaimagem|748x748px]]&lt;br /&gt;
Agora em se tratando de Cluster, você tem o mínimo de votantes para o bom funcionamento e usando uma máquina simples com Debian.&lt;br /&gt;
&lt;br /&gt;
== Adicionando um CEPH monitor e OSD ==&lt;br /&gt;
Agora precisamos tornar nosso &#039;&#039;&#039;CEPH&#039;&#039;&#039; saudável também e para isso vamos instalar os pacotes do CEPH do Proxmox no Debian. O CEPH precisa ser da mesma versão usada no Cluster Proxmox. Para os meus testes utilizei um &#039;&#039;&#039;Cluster Proxmox 9&#039;&#039;&#039; no &#039;&#039;&#039;PVE01&#039;&#039;&#039; e &#039;&#039;&#039;PVE02&#039;&#039;&#039; que utiliza o &#039;&#039;&#039;CEPH Squid 19.2&#039;&#039;&#039;. Então vamos adicionar o repositório:&lt;br /&gt;
 # echo &amp;quot;deb &amp;lt;nowiki&amp;gt;http://download.proxmox.com/debian/ceph-squid&amp;lt;/nowiki&amp;gt; trixie no-subscription&amp;quot; &amp;gt; /etc/apt/sources.list.d/ceph.list&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg&amp;lt;/nowiki&amp;gt; -O /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg&lt;br /&gt;
Instalando os pacotes do CEPH:&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install ceph ceph-common&lt;br /&gt;
Antes de prosseguir adicione no &#039;&#039;&#039;/etc/hosts&#039;&#039;&#039; do Debian:&lt;br /&gt;
 192.168.2.1 node1&lt;br /&gt;
 192.168.2.2 node2&lt;br /&gt;
 192.168.2.3 nodeq&lt;br /&gt;
Estou chamando nosso &#039;&#039;&#039;Quorum Device&#039;&#039;&#039; com o hostname &#039;&#039;&#039;nodeq&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Agora precisaremos executar algumas tarefas no nosso &#039;&#039;&#039;PVE01&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon getmap -o /tmp/monmap&lt;br /&gt;
 &lt;br /&gt;
 # monmaptool \&lt;br /&gt;
   --add nodeq 192.168.2.3:6789 \&lt;br /&gt;
   /tmp/monmap&lt;br /&gt;
Vamos checar se adicionamos o &#039;&#039;&#039;nodeq&#039;&#039;&#039; ao &#039;&#039;&#039;monmap&#039;&#039;&#039; com o comando: &#039;&#039;&#039;monmaptool --print /tmp/monmap&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Monmap.png|nenhum|miniaturadaimagem|677x677px]]&lt;br /&gt;
Vamos gerar o &#039;&#039;&#039;keyring&#039;&#039;&#039; para usarmos no Debian:&lt;br /&gt;
 # ceph auth get mon. -o /tmp/ceph.mon.keyring&lt;br /&gt;
Agora precisamos copiar todos os arquivos necessários do &#039;&#039;&#039;PVE01&#039;&#039;&#039; para o nosso Debian:&lt;br /&gt;
 # scp /tmp/monmap root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /tmp/ceph.mon.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/ceph.conf root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/priv/ceph.client.admin.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 &lt;br /&gt;
 # scp /var/lib/ceph/bootstrap-osd/ceph.keyring \&lt;br /&gt;
 root@192.168.2.3:/var/lib/ceph/bootstrap-osd/&lt;br /&gt;
&#039;&#039;&#039;Atenção&#039;&#039;&#039; &#039;&#039;&#039;agora&#039;&#039;&#039; pois vamos no nosso Debian alterar o arquivo &#039;&#039;&#039;/etc/ceph/ceph.conf&#039;&#039;&#039;. Primeiro modifique  o parâmetro abaixo para incluir o IP &#039;&#039;&#039;192.168.2.3&#039;&#039;&#039;:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
Modifique os dois parâmetros abaixo e deixe eles iguais a estes:&amp;lt;pre&amp;gt;&lt;br /&gt;
[client]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&lt;br /&gt;
[client.crash]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt;Adicione no final deste mesmo arquivo a configuração abaixo:&amp;lt;pre&amp;gt;&lt;br /&gt;
[mon.nodeq]&lt;br /&gt;
	public_addr = 192.168.2.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;Ainda no &#039;&#039;&#039;Debian&#039;&#039;&#039; execute os comandos abaixo para prepararmos o ambiente pro &#039;&#039;&#039;CEPH&#039;&#039;&#039;:&lt;br /&gt;
 # mkdir -p /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown ceph:ceph /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chmod 750 /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
Vamos criar o monitor:&lt;br /&gt;
 # ceph-mon --mkfs \&lt;br /&gt;
 -i nodeq \&lt;br /&gt;
 --monmap /etc/ceph/monmap \&lt;br /&gt;
 --keyring /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 &lt;br /&gt;
 # chown -R ceph: /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown -R ceph: /etc/ceph/&lt;br /&gt;
 # chmod 640 /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 # chmod 640 /etc/ceph/monmap&lt;br /&gt;
Este é o momento crucial para que tenhamos mais um monitor no nosso CEPH do Proxmox:&lt;br /&gt;
 # systemctl enable ceph-mon@nodeq&lt;br /&gt;
 # systemctl start ceph-mon@nodeq&lt;br /&gt;
Precisamos checar se o serviço subiu com o comando: &#039;&#039;&#039;systemctl status ceph-mon@nodeq&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se aparecer algo assim então parabéns, até aqui foi tudo OK:&lt;br /&gt;
[[Arquivo:Nodeq ceph.png|nenhum|miniaturadaimagem|806x806px]]Volte no Proxmox PVE01 e altere o &#039;&#039;&#039;/etc/pve/ceph.conf&#039;&#039;&#039; modificando para:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
E adicionando no final do arquivo:&lt;br /&gt;
 [mon.nodeq]&lt;br /&gt;
         public_addr = 192.168.2.3&lt;br /&gt;
Agora ativamos, ainda no &#039;&#039;&#039;Proxmox PVE01&#039;&#039;&#039;, o &#039;&#039;&#039;msgr2&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon enable-msgr2&lt;br /&gt;
No Debian reinicie o serviço:&lt;br /&gt;
 # systemctl restart ceph-mon@nodeq&lt;br /&gt;
No &#039;&#039;&#039;Proxmox&#039;&#039;&#039; em &#039;&#039;&#039;CEPH&#039;&#039;&#039; verá um novo Monitor adicionado:&lt;br /&gt;
[[Arquivo:Mon ceph.png|nenhum|miniaturadaimagem|598x598px]]&lt;br /&gt;
&lt;br /&gt;
== Adicionando o OSD no Debian ==&lt;br /&gt;
Agora vamos aos procedimentos para usarmos aquele SSD como OSD no CEPH. Vamos supor que o &#039;&#039;&#039;SSD livre&#039;&#039;&#039; seja o &#039;&#039;&#039;/dev/sdb&#039;&#039;&#039;:&lt;br /&gt;
 # apt install gdisk util-linux&lt;br /&gt;
 &lt;br /&gt;
 # wipefs -a /dev/sdb&lt;br /&gt;
 # sgdisk --zap-all /dev/sdb&lt;br /&gt;
&lt;br /&gt;
Feito isso só precisamos criar o volume CEPH com o comando:&lt;br /&gt;
 # ceph-volume lvm create --data /dev/sdb&lt;br /&gt;
Se tudo foi bem, nesse momento verá o &#039;&#039;&#039;OSD&#039;&#039;&#039; no seu &#039;&#039;&#039;Cluster Proxmox&#039;&#039;&#039;:&lt;br /&gt;
[[Arquivo:Osd img.png|nenhum|miniaturadaimagem|1234x1234px]]&lt;br /&gt;
Olhando a saúde do nosso Cluster veremos:&lt;br /&gt;
[[Arquivo:Resultado ceph.png|nenhum|miniaturadaimagem|1235x1235px]]&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
Aqui vemos em funcionamento um &#039;&#039;&#039;Cluster Proxmox + HA&#039;&#039;&#039; com 2 nós apenas e uma máquina Debian servindo como apoio no funcionamento e segurança do Cluster.&lt;br /&gt;
&lt;br /&gt;
Gostou do artigo? Compartilhe!&lt;br /&gt;
&lt;br /&gt;
Autor: [[Sobre mim|Marcelo Gondim]]&lt;br /&gt;
[[Categoria:Artigos Técnicos]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1135</id>
		<title>Debian Cluster CEPH</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1135"/>
		<updated>2026-04-10T15:28:43Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
Este artigo tem como foco explicar como adicionar um Debian GNU/Linux em um Proxmox Cluster + HA com 2 nodes. Como muitos sabem, um &#039;&#039;&#039;Cluster&#039;&#039;&#039; deve ser composto de no &#039;&#039;&#039;mínimo 3 nodes&#039;&#039;&#039; para que possa dar segurança, existir &#039;&#039;&#039;quorum&#039;&#039;&#039; e quando usamos &#039;&#039;&#039;CEPH&#039;&#039;&#039; também precisamos de pelo menos 3 nodes com &#039;&#039;&#039;OSDs&#039;&#039;&#039; para termos uma estabilidade e segurança no sistema. O problema é quando se quer fazer  isso com apenas 2 servidores Proxmox. Comprar um terceiro servidor às vezes ainda não está nos planos mas você tem uma máquina parada, onde você pode adicionar 2 SSDs e com 4G de ram você pode adicionar ela no &#039;&#039;&#039;Cluster&#039;&#039;&#039; para servir de quorum e de disco &#039;&#039;&#039;CEPH&#039;&#039;&#039;.  Dessa maneira você consegue com 2 servidores &#039;&#039;&#039;Proxmox&#039;&#039;&#039; e uma máquina que chamei de &#039;&#039;&#039;Quorum Device&#039;&#039;&#039;, colocar em produção um Cluster com HA funcional.&lt;br /&gt;
&lt;br /&gt;
== Diagrama ==&lt;br /&gt;
O diagrama abaixo será o ambiente de exemplo mas não falaremos de como construir um Cluster + HA com Proxmox. Nesse caso você precisará ter os 2 servidores já instalados e configurados em &#039;&#039;&#039;Cluster&#039;&#039;&#039; com &#039;&#039;&#039;CEPH&#039;&#039;&#039;. Aqui vamos apenas mostrar como adicionar um Debian GNU/Linux nesse Cluster e no CEPH.&lt;br /&gt;
[[Arquivo:Diagrama cluster ceph.png|nenhum|miniaturadaimagem|522x522px]]&lt;br /&gt;
&lt;br /&gt;
== Pré-requisitos ==&lt;br /&gt;
&lt;br /&gt;
* Debian GNU/Linux 13 (Trixie).&lt;br /&gt;
* Uma máquina com 4G ou 8G de ram.&lt;br /&gt;
* 1 SSD para instalar o sistema.&lt;br /&gt;
* 1 SSD para servir de &#039;&#039;&#039;OSD&#039;&#039;&#039; no &#039;&#039;&#039;CEPH&#039;&#039;&#039;.&lt;br /&gt;
*3 interfaces de rede. Uma para o acesso, outra para o &#039;&#039;&#039;Cluster&#039;&#039;&#039; e outra para o &#039;&#039;&#039;CEPH&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Configurando o Qdevice no Debian ==&lt;br /&gt;
Uma vez instalado o Debian, precisamos configurar as 3 interfaces para a comunicação com seu Cluster Proxmox. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
* ens18 - IP 10.254.254.27/24 GW 10.254.254.1 (essa seria a interface com acesso à Internet para instalar os programas).&lt;br /&gt;
* ens19 - IP 192.168.1.3/24 (interface que deve se comunicar com a rede do Cluster, com os IPs dos nodes 192.168.1.1 e 192.168.1.2.&lt;br /&gt;
* ens20 - IP 192.168.2.3/24 (interface que se comunica com a rede CEPH, com os IPs 192.168.2.1 e 192.168.2.2.&lt;br /&gt;
&lt;br /&gt;
Precisamos configurar o serviço SSHD para permitir conexão com root, pois o Proxmox vai precisar acessar o Debian. Para isso altere o arquivo &#039;&#039;&#039;/etc/ssh/sshd_config&#039;&#039;&#039; o parâmetro abaixo:&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
Reinicie o serviço:&lt;br /&gt;
 # systemctl restart sshd&lt;br /&gt;
No Debian vamos instalar o pacote &#039;&#039;&#039;corosync-qnetd&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qnetd&lt;br /&gt;
Nos dois servidores Proxmox, no nosso exemplo PVE01 e PVE02 instalaremos o pacote &#039;&#039;&#039;corosync-qdevice&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qdevice&lt;br /&gt;
Agora vá para o shell do seu &#039;&#039;&#039;Proxmox principal&#039;&#039;&#039;, no meu caso o &#039;&#039;&#039;PVE01&#039;&#039;&#039; e adicione o Debian ao Cluster com o seguinte comando: &lt;br /&gt;
 # pvecm qdevice setup 192.168.1.3&lt;br /&gt;
Com o comando &#039;&#039;&#039;pvecm status&#039;&#039;&#039; podemos ver como está o quorum e se tudo ocorreu bem, verá que agora temos 3 votos no lugar de 2 e um &#039;&#039;&#039;Qdevice&#039;&#039;&#039; no membership:&lt;br /&gt;
[[Arquivo:Qdevice.png|nenhum|miniaturadaimagem|748x748px]]&lt;br /&gt;
Agora em se tratando de Cluster, você tem o mínimo de votantes para o bom funcionamento e usando uma máquina simples com Debian.&lt;br /&gt;
&lt;br /&gt;
== Adicionando um CEPH monitor e OSD ==&lt;br /&gt;
Agora precisamos tornar nosso &#039;&#039;&#039;CEPH&#039;&#039;&#039; saudável também e para isso vamos instalar os pacotes do CEPH do Proxmox no Debian. O CEPH precisa ser da mesma versão usada no Cluster Proxmox. Para os meus testes utilizei um &#039;&#039;&#039;Cluster Proxmox 9&#039;&#039;&#039; no &#039;&#039;&#039;PVE01&#039;&#039;&#039; e &#039;&#039;&#039;PVE02&#039;&#039;&#039; que utiliza o &#039;&#039;&#039;CEPH Squid 19.2&#039;&#039;&#039;. Então vamos adicionar o repositório:&lt;br /&gt;
 # echo &amp;quot;deb &amp;lt;nowiki&amp;gt;http://download.proxmox.com/debian/ceph-squid&amp;lt;/nowiki&amp;gt; trixie no-subscription&amp;quot; &amp;gt; /etc/apt/sources.list.d/ceph.list&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg&amp;lt;/nowiki&amp;gt; -O /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg&lt;br /&gt;
Instalando os pacotes do CEPH:&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install ceph ceph-common&lt;br /&gt;
Antes de prosseguir adicione no &#039;&#039;&#039;/etc/hosts&#039;&#039;&#039; do Debian:&lt;br /&gt;
 192.168.2.1 node1&lt;br /&gt;
 192.168.2.2 node2&lt;br /&gt;
 192.168.2.3 nodeq&lt;br /&gt;
Estou chamando nosso &#039;&#039;&#039;Quorum Device&#039;&#039;&#039; com o hostname &#039;&#039;&#039;nodeq&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Agora precisaremos executar algumas tarefas no nosso &#039;&#039;&#039;PVE01&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon getmap -o /tmp/monmap&lt;br /&gt;
 &lt;br /&gt;
 # monmaptool \&lt;br /&gt;
   --add nodeq 192.168.2.3:6789 \&lt;br /&gt;
   /tmp/monmap&lt;br /&gt;
Vamos checar se adicionamos o &#039;&#039;&#039;nodeq&#039;&#039;&#039; ao &#039;&#039;&#039;monmap&#039;&#039;&#039; com o comando: &#039;&#039;&#039;monmaptool --print /tmp/monmap&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Monmap.png|nenhum|miniaturadaimagem|677x677px]]&lt;br /&gt;
Vamos gerar o &#039;&#039;&#039;keyring&#039;&#039;&#039; para usarmos no Debian:&lt;br /&gt;
 # ceph auth get mon. -o /tmp/ceph.mon.keyring&lt;br /&gt;
Agora precisamos copiar todos os arquivos necessários do &#039;&#039;&#039;PVE01&#039;&#039;&#039; para o nosso Debian:&lt;br /&gt;
 # scp /tmp/monmap root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /tmp/ceph.mon.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/ceph.conf root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/priv/ceph.client.admin.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 &lt;br /&gt;
 # scp /var/lib/ceph/bootstrap-osd/ceph.keyring \&lt;br /&gt;
 root@192.168.2.3:/var/lib/ceph/bootstrap-osd/&lt;br /&gt;
&#039;&#039;&#039;Atenção&#039;&#039;&#039; &#039;&#039;&#039;agora&#039;&#039;&#039; pois vamos no nosso Debian alterar o arquivo &#039;&#039;&#039;/etc/ceph/ceph.conf&#039;&#039;&#039;. Primeiro modifique  o parâmetro abaixo para incluir o IP &#039;&#039;&#039;192.168.2.3&#039;&#039;&#039;:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
Modifique os dois parâmetros abaixo e deixe eles iguais a estes:&amp;lt;pre&amp;gt;&lt;br /&gt;
[client]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&lt;br /&gt;
[client.crash]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt;Adicione no final deste mesmo arquivo a configuração abaixo:&amp;lt;pre&amp;gt;&lt;br /&gt;
[mon.nodeq]&lt;br /&gt;
	public_addr = 192.168.2.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;Ainda no &#039;&#039;&#039;Debian&#039;&#039;&#039; execute os comandos abaixo para prepararmos o ambiente pro &#039;&#039;&#039;CEPH&#039;&#039;&#039;:&lt;br /&gt;
 # mkdir -p /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown ceph:ceph /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chmod 750 /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
Vamos criar o monitor:&lt;br /&gt;
 # ceph-mon --mkfs \&lt;br /&gt;
 -i nodeq \&lt;br /&gt;
 --monmap /etc/ceph/monmap \&lt;br /&gt;
 --keyring /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 &lt;br /&gt;
 # chown -R ceph: /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown -R ceph: /etc/ceph/&lt;br /&gt;
 # chmod 640 /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 # chmod 640 /etc/ceph/monmap&lt;br /&gt;
Este é o momento crucial para que tenhamos mais um monitor no nosso CEPH do Proxmox:&lt;br /&gt;
 # systemctl enable ceph-mon@nodeq&lt;br /&gt;
 # systemctl start ceph-mon@nodeq&lt;br /&gt;
Precisamos checar se o serviço subiu com o comando: &#039;&#039;&#039;systemctl status ceph-mon@nodeq&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se aparecer algo assim então parabéns, até aqui foi tudo OK:&lt;br /&gt;
[[Arquivo:Nodeq ceph.png|nenhum|miniaturadaimagem|806x806px]]Volte no Proxmox PVE01 e altere o &#039;&#039;&#039;/etc/pve/ceph.conf&#039;&#039;&#039; modificando para:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
E adicionando no final do arquivo:&lt;br /&gt;
 [mon.nodeq]&lt;br /&gt;
         public_addr = 192.168.2.3&lt;br /&gt;
Agora ativamos, ainda no &#039;&#039;&#039;Proxmox PVE01&#039;&#039;&#039;, o &#039;&#039;&#039;msgr2&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon enable-msgr2&lt;br /&gt;
No Debian reinicie o serviço:&lt;br /&gt;
 # systemctl restart ceph-mon@nodeq&lt;br /&gt;
No &#039;&#039;&#039;Proxmox&#039;&#039;&#039; em &#039;&#039;&#039;CEPH&#039;&#039;&#039; verá um novo Monitor adicionado:&lt;br /&gt;
[[Arquivo:Mon ceph.png|nenhum|miniaturadaimagem|598x598px]]&lt;br /&gt;
&lt;br /&gt;
== Adicionando o OSD no Debian ==&lt;br /&gt;
Agora vamos aos procedimentos para usarmos aquele SSD como OSD no CEPH. Vamos supor que o &#039;&#039;&#039;SSD livre&#039;&#039;&#039; seja o &#039;&#039;&#039;/dev/sdb&#039;&#039;&#039;:&lt;br /&gt;
 # apt install gdisk&lt;br /&gt;
 &lt;br /&gt;
 # wipefs -a /dev/sdb&lt;br /&gt;
 # sgdisk --zap-all /dev/sdb&lt;br /&gt;
&lt;br /&gt;
Feito isso só precisamos criar o volume CEPH com o comando:&lt;br /&gt;
 # ceph-volume lvm create --data /dev/sdb&lt;br /&gt;
Se tudo foi bem, nesse momento verá o &#039;&#039;&#039;OSD&#039;&#039;&#039; no seu &#039;&#039;&#039;Cluster Proxmox&#039;&#039;&#039;:&lt;br /&gt;
[[Arquivo:Osd img.png|nenhum|miniaturadaimagem|1234x1234px]]&lt;br /&gt;
Olhando a saúde do nosso Cluster veremos:&lt;br /&gt;
[[Arquivo:Resultado ceph.png|nenhum|miniaturadaimagem|1235x1235px]]&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
Aqui vemos em funcionamento um &#039;&#039;&#039;Cluster Proxmox + HA&#039;&#039;&#039; com 2 nós apenas e uma máquina Debian servindo como apoio no funcionamento e segurança do Cluster.&lt;br /&gt;
&lt;br /&gt;
Gostou do artigo? Compartilhe!&lt;br /&gt;
&lt;br /&gt;
Autor: [[Sobre mim|Marcelo Gondim]]&lt;br /&gt;
[[Categoria:Artigos Técnicos]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1134</id>
		<title>Debian Cluster CEPH</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1134"/>
		<updated>2026-04-10T15:27:59Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
Este artigo tem como foco explicar como adicionar um Debian GNU/Linux em um Proxmox Cluster + HA com 2 nodes. Como muitos sabem, um &#039;&#039;&#039;Cluster&#039;&#039;&#039; deve ser composto de no &#039;&#039;&#039;mínimo 3 nodes&#039;&#039;&#039; para que possa dar segurança, existir &#039;&#039;&#039;quorum&#039;&#039;&#039; e quando usamos &#039;&#039;&#039;CEPH&#039;&#039;&#039; também precisamos de pelo menos 3 nodes com &#039;&#039;&#039;OSDs&#039;&#039;&#039; para termos uma estabilidade e segurança no sistema. O problema é quando se quer fazer  isso com apenas 2 servidores Proxmox. Comprar um terceiro servidor às vezes ainda não está nos planos mas você tem uma máquina parada, onde você pode adicionar 2 SSDs e com 4G de ram você pode adicionar ela no &#039;&#039;&#039;Cluster&#039;&#039;&#039; para servir de quorum e de disco &#039;&#039;&#039;CEPH&#039;&#039;&#039;.  Dessa maneira você consegue com 2 servidores &#039;&#039;&#039;Proxmox&#039;&#039;&#039; e uma máquina que chamei de &#039;&#039;&#039;Quorum Device&#039;&#039;&#039;, colocar em produção um Cluster com HA funcional.&lt;br /&gt;
&lt;br /&gt;
== Diagrama ==&lt;br /&gt;
O diagrama abaixo será o ambiente de exemplo mas não falaremos de como construir um Cluster + HA com Proxmox. Nesse caso você precisará ter os 2 servidores já instalados e configurados em &#039;&#039;&#039;Cluster&#039;&#039;&#039; com &#039;&#039;&#039;CEPH&#039;&#039;&#039;. Aqui vamos apenas mostrar como adicionar um Debian GNU/Linux nesse Cluster e no CEPH.&lt;br /&gt;
[[Arquivo:Diagrama cluster ceph.png|nenhum|miniaturadaimagem|522x522px]]&lt;br /&gt;
&lt;br /&gt;
== Pré-requisitos ==&lt;br /&gt;
&lt;br /&gt;
* Debian GNU/Linux 13 (Trixie).&lt;br /&gt;
* Uma máquina com 4G ou 8G de ram.&lt;br /&gt;
* 1 SSD para instalar o sistema.&lt;br /&gt;
* 1 SSD para servir de &#039;&#039;&#039;OSD&#039;&#039;&#039; no &#039;&#039;&#039;CEPH&#039;&#039;&#039;.&lt;br /&gt;
*3 interfaces de rede. Uma para o acesso, outra para o &#039;&#039;&#039;Cluster&#039;&#039;&#039; e outra para o &#039;&#039;&#039;CEPH&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Configurando o Qdevice no Debian ==&lt;br /&gt;
Uma vez instalado o Debian, precisamos configurar as 3 interfaces para a comunicação com seu Cluster Proxmox. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
* ens18 - IP 10.254.254.27/24 GW 10.254.254.1 (essa seria a interface com acesso à Internet para instalar os programas).&lt;br /&gt;
* ens19 - IP 192.168.1.3/24 (interface que deve se comunicar com a rede do Cluster, com os IPs dos nodes 192.168.1.1 e 192.168.1.2.&lt;br /&gt;
* ens20 - IP 192.168.2.3/24 (interface que se comunica com a rede CEPH, com os IPs 192.168.2.1 e 192.168.2.2.&lt;br /&gt;
&lt;br /&gt;
Precisamos configurar o serviço SSHD para permitir conexão com root, pois o Proxmox vai precisar acessar o Debian. Para isso altere o arquivo &#039;&#039;&#039;/etc/ssh/sshd_config&#039;&#039;&#039; o parâmetro abaixo:&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
Reinicie o serviço:&lt;br /&gt;
 # systemctl restart sshd&lt;br /&gt;
No Debian vamos instalar o pacote &#039;&#039;&#039;corosync-qnetd&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qnetd&lt;br /&gt;
Nos dois servidores Proxmox, no nosso exemplo PVE01 e PVE02 instalaremos o pacote &#039;&#039;&#039;corosync-qdevice&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qdevice&lt;br /&gt;
Agora vá para o shell do seu &#039;&#039;&#039;Proxmox principal&#039;&#039;&#039;, no meu caso o &#039;&#039;&#039;PVE01&#039;&#039;&#039; e adicione o Debian ao Cluster com o seguinte comando: &lt;br /&gt;
 # pvecm qdevice setup 192.168.1.3&lt;br /&gt;
Com o comando &#039;&#039;&#039;pvecm status&#039;&#039;&#039; podemos ver como está o quorum e se tudo ocorreu bem, verá que agora temos 3 votos no lugar de 2 e um &#039;&#039;&#039;Qdevice&#039;&#039;&#039; no membership:&lt;br /&gt;
[[Arquivo:Qdevice.png|nenhum|miniaturadaimagem|748x748px]]&lt;br /&gt;
Agora em se tratando de Cluster, você tem o mínimo de votantes para o bom funcionamento e usando uma máquina simples com Debian.&lt;br /&gt;
&lt;br /&gt;
== Adicionando um CEPH monitor e OSD ==&lt;br /&gt;
Agora precisamos tornar nosso &#039;&#039;&#039;CEPH&#039;&#039;&#039; saudável também e para isso vamos instalar os pacotes do CEPH do Proxmox no Debian. O CEPH precisa ser da mesma versão usada no Cluster Proxmox. Para os meus testes utilizei um &#039;&#039;&#039;Cluster Proxmox 9&#039;&#039;&#039; no &#039;&#039;&#039;PVE01&#039;&#039;&#039; e &#039;&#039;&#039;PVE02&#039;&#039;&#039; que utiliza o &#039;&#039;&#039;CEPH Squid 19.2&#039;&#039;&#039;. Então vamos adicionar o repositório:&lt;br /&gt;
 # echo &amp;quot;deb &amp;lt;nowiki&amp;gt;http://download.proxmox.com/debian/ceph-squid&amp;lt;/nowiki&amp;gt; trixie no-subscription&amp;quot; &amp;gt; /etc/apt/sources.list.d/ceph.list&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg&amp;lt;/nowiki&amp;gt; -O /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg&lt;br /&gt;
Instalando os pacotes do CEPH:&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install ceph ceph-common&lt;br /&gt;
Antes de prosseguir adicione no &#039;&#039;&#039;/etc/hosts&#039;&#039;&#039; do Debian:&lt;br /&gt;
 192.168.2.1 node1&lt;br /&gt;
 192.168.2.2 node2&lt;br /&gt;
 192.168.2.3 nodeq&lt;br /&gt;
Estou chamando nosso &#039;&#039;&#039;Quorum Device&#039;&#039;&#039; com o hostname &#039;&#039;&#039;nodeq&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Agora precisaremos executar algumas tarefas no nosso &#039;&#039;&#039;PVE01&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon getmap -o /tmp/monmap&lt;br /&gt;
 &lt;br /&gt;
 # monmaptool \&lt;br /&gt;
   --add nodeq 192.168.2.3:6789 \&lt;br /&gt;
   /tmp/monmap&lt;br /&gt;
Vamos checar se adicionamos o &#039;&#039;&#039;nodeq&#039;&#039;&#039; ao &#039;&#039;&#039;monmap&#039;&#039;&#039; com o comando: &#039;&#039;&#039;monmaptool --print /tmp/monmap&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Monmap.png|nenhum|miniaturadaimagem|677x677px]]&lt;br /&gt;
Vamos gerar o &#039;&#039;&#039;keyring&#039;&#039;&#039; para usarmos no Debian:&lt;br /&gt;
 # ceph auth get mon. -o /tmp/ceph.mon.keyring&lt;br /&gt;
Agora precisamos copiar todos os arquivos necessários do &#039;&#039;&#039;PVE01&#039;&#039;&#039; para o nosso Debian:&lt;br /&gt;
 # scp /tmp/monmap root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /tmp/ceph.mon.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/ceph.conf root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/priv/ceph.client.admin.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 &lt;br /&gt;
 # scp /var/lib/ceph/bootstrap-osd/ceph.keyring \&lt;br /&gt;
 root@192.168.2.3:/var/lib/ceph/bootstrap-osd/&lt;br /&gt;
&#039;&#039;&#039;Atenção&#039;&#039;&#039; &#039;&#039;&#039;agora&#039;&#039;&#039; pois vamos no nosso Debian alterar o arquivo &#039;&#039;&#039;/etc/ceph/ceph.conf&#039;&#039;&#039;. Primeiro modifique  o parâmetro abaixo para incluir o IP &#039;&#039;&#039;192.168.2.3&#039;&#039;&#039;:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
Modifique os dois parâmetros abaixo e deixe eles iguais a estes:&amp;lt;pre&amp;gt;&lt;br /&gt;
[client]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&lt;br /&gt;
[client.crash]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt;Adicione no final deste mesmo arquivo a configuração abaixo:&amp;lt;pre&amp;gt;&lt;br /&gt;
[mon.nodeq]&lt;br /&gt;
	public_addr = 192.168.2.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;Ainda no &#039;&#039;&#039;Debian&#039;&#039;&#039; execute os comandos abaixo para prepararmos o ambiente pro &#039;&#039;&#039;CEPH&#039;&#039;&#039;:&lt;br /&gt;
 # mkdir -p /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown ceph:ceph /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chmod 750 /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
Vamos criar o monitor:&lt;br /&gt;
 # ceph-mon --mkfs \&lt;br /&gt;
 -i nodeq \&lt;br /&gt;
 --monmap /etc/ceph/monmap \&lt;br /&gt;
 --keyring /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 &lt;br /&gt;
 # chown -R ceph: /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown -R ceph: /etc/ceph/&lt;br /&gt;
 # chmod 640 /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 # chmod 640 /etc/ceph/monmap&lt;br /&gt;
Este é o momento crucial para que tenhamos mais um monitor no nosso CEPH do Proxmox:&lt;br /&gt;
 # systemctl enable ceph-mon@nodeq&lt;br /&gt;
 # systemctl start ceph-mon@nodeq&lt;br /&gt;
Precisamos checar se o serviço subiu com o comando: &#039;&#039;&#039;systemctl status ceph-mon@nodeq&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se aparecer algo assim então parabéns, até aqui foi tudo OK:&lt;br /&gt;
[[Arquivo:Nodeq ceph.png|nenhum|miniaturadaimagem|806x806px]]Volte no Proxmox PVE01 e altere o &#039;&#039;&#039;/etc/pve/ceph.conf&#039;&#039;&#039; modificando para:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
E adicionando no final do arquivo:&lt;br /&gt;
 [mon.nodeq]&lt;br /&gt;
         public_addr = 192.168.2.3&lt;br /&gt;
Agora ativamos, ainda no &#039;&#039;&#039;Proxmox PVE01&#039;&#039;&#039;, o &#039;&#039;&#039;msgr2&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon enable-msgr2&lt;br /&gt;
No Debian reinicie o serviço:&lt;br /&gt;
 # systemctl restart ceph-mon@nodeq&lt;br /&gt;
No &#039;&#039;&#039;Proxmox&#039;&#039;&#039; em &#039;&#039;&#039;CEPH&#039;&#039;&#039; verá um novo Monitor adicionado:&lt;br /&gt;
[[Arquivo:Mon ceph.png|nenhum|miniaturadaimagem|598x598px]]&lt;br /&gt;
&lt;br /&gt;
== Adicionando o OSD no Debian ==&lt;br /&gt;
Agora vamos aos procedimentos para usarmos aquele SSD como OSD no CEPH. Vamos supor que o &#039;&#039;&#039;SSD livre&#039;&#039;&#039; seja o &#039;&#039;&#039;/dev/sdb&#039;&#039;&#039;:&lt;br /&gt;
 # apt install gdisk&lt;br /&gt;
 &lt;br /&gt;
 # wipefs -a /dev/sdb&lt;br /&gt;
 # sgdisk --zap&lt;br /&gt;
&lt;br /&gt;
Feito isso só precisamos criar o volume CEPH com o comando:&lt;br /&gt;
 # ceph-volume lvm create --data /dev/sdb&lt;br /&gt;
Se tudo foi bem, nesse momento verá o &#039;&#039;&#039;OSD&#039;&#039;&#039; no seu &#039;&#039;&#039;Cluster Proxmox&#039;&#039;&#039;:&lt;br /&gt;
[[Arquivo:Osd img.png|nenhum|miniaturadaimagem|1234x1234px]]&lt;br /&gt;
Olhando a saúde do nosso Cluster veremos:&lt;br /&gt;
[[Arquivo:Resultado ceph.png|nenhum|miniaturadaimagem|1235x1235px]]&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
Aqui vemos em funcionamento um &#039;&#039;&#039;Cluster Proxmox + HA&#039;&#039;&#039; com 2 nós apenas e uma máquina Debian servindo como apoio no funcionamento e segurança do Cluster.&lt;br /&gt;
&lt;br /&gt;
Gostou do artigo? Compartilhe!&lt;br /&gt;
&lt;br /&gt;
Autor: [[Sobre mim|Marcelo Gondim]]&lt;br /&gt;
[[Categoria:Artigos Técnicos]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1133</id>
		<title>Debian Cluster CEPH</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1133"/>
		<updated>2026-04-08T23:33:14Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
Este artigo tem como foco explicar como adicionar um Debian GNU/Linux em um Proxmox Cluster + HA com 2 nodes. Como muitos sabem, um &#039;&#039;&#039;Cluster&#039;&#039;&#039; deve ser composto de no &#039;&#039;&#039;mínimo 3 nodes&#039;&#039;&#039; para que possa dar segurança, existir &#039;&#039;&#039;quorum&#039;&#039;&#039; e quando usamos &#039;&#039;&#039;CEPH&#039;&#039;&#039; também precisamos de pelo menos 3 nodes com &#039;&#039;&#039;OSDs&#039;&#039;&#039; para termos uma estabilidade e segurança no sistema. O problema é quando se quer fazer  isso com apenas 2 servidores Proxmox. Comprar um terceiro servidor às vezes ainda não está nos planos mas você tem uma máquina parada, onde você pode adicionar 2 SSDs e com 4G de ram você pode adicionar ela no &#039;&#039;&#039;Cluster&#039;&#039;&#039; para servir de quorum e de disco &#039;&#039;&#039;CEPH&#039;&#039;&#039;.  Dessa maneira você consegue com 2 servidores &#039;&#039;&#039;Proxmox&#039;&#039;&#039; e uma máquina que chamei de &#039;&#039;&#039;Quorum Device&#039;&#039;&#039;, colocar em produção um Cluster com HA funcional.&lt;br /&gt;
&lt;br /&gt;
== Diagrama ==&lt;br /&gt;
O diagrama abaixo será o ambiente de exemplo mas não falaremos de como construir um Cluster + HA com Proxmox. Nesse caso você precisará ter os 2 servidores já instalados e configurados em &#039;&#039;&#039;Cluster&#039;&#039;&#039; com &#039;&#039;&#039;CEPH&#039;&#039;&#039;. Aqui vamos apenas mostrar como adicionar um Debian GNU/Linux nesse Cluster e no CEPH.&lt;br /&gt;
[[Arquivo:Diagrama cluster ceph.png|nenhum|miniaturadaimagem|522x522px]]&lt;br /&gt;
&lt;br /&gt;
== Pré-requisitos ==&lt;br /&gt;
&lt;br /&gt;
* Debian GNU/Linux 13 (Trixie).&lt;br /&gt;
* Uma máquina com 4G ou 8G de ram.&lt;br /&gt;
* 1 SSD para instalar o sistema.&lt;br /&gt;
* 1 SSD para servir de &#039;&#039;&#039;OSD&#039;&#039;&#039; no &#039;&#039;&#039;CEPH&#039;&#039;&#039;.&lt;br /&gt;
*3 interfaces de rede. Uma para o acesso, outra para o &#039;&#039;&#039;Cluster&#039;&#039;&#039; e outra para o &#039;&#039;&#039;CEPH&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Configurando o Qdevice no Debian ==&lt;br /&gt;
Uma vez instalado o Debian, precisamos configurar as 3 interfaces para a comunicação com seu Cluster Proxmox. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
* ens18 - IP 10.254.254.27/24 GW 10.254.254.1 (essa seria a interface com acesso à Internet para instalar os programas).&lt;br /&gt;
* ens19 - IP 192.168.1.3/24 (interface que deve se comunicar com a rede do Cluster, com os IPs dos nodes 192.168.1.1 e 192.168.1.2.&lt;br /&gt;
* ens20 - IP 192.168.2.3/24 (interface que se comunica com a rede CEPH, com os IPs 192.168.2.1 e 192.168.2.2.&lt;br /&gt;
&lt;br /&gt;
Precisamos configurar o serviço SSHD para permitir conexão com root, pois o Proxmox vai precisar acessar o Debian. Para isso altere o arquivo &#039;&#039;&#039;/etc/ssh/sshd_config&#039;&#039;&#039; o parâmetro abaixo:&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
Reinicie o serviço:&lt;br /&gt;
 # systemctl restart sshd&lt;br /&gt;
No Debian vamos instalar o pacote &#039;&#039;&#039;corosync-qnetd&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qnetd&lt;br /&gt;
Nos dois servidores Proxmox, no nosso exemplo PVE01 e PVE02 instalaremos o pacote &#039;&#039;&#039;corosync-qdevice&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qdevice&lt;br /&gt;
Agora vá para o shell do seu &#039;&#039;&#039;Proxmox principal&#039;&#039;&#039;, no meu caso o &#039;&#039;&#039;PVE01&#039;&#039;&#039; e adicione o Debian ao Cluster com o seguinte comando: &lt;br /&gt;
 # pvecm qdevice setup 192.168.1.3&lt;br /&gt;
Com o comando &#039;&#039;&#039;pvecm status&#039;&#039;&#039; podemos ver como está o quorum e se tudo ocorreu bem, verá que agora temos 3 votos no lugar de 2 e um &#039;&#039;&#039;Qdevice&#039;&#039;&#039; no membership:&lt;br /&gt;
[[Arquivo:Qdevice.png|nenhum|miniaturadaimagem|748x748px]]&lt;br /&gt;
Agora em se tratando de Cluster, você tem o mínimo de votantes para o bom funcionamento e usando uma máquina simples com Debian.&lt;br /&gt;
&lt;br /&gt;
== Adicionando um CEPH monitor e OSD ==&lt;br /&gt;
Agora precisamos tornar nosso &#039;&#039;&#039;CEPH&#039;&#039;&#039; saudável também e para isso vamos instalar os pacotes do CEPH do Proxmox no Debian. O CEPH precisa ser da mesma versão usada no Cluster Proxmox. Para os meus testes utilizei um &#039;&#039;&#039;Cluster Proxmox 9&#039;&#039;&#039; no &#039;&#039;&#039;PVE01&#039;&#039;&#039; e &#039;&#039;&#039;PVE02&#039;&#039;&#039; que utiliza o &#039;&#039;&#039;CEPH Squid 19.2&#039;&#039;&#039;. Então vamos adicionar o repositório:&lt;br /&gt;
 # echo &amp;quot;deb &amp;lt;nowiki&amp;gt;http://download.proxmox.com/debian/ceph-squid&amp;lt;/nowiki&amp;gt; trixie no-subscription&amp;quot; &amp;gt; /etc/apt/sources.list.d/ceph.list&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg&amp;lt;/nowiki&amp;gt; -O /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg&lt;br /&gt;
Instalando os pacotes do CEPH:&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install ceph ceph-common&lt;br /&gt;
Antes de prosseguir adicione no &#039;&#039;&#039;/etc/hosts&#039;&#039;&#039; do Debian:&lt;br /&gt;
 192.168.2.1 node1&lt;br /&gt;
 192.168.2.2 node2&lt;br /&gt;
 192.168.2.3 nodeq&lt;br /&gt;
Estou chamando nosso &#039;&#039;&#039;Quorum Device&#039;&#039;&#039; com o hostname &#039;&#039;&#039;nodeq&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Agora precisaremos executar algumas tarefas no nosso &#039;&#039;&#039;PVE01&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon getmap -o /tmp/monmap&lt;br /&gt;
 &lt;br /&gt;
 # monmaptool \&lt;br /&gt;
   --add nodeq 192.168.2.3:6789 \&lt;br /&gt;
   /tmp/monmap&lt;br /&gt;
Vamos checar se adicionamos o &#039;&#039;&#039;nodeq&#039;&#039;&#039; ao &#039;&#039;&#039;monmap&#039;&#039;&#039; com o comando: &#039;&#039;&#039;monmaptool --print /tmp/monmap&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Monmap.png|nenhum|miniaturadaimagem|677x677px]]&lt;br /&gt;
Vamos gerar o &#039;&#039;&#039;keyring&#039;&#039;&#039; para usarmos no Debian:&lt;br /&gt;
 # ceph auth get mon. -o /tmp/ceph.mon.keyring&lt;br /&gt;
Agora precisamos copiar todos os arquivos necessários do &#039;&#039;&#039;PVE01&#039;&#039;&#039; para o nosso Debian:&lt;br /&gt;
 # scp /tmp/monmap root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /tmp/ceph.mon.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/ceph.conf root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/priv/ceph.client.admin.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 &lt;br /&gt;
 # scp /var/lib/ceph/bootstrap-osd/ceph.keyring \&lt;br /&gt;
 root@192.168.2.3:/var/lib/ceph/bootstrap-osd/&lt;br /&gt;
&#039;&#039;&#039;Atenção&#039;&#039;&#039; &#039;&#039;&#039;agora&#039;&#039;&#039; pois vamos no nosso Debian alterar o arquivo &#039;&#039;&#039;/etc/ceph/ceph.conf&#039;&#039;&#039;. Primeiro modifique  o parâmetro abaixo para incluir o IP &#039;&#039;&#039;192.168.2.3&#039;&#039;&#039;:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
Modifique os dois parâmetros abaixo e deixe eles iguais a estes:&amp;lt;pre&amp;gt;&lt;br /&gt;
[client]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&lt;br /&gt;
[client.crash]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt;Adicione no final deste mesmo arquivo a configuração abaixo:&amp;lt;pre&amp;gt;&lt;br /&gt;
[mon.nodeq]&lt;br /&gt;
	public_addr = 192.168.2.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;Ainda no &#039;&#039;&#039;Debian&#039;&#039;&#039; execute os comandos abaixo para prepararmos o ambiente pro &#039;&#039;&#039;CEPH&#039;&#039;&#039;:&lt;br /&gt;
 # mkdir -p /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown ceph:ceph /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chmod 750 /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
Vamos criar o monitor:&lt;br /&gt;
 # ceph-mon --mkfs \&lt;br /&gt;
 -i nodeq \&lt;br /&gt;
 --monmap /etc/ceph/monmap \&lt;br /&gt;
 --keyring /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 &lt;br /&gt;
 # chown -R ceph: /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown -R ceph: /etc/ceph/&lt;br /&gt;
 # chmod 640 /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 # chmod 640 /etc/ceph/monmap&lt;br /&gt;
Este é o momento crucial para que tenhamos mais um monitor no nosso CEPH do Proxmox:&lt;br /&gt;
 # systemctl enable ceph-mon@nodeq&lt;br /&gt;
 # systemctl start ceph-mon@nodeq&lt;br /&gt;
Precisamos checar se o serviço subiu com o comando: &#039;&#039;&#039;systemctl status ceph-mon@nodeq&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se aparecer algo assim então parabéns, até aqui foi tudo OK:&lt;br /&gt;
[[Arquivo:Nodeq ceph.png|nenhum|miniaturadaimagem|806x806px]]Volte no Proxmox PVE01 e altere o &#039;&#039;&#039;/etc/pve/ceph.conf&#039;&#039;&#039; modificando para:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
E adicionando no final do arquivo:&lt;br /&gt;
 [mon.nodeq]&lt;br /&gt;
         public_addr = 192.168.2.3&lt;br /&gt;
Agora ativamos, ainda no &#039;&#039;&#039;Proxmox PVE01&#039;&#039;&#039;, o &#039;&#039;&#039;msgr2&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon enable-msgr2&lt;br /&gt;
No Debian reinicie o serviço:&lt;br /&gt;
 # systemctl restart ceph-mon@nodeq&lt;br /&gt;
No &#039;&#039;&#039;Proxmox&#039;&#039;&#039; em &#039;&#039;&#039;CEPH&#039;&#039;&#039; verá um novo Monitor adicionado:&lt;br /&gt;
[[Arquivo:Mon ceph.png|nenhum|miniaturadaimagem|598x598px]]&lt;br /&gt;
&lt;br /&gt;
== Adicionando o OSD no Debian ==&lt;br /&gt;
Agora vamos aos procedimentos para usarmos aquele SSD como OSD no CEPH. Vamos supor que o &#039;&#039;&#039;SSD livre&#039;&#039;&#039; seja o &#039;&#039;&#039;/dev/sdb&#039;&#039;&#039;:&lt;br /&gt;
 # apt install parted&lt;br /&gt;
 &lt;br /&gt;
 # parted /dev/sdb --script mklabel gpt&lt;br /&gt;
 &lt;br /&gt;
 # parted /dev/sdb --script \&lt;br /&gt;
 mkpart primary 0% 100%&lt;br /&gt;
Feito isso só precisamos criar o volume CEPH com o comando:&lt;br /&gt;
 # ceph-volume lvm create --data /dev/sdb1&lt;br /&gt;
Se tudo foi bem, nesse momento verá o &#039;&#039;&#039;OSD&#039;&#039;&#039; no seu &#039;&#039;&#039;Cluster Proxmox&#039;&#039;&#039;:&lt;br /&gt;
[[Arquivo:Osd img.png|nenhum|miniaturadaimagem|1234x1234px]]&lt;br /&gt;
Olhando a saúde do nosso Cluster veremos:&lt;br /&gt;
[[Arquivo:Resultado ceph.png|nenhum|miniaturadaimagem|1235x1235px]]&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
Aqui vemos em funcionamento um &#039;&#039;&#039;Cluster Proxmox + HA&#039;&#039;&#039; com 2 nós apenas e uma máquina Debian servindo como apoio no funcionamento e segurança do Cluster.&lt;br /&gt;
&lt;br /&gt;
Gostou do artigo? Compartilhe!&lt;br /&gt;
&lt;br /&gt;
Autor: [[Sobre mim|Marcelo Gondim]]&lt;br /&gt;
[[Categoria:Artigos Técnicos]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=P%C3%A1gina_principal&amp;diff=1132</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=P%C3%A1gina_principal&amp;diff=1132"/>
		<updated>2026-04-08T23:27:53Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Arquivo:Pascal.png|esquerda|semmoldura|554x554px]]&lt;br /&gt;
&lt;br /&gt;
= Bem vindo à Wiki ISPUP! =&lt;br /&gt;
Durante 29 anos trabalhando como &#039;&#039;&#039;sysadmin&#039;&#039;&#039; em ambientes &#039;&#039;&#039;Unix Like&#039;&#039;&#039; e com Redes em Provedores de Internet, acabei guardando algum conhecimento e essa Wiki é uma forma de disponibilizar para a comunidade, uma fonte de consulta de soluções para diversos problemas que encontrei ao longo da minha vida como profissional. Espero que te ajude assim como sempre me ajudou. Tenho muita documentação para postar aqui e por isso irei revisar e disponibilizar aos poucos. Vamos dar um UP! no seu ISP?&lt;br /&gt;
&lt;br /&gt;
Aqui veremos assuntos relacionados a &#039;&#039;&#039;Servidores GNU/Linux&#039;&#039;&#039;, &#039;&#039;&#039;Telecom&#039;&#039;&#039;, &#039;&#039;&#039;Serviços de Redes&#039;&#039;&#039;, &#039;&#039;&#039;Segurança da Informação&#039;&#039;&#039; e &#039;&#039;&#039;Boas Práticas&#039;&#039;&#039;. Os artigos e documentações serão voltados paras as comunidades &#039;&#039;&#039;ISP (Internet Service Provider)&#039;&#039;&#039;, &#039;&#039;&#039;ITP (Internet Transit Provider)&#039;&#039;&#039; e &#039;&#039;&#039;Debian&#039;&#039;&#039;.  &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Enquanto for &amp;quot;&#039;&#039;&#039;pequeno&#039;&#039;&#039;&amp;quot;, precisa pensar como um &amp;quot;&#039;&#039;&#039;grande&#039;&#039;&#039;&amp;quot;: precisa pensar nas boas práticas, se estruturar para o futuro e aí quando crescer e ficar &amp;quot;&#039;&#039;&#039;grande&#039;&#039;&#039;&amp;quot;, precisará pensar como um &amp;quot;&#039;&#039;&#039;pequeno&#039;&#039;&#039;&amp;quot;, para continuar melhorando a sua agilidade nos processos, na qualidade do atendimento e nos serviços entregues aos seus clientes.  &lt;br /&gt;
&lt;br /&gt;
As boas práticas trazem: &#039;&#039;&#039;segurança&#039;&#039;&#039;, &#039;&#039;&#039;credibilidade&#039;&#039;&#039;, &#039;&#039;&#039;estabilidade&#039;&#039;&#039; e &#039;&#039;&#039;qualidade&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;quot;UNIX is very simple, it just needs a genius to understand its simplicity.&amp;quot;&#039;&#039;&#039; Dennis Ritchie.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Índice ==&lt;br /&gt;
* [[Artigos Tecnicos|Artigos Técnicos]]&lt;br /&gt;
* [[Servicos de Redes e Servidores|Serviços de Redes e Servidores]]&lt;br /&gt;
* [[Dicas Tecnicas|Dicas Técnicas]]&lt;br /&gt;
* [[Links Uteis|Links úteis]]&lt;br /&gt;
* [[Sobre mim]]&lt;br /&gt;
&lt;br /&gt;
== Destaques ==&lt;br /&gt;
[[Debian Cluster CEPH]]&lt;br /&gt;
&lt;br /&gt;
[[Autenticacao TOTP Radius Tacacs Debian|Autenticação TOTP + Radius/Tacacs no Debian]]&lt;br /&gt;
&lt;br /&gt;
[[SSH SERVER 2FA|SSH Server com Autenticação 2FA]]&lt;br /&gt;
&lt;br /&gt;
[[Certificado TLS com ACME-DNS e DNS-01]]&lt;br /&gt;
&lt;br /&gt;
[[RPKI|RPKI (Resource Public Key Infrastructure)]]&lt;br /&gt;
&lt;br /&gt;
[[Recomendacao Mitigacao DDoS|Recomendações sobre Mitigação DDoS]]&lt;br /&gt;
&lt;br /&gt;
[[DNS Recursivo Anycast HyperLocal|DNS Recursivo Anycast com Hyperlocal]]&lt;br /&gt;
&lt;br /&gt;
[[Static Loop|Static Loop - um erro que pode matar seu ISP/ITP]]&lt;br /&gt;
&lt;br /&gt;
[[Portas Amplificacao DDoS|Portas de Amplificação DDoS e Botnets]]&lt;br /&gt;
&lt;br /&gt;
[[Servidor Logs CGNAT|Servidor de logs CGNAT]]&lt;br /&gt;
&lt;br /&gt;
[[Template Servidor Debian|Template de Servidor Debian GNU/Linux]]&lt;br /&gt;
&lt;br /&gt;
[[Policy Based Routing|Policy Based Routing (PBR)]]&lt;br /&gt;
&lt;br /&gt;
[[Compilando Bash|Compilando Shell Scripts com o SHC]]&lt;br /&gt;
&lt;br /&gt;
[[PHPIPAM|DCIM/IPAM com phpIPAM]]&lt;br /&gt;
&lt;br /&gt;
[[MSMTP com OAuth2|MSMTP com OAuth2 no Debian 12]]&lt;br /&gt;
&lt;br /&gt;
[[Geolocalizacao|Geolocalização e a Internet]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Debian powered.png|miniaturadaimagem|83x83px]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1131</id>
		<title>Debian Cluster CEPH</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Debian_Cluster_CEPH&amp;diff=1131"/>
		<updated>2026-04-08T23:26:01Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introdução ==&lt;br /&gt;
Este artigo tem como foco explicar como adicionar um Debian GNU/Linux em um Proxmox Cluster + HA com 2 nodes. Como muitos sabem, um &#039;&#039;&#039;Cluster&#039;&#039;&#039; deve ser composto de no &#039;&#039;&#039;mínimo 3 nodes&#039;&#039;&#039; para que possa dar segurança, existir &#039;&#039;&#039;quorum&#039;&#039;&#039; e quando usamos &#039;&#039;&#039;CEPH&#039;&#039;&#039; também precisamos de pelo menos 3 &#039;&#039;&#039;OSDs&#039;&#039;&#039; para termos uma estabilidade e segurança no sistema. O problema é quando se quer fazer  isso com apenas 2 servidores Proxmox. Comprar um terceiro servidor às vezes ainda não está nos planos mas você tem uma máquina parada, onde você pode adicionar 2 SSDs e com 4G de ram você pode adicionar ela no &#039;&#039;&#039;Cluster&#039;&#039;&#039; para servir de quorum e de disco &#039;&#039;&#039;CEPH&#039;&#039;&#039;.  Dessa maneira você consegue com 2 servidores &#039;&#039;&#039;Proxmox&#039;&#039;&#039; e uma máquina que chamei de &#039;&#039;&#039;Quorum Device&#039;&#039;&#039;, colocar em produção um Cluster com HA funcional.&lt;br /&gt;
&lt;br /&gt;
== Diagrama ==&lt;br /&gt;
O diagrama abaixo será o ambiente de exemplo mas não falaremos de como construir um Cluster + HA com Proxmox. Nesse caso você precisará ter os 2 servidores já instalados e configurados em &#039;&#039;&#039;Cluster&#039;&#039;&#039; com &#039;&#039;&#039;CEPH&#039;&#039;&#039;. Aqui vamos apenas mostrar como adicionar um Debian GNU/Linux nesse Cluster e no CEPH.&lt;br /&gt;
[[Arquivo:Diagrama cluster ceph.png|nenhum|miniaturadaimagem|522x522px]]&lt;br /&gt;
&lt;br /&gt;
== Pré-requisitos ==&lt;br /&gt;
&lt;br /&gt;
* Debian GNU/Linux 13 (Trixie).&lt;br /&gt;
* Uma máquina com 4G ou 8G de ram.&lt;br /&gt;
* 1 SSD para instalar o sistema.&lt;br /&gt;
* 1 SSD para servir de &#039;&#039;&#039;OSD&#039;&#039;&#039; no &#039;&#039;&#039;CEPH&#039;&#039;&#039;.&lt;br /&gt;
*3 interfaces de rede. Uma para o acesso, outra para o &#039;&#039;&#039;Cluster&#039;&#039;&#039; e outra para o &#039;&#039;&#039;CEPH&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== Configurando o Qdevice no Debian ==&lt;br /&gt;
Uma vez instalado o Debian, precisamos configurar as 3 interfaces para a comunicação com seu Cluster Proxmox. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
* ens18 - IP 10.254.254.27/24 GW 10.254.254.1 (essa seria a interface com acesso à Internet para instalar os programas).&lt;br /&gt;
* ens19 - IP 192.168.1.3/24 (interface que deve se comunicar com a rede do Cluster, com os IPs dos nodes 192.168.1.1 e 192.168.1.2.&lt;br /&gt;
* ens20 - IP 192.168.2.3/24 (interface que se comunica com a rede CEPH, com os IPs 192.168.2.1 e 192.168.2.2.&lt;br /&gt;
&lt;br /&gt;
Precisamos configurar o serviço SSHD para permitir conexão com root, pois o Proxmox vai precisar acessar o Debian. Para isso altere o arquivo &#039;&#039;&#039;/etc/ssh/sshd_config&#039;&#039;&#039; o parâmetro abaixo:&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
Reinicie o serviço:&lt;br /&gt;
 # systemctl restart sshd&lt;br /&gt;
No Debian vamos instalar o pacote &#039;&#039;&#039;corosync-qnetd&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qnetd&lt;br /&gt;
Nos dois servidores Proxmox, no nosso exemplo PVE01 e PVE02 instalaremos o pacote &#039;&#039;&#039;corosync-qdevice&#039;&#039;&#039;:&lt;br /&gt;
 # apt install corosync-qdevice&lt;br /&gt;
Agora vá para o shell do seu &#039;&#039;&#039;Proxmox principal&#039;&#039;&#039;, no meu caso o &#039;&#039;&#039;PVE01&#039;&#039;&#039; e adicione o Debian ao Cluster com o seguinte comando: &lt;br /&gt;
 # pvecm qdevice setup 192.168.1.3&lt;br /&gt;
Com o comando &#039;&#039;&#039;pvecm status&#039;&#039;&#039; podemos ver como está o quorum e se tudo ocorreu bem, verá que agora temos 3 votos no lugar de 2 e um &#039;&#039;&#039;Qdevice&#039;&#039;&#039; no membership:&lt;br /&gt;
[[Arquivo:Qdevice.png|nenhum|miniaturadaimagem|748x748px]]&lt;br /&gt;
Agora em se tratando de Cluster, você tem o mínimo de votantes para o bom funcionamento e usando uma máquina simples com Debian.&lt;br /&gt;
&lt;br /&gt;
== Adicionando um CEPH monitor e OSD ==&lt;br /&gt;
Agora precisamos tornar nosso &#039;&#039;&#039;CEPH&#039;&#039;&#039; saudável também e para isso vamos instalar os pacotes do CEPH do Proxmox no Debian. O CEPH precisa ser da mesma versão usada no Cluster Proxmox. Para os meus testes utilizei um &#039;&#039;&#039;Cluster Proxmox 9&#039;&#039;&#039; no &#039;&#039;&#039;PVE01&#039;&#039;&#039; e &#039;&#039;&#039;PVE02&#039;&#039;&#039; que utiliza o &#039;&#039;&#039;CEPH Squid 19.2&#039;&#039;&#039;. Então vamos adicionar o repositório:&lt;br /&gt;
 # echo &amp;quot;deb &amp;lt;nowiki&amp;gt;http://download.proxmox.com/debian/ceph-squid&amp;lt;/nowiki&amp;gt; trixie no-subscription&amp;quot; &amp;gt; /etc/apt/sources.list.d/ceph.list&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg&amp;lt;/nowiki&amp;gt; -O /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg&lt;br /&gt;
Instalando os pacotes do CEPH:&lt;br /&gt;
 # apt update&lt;br /&gt;
 # apt install ceph ceph-common&lt;br /&gt;
Antes de prosseguir adicione no &#039;&#039;&#039;/etc/hosts&#039;&#039;&#039; do Debian:&lt;br /&gt;
 192.168.2.1 node1&lt;br /&gt;
 192.168.2.2 node2&lt;br /&gt;
 192.168.2.3 nodeq&lt;br /&gt;
Estou chamando nosso &#039;&#039;&#039;Quorum Device&#039;&#039;&#039; com o hostname &#039;&#039;&#039;nodeq&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Agora precisaremos executar algumas tarefas no nosso &#039;&#039;&#039;PVE01&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon getmap -o /tmp/monmap&lt;br /&gt;
 &lt;br /&gt;
 # monmaptool \&lt;br /&gt;
   --add nodeq 192.168.2.3:6789 \&lt;br /&gt;
   /tmp/monmap&lt;br /&gt;
Vamos checar se adicionamos o &#039;&#039;&#039;nodeq&#039;&#039;&#039; ao &#039;&#039;&#039;monmap&#039;&#039;&#039; com o comando: &#039;&#039;&#039;monmaptool --print /tmp/monmap&#039;&#039;&#039;&lt;br /&gt;
[[Arquivo:Monmap.png|nenhum|miniaturadaimagem|677x677px]]&lt;br /&gt;
Vamos gerar o &#039;&#039;&#039;keyring&#039;&#039;&#039; para usarmos no Debian:&lt;br /&gt;
 # ceph auth get mon. -o /tmp/ceph.mon.keyring&lt;br /&gt;
Agora precisamos copiar todos os arquivos necessários do &#039;&#039;&#039;PVE01&#039;&#039;&#039; para o nosso Debian:&lt;br /&gt;
 # scp /tmp/monmap root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /tmp/ceph.mon.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/ceph.conf root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 # scp /etc/pve/priv/ceph.client.admin.keyring root@192.168.2.3:/etc/ceph/&lt;br /&gt;
 &lt;br /&gt;
 # scp /var/lib/ceph/bootstrap-osd/ceph.keyring \&lt;br /&gt;
 root@192.168.2.3:/var/lib/ceph/bootstrap-osd/&lt;br /&gt;
&#039;&#039;&#039;Atenção&#039;&#039;&#039; &#039;&#039;&#039;agora&#039;&#039;&#039; pois vamos no nosso Debian alterar o arquivo &#039;&#039;&#039;/etc/ceph/ceph.conf&#039;&#039;&#039;. Primeiro modifique  o parâmetro abaixo para incluir o IP &#039;&#039;&#039;192.168.2.3&#039;&#039;&#039;:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
Modifique os dois parâmetros abaixo e deixe eles iguais a estes:&amp;lt;pre&amp;gt;&lt;br /&gt;
[client]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&lt;br /&gt;
[client.crash]&lt;br /&gt;
	keyring = /etc/ceph/$cluster.$name.keyring&lt;br /&gt;
&amp;lt;/pre&amp;gt;Adicione no final deste mesmo arquivo a configuração abaixo:&amp;lt;pre&amp;gt;&lt;br /&gt;
[mon.nodeq]&lt;br /&gt;
	public_addr = 192.168.2.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;Ainda no &#039;&#039;&#039;Debian&#039;&#039;&#039; execute os comandos abaixo para prepararmos o ambiente pro &#039;&#039;&#039;CEPH&#039;&#039;&#039;:&lt;br /&gt;
 # mkdir -p /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown ceph:ceph /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chmod 750 /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
Vamos criar o monitor:&lt;br /&gt;
 # ceph-mon --mkfs \&lt;br /&gt;
 -i nodeq \&lt;br /&gt;
 --monmap /etc/ceph/monmap \&lt;br /&gt;
 --keyring /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 &lt;br /&gt;
 # chown -R ceph: /var/lib/ceph/mon/ceph-nodeq&lt;br /&gt;
 # chown -R ceph: /etc/ceph/&lt;br /&gt;
 # chmod 640 /etc/ceph/ceph.mon.keyring&lt;br /&gt;
 # chmod 640 /etc/ceph/monmap&lt;br /&gt;
Este é o momento crucial para que tenhamos mais um monitor no nosso CEPH do Proxmox:&lt;br /&gt;
 # systemctl enable ceph-mon@nodeq&lt;br /&gt;
 # systemctl start ceph-mon@nodeq&lt;br /&gt;
Precisamos checar se o serviço subiu com o comando: &#039;&#039;&#039;systemctl status ceph-mon@nodeq&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se aparecer algo assim então parabéns, até aqui foi tudo OK:&lt;br /&gt;
[[Arquivo:Nodeq ceph.png|nenhum|miniaturadaimagem|806x806px]]Volte no Proxmox PVE01 e altere o &#039;&#039;&#039;/etc/pve/ceph.conf&#039;&#039;&#039; modificando para:&lt;br /&gt;
 mon_host = 192.168.2.1 192.168.2.2 192.168.2.3&lt;br /&gt;
E adicionando no final do arquivo:&lt;br /&gt;
 [mon.nodeq]&lt;br /&gt;
         public_addr = 192.168.2.3&lt;br /&gt;
Agora ativamos, ainda no &#039;&#039;&#039;Proxmox PVE01&#039;&#039;&#039;, o &#039;&#039;&#039;msgr2&#039;&#039;&#039;:&lt;br /&gt;
 # ceph mon enable-msgr2&lt;br /&gt;
No Debian reinicie o serviço:&lt;br /&gt;
 # systemctl restart ceph-mon@nodeq&lt;br /&gt;
No &#039;&#039;&#039;Proxmox&#039;&#039;&#039; em &#039;&#039;&#039;CEPH&#039;&#039;&#039; verá um novo Monitor adicionado:&lt;br /&gt;
[[Arquivo:Mon ceph.png|nenhum|miniaturadaimagem|598x598px]]&lt;br /&gt;
&lt;br /&gt;
== Adicionando o OSD no Debian ==&lt;br /&gt;
Agora vamos aos procedimentos para usarmos aquele SSD como OSD no CEPH. Vamos supor que o &#039;&#039;&#039;SSD livre&#039;&#039;&#039; seja o &#039;&#039;&#039;/dev/sdb&#039;&#039;&#039;:&lt;br /&gt;
 # apt install parted&lt;br /&gt;
 &lt;br /&gt;
 # parted /dev/sdb --script mklabel gpt&lt;br /&gt;
 &lt;br /&gt;
 # parted /dev/sdb --script \&lt;br /&gt;
 mkpart primary 0% 100%&lt;br /&gt;
Feito isso só precisamos criar o volume CEPH com o comando:&lt;br /&gt;
 # ceph-volume lvm create --data /dev/sdb1&lt;br /&gt;
Se tudo foi bem, nesse momento verá o &#039;&#039;&#039;OSD&#039;&#039;&#039; no seu &#039;&#039;&#039;Cluster Proxmox&#039;&#039;&#039;:&lt;br /&gt;
[[Arquivo:Osd img.png|nenhum|miniaturadaimagem|1234x1234px]]&lt;br /&gt;
Olhando a saúde do nosso Cluster veremos:&lt;br /&gt;
[[Arquivo:Resultado ceph.png|nenhum|miniaturadaimagem|1235x1235px]]&lt;br /&gt;
&lt;br /&gt;
== Conclusão ==&lt;br /&gt;
Aqui vemos em funcionamento um &#039;&#039;&#039;Cluster Proxmox + HA&#039;&#039;&#039; com 2 nós apenas e uma máquina Debian servindo como apoio no funcionamento e segurança do Cluster.&lt;br /&gt;
&lt;br /&gt;
Gostou do artigo? Compartilhe!&lt;br /&gt;
&lt;br /&gt;
Autor: [[Sobre mim|Marcelo Gondim]]&lt;br /&gt;
[[Categoria:Artigos Técnicos]]&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Arquivo:Resultado_ceph.png&amp;diff=1130</id>
		<title>Arquivo:Resultado ceph.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Arquivo:Resultado_ceph.png&amp;diff=1130"/>
		<updated>2026-04-08T23:20:57Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;resultado_ceph&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Arquivo:Osd_img.png&amp;diff=1129</id>
		<title>Arquivo:Osd img.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Arquivo:Osd_img.png&amp;diff=1129"/>
		<updated>2026-04-08T23:18:52Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;osd_img&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
	<entry>
		<id>https://wiki.ispup.com.br/w/index.php?title=Arquivo:Mon_ceph.png&amp;diff=1128</id>
		<title>Arquivo:Mon ceph.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.ispup.com.br/w/index.php?title=Arquivo:Mon_ceph.png&amp;diff=1128"/>
		<updated>2026-04-08T23:11:34Z</updated>

		<summary type="html">&lt;p&gt;Gondim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;mon_ceph&lt;/div&gt;</summary>
		<author><name>Gondim</name></author>
	</entry>
</feed>