Qualquer dispositivo conectado a uma rede computacional, seja local ou Internet, possui um endereço atribuído a ele, mais conhecido como endereço IP. Análogo a rede de telefonia e os números telefônicos é a rede computacional e os endereços IP. Dito isso, em geral a alocação de endereços IP aos dispositivos de uma rede pode ser manual, ou seja, a configuração individual de cada dispositivo, ou automática através do Protocolo de Configuração Dinâmica de Host (DHCP). Neste post será apresentado como configurar um servidor DHCP com Raspberry Pi!
Material necessário
Para realizar este projeto, vamos precisar de:
E ter concluído o post Servidor DNS autoritativo com Raspberry Pi.
O que é um servidor DHCP?
O Protocolo de Configuração Dinâmica de Host (DHCP) permite a alocação automática de endereços IP. O DHCP é construído em um modelo cliente-servidor, onde o servidor DHCP aloca endereços IP e parâmetros de configuração (servidor DNS, gateway padrão, nome de domínio, etc) para os clientes solicitantes (computadores, dispositivos móveis, etc).
O DHCP suporta três mecanismos para alocação de endereços IP :
- Alocação automática (automatic allocation) também conhecida como reserva de endereço (address reservation). Onde o DHCP atribui um endereço IP permanente a um cliente. Ilustrado na imagem abaixo, obtida da página de configuração de um roteador sem fio.
- Alocação dinâmica (dynamic allocation). Onde o DHCP atribui um endereço IP a um cliente por um período limitado de tempo (ou até que o cliente explicitamente abandone o endereço). Ilustrado na imagem abaixo, obtida da página de configuração de um roteador sem fio.
- Alocação manual (manual allocation) também conhecido como IP estático (static IP). Onde o endereço IP de um cliente é atribuído manualmente (pelo usuário ou administrador da rede), e o DHCP é usado simplesmente para transmitir o endereço atribuído ao cliente.
Como visto nas imagens acima, geralmente em residências e pequenas empresas quem faz a atribuição dos endereços IP é o roteador sem fio – que possui o recurso de servidor DHCP. A proposta desse post é migrar o DHCP do roteador sem fio para uma placa Raspberry Pi, pois assim teremos um servidor DHCP com mais recursos, mais customizável e escalável.
Montando o servidor DHCP com Raspberry Pi
Para começar precisamos de algum tipo de acesso ao terminal, seja remoto via ssh ou local via teclado. Tudo certo? Então vamos lá!
É uma boa prática atribuir manualmente o endereço IP do servidor DHCP, para isso vamos editar o arquivo.
vim /etc/dhcpcd.conf
E incluir o conteúdo abaixo no final (fique atento aos comentários)!
interface eth0 # SUBSTITUA "192.168.0.14" PELO ENDEREÇO IP DO SEU RASPBERRY PI. static ip_address=192.168.0.14/24 # SUBSTITUA "192.168.0.1" PELO ENDEREÇO IP DO SEU ROTEADOR SEM FIO. static routers=192.168.0.1 # SUBSTITUA "192.168.0.14" PELO ENDEREÇO IP DO SEU RASPBERRY PI (DNS RECURSIVO). static domain_name_servers=192.168.0.14 static domain_name=example.com
Agora vamos instalar os pacotes, nosso servidor DHCP será baseado no Kea.
apt-get update apt-get install kea-dhcp4-server
É uma boa prática fazer uma cópia do arquivo de configuração antes de editá-lo.
cp -p /etc/kea/kea-dhcp4.conf /etc/kea/kea-dhcp4.conf.default
Agora iremos limpar o conteúdo do arquivo.
echo "" > /etc/kea/kea-dhcp4.conf
Editá-lo.
vim /etc/kea/kea-dhcp4.conf
E incluir o conteúdo abaixo (fique atento aos comentários!
{ # A configuração do DHCP começa aqui. "Dhcp4": { # Interfaces onde escutar as solicitações DHCP. # "eth0" é a interface de rede do Rasperry Pi. "interfaces-config": { "interfaces": [ "eth0" ] }, # Especifica o banco de dados usado para armazenar as concessões. # Quatro opções de banco de dados são suportados: MySQL, PostgreSQL, Cassandra e Memfile. # Usaremos o Memfile porque não requer configuração prévia. "lease-database": { "type": "memfile" }, # Define por quanto tempo os endereços (concessões) fornecidos pelo servidor DHCP são válidos. # Nesse caso, um cliente (computadores, dispositivos móveis, etc) que receba um endereço # pode usá-lo por 4000 segundos. "valid-lifetime": 4000, # Define uma lista de sub-redes (subnet) IPv4. # Essa é a estrutura de configuração mais importante do DHCPv4, # pois o servidor usa essas informações para processar as solicitações dos clientes. # As sub-redes são especificadas com o parâmetro "subnet4". "subnet4": [ # Uma definição de sub-rede (subnet4) deve ter pelo menos dois parâmetros : # "subnet": que define toda a sub-rede. # "pools": intervalo de endereços IP atribuídos dinamicamente (dynamic allocation) aos clientes. # Nesse caso, os endereços IP entre 192.168.0.200 e 192.168.0.205 serão atribuídos aos # clientes que não possuam reserva de endereço na seção "reservations", veremos abaixo. # ATENÇÃO! Os endereços atribuídos dinamicamente ("pools") não devem ser reservados ("reservations") # e vice-versa. # MODIFIQUE OS TRÊS PRIMEIROS OCTETOS (192.168.0) EM AMBAS LINHAS DE ACORDO COM SUA REDE. { "subnet": "192.168.0.0/24", "pools": [ { "pool": "192.168.0.200 - 192.168.0.205" } ], # Fornece aos clientes os parâmetros de configuração : # "domain-name-servers": endereço IP do servidor DNS recursivo; # "routers": endereço IP do roteador; # "domain-name": nome de domínio; # SUBSTITUA "192.168.0.14" PELO ENDEREÇO IP DO SEU RASPBERRY PI (DNS RECURSIVO). # SUBSTITUA "192.168.0.1" PELO ENDEREÇO IP DO SEU ROTEADOR SEM FIO. "option-data": [ { "name": "domain-name-servers", "data": "192.168.0.14" }, { "name": "routers", "data": "192.168.0.1" }, { "name": "domain-name", "data": "example.com" } ], # Reserva de endereço (address reservation), o DHCP atribui um endereço IP permanente a um cliente. # "hw-address": endereço físico associado à interface de rede do cliente (MAC address); # "ip-address": endereço IP atribuído permanentemente ao cliente; # "hostname": nome do cliente; # Nesse caso, os clientes listados abaixo foram obtidos do post Servidor DNS autoritativo com Raspberry Pi. # E devem ser modificados de acordo com sua rede local. # ATENÇÃO! Os endereços atribuídos dinamicamente ("pools") não devem ser reservados ("reservations") # e vice-versa. "reservations": [ { "hw-address": "22:b6:d6:40:9f:77", "ip-address": "192.168.0.100", "hostname": "esp32" }, { "hw-address": "63:c4:3a:e4:11:d6", "ip-address": "192.168.0.101", "hostname": "esp8266" }, { "hw-address": "78:28:49:17:d8:3c", "ip-address": "192.168.0.102", "hostname": "nodemcu" }, { "hw-address": "2a:d9:ab:43:6c:33", "ip-address": "192.168.0.103", "hostname": "rasp3" }, { "hw-address": "00:17:c4:e6:f2:34", "ip-address": "192.168.0.104", "hostname": "note" }, { "hw-address": "43:9b:be:cf:7c:93", "ip-address": "192.168.0.105", "hostname": "pc" }, { "hw-address": "5c:af:06:77:eb:9f", "ip-address": "192.168.0.106", "hostname": "tablet" } ] }, ] }, # A configuração do Log começa aqui. # E diz para armazenar as mensagens de log no arquivo /var/log/kea-dhcp4.log. "Logging": { "loggers": [ { "name": "kea-dhcp4", "output_options": [ { "output": "/var/log/kea-dhcp4.log" } ], "severity": "INFO", "debuglevel": 0 }, ] } }
E agora reiniciar o serviço.
systemctl restart kea-dhcp4-server
Para checar.
netstat -putan | grep 67
Se a resposta for algo como.
udp 0 0 192.168.0.14:67 0.0.0.0:* 10479/kea-dhcp4
Está tudo certo.
O último passo é ativar o serviço Kea DHCP na inicialização, para isso vamos editar o arquivo.
vim /etc/rc.local
E incluir a linha abaixo antes de “exit 0”.
/etc/init.d/kea-dhcp4-server start
Seu servidor DHCP com Raspberry Pi está pronto!!
Para verificar o funcionamento do servidor DHCP, podemos examiar o arquivo de log.
tail -f /var/log/kea-dhcp4.log
2019-05-03 17:56:33.013 INFO [kea-dhcp4.leases/10479] DHCP4_LEASE_ADVERT [hwtype=1 22:b6:d6:40:9f:77], cid=[01:22:b6:d6:40:9f:77], tid=0xd60446e7: lease 192.168.0.100 will be advertised 2019-05-03 17:56:33.019 INFO [kea-dhcp4.leases/10479] DHCP4_LEASE_ALLOC [hwtype=1 22:b6:d6:40:9f:77], cid=[01:22:b6:d6:40:9f:77], tid=0xd60446e7: lease 192.168.0.100 has been allocated
DHCP4_LEASE_ADVERT : Essa mensagem informativa indica que o servidor encontrou a concessão a ser oferecida ao cliente. Cabe ao cliente escolher um servidor dentre aqueles que oferecem concessões e continuar a alocação com esse servidor. O primeiro argumento especifica o cliente (cid=[01:22:b6:d6:40:9f:77]) e as informações de identificação da transação (tid=0xd60446e7). O segundo argumento especifica o endereço IPv4 (lease 192.168.0.100) a ser oferecido.
DHCP4_LEASE_ALLOC : Essa mensagem informativa indica que o servidor concedeu com sucesso uma concessão em resposta à mensagem DHCPREQUEST do cliente. As informações de concessão serão enviadas para o cliente na mensagem DHCPACK. O primeiro argumento contém o cliente (cid=[01:22:b6:d6:40:9f:77]) e as informações de identificação da transação (tid=0xd60446e7). O segundo argumento contém o endereço IPv4 (lease 192.168.0.100) alocado.
E também o arquivo de concessões.
tail -f /var/lib/kea/kea-leases4.csv
192.168.0.100,22:b6:d6:40:9f:77,01:22:b6:d6:40:9f:77,4000,1556920993,1,1,1,esp32,0
O primeiro argumento contém o endereço IPv4 (192.168.0.100) alocado. O terceiro argumento contém o cliente (01:22:b6:d6:40:9f:77). O quarto argumento contém o tempo da concessão (4000) em segundos.
ATENÇÃO! Depois de tudo configurado e testado, não se esqueça de desativar o DHCP do roteador sem fio.
Gostou de criar um servidor DHCP com Raspberry Pi? Ajude-nos a melhorar o blog comentando abaixo sobre este tutorial.
Até a próxima.
muito maneiro, Estava procurando isso há um tempo, Obrigado,
Uma pergunta: é da mesma forma a configuração no Raspbarry Pi 4?
Outra pergunta: e se quiser usar o IPv6 como faz a configuração?