Criando seu próprio servidor de DNS dinâmico (nsupdate + bind9)

Rotina útil pra quem tem acesso à configuração do servidor DNS (bind) de seu provedor ou é o próprio administrador de tal. Aqui veremos como fazer para ter um subdomínio apontando de forma permanente para seu IP dinâmico ADSL. Enfim, vamos criar um dyndns ou no-ip da vida.

[ Hits: 183.326 ]

Por: Fábio Berbert de Paula em 03/07/2007 | Blog: https://fabio.automatizando.dev


Segurança: preparando a chave de assinatura do servidor



Vamos começar preparando o servidor para receber as atualizações de DNS a partir de seu desktop. O pulo-do-gato dessa rotina está na opção "allow-update" que será incluída na configuração de zona do seu domínio.

Como estou falando de administrador para administrador, estou certo de que você sabe o que é uma zona né? Se não sabe, consulte alguma literatura sobre fundamentos de DNS aqui mesmo no site.

Mas aí você pergunta, ué... não é inseguro liberar meu servidor para receber updates de outras máquinas pela internet? Não, a segurança é feita a partir de chaves criptografadas de até 512 bits conhecidas como assinaturas de transação, ou TSIG (Transaction SIGnature).

De posse de um terminal no servidor, digite:

# cd /etc/bind
# dnssec-keygen -a HMAC-MD5 -b 512 -n HOST server


Acessamos o diretório de configuração do bind (/etc/bind no Debian) e criamos uma assinatura TSIG da seguinte forma:
  • -a HMAC-MD5: algoritmo utilizado para criação da chave;
  • -b 512: tamanho em bits da chave. Esse número varia de acordo com o algoritmos escolhido na opção anterior;
  • -n HOST: o tipo de dono da chave (case-sensitive);
  • server: o nome da chave em si.

Para maiores explicações sobre os parâmetros usados, digite:

$ man dnssec-keygen

Se tudo correu bem foram gerados 2 arquivos no seguinte formato:

K<keyname>+157+<keyid>.private
K<keyname>+157+<keyid>.key

Onde keyname é o nome da chave (server em nosso exemplo) e keyid o número de identificação único para a chave. Veja:

# ls K*
Kserver.+157+31518.key Kserver.+157+31518.private

A informação que vamos usar adiante é o campo "Key" de qualquer dos arquivos:

# grep ^Key Kserver.+157+31518.private
Key: FGbUIzPEbJgyEkDxEYccrxVTLQ==

NOTA: Por questões de didática "cortei" um bom pedaço do hash da chave gerada. O que vamos usar é neste artigo é o "FGbUIzPEbJgyEkDxEYccrxVTLQ==" e o nome da chave, "server".

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Segurança: preparando a chave de assinatura do servidor
   3. Configurando o BIND
   4. Configurando seu desktop/ADSL para atualizar o DNS
   5. Bônus: Gambiarra pra liberar acesso ao meu IP dinâmico
Outros artigos deste autor

Kdenlive - Como desfocar/borrar rosto, área ou objetos em um vídeo

O Linux e o Star Office

Como Turbinar sua Produtividade com VIM - Guia Definitivo do Desenvolvedor

Como ter o chatGPT no terminal Linux

Organizando projetos com a classe FastTemplate (parte 2)

Leitura recomendada

Por que eu pago por 10 megas, mas só faço download a 1 mega?

SOCKS - Acessando Hosts remotos via OpenSSH

Configurando um servidor DNS rápido e fácil

DNS com BIND

Transmissão de dados via telemetria: uma opção de comunicação remota

  
Comentários
[1] Comentário enviado por M4v3r1ck_RJ em 03/07/2007 - 10:37h

MARAVILHOSO !!!!!!!!
VC EH O CARA FABIAUM !!!!!!!!

Assim que chegar em casa vou configurar o Bind no Slack e vou fazer segundo sua dica !!!

Abraços !!!!!!! ;)

Ps.: Valew mesmo salvou minha vida !!! hauahuahua

[2] Comentário enviado por removido em 03/07/2007 - 11:30h

Genial!!!
Esta familia Berbert nao brinca em servico mesmo ;)
[] 's

[3] Comentário enviado por slacklex em 03/07/2007 - 12:43h

Muito bom mesmo!! Vou testar aqui! Obrigado..

[4] Comentário enviado por viniciuscordeiro em 03/07/2007 - 15:43h

Esse comando para pegar o IP só vai funcionar se vc tiver diretamente conectado ao modem velox?

