Servidor DHCP com Raspberry Pi 1

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.

Servidor DHCP com Raspberry Pi modem1

  • 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.

Servidor DHCP com Raspberry Pi modem2

  • 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.

Servidor DHCP com Raspberry Pi modem3

Gostou de criar um servidor DHCP com Raspberry Pi? Ajude-nos a melhorar o blog comentando abaixo sobre este tutorial.

Até a próxima.

Faça seu comentário

Acesse sua conta e participe

Um Comentário

  1. 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?

    MARCELO GUIMARAES CARVALHO