02 - Processo DORA (Discover, Offer, Request, Ack)
video: https://youtu.be/... no frontmatter da nota.Processo DORA (Discover, Offer, Request, Ack)
1. Definição e Visão Geral
O DHCP (Dynamic Host Configuration Protocol, RFC 2131) automatiza a atribuição de endereços IP e outras configurações de rede a hosts clientes. O protocolo é baseado em BOOTP (RFC 951) e usa UDP em duas portas: 67 (servidor) e 68 (cliente). O fluxo clássico de obtenção de um endereço IP pelo cliente é chamado DORA, acrônimo das quatro mensagens trocadas:
- Discover — cliente envia em broadcast.
- Offer — servidor responde com proposta.
- Request — cliente confirma a escolha.
- Ack — servidor finaliza com configuração completa.
Esse fluxo de quatro passos garante que múltiplos servidores DHCP possam coexistir na mesma rede, com o cliente escolhendo qual oferta aceitar. É um modelo de negociação leve, sem estado persistente até o Ack final.
2. Estrutura da Mensagem DHCP
Cada mensagem DHCP carrega um cabeçalho BOOTP de 236 bytes seguido de opções TLV (Type-Length-Value). Campos principais:
| Campo | Tamanho | Função |
|---|---|---|
| op | 1 byte | BOOTREQUEST (1) ou BOOTREPLY (2) |
| htype | 1 byte | Tipo de hardware (1 = Ethernet) |
| hlen | 1 byte | Comprimento do endereço de hardware (6 = MAC) |
| hops | 1 byte | Incrementado por relay agents |
| xid | 4 bytes | Transaction ID — correlaciona mensagens |
| secs | 2 bytes | Segundos desde início do processo |
| flags | 2 bytes | Broadcast (0x8000) ou unicast |
| ciaddr | 4 bytes | Client IP Address (atual, se tiver) |
| yiaddr | 4 bytes | Your IP Address — IP que o servidor oferece |
| siaddr | 4 bytes | Server IP Address (próximo servidor, TFTP) |
| giaddr | 4 bytes | Gateway IP Address (relay agent) |
| chaddr | 16 bytes | Client Hardware Address (MAC) |
| sname | 64 bytes | Server hostname (opcional) |
| file | 128 bytes | Boot file name (legacy TFTP) |
| options | variável | Opções DHCP (TLV) |
O campo op é o que diferencia mensagem de cliente (BOOTREQUEST) de servidor (BOOTREPLY). O xid identifica a transação — todas as 4 mensagens de uma negociação DORA compartilham o mesmo xid. O yiaddr ("your IP address") é onde o servidor escreve o IP que está oferecendo ao cliente.
3. Opções DHCP (TLV)
A flexibilidade do DHCP vem das opções, formatadas como TLV. As mais importantes:
| Código | Nome | Função |
|---|---|---|
| 53 | DHCP Message Type | Discover(1), Offer(2), Request(3), Ack(5), Nak(6), Release(7), Decline(8), Inform(9) |
| 1 | Subnet Mask | Máscara de rede |
| 3 | Router | Default gateway |
| 6 | Domain Name Server | Lista de DNS recursivos |
| 12 | Hostname | Nome do host cliente |
| 15 | Domain Name | Sufixo DNS |
| 28 | Broadcast Address | Endereço de broadcast da subrede |
| 42 | NTP Servers | Servidores de horário |
| 50 | Requested IP Address | IP que o cliente quer (renovação) |
| 51 | IP Address Lease Time | Duração do lease em segundos |
| 54 | Server Identifier | Identifica o servidor escolhido |
| 55 | Parameter Request List | Opções que o cliente gostaria |
| 60 | Vendor Class Identifier | Identifica tipo de cliente (ex: "MSFT 5.0") |
| 61 | Client Identifier | ID único do cliente (pode ser diferente do MAC) |
| 82 | Relay Agent Information | Adicionada por switches (circuit-ID, remote-ID) |
| 121 | Classless Static Route | Rotas estáticas em formato CIDR |
A opção 53 (Message Type) é obrigatória em toda mensagem DHCP — é o que distingue o DORA.
4. Passo a Passo do DORA
4.1 DISCOVER (Cliente → Broadcast)
O cliente acaba de ligar, não tem IP e não sabe quem são os servidores DHCP disponíveis. Constrói um pacote UDP:
- IP origem:
0.0.0.0(ainda não tem IP) - IP destino:
255.255.255.255(broadcast L2 e L3) - Porta origem:
68, Porta destino:67 - MAC origem: o do cliente, MAC destino:
FF:FF:FF:FF:FF:FF - xid: gerado aleatoriamente
- chaddr: MAC do cliente
- Opção 53 = 1 (Discover)
- Opção 55 = lista de parâmetros desejados
- Opção 60 = Vendor class (opcional)
[Cliente 0.0.0.0:68] --DISCOVER broadcast--> [255.255.255.255:67]
4.2 OFFER (Servidor → Cliente)
Cada servidor DHCP na rede recebe o Discover e decide se tem um lease disponível. Se sim, reserva temporariamente o IP e responde:
- IP origem: IP do servidor
- IP destino: varia — se o cliente ainda não tem IP, o servidor pode enviar broadcast
255.255.255.255(com flag broadcast setada no Discover) ou unicast para o IP oferecido (se o cliente sinalizou que aceita unicast com flag 0). - yiaddr: IP sendo oferecido
- Opções: máscara (1), gateway (3), DNS (6), lease time (51), server identifier (54)
[Servidor 192.168.1.1:67] --OFFER broadcast/unicast--> [Cliente MAC]
Se múltiplos servidores DHCP responderem, o cliente escolhe normalmente a primeira Offer recebida (ou a do servidor com o Server Identifier preferido).
4.3 REQUEST (Cliente → Broadcast)
O cliente confirma qual oferta aceitou. Importante: envia em broadcast, para que todos os servidores saibam qual foi escolhido e possam liberar reservas temporárias dos IPs que ofereceram mas não foram aceitos.
- Opção 53 = 3 (Request)
- Opção 50 = IP solicitado (o yiaddr da Offer aceita)
- Opção 54 = Server Identifier do servidor escolhido
[Cliente 0.0.0.0:68] --REQUEST broadcast--> [255.255.255.255:67]
# Servidor escolhido: "OK, esse é para mim."
# Servidores não escolhidos: "Liberar reserva temporária."
4.4 ACK (Servidor → Cliente)
O servidor escolhido confirma o lease definitivo:
- yiaddr = IP atribuído
- Opção 51 = lease time em segundos (típico: 86400 = 24h)
- Opção 1, 3, 6 = máscara, gateway, DNS
- Opção 54 = server identifier
- Opções adicionais solicitadas via 55
A partir deste momento, o cliente configura a interface e pode usar o IP normalmente.
4.5 NAK (Servidor → Cliente)
Se o servidor não puder honrar o Request (por exemplo, o IP foi dado a outro cliente no interim), responde com NAK (opção 53 = 6):
[Servidor] --NAK--> [Cliente]
# Cliente: reinicia o processo DORA do zero
5. Diagrama Completo
Cliente Servidor DHCP
| |
| ---- DISCOVER (broadcast) --------> |
| | (reserva IP temporariamente)
| <--- OFFER (yiaddr, options) ----- |
| |
| ---- REQUEST (broadcast) ---------> |
| (Server Identifier = X) |
| | (confirma reserva)
| <--- ACK (configuração final) ---- |
| |
| == Cliente configura interface == |
6. Casos Especiais
6.1 DHCP Inform
Cliente já tem IP (configurado estaticamente), mas quer apenas opções (DNS, NTP). Envia Inform:
[Cliente 192.168.1.50] --INFORM--> [Servidor]
[Servidor] --ACK--> [Cliente com apenas opções, sem lease]
6.2 DHCP Decline
Cliente recebeu Ack, mas faz dupla-verificação com ARP para garantir que o IP não está em uso. Se o ARP responder, o cliente envia Decline (opção 53 = 8) e reinicia o processo.
6.3 DHCP Release
Cliente libera explicitamente o lease antes de expirar (opção 53 = 7). Não é obrigatório — sem Release, o lease expira naturalmente quando atinge o tempo. Mas é boa prática ao desligar uma VM, por exemplo, para liberar o IP na pool.
6.4 Renovação (T1 e T2)
Após 50% do lease time (T1), o cliente envia unicast REQUEST ao servidor para renovar. Se o servidor não responder até 87,5% (T2), o cliente envia broadcast REQUEST tentando qualquer servidor.
7. Captura Prática com tcpdump
sudo tcpdump -ni eth0 -vvv 'port 67 or port 68'
# Saída típica de um DORA:
12:00:01.123456 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from aa:bb:cc:11:22:33, length 300, xid 0x12345678, Discover
12:00:01.234567 IP 192.168.1.1.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 300, xid 0x12345678, Offer, Flags [Broadcast], yiaddr 192.168.1.100
12:00:01.345678 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from aa:bb:cc:11:22:33, length 300, xid 0x12345678, Request
12:00:01.456789 IP 192.168.1.1.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 300, xid 0x12345678, Ack, Flags [Broadcast], yiaddr 192.168.1.100
Acompanhe o campo xid — deve ser o mesmo nas 4 mensagens.
8. Configuração de Servidor (ISC DHCPd)
# /etc/dhcp/dhcpd.conf
default-lease-time 86400; # 24h
max-lease-time 172800; # 48h
authoritative;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
option domain-name-servers 1.1.1.1, 8.8.8.8;
option domain-name "exemplo.com.br";
option broadcast-address 192.168.1.255;
option ntp-servers 192.168.1.1;
}
# Reserva estática (host específico)
host impressora-3o-andar {
hardware ethernet aa:bb:cc:dd:ee:ff;
fixed-address 192.168.1.50;
}
9. Problemas Comuns
Dois Servidores DHCP na Mesma Rede
Acidentalmente (ex: roteador doméstico + servidor Windows DHCP). O cliente recebe duas Offers e pode pegar IP de qualquer um. Solução: desativar um dos dois, ou configurar DHCP snooping no switch para bloquear respostas DHCP de portas não autorizadas.
IP Conflitante (Already in Use)
Cliente recebeu IP que está em uso por máquina configurada estaticamente. O Ack foi enviado, mas o ARP de verificação responde. Cliente envia Decline e recomeça. Solução: excluir ranges estáticos da pool DHCP.
Cliente Não Recebe Endereço
- Verificar conectividade L2 (cabo, VLAN).
- Verificar se servidor DHCP está ouvindo na VLAN correta.
- Verificar se há relay agent (ip helper-address) configurado se cliente e servidor estão em VLANs diferentes.
10. Tabela Resumo
| Mensagem | Opção 53 | Origem → Destino | Função |
|---|---|---|---|
| Discover | 1 | Cliente (0.0.0.0) → broadcast | Procurar servidor |
| Offer | 2 | Servidor → Cliente | Propor IP e opções |
| Request | 3 | Cliente → broadcast | Aceitar oferta específica |
| Ack | 5 | Servidor → Cliente | Confirmar lease definitivo |
| Nak | 6 | Servidor → Cliente | Recusar Request |
| Decline | 8 | Cliente → broadcast | IP em conflito |
| Release | 7 | Cliente → Servidor | Liberar lease |
| Inform | 9 | Cliente → Servidor | Solicitar apenas opções |
11. Conclusão
O processo DORA é elegante na sua simplicidade: quatro mensagens, com o cliente como iniciador e os servidores competindo pela oferta. Apesar de quase 30 anos de idade (RFC 2131 é de 1997), o DHCP continua sendo a forma padrão de atribuir IPs em redes IPv4. Entender os campos da mensagem (xid, yiaddr, chaddr), as opções (especialmente 53, 54, 50, 51) e o fluxo broadcast/unicast é essencial para diagnosticar qualquer problema de conectividade em rede corporativa — desde um notebook que não pega IP até impressoras com IPs conflitantes. As extensões modernas (opção 82 em relays, classless static routes, prefix delegation em DHCPv6) são construídas sobre a mesma base DORA.