IP=`ifconfig $INTERFACE | grep inet | cut -d ":" -f 2 | tr -d a-z,A-Z,- | sed 's/\s//g';`

Se você estiver em uma rede esse comando só vai retornar o IP interno... Além do mais que estava tentando utilizar essa solução no meu notebook, que posso estar conectado na internet de várias formas (LAN, WIFI, BlueTooth, Modem), então seria interessante que o script "checasse" qual(is) interface(s) está(ão) conectada(s) e pegasse o IP EXTERNO dessa interface ou simplesmente a solução mais rápida que eu achei foi pegar o IP através de um site...

lynx -dump www.whatismyip.com | grep Your | awk '{if(!m && match($0,/[0-9]+.[0-9]+.[0-9]+.[0-9]+/,a)){print a[0];m=1}}'

Claro que não vou entrar no mérito da questão de abrir portas para esse DNS dinâmico, pois de nada adianta eu estar na rede do meu cliente com meu notebook e o modem dele estiver com o FIREWALL bloqueando todo e qualquer tipo de acesso...

O que você acha de tudo isso?

[5] Comentário enviado por fabio em 03/07/2007 - 15:57h

Se sua interface de conexão for diferente de ppp0, basta mudar o valor da variável INTERFACE no script.

Bacana sua linha de comando do whatismyip, funciona melhor que a minha do script local, porém o sistema fica dependendo do site em questão. Se o site cair, mudar de domínio ou acabar, vc terá que mudar seu script, enquanto que localmente o processo nunca vai mudar.

Um abraço.

[6] Comentário enviado por slaypher em 03/07/2007 - 16:05h

Olá,

Parabéns pelo artigo, mas tenho uma questão que surgiu no final:

# adiciona 3 regras no canal início do canal INPUT
$IPT -I INPUT -p tcp --dport 3306 -j DROP
$IPT -I INPUT -p tcp -i lo --dport 3306 -j ACCEPT
$IPT -I INPUT -p tcp -s casa.acme.com --dport 3306 -j ACCEPT

Ao adicionar essas regras ela não irá bloquear inclusive as conexões locais, pois a primeira regra para bloquear qualquer conexão independente de onde veio, se foi local ou não.

[]'s

[7] Comentário enviado por fabio em 03/07/2007 - 16:08h

Olá slaypher, no artigo tem citado isso, a princípio parece isso, mas o parâmetro "-I" insere a regra no início da fila do canal. Sendo assim a regra que libera pro localhost fica antes da regra que bloqueia tudo. Se eu tivesse usado p "-i" (minúsculo) ou o "-A", aí sim ia dar problema.

Um abraço.

[8] Comentário enviado por viniciuscordeiro em 03/07/2007 - 16:10h

Fabio, mas aqui quando utilizo sua linha ele só me retorna o IP INTERNO da rede... Se o DNS casa.acme.com estiver apontando para 192.168.0.1 por exemplo, os outros computadores que estiverem na mesma rede irão te encontrar por esse domínio?

[9] Comentário enviado por fabio em 03/07/2007 - 16:14h

Na mesma rede sim, sem problemas. Quem tiver na internet que não vai conseguir.

[10] Comentário enviado por viniciuscordeiro em 03/07/2007 - 16:24h

Ummm... também é interessante... então o ideal é criar 2 hosts pra update, local.acme.com e externo.acme.com

Pq aí ficaria completo não é?

[11] Comentário enviado por fabio em 03/07/2007 - 16:31h

Isso aí! No script nsupdate.sh vc pode colocar quantos "UPDATE delete" e "UPDATE add $HOST" quiser. É só adaptá-lo.

[12] Comentário enviado por pankdo em 04/07/2007 - 12:09h

Show de bola Fabio

mas tenho uma duvida
eu poderia fazer algo semelhante para atualizar o IP do próprio servidor?
e o seguinte tenho uma maquina como gateway da rede com
2 ADSLs com IP dinâmico
e um link com IP estático
cada um ligado em uma placa de rede diferente
isso forma um unico link com load-balance para fornecer acesso de internet a rede interna o qual tambem hospeda um bind9
eu preciso saber o IP das interfaces ADSL
e relacionar com um nome(DNS)
depois eu faria um outro load-balance do tipo servidor sujo (como a google faz)
para desafogar o meu unico link com IP estático
pois este gateway também hospeda um site
a sempre que temos que acessa-lo de fora da rede somos obrigados a usar o unico link com IP estático ou entrar no gateway descobrir os IPs dos ADSLs e acessar utilizando o IP direto no navegador o que e um grande problema pois nem todo mundo tem permissão para entrar no gateway(na realidade so eu ai eu entro e tenho que pagar o IP e mandar pro pessoal)
sera que esse meu problema tem solucao ???

