17 de abril de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Servidor DNS com DNSMasq em 3 minutos

Diagnóstico de rede no Raspberry | Servidor DNS com DNSMasq | Boot do Raspberry pela rede | Raspberry Pi sem vídeo | curso de raspberry | aumentar a vida útil do micro SD

Já escrevi alguns artigos sobre configuração de servidor DNS com bind9, nessa referência, para Raspberry. Nesse breve artigo vamos ver como configurar um servidor DNS com DNSMasq, para acelerar o tempo de resolução de nomes, tornando a navegação do seu Raspberry e de sua rede mais rápidos. De quebra, vai poder acessar seus dispositivos da rede por nome.

Instalação do DNSMasq

Essa parte é tão fácil quanto a configuração. Abra um terminal em seu Raspberry e digite os comandos:

sudo su
apt-get update
apt-get install dnsmasq

Mantenha o terminal aberto como está. Precisamos definir algumas linhas no serviço de DNS para termos nosso servidor DNS com DNSMasq funcional.

Configurar o DNSMasq como servidor DNS

Agora devemos editar o arquivo /etc/dnsmasq.conf para fazermos algumas definições. Tudo estará comentado (com trama no início da linha), então pode colocar as definições a seguir no início do arquivo, sem problemas. Use seu editor preferido. Pelo terminal, sugiro o nano, mas se quiser um editor gráfico, digite:

xdg-open /etc/dnsmasq.conf

Então inclua as linhas:

listen-address=::1,127.0.0.1,<ip do seu RPi>

ATENÇÃO:

Se for utilizar como servidor DNS apenas para o próprio Raspberry, não precisa adicionar o <IP DO RPi>, apenas se quiser servir DNS para sua rede também. Isto é, outros computadores poderão se beneficiar do servidor DNS instalado no Raspberry.

Defina a porta de serviço, sendo por padrão a UDP/53:

port=53

Quando seu servidor DNS não tem referência em cache, ele deve buscar a referência fora. Isso é chamado de forwarding, que é um encaminhamento para a resolução, tornando-se disponível no cache a partir de então. O forwarding é definido na variável server e podemos ter vários apontamentos:

server=8.8.8.8
server=8.8.4.4
server=192.168.1.2

Como já tenho um servidor DNS rodando em outro Raspberry (com bind9), passei ele também para a resolução, que ainda deve ser mais rápido que uma consulta na Internet.

O parâmetro final é a interface a escutar. Podemos optar por eth0, wlan0 ou ambos. No meu caso o Raspberry está conectado por WiFi, então é wlan0 mesmo:

interface=wlan0

Juntando, tudo o que precisa ser adicionado ao arquivo /etc/dnsmasq.conf são essas linhas:

interface=wlan0
port=53
listen-address=127.0.0.1,192.168.1.200
server=8.8.8.8
server=8.8.4.4

Reinicie o serviço do DNSMasq e veja como está seu arquivo /etc/resolv.conf. Se estiver usando outro DNS, troque-o pelo IP de sua interface.

sudo service dnsmasq restart

Se nunca editou o arquivo /etc/resolv.conf, o formato para resolução de nomes através do IP de exemplo 172.16.4.8 ficaria assim:

nameserver 172.16.4.8

Se tiver domínio haverá uma linha adicional.

Resolução de problemas

Se por alguma razão tiver problemas na configuração de seu servidor DNS com DNSMasq, siga essas dicas, mas é bastante incomum não funcionar de primeira.

Checar o status do serviço

Normalmente um erro é reportado pelo próprio status. Se tiver erro de digitação no arquivo ou algo incorreto deve aparecer no terminal ao digitar:

service dnsmasq status

Checar o arquivo /etc/resolv.conf

Se o DNS não estiver nesse arquivo ou a definição estiver digitada errada, ou se tiver outro serviço controlando o arquivo /etc/resolv.conf, também não funcionará. Se for apenas falta da definição e já não estiver contida essa linha, adicione-a:

#coloque o ip do SEU raspberry
nameserver 172.16.0.100

Checar se está rodando openresolv

Se estiver, edite o arquivo /etc/resolvconf.conf e adicione o seguinte conteúdo:

name_servers="::1 127.0.0.1"
# Escreve os arquivos resolv e de configuração estendida do dnsmasq
dnsmasq_conf=/etc/dnsmasq-conf.conf
dnsmasq_resolv=/etc/dnsmasq-resolv.conf

Por fim, execute o comando resolvconf -u para que ocorra a atualização dos arquivos.

Checar status novamente

Toda a vez que fizer alguma modificação, verifique o último status. Não modifique todas as coisas de uma vez senão jamais será identificada a origem do problema. Temos a já citada forma mais acima, como também o journalctl:

sudo service dnsmasq status
#ou...
sudo journalctl -u dnsmasq.service

Garanta que o IP do Raspberry está reservado

O RPi não poderá mais mudar de IP para que outros hosts possam encontrá-lo, caso deseje utilizá-lo como servidor DNS da rede, invés de resolver nomes apenas para si mesmo. Nesse caso, verifique na interface de rede se houve mudança:

ifconfig wlan0 #ou eth0, se for conexão cabeada

Se o IP mudou, significa que não foi reservado o IP ou houve algum erro na configuração da reserva. Para reservar o IP ou para verificar a reserva, pegue o endereço MAC na interface de rede e confira em seu roteador. Para pegar o MAC já limpo:

ifconfig wlan0|egrep ether|awk '{print $2}'

Verifique se o adicionou corretamente, se a configuração está habilitada em seu roteador, etc. Cada roteador tem sua própria interface com o usuário, por isso não consigo descrever o processo exato para cada caso, mas é fácil achar, certamente está no menu de configuração DHCP.

Modifique o servidor DNS a ser distribuído em sua rede

Seu roteador é provavelmente o servidor DHCP da rede. Ele oferece o IP, gateway e os servidores DNS que deverão ser utilizados pelos seus hosts. Para que o servidor DNS seja o Raspberry, procure pela definição dos DNSs na configuração do DHCP do seu roteador. É fácil também, não se preocupe.

Garanta que as definições DHCP dos hosts já foram atualizadas

Não basta configurar o servidor DNS e o DHCP em seu roteador. Os hosts precisam saber que uma modificação deve ser aplicada e para isso é necessário renovar o IP em suas interfaces. Em Windows (não sei se ainda é assim porque não uso há um bom tempo), abra o terminal (digite CMD no menu) e digite:

ipconfig /release
ipconfig /renew

Em Linux:

#para ethernet:
sudo ifdown eth0
sudo ifup eth0

#wlan etc
sudo service networking restart
#ou..
sudo service network restart

Ou reinicie os sistema, seja lá ele qual for.

Bônus

Para resolver nomes em sua rede interna, podemos definir os hosts em /etc/hosts e adicionar mais alguns parâmetros ao arquivo /etc/dnsmasq.conf. É simples, apenas adicione isso:

local=/lan/
domain=lan

Os hosts definidos em /etc/hosts devem estar utilizando IP estático, claro. O formato de inserção dos hosts deve ser assim:

#defina o ip de SEUS hosts e o nome de resolução para o respectivo ip
10.0.0.18       dobitaobyte

Reinicie o serviço do DNSMasq sempre que fizer alguma modificação:

sudo service dnsmasq restart

Agora deve ser possível acessar outro host pelo nome:

ping -c4 nome_do_host

É isso. Esse artigo “Servidor DNS com DNSMasq” é mais complementar para facilitar a busca por referência, já que alguns artigos sobre o tema foram escritos anteriormente.

Procurando onde comprar Raspberry Pi 4?

Para RPi 4 recomendo nosso parceiro MASUGUX. Uma curiosidade é que corajosamente eles estão migrando do Mercado Livre após muitos anos, devido à insatisfação com o ML. Acho que atualmente o ML não é mais bom para ninguém, já foi mais vantajoso para ambos, comprador e vendedor. Mas enfim, hoje você encontra a MASUGUX no Shopee e para contatos, eles já têm um domínio que ainda não aponta para uma loja, mas tem as informações necessárias. Recomendo fortemente, o parceiro é de longa data, confiável, atencioso e honesto… bora dar uma força para essa migração, inclusive comprando outros itens de sua lista que eventualmente sejam úteis ao seu projeto.

 

Revisão: Ricardo Amaral de Andrade