Skip to main content

210.1 Configurações do DHCP


Introdução


Um servidor DHCP (Dynamic Host Configuration Protocol) é um protocolo de rede que distribui automaticamente endereços IP e outras configurações de rede, como máscara de sub-rede, gateway padrão e servidores DNS, para dispositivos conectados a uma rede. Ou seja, ele atribui automaticamente endereços IP aos dispositivos que se conectam à rede, simplificando a configuração de rede e gerenciamento de endereços IP. Sem um servidor DHCP, cada dispositivo teria que ter um endereço IP manualmente configurado, o que seria trabalhoso e propenso a erros em redes maiores.


Vamos começar instalando o pacote que fornece o serviço que implementa o uso do DHCP, no mercado existem algumas aplicações, duas das aplicações usadas são:

  • dnsmasq Apesar do foco ser no DNS, também implementa o DHCP, de uma foma mais fácil de ser configurada assim como é feito para com o DNS.

  • isc-dhcp-server Aplicação desenvolvida e mantida pela Internet Systems Consortium (ISC), mesma desenvolvedora e mantenedora do BIND. Para uso na LPIC-2 o foco é nessa aplicação.

# Instale o DHCP:
$ sudo apt install isc-dhcp-server -y

O DHCP por definição escuta as requisições na porta 67, ou seja, quando um cliente solicitar um endereço IP, essa requisição vai entrar no servidor através da porta 67. Mas quando ele for responder para o cliente, essa resposta vai sair do servidor na porta 68. Só para resumir, entra na 67 e sai na 68. Sempre usando UDP como protocolo de transporte.



Arquivos de configurações


O DHCP da ISC fornece alguns arquivos de configuração, vejamos a explicação de cada um deles.

ArquivoDescrição
/etc/default/isc-dhcp-serverConfigura opções do processo do DHCP quando ele é iniciado, normalmente podemos ver essas opções como argumentos ao executar systemctl status isc-dhcp-server.
/etc/dhcp/dhcpd.confEste é o principal arquivo de configuração do ISC DHCP Server. Ele contém informações sobre a configuração da rede.
/etc/dhcp/dhcpd6.confEste é o arquivo de configuração para o suporte do protocolo DHCPv6, que é usado para atribuir endereços IPv6 aos clientes da rede. Ele contém informações semelhantes ao dhcpd.conf, mas específicas para o DHCPv6.
/var/lib/dhcp/dhcpd.leasesEste arquivo é gerado automaticamente pelo servidor DHCP e contém informações sobre os endereços IP que foram atribuídos aos clientes da rede.
/etc/dhcp/dhcpd.omapi.keyEste é um arquivo de chave usado pelo OMAPI (Object Management API) do ISC DHCP Server. O OMAPI é uma API usada para gerenciar o servidor DHCP e o arquivo de chave é usado para autenticar as conexões de gerenciamento OMAPI.
/var/lib/dhcp/dhcpd.leases~Este arquivo é uma cópia de backup do dhcpd.leases original.


Opções de configuração


Durante a configuração do DHCP usaremos uma variedade bastante grande de opções para configurar não somente o endereçamento fornecido aos clientes, mas também como o servidor DHCP deve trabalhar e operar. Vejamos algumas das opções de configuração mais usadas:

OpçãoDescrição
option domain-name "exemplo.com";Define o domínio que será atribuído aos clientes que obtiverem um endereço IP através do servidor DHCP.
option domain-name-server "xxx";Define os servidores DNS fornecidos juntamente com as configurações de endereçamento. Pode usar IP ou nome dos servidores, para mais de um separar com vírgula ,.
option domain-name-search 'exemplo.com';Define o 'search' usado nas consultas DNS.
option routers IP;Define o GW (Gateway) para a rede em questão;
option smtp-server IP;Define servidores SMTP disponível para o cliente.
option pop-server IP;Define servidores POP disponível para o cliente.
option ntp-servers IP;Define os servidores NTP para o cliente.
option static-routes IP1 IP2;Cria uma rota estática. É ilegal definir uma rota default aqui.
authoritativeIndica que esse servidor é autoritativo.
ddns-update-styleControla se o servidor tentará ou não fazer uma atualização DNS quando um IP for emprestado. DDNS (Dynamic Domain Name System) atualizará o nome do host para o novo IP fornecido no DNS.
db-time-format localFaz com que o arquivo /var/lib/dhcp/dhcpd.leases exiba os empréstimos de IP mostrando a hora do servidor.
default-lease-time 86400Tempo de empréstimo em segundos (um dia = 86400) que o servidor DHCP usa para verificar se o IP ainda está em uso.
max-lease-time 604800Tempo máximo que pode usar a configuração (Uma semana).
log-facility local7;Define o nome da facility para configurar os logs do DHCP juntamente ao syslog para outro arquivo de log.
allow booting;Permite que os clientes recebam opções de inicialização específicas, como informações de inicialização do sistema operacional ou um arquivo de imagem de inicialização do disco. Essa opção deve ser usada em conjunto com a opção filename e a opção next-server.
allow bootp;Permite que os clientes usem o protocolo BOOTP. Quando essa opção é ativada, o ISC DHCP Server responderá a solicitações BOOTP e as tratará como solicitações DHCP.
ignore client-updates;Faz com que o servidor DHCP ignore as tentativas dos clientes de atualizarem seus registros DNS.
deny unknown-clients;Só fornece endereçamento para Hosts conhecidos pelo servidor DHCP, precisa adicione o endereço mac dos Hosts para o servidor conhecer.
range dynamic-bootp 192.168.1.241 192.168.1.252;Declara um intervalo de endereços IP que pode ser atribuído a hosts usando o protocolo BOOTP.
next-server IP;Informa ao cliente o endereço IP do servidor TFTP a ser usado durante o processo de inicialização do cliente. Essa opção é geralmente usada em conjunto com o protocolo PXE (Preboot Execution Environment) para permitir a inicialização de um sistema operacional via rede.
server-name "IP";Fornecer o nome do servidor DHCP. Essa opção pode ser usada para fins de registro de eventos e auditoria, ou para que os clientes possam distinguir entre diferentes servidores DHCP em sua rede.
O que é bootp?

O BOOTP (Bootstrap Protocol) é um protocolo de rede que é usado para inicializar dispositivos de rede antes que eles possam ser usados na rede.


O BOOTP funciona usando um servidor BOOTP que recebe solicitações de dispositivos de rede e fornece informações de configuração, como endereços IP, máscaras de sub-rede e gateways padrão. O servidor BOOTP pode ser configurado para fornecer informações de configuração diferentes para dispositivos específicos, dependendo de seu endereço MAC ou de outros fatores.


Só usaremos BOOTP quando quisermos configurar um servidor PXE (Preboot Execution Environment) que é uma extensão do protocolo BOOTP.



Funcionamento do DHCP


O DHCP é construído em um modelo cliente-servidor, em que os hosts designados do servidor DHCP alocam endereços de rede e entregam parâmetros de configuração para hosts configurados dinamicamente (clientes).


O DHCP é um protocolo que permite que um servidor atribua automaticamente endereços IP e outras configurações de rede a um cliente DHCP. Além disso, o DHCP oferece um mecanismo de alocação de endereços temporários para hosts, conhecido como leasing. Isso ajuda a evitar a escassez de endereços IP e permite que os hosts sejam facilmente adicionados e removidos da rede sem a necessidade de configuração manual de endereços IP.



Origem de leasing


Quando o cliente inicializa (ou quer ingressar em uma rede), ele começa um processo de quatro etapas para obter um endereço válido na rede.


Vamos ver o fluxo de quando o cliente inicia o processo de busca do servidor DHCP para obter um IP para Rede.


  1. Descoberta do DHCP (DHCPDISCOVER) A mensagem de broadcast DHCPDISCOVER encontra os servidores DHCPv4 na rede. Como o cliente não tem informações válidas de IPv4 durante a inicialização, ele usa endereços de broadcast de Camada 2 e Camada 3 (FF:FF:FF:FF:FF:FF e 255.255.255.255) para se comunicar com o servidor DHCP.


  2. Pacote de DHCP Offer (DHCPOFFER) Quando o servidor DHCPv4 recebe uma mensagem DHCPDISCOVER, ele reserva o endereço IPv4 disponível para oferecer ao cliente. O servidor também cria uma entrada ARP que consiste no endereço MAC do cliente solicitante e o endereço IPv4 alugado pelo cliente.

    O servidor DHCPv4 envia uma mensagem oferencendo o endereço ao cliente, a mensagem é DHCPOFFER. A mensagem de DHCPOFFER é enviada como unicast, usando o endereço MAC de Camada 2 do servidor como o endereço origem e o endereço MAC de Camada 2 do cliente como destino.


  3. Solicitação de DHCP (DHCPREQUEST) Quando o cliente recebe o DHCPOFFER do servidor, ele envia uma mensagem DHCPREQUEST para o servidor. Esta mensagem é usada para geração e renovação do leasing (aluguel). Quando usada para geração de leasing, DHCPREQUEST atua como um aviso de aceitação para o servidor selecionado e uma recusa implícita a todos os outros servidores que possam ter fornecido ao cliente uma oferta de vinculação.

     Muitas redes corporativas usam vários servidores DHCPv4. 
    A mensagem *DHCPREQUEST* é enviada na forma de um broadcast para informar a esses servidores DHCPv4 sobre a oferta aceita.

  4. Reconhecimento de DHCP (DHCPACK) Ao receber a mensagem DHCPREQUEST, o servidor verifica as informações de aluguel com um ping (ICMP) para esse endereço para garantir que ele não esteja sendo usado atualmente, cria uma nova entrada ARP para o aluguel do cliente e envia uma mensagem unicast DHCPACK.

    A mensagem DHCPACK é uma cópia de DHCPOFFER, exceto por uma mudança no campo do tipo de mensagem. Quando o cliente recebe a mensagem DHCPACK, registra informações sobre configuração e realiza uma pesquisa ARP para o endereço atribuído. Se não houver resposta ao ARP, o cliente sabe que o endereço IPv4 é válido e começa a usá-lo.



Renovação de leasing


Vamos ver o fluxo gerado quando o cliente precisa renovar o leasing de endereçamento.

  1. Solicitação de DHCP (DHCPREQUEST)

    Antes do aluguel expirar, o cliente envia uma mensagem DHCPREQUEST diretamente para o servidor DHCPv4 que originalmente ofereceu o endereço IPv4. Se um DHCPACK não for recebido dentro de um período especificado, o cliente envia outro DHCPREQUEST, de modo que um dos outros servidores DHCPv4 possa estender o aluguel.


  1. Reconhecimento de DHCP (DHCPACK)

    Ao receber a mensagem DHCPREQUEST, o servidor verifica as informações de aluguel retornando um DHCPACK.


  1. Renovação completa

    Depois que o cliente recebe o DHCPACK do servidor, ele atualiza suas informações de configuração de rede com base nas informações recebidas do servidor DHCPv4. O cliente agora tem um novo prazo de validade para o aluguel e deve solicitar uma renovação novamente antes que o prazo expire novamente. O processo de renovação pode continuar enquanto o cliente estiver conectado à rede e precisar manter o endereço IP atribuído.



Mecanismo de Leasing (alocação)


O DHCP suporta três mecanismos para alocação de endereços IP, são eles:

  1. Alocação Automática

    O DHCP atribui um endereço IP permanente a um cliente.


  2. Alocação Dinâmica

    O DHCP atribui um endereço IP a um cliente por um período limitado de tempo (ou até que o cliente abandone explicitamente o endereço IP).

    A alocação dinâmica é o único dos três mecanismos que permite a reutilização automática de um endereço que não é mais necessário para o cliente ao qual foi atribuído (uso mais comum de servidor DHCP).

    A alocação dinâmica é útil para atribuir um endereço a um cliente que será conectado apenas temporariamente à rede ou para compartilhar um pool limitado de endereços IP entre um grupo de clientes que não precisa de endereços IP permanentes.

    A alocação dinâmica é uma boa opção para atribuir um endereço IP a um novo cliente permanentemente conectado a uma rede, em que os endereços IP sejam escassos o suficiente para que seja importante recuperá-los quando clientes antigos forem aposentados.


  3. Alocação Manual

    O endereço IP de um cliente é atribuído pelo administrador e o DHCP é usado para transmitir o endereço atribuído ao cliente. Uma rede pode usar um ou mais desses mecanismos, dependendo das políticas do administrador.

    A alocação manual permite que o DHCP seja usado para eliminar o processo propenso a erros de configuração manual de hosts com endereços IP em ambientes onde (por qualquer motivo) é desejável gerenciar.

    Aqui é definido explicitamente no arquivo de configuração o endereço IP de cada cliente ou apenas de alguns.



Configurando o servidor DHCP


Vamos ver como configurar o servidor DHCP. Primeiro vamos começar configurando em qual interface o DHCP vai escutar:

# Edite o arquivo abaixo: 
$ sudo vim /etc/default/isc-dhcp-server

# Coloque o nome correto de interface:
INTERFACESv4="eth0"

Agora vamos configurar o arquivo principal do DHCP:

# Primeiro renomeie o arquivo atual para termos um arquivo customizado:
$ sudo mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf-bkp

# Edite o arquivo abaixo:
$ sudo vim /etc/dhcp/dhcpd.conf

## Configure assim (vamos fornecer DHCP para a rede 192.168.121.0./24):
option domain-name "exemplo.com.br";

default-lease-time 600;
max-lease-time 7200;

authoritative;

ignore client-updates;

log-facility local7;

subnet 192.168.121.0 netmask 255.255.255.0
{
range 192.168.121.15 192.168.121.250;
option routers 192.168.121.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;
}


# Agora reinicie o serviço do DHCP:
$ sudo systemctl restart isc-dhcp-server

# Verifique se subiu, as vezes não mostra erro e não sobe:
$ sudo systemctl status isc-dhcp-server
● isc-dhcp-server.service - ISC DHCP IPv4 server
Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2023-04-14 17:35:29 UTC; 42s ago
Docs: man:dhcpd(8)
Main PID: 6360 (dhcpd)
Tasks: 4 (limit: 460)
Memory: 4.6M
CGroup: /system.slice/isc-dhcp-server.service
└─6360 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dh>

Apr 14 17:35:29 ubuntu2004.localdomain sh[6360]: PID file: /run/dhcp-server/dhcpd.pid
Apr 14 17:35:29 ubuntu2004.localdomain dhcpd[6360]: Wrote 1 leases to leases file.
Apr 14 17:35:29 ubuntu2004.localdomain sh[6360]: Wrote 1 leases to leases file.
Apr 14 17:35:29 ubuntu2004.localdomain dhcpd[6360]: Listening on LPF/eth0/52:54:00:e7:cc:47/192.168.121.>
Apr 14 17:35:29 ubuntu2004.localdomain sh[6360]: Listening on LPF/eth0/52:54:00:e7:cc:47/192.168.121.0/24
Apr 14 17:35:29 ubuntu2004.localdomain sh[6360]: Sending on LPF/eth0/52:54:00:e7:cc:47/192.168.121.0/24
Apr 14 17:35:29 ubuntu2004.localdomain sh[6360]: Sending on Socket/fallback/fallback-net
Apr 14 17:35:29 ubuntu2004.localdomain dhcpd[6360]: Sending on LPF/eth0/52:54:00:e7:cc:47/192.168.121.>
Apr 14 17:35:29 ubuntu2004.localdomain dhcpd[6360]: Sending on Socket/fallback/fallback-net
Apr 14 17:35:29 ubuntu2004.localdomain dhcpd[6360]: Server starting service.

# Para pegar IP no cliente pode usar o comando abaixo:
$ sudo dhclient

# Ou:
$ sudo dhclient eth1


Configurando endereços estáticos


Existem duas formas mais usadas para configurar um endereço IP estático para um host, a primeira é a configuração para um único host e a segunda é o agrupamento de vários hosts num grupo para aplicar a configuração:

# Único host:
host cliente
{
hardware ethernet 08:00:27:ef:e4:6e;
fixed-address 192.168.0.5;
}

É válido para poucos hosts ou onde a configuração entre eles não possuem nenhum similaridade.


group {
option domain-name-servers 1.1.1.1;
option ntp-servers 192.168.1.10;

host adm1 {
hardware ethernet 08:00:27:ef:e4:66;
fixed-address 192.168.1.183;
}

host adm2 {
hardware ethernet 08:00:27:ef:e4:77;
fixed-address 192.168.1.184;
}
}

Esse segundo exemplo com criação de grupo é melhor, pois, apesar de se parecer com o primeiro exemplo, ele possibilita definir opções que são iguais para todos do grupo, e ainda assim, definir configurações individuais para cada host.



BootP


O BOOTP (Bootstrap Protocol) é um protocolo de rede usado para iniciar máquinas denominadas "dump hosts", onde a máquina não possui um HD, é apenas um terminal, e precisa obter um S.O pela Rede para conseguir inicializar.


Vamos ver como configurar o BootP:

# Edite o arquivo abaixo:
$ sudo vim /etc/dhcp/dhcpd.conf

## Adicione as opções abaixo:
allow booting;
allow bootp;

group {
# Aqui depende do Sistemas que está iniciando e como foi configurado:
filename "bootx64.efi"

host terminal1 {
hardware ethernet 08:00:27:ef:e4:66;
fixed-address 192.168.1.183;
}

host terminal2 {
hardware ethernet 08:00:27:ef:e4:77;
fixed-address 192.168.1.184;
}
}

Vale notar que essa é apenas a parte do DHCP, ainda pode ser necessário configurar outras aplicações para que o BootP funcione.



DHCP Relay


O DHCP Relay (ou agente de retransmissão DHCP) é um recurso que permite que dispositivos em diferentes redes obtenham endereços IP de um único servidor DHCP. Quando um cliente DHCP está em uma rede diferente da do servidor DHCP, o agente de retransmissão é responsável por encaminhar as mensagens DHCP entre o cliente e o servidor, permitindo a comunicação entre eles. Esse recurso é útil porque possibilita que um único servidor DHCP atenda a várias redes diferentes, mesmo que ele não esteja diretamente conectado a todas elas.


O DHCP Relay é necessário porque as mensagens DHCP, como DHCPDISCOVER, são enviadas inicialmente como pacotes de broadcast. No entanto, pacotes de broadcast são limitados ao domínio de broadcast, ou seja, eles não atravessam roteadores ou gateways que separam diferentes redes. Sem o DHCP Relay, um servidor DHCP localizado em uma rede diferente do cliente DHCP não consegue receber essas mensagens de broadcast, já que os gateways não repassam esse tipo de tráfego entre redes. O agente de retransmissão DHCP resolve esse problema ao receber as mensagens de broadcast da rede local, convertê-las em pacotes unicast, e então encaminhá-las ao servidor DHCP em outra rede. Da mesma forma, ele encaminha as respostas do servidor de volta ao cliente, permitindo a atribuição de endereços IP entre redes diferentes.


Com o DHCP Relay evitamos de ter que colocado o servidor DHCP em todas as redes que ele deva atender, enchendo o servidor de interfaces em várias redes. Para habilitar esse recurso, basta instalar o pacote apropriado para configurar o serviço de DHCP Relay.

$ sudo apt install isc-dhcp-relay -y

# Agora configure o DHCP Relay (usar o IP do servidor DHCP):
$ sudo dhcrelay -i eth1 192.168.1.1

Ainda é possível configurar os parâmetro no arquivo /etc/default/isc-dhcp-relay.



IPv6


Vamos ver como configurar o IPv6 para o servidor DHCP.

# Edite o arquivo abaixo:
$ sudo vim /etc/default/isc-dhcp-server

## Descomente e acerte a interface:
DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf
DHCPDv6_PID=/var/run/dhcpd6.pid
INTERFACESv6="eth1"


# Edite o arquivo abaixo:
$ sudo vim /etc/dhcp/dhcpd6.conf

## Adicione a configuração abaixo:

default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.info-refresh-time 21600;

subnet6 2001:db8:abcd::/64 {
range6 2001:db8:abcd::100 2001:db8:abcd::200;

}


# Reinicie o serviço:
$ sudo systemctl restart isc-dhcp-server6.service

É necessário configurar a interface com IPv6, caso contrário não consegue fornecer IPv6.



Gateway em IPv6


Devido a arquitetura do IPv6 a configuração do Gateway não é mais realizada no DHCP, isso acontece porque o GW só é configurado pelas máquinas mediante mensagens na rede do tipo ICMPv6 (Router Advertisement, tendo o tipo 134) e são enviadas pelos roteadores, por isso a prática muitas das vezes é o Roteador fornecer o v6.


Para que o servidor possa responder a essas solicitações, podemos instalar o radvd para atuar como um GWv6 na rede e responder a essas solicitações.


Ele implementa o Protocolo NDP (Neighbor Discovery Protocol) que o IPv6 usa para fazer descobertas na Rede e se auto configurar dependendo da configurar do Router.


Ele pode ser instalado com o comando abaixo:

$ sudo apt install radvd -y

O arquivo de configuração fica em /etc/radvd.conf.



Fontes importantes


https://kb.isc.org/docs/isc-dhcp-44-manual-pages-dhcpdconf

https://kb.isc.org/docs/isc-dhcp-44-manual-pages-dhcp-options

https://en.wikipedia.org/wiki/Bootstrap_Protocol

https://www.youtube.com/watch?v=A3LFt7CHpgs