desde ja agradeço

[13] Comentário enviado por shocker em 05/07/2007 - 09:23h

Excelente artigo Fábio, como sempre aliás.
Grande abraço.

Atc,
Alan Cota.

[14] Comentário enviado por zapp em 17/07/2007 - 16:53h

Otimo Artigo....
tem uns erros por causa do formato de data de cada servidor... em casa esta UTC em no meu server de DNS esta BR mas corrigi isso e deu certo..... depois deu eu erro de permissao, mas tb arrumei...
conclusao tudo funcionando..... Perfeito..


[15] Comentário enviado por leoberbert em 23/07/2007 - 08:57h

Fabio....

No Slackware vc saberia me informar os pacotes necessários? Outra coisa, é realmente necessário ter uma interface pppoe? Pois estou debaixo de um router tb, mas creio que não seja..... Fico no aguardo!!!

Pois to numa briga aqui

[16] Comentário enviado por fabio em 23/07/2007 - 09:04h

Leo,

Só é necessário o comando nsupdate, pesquisa em que pacote ele se encontra no Slackware. Se está debaixo de um router, o único sentido de usar isso é se você redirecionar alguma porta do router (IP real) pra sua máquina interna, como por exemplo a do SSH.

[17] Comentário enviado por melare em 21/10/2007 - 18:32h

tudo bem Fabio,

No debian estou com a seguinte mensagem bindrndc: connect failed: 127.0.0.1#953: connection refused
failed!

Poderia me ajudar..

obrigado pela atenção

[18] Comentário enviado por lucasamorim em 09/11/2007 - 18:16h

Olá,

Uso Velox Residencial com IP dinâmico. Meu desktop Debian está conectado à saída RJ45 do meu modem roteado speedstream 5200. A saída de ifconfig para mim é bem diferente da do artigo, o que eu devo mudar no procedimento? veja:
eth0 Link encap:Ethernet HWaddr 00:1A:4D:A2:8C:77
inet addr:192.168.254.2 Bcast:192.168.254.255 Mask:255.255.255.0
inet6 addr: fe80::21a:4dff:fea2:8c77/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:208387 errors:0 dropped:0 overruns:0 frame:0
TX packets:196515 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:207925971 (198.2 MiB) TX bytes:16364967 (15.6 MiB)
Interrupt:18 Base address:0xc000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:50 errors:0 dropped:0 overruns:0 frame:0
TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3364 (3.2 KiB) TX bytes:3364 (3.2 KiB)


[19] Comentário enviado por abelardo em 20/12/2007 - 10:14h

bom dia fabio, seguinte estou com um problema aqui na minha rede, ela ta muito lenta e existem alguns nomes que eu nao estou conseguindo resolver, como o do www.vivaolinux.com.br, nao estou conseguindo nem pingar nele, mas em outros sites estou entrando normal, apenas alguns sites que estao assim,

ai esta o meus logs

http://paste.lymas.com.br//?q=11948

agradeço se puder ajudar!!

[20] Comentário enviado por onlline em 26/12/2007 - 16:04h

Oi boa tarde, Eu consegui ate configurar o bind mas a parte do NSUPDATE fla que enviou a atualização mas nada de mandar o update no servidor bind.. eu uso o Debian teste no 3.1 r5 e no 4.0r1 , gostaria de saber se alguem poderia me mandar as configurações de dns e do nsupdate, pra ver se eu consigo!

[21] Comentário enviado por onlline em 26/12/2007 - 16:14h

Eu consegui um cliente tipo NSUPDATE para WINDOWS XP muito bom ,,
o nome dele é (DynSite) ele não é free! mas no meu caso não consegui funcionar nem com o NSUPDATE e Nem com Ele!

[22] Comentário enviado por onlline em 27/12/2007 - 22:08h

Quando mando manualmente,

nsupdate –d –k /root/Klinuxbsd.com.br.+157+15055.key
Creating key…
server 192.168.149.128
zone onlline.solutions
update delete leo.onlline.solutions
update add leo.onlline.solutions 90 A 200.200.200.200
send

Da erro REFUSED


se eu mandar pelo script do site da NOAUTH

[23] Comentário enviado por onlline em 27/12/2007 - 23:39h

Eu fiz o Teste com o Fedora 6 deu erro tambem REFUSED tanto no scriipt como manual ,....





Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: REFUSED, id: 14845
;; flags: qr ra ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; TSIG PSEUDOSECTION:
leo. 0 ANY TSIG hmac-md5.sig-alg.reg.int. 1198

[24] Comentário enviado por marrichi em 13/05/2008 - 19:24h

[i] parabens...


otimo artigo


\ô/

[25] Comentário enviado por nardin em 13/07/2008 - 11:08h

Estou com uma dúvida.

Pra fazer essas configurações o modem prescisa ser bridge ou router?
Quando uso meu modem bridge eu consigo uma interface ppp0 como a sua, mas com o router fica a eth0 com um ip interno.

Se for pra usar o bridge como ficaria os arquivos de Registros de Recursos? Por exemplo, de uma olhada como está configurado o meu.

$TTL 43200
@ IN SOA rockstar.leonardocostaborges.com. root.leonardocostaborges.com. (
1 ; Serial
3600 ; Refresh
900 ; Retry
1209600 ; Expire
43200 ) ; Negative Cache TTL
;
@ IN NS rockstar.leonardocostaborges.com.
@ IN A 192.168.1.64
rockstar IN A 192.168.1.64
www IN CNAME rockstar

[26] Comentário enviado por jef.ferregato em 07/02/2010 - 18:33h

olá alguem pode me ajudar estou a dias tentando resolver isso e ainda não consegui, sou iniciante na comunidade Linux e por enquanto utilizo o Suse e o RedHat.

O quadro é o seguinte:

tenho um DSL PPoe (ip dinamico), um router D-link WBR 1310 (ele que disca e faz a autenticação), e uma rede com o range de ip de 192.168.0.100 a 192.168.0.199.

nesta rede está um servidor ftp/ssh/web, cujo o ip é 192.168.0.157

como o router não tem o o cliente ddns interno optei por instalar um cliente ddns no própio servidor, a instalação foi bem facil e a configuração está feita sobre a interface eth0, que é a placa onde recebe dhcp do router citado.

No entanto o proposito do meu ddns é que o ele atualize o ip publico para que eu tenha este acesso de fora, mas ele está atualizando o ip inteno (192.168.0.157) o que eu faço para ele atualizar o ip externo sendo que na interface tenho que colocar eth0?

se alguem puder me ajudar ficarei imensamente grato.



[27] Comentário enviado por Finallf em 31/03/2013 - 11:53h

Para obter o IP externo independente da interface usada podemos mudar esta parte:
IP=`ifconfig $INTERFACE | grep inet | cut -d ":" -f 2 | tr -d a-z,A-Z,- | sed 's/\s//g';`

para:
IP="$(curl ifconfig.me)"

Assim funciona para todo mundo, basta que para isso tenha o pacote cURL

[28] Comentário enviado por fabio em 01/04/2013 - 07:41h

Bela dica Finallf, obrigado pela adição.

[29] Comentário enviado por Alfredo_Silveira em 03/06/2013 - 12:38h

Caro Fábio,
Eu poderia utilizar como clientes, neste caso, modems 3G que permitissem apontar para o meu servidor DDNS (FreeBSD 9.1)?
Estou precisando montar um servidor DDNS, mas ele irá coletar os IPs dinâmicos de modems 3G. Só que nestes modems posso configurar um domínio no qual ele se conecta.

Desde já grato pela atenção.

[30] Comentário enviado por mpbabilio em 27/03/2015 - 11:48h


Bom Dia Fabio,

Muito bom o artigo. Me ajudou muito. só tenho duas observações a fazer.

1- Quem usa o apparmor e o Bind com chroot, tem que apontar o caminho do chroot no arquivo /etc/apparmor.d/usr.bin.named com permissão de leitura e escrita.

2- em se tratando de ips dinâmicos, o ttl de 1440 é um pouco alto ainda, estou trabalhando com 30 segundos.

ps: estou trabalhando em um script para verificar periodicamente o IP e só atualizar o DNS quando houver uma mudança efetiva do IP, assim que estiver pronto publico aqui.

[31] Comentário enviado por fabio em 27/03/2015 - 13:45h


[30] Comentário enviado por mpbabilio em 27/03/2015 - 11:48h


Bom Dia Fabio,

Muito bom o artigo. Me ajudou muito. só tenho duas observações a fazer.

1- Quem usa o apparmor e o Bind com chroot, tem que apontar o caminho do chroot no arquivo /etc/apparmor.d/usr.bin.named com permissão de leitura e escrita.

2- em se tratando de ips dinâmicos, o ttl de 1440 é um pouco alto ainda, estou trabalhando com 30 segundos.

ps: estou trabalhando em um script para verificar periodicamente o IP e só atualizar o DNS quando houver uma mudança efetiva do IP, assim que estiver pronto publico aqui.


Boa Martins, obrigado por somar ao artigo.

[32] Comentário enviado por udson em 25/01/2016 - 21:32h

Caro,

Estou tentando subir um servidor ddns usando seu manual, porém estou tendo problemas de autenticação, poderia me ajudar ?

Veja erros abaixo:

Da parte do cliente:

root@Firewall:/etc/bind/key# nsupdate ^C "escritorio.brfonetelecom.com:Y/Cx39zKx5WIgQRoGfu/UfwsbSHr3yQ98GJLDUuW48A2oVZXgi50w==" -v /etc/init.d/nsupdate.txt
root@Firewall:/etc/bind/key# vim /etc/init.d/
acpid check-vpn .depend.stop keyboard-setup mountnfs-bootclean.sh rc rsyslog umountnfs.sh
atd check-vpn1 exim4 killprocs mountnfs.sh rc.local sendsigs umountroot
bind9 console-setup firewall kmod networking rcS single urandom
bootlogs cron halt motd nfs-common README skeleton
bootmisc.sh dbus hostname.sh mountall-bootclean.sh nsupdate reboot ssh
checkfs.sh ddclient hwclock.sh mountall.sh nsupdate.txt rmnologin udev
checkroot-bootclean.sh .depend.boot isc-dhcp-server mountdevsubfs.sh pppd-dns rpcbind udev-finish
checkroot.sh .depend.start kbd mountkernfs.sh procps rsync umountfs
root@Firewall:/etc/bind/key# vim /etc/init.d/nsupdate.txt
root@Firewall:/etc/bind/key#
root@Firewall:/etc/bind/key#
root@Firewall:/etc/bind/key#
root@Firewall:/etc/bind/key# nsupdate -y "escritorio.brfonetelecom.com:YQtrdUk6byz6/axddIFrkboxRc4VIN3M7c/Cx39zKx5WIgQRoGfu/UfwsbSHr3yQ98GJLDUuW48A2oVZXgi50w==" -v /etc/init.d/nsupdate.txt
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;brfonetelecom.com. IN SOA

;; UPDATE SECTION:
escritorio.brfonetelecom.com. 0 ANY A
escritorio.brfonetelecom.com. 14440 IN A 189.70.101.50

; TSIG error with server: clocks are unsynchronized
update failed: NOTAUTH(BADTIME)



Da parte do servidor:

Jan 25 18:29:05 ns1 named[13560]: client 189.70.101.50#13995: request has invalid signature: TSIG escritorio.brfonetelecom.com: tsig verify failure (BADTIME)

[33] Comentário enviado por udson em 25/01/2016 - 21:38h

Caro,

Estou tentando subir um servidor DDNS utilizando seu manual, porem estou tendo problemas de autenticação no update, poderia me ajudar ?

Segue erros abaixo, da parte do cliente e do servidor:

Cliente:

root@Firewall:/etc/bind/key# nsupdate -y "escritorio.brfonetelecom.com:c/Cx39zKx5WIgQRoGfu/UfwsbSHr3yQ98GJLDUuW48A2oVZXgi50w==" -v /etc/init.d/nsupdate.txt
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;brfonetelecom.com. IN SOA

;; UPDATE SECTION:
escritorio.brfonetelecom.com. 0 ANY A
escritorio.brfonetelecom.com. 14440 IN A 189.70.101.50

; TSIG error with server: clocks are unsynchronized
update failed: NOTAUTH(BADTIME)


Servidor:

Jan 25 18:29:05 ns1 named[13560]: client 189.70.101.50#13995: request has invalid signature: TSIG escritorio.brfonetelecom.com: tsig verify failure (BADTIME)

[34] Comentário enviado por fabio em 26/01/2016 - 11:00h


[33] Comentário enviado por udson em 25/01/2016 - 21:38h
...
; TSIG error with server: clocks are unsynchronized
...
Servidor:

Jan 25 18:29:05 ns1 named[13560]: client 189.70.101.50#13995: request has invalid signature: TSIG escritorio.brfonetelecom.com: tsig verify failure (BADTIME)


Segundo a mensagem, ele está reclamando que as máquinas estão com horário fora de sincronia. Execute um ntpdate nas duas máquinas que deve resolver:

# ntpdate a.ntp.br


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts