Como configurar o dnsmasq

Quando ler ou ouvir “configurar o dnsmasq”, certamente virão várias coisas à sua mente depois desse artigo.

O que é dnsmasq

O dnsmasq é um “canivete suíço” que resolve diversas questões, e tudo de forma simples. Muito simples!

Ele oferece quatro serviços importantes, sendo: um servidor DNS, um servidor DHCP (com suporte a DHCPv6) e PXE, e um servidor TFTP. Não conhece algum desses serviços? Bem, aqui vou mostrar algumas configurações, mas o próximo artigo publicado (que já está pronto, só vou esperar mais um dia para publicá-lo) mostrará toda a excelência dessa ferramenta.

Como um pacote de repositório, está disponível em todos os Linux e pode ser instalado com o respectivo gerenciador de pacotes. Está disponível também para Raspberry.

Instalar o dnsmasq

Para instalar é o padrão, não que precise, mas para não faltar informação:

sudo apt-get update
sudo apt-get install -y dnsmasq

Servidor DNS com dnsmasq

Por padrão ele já habilita um servidor DNS. Para desabilitá-lo (caso não seja desejada essa função), defina a porta como 0 no arquivo de configuração. No Ubuntu fica em /etc/dnsmasq.d/dnsmasq.conf:

port=0

Como cache de DNS, pode ser uma das melhores e mais práticas opções. Já mostrei em outros dois artigos como configurar o bind para servir à rede local, inclusive resolvendo nomes de dispositivos da rede.

Para configurar o dnsmasq para resolver nomes localmente, basta adicionar ao arquivo o endereço de escuta. Se for apenas para o próprio computador:

listen-address=::1,127.0.0.1

Assim ele resolverá tanto IPv4 quanto IPv6. Se for para beneficiar toda a rede, apenas adicione o IP do computador que o hospedará. Claro, é primordial que o IP do computador em que configurar o dnsmasq não mude. Sendo assim, ou deve-se configurar um IP estático, ou atribuir o IP pelo MAC address, configurando-o no roteador da rede. No arquivo de configuração seria algo como:

listen-address=::1,127.0.0.1,192.168.1.200

Também temos a opção de limitar o tamanho de cache. Nesse caso:

cache-size=1000

Outra coisa interessante é poder utilizar o DNSSEC para aumentar a segurança e evitar manipulação de dados. Para isso, adicione ao arquivo de configuração:

conf-file=/usr/share/dnsmasq/trust-anchors.conf
dnssec

Para que seja feito uso de seu servidor DNS, é fundamental indicá-lo como servidor único no arquivo /etc/resolv.conf. Basta adicionar (por exemplo):

nameserver 192.168.1.200
#ou local, na interface de loopback:
nameserver 127.0.0.1
#...e ipv6:
nameserver ::1

E se estiver utilizando o openresolv, edite o arquivo /etc/resolvconf.conf e adicione:

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

Depois, execute resolvconf -u para que os arquivos sejam criados. Caso esqueça de fazê-lo, a inicialização do serviço falhará. Para saber o status da inicialização do serviço dnsmasq, há várias maneiras:

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

Ou ainda, lendo os logs de sistema, seja dmsg, messages etc.

Para fazer forwarding (quando ele não for capaz de resolver a partir de seu próprio cache), adicione os DNSs de encaminhamento. No caso, os populares do Google:

no-resolv
server=8.8.8.8
server=8.8.4.4

A opção no-resolv é para que ele não fique resolvendo nomes apenas nele mesmo.

Para adicionar um domínio personalizado para hosts de sua LAN, adicione:

local=/lan/
domain=lan

Assim, os hosts definidos em /etc/hosts (que já é o suficiente para ping a partir da própria máquina) serão acessados também pelos demais hosts da rede. Por exemplo, um ping seria algo como:

ping dobitaobyte.lan

E coloque no arquivo de configuração também:

expand-hosts

De outro modo, será necessário adicionar o domínio aos hosts definidos em /etc/hosts.

A primeira resolução a um destino será sempre feita pelos DNS de forwarding, mas após isso a resolução será sempre mais rápida, pois já estará contida no cache do dnsmasq.

Configurar o dnsmasq como servidor DHCP

Suponhamos que o interesse é outro; apenas ter um servidor DHCP fácil de configurar. E que fácil! Para quem já configurou o isc-dhcp-server (que também não é lá coisa para gurus), configurar o DHCP server no dnsmasq é de babar na sopa!

Definir um nome de domínio (opcional)

Para definir um nome de domínio, adicione ao arquivo (nesse momento, supõe-se: vazio) o seguinte:

domain=meudominio.com

Definir default gateway

O gateway padrão é a porta de saída de uma rede para outra, seja ela pública ou não. Para exemplificar aos que não conhecem muito de rede, é o endereço IP que leva seu computador ao mundo. Supondo que sua rede seja 192.168.0.0/24 (onde são possíveis até 254 hosts), provavelmente seu gateway é o 192.168.0.1. Em miúdos, seu roteador WiFi ou o Modem de sua operadora de Internet. Normalmente o gateway tem duas interfaces de rede e, no caso do roteador de saída, de um lado está o IP da LAN e do outro, o IP público de Internet.

Para definir o default gateway (que é fundamental pelas razões supracitadas), adicione:

dhcp-option=3,192.168.0.1

A flag inicial será explicada no próximo artigo (garanto que será bastante agradável, se curte Raspberry), atenha-se apenas ao formato e ao posicionamento do endereço IP do gateway.

O servidor DHCP também precisa especificar o DNS que resolverá nomes para a rede; ou “os” DNSs. Utilizando os do Google para exemplificar:

dhcp-option=6,8.8.8.8,8.8.4.4

Repare que a separação é feita por vírgula.

Outra coisa impressionante que o dnsmasq faz de maneira simples é roteamento, mas para uso doméstico é pouco provável que utilize, exceto caso tenha separado sua rede IoT da rede de navegação. Mas vou criar um exemplo; suponhamos que sua rede IoT seja uma classe B com endereçamento 172.16.0.0 com subnet para 128 hosts (/25) e ela deve passar por um firewall (172.16.0.1<->192.168.0.0/24) antes de sair para a rede 192.168.0.0/24. Nesse caso:

dhcp-option=192.168.0.0/24,172.16.0.1

Faixa de IP para atribuição por DHCP

E claro, precisamos definir os IPs que serão distribuídos e o lease-time deles. Para isso:

dhcp-range=192.168.0.100,192.168.0.200,12h

Isso significa que por 12h não haverá renovação dos IPs, que serão distribuídos do 100 ao 200. IPs estáticos fora dessa range podem ser atribuídos a hosts servidores, mas se desejar atribuir os IPs estáticos por DHCP, também é fácil:

dhcp-host=aa:bb:cc:dd:ee:ff,192.168.0.254

Para testar a sintaxe de suas configurações (independente do serviço configurado), utilize:

dnsmasq --test

Para saber quais IPs estão sendo atribuídos (e se estão), podemos consultar o arquivo /var/lib/misc/dnsmasq.leases:

configurar o dnsmasq - lease-time

Nesse caso foi apenas um, que é a surpresa do próximo artigo (que concluí antes desse, mas não quis publicar ainda).

Configurar o dnsmasq como servidor TFTP

Configurar um TFTP agora ficou mais fácil! Basta adicionar 2 linhas ao arquivo de configuração, sendo uma delas a ativação do serviço e a outra, o caminho do diretório TFTP. Para aumentar a segurança, uma terceira flag pode ser utilizada, mas nesse caso a propriedade do diretório e conteúdo deve ser do usuário dnsmasq. Supondo a configuração:

enable-tftp
tftp-root=/srv/tftp
tftp-secure

Devemos então criar o diretório /srv/tftp e atribuí-lo ao usuário dnsmasq:

sudo mkdir /srv/tftp
sudo chown -R dnsmasq.dnsmasq /srv/tftp

Configurar o dnsmasq como servidor PXE

Para utilizar o servidor PXE, fundamentalmente devemos ter configurados também os serviços TFTP e DHCP. Supondo uma configuração como proxy DHCP em uma rede que já contenha um servidor DHCP rodando:

interface=enp0s0
bind-dynamic
dhcp-range=192.168.0.1,proxy

Após isso será necessário ainda configurar um boot compatível com PXE, como o PXELinux, na raiz do TFTP. Para enviar um arquivo, adicionamo-lo da seguinte forma:

dhcp-boot=lpxelinux.0

Se dependente de plataforma, podemos defini-lo assim:

pxe-service=x86PC, "PXELINUX (BIOS)", "bios/lpxelinux"
pxe-service=X86-64_EFI, "PXELINUX (EFI)", "efi64/syslinux.efi"

A maior parte desse artigo foi referência da documentação do Arch Linux, do qual deixo a referência. Esse material foi fundamental para atingir o propósito do próximo artigo (já concluído, mas não publicado). Espero que acompanhe, principalmente se for usuário de Raspberry Pi!

 

Revisão: Ricardo Amaral de Andrade

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.