Dia 17: DHCP e PXE — dhcpd, PXE Boot e Provisioning
O DHCP atribui automaticamente endereços IP, máscara, gateway e DNS a cada máquina que liga na rede. Sem DHCP, cada novo equipamento teria de ser configurado manualmente — impraticável em qualquer infraestrutura com mais de algumas dezenas de máquinas. O PXE (Preboot Execution Environment) vai mais longe: permite que uma máquina sem sistema operativo instalado arranque pela rede, descarregue um instalador ou imagem de diagnóstico e fique operacional sem suporte físico (pen USB ou DVD).
Este artigo cobre a configuração de um servidor DHCP com ISC dhcpd (referência histórica, ainda amplamente usada) e dnsmasq (alternativa leve ideal para PME e laboratórios), seguida da configuração de PXE Boot com PXELINUX e TFTP. Mostramos a sintaxe para Debian/Ubuntu e RHEL/Rocky/Alma, os erros comuns (conflito de DHCP, permissões TFTP, opções PXE erradas) e um checklist de verificação antes de colocar o servidor em produção.
ip helper-address <ip-dhcp-server>.1. Como Funciona o DHCP — DORA e Estados
2. Instalar o ISC dhcpd (Debian/Ubuntu e RHEL)
3. Configurar dhcpd.conf — Scopes, Reservas e Opções
4. Alternativa Leve — dnsmasq para PME
5. Instalar TFTP Server e PXELINUX
6. Configurar PXE no dhcpd — option 66 e 67
7. Configurar PXE com dnsmasq (tudo-em-um)
8. Erros Comuns e Soluções
9. Checklist de Verificação
1. Como Funciona o DHCP — DORA e Estados
Quando uma máquina liga na rede sem IP configurado, envia um DHCPDISCOVER em broadcast (MAC-level, destino 255.255.255.255). Todos os servidores DHCP que recebem o broadcast respondem com DHCPOFFER, propondo um IP do seu scope. O cliente escolhe uma oferta (geralmente a primeira) e responde com DHCPREQUEST, também em broadcast, indicando qual servidor escolheu. O servidor confirma com DHCPACK. Este ciclo de quatro mensagens é conhecido pela sigla DORA — Discover, Offer, Request, Acknowledge (Wikipedia — DHCP, ISC).
O DHCP é stateful: cada lease (aluguer de IP) tem um tempo de validade. O cliente renova a metade do tempo (T1) e tenta rebind perto do fim (T2). Se o lease expirar sem renovação, o IP volta ao pool. A configuração típica usa leases de 8 a 24 horas para redes fixas (escritórios) e 1-2 horas para redes dinâmicas (Wi-Fi de visitantes).
Para PXE, o DHCP tem um papel adicional: além do IP, entrega ao cliente a opção 66 (endereço do TFTP server) e opção 67 (nome do ficheiro bootloader a descarregar). O cliente PXE faz o TFTP do bootloader (ex: pxelinux.0), executa-o, e esse bootloader encarrega-se de carregar o kernel e o initrd — ou apresenta um menu de arranque (Wikipedia — PXE, Syslinux PXELINUX).
2. Instalar o ISC dhcpd (Debian/Ubuntu e RHEL)
O ISC dhcpd é o servidor DHCP clássico. Em Debian/Ubuntu instala-se com apt; em RHEL/Rocky/Alma com dnf. O pacote chama-se isc-dhcp-server em Debian e dhcp-server em RHEL 9+. Antes de instalar, verifica se a porta 67/udp está livre — outro DHCP (modem router, dnsmasq) pode estar a ouvir.
Para Debian e Ubuntu:
sudo apt update
sudo apt install isc-dhcp-server
# Verificar que arrancou e a ouvir em 0.0.0.0:67
sudo ss -lunp | grep ':67 '
Para RHEL 9, Rocky Linux e AlmaLinux:
sudo dnf install dhcp-server
sudo systemctl enable --now dhcpd
sudo ss -lunp | grep ':67 '
Em Debian/Ubuntu, antes de arrancar o serviço é preciso declarar a interface de escuta em /etc/default/isc-dhcp-server:
# /etc/default/isc-dhcp-server
INTERFACESv4="eth0"
INTERFACESv6=""
Em RHEL, a interface é declarada no ficheiro systemd override ou no ficheiro /etc/sysconfig/dhcpd (depende da versão). Sem declarar a interface, o dhcpd pode recusar arrancar com erro “Not configured to listen on any interfaces”.
3. Configurar dhcpd.conf — Scopes, Reservas e Opções
O ficheiro principal é /etc/dhcp/dhcpd.conf (Debian/Ubuntu) ou /etc/dhcp/dhcpd.conf (RHEL — mesmo path). A sintaxe é declarativa: define-se parâmetros globais (DNS, domínio, lease time) e depois subnets (scopes) com ranges de IP. Dentro de cada subnet podes ter host blocks para reservas estáticas baseadas em MAC (Arch wiki — dhcpd, Debian Handbook, Ubuntu docs).
# /etc/dhcp/dhcpd.conf
# Parametros globais
option domain-name "lab.local";
option domain-name-servers 192.168.1.10, 1.1.1.1;
default-lease-time 28800; # 8 horas
max-lease-time 86400; # 24 horas (teto)
authoritative; # este server e autoritativo
# Scope da rede 192.168.1.0/24
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 broadcast-address 192.168.1.255;
option subnet-mask 255.255.255.0;
option ntp-servers 192.168.1.10;
}
# Reserva estatica para impressora (MAC fixo, IP fixo)
host impressora-laser {
hardware ethernet 00:11:22:33:44:55;
fixed-address 192.168.1.50;
}
# Reserva estatica para servidor de monitorizacao
host grafana-node {
hardware ethernet aa:bb:cc:dd:ee:ff;
fixed-address 192.168.1.60;
}
Parâmetros-chave do exemplo acima:
authoritative— o servidor responde com DHCPNAK se um cliente pedir um IP que não pertence ao seu scope (evita “fantasmas” de outros servidores). Sem esta linha, um servidor DHCP antigo pode ficar silencioso e deixar máquinas presas.range— o pool dinâmico. Nunca sobreponhas o range com IPs de reservas ou estáticos — o dhcpd não detecta overlap automaticamente.fixed-address— reserva permanente: o MAC indicado recebe sempre o mesmo IP. Útil para impressoras, APs, servidores.option routers— gateway default entregue ao cliente (opção 3).option domain-name-servers— lista de DNS (opção 6), separada por vírgulas.
Depois de editar, valida a sintaxe e reinicia o serviço:
# Debian/Ubuntu
sudo dhcpd -t # testa sintaxe (nao arranca)
sudo systemctl restart isc-dhcp-server
sudo journalctl -u isc-dhcp-server -n 20
# RHEL/Rocky/Alma
sudo dhcpd -t
sudo systemctl restart dhcpd
sudo journalctl -u dhcpd -n 20
O comando dhcpd -t faz um teste de sintaxe sem arrancar o serviço — é a primeira coisa a correr quando o dhcpd não inicia. As leases activas ficam em /var/lib/dhcp/dhcpd.leases (Debian) ou /var/lib/dhcpd/dhcpd.leases (RHEL); consulta esse ficheiro para ver que máquinas estão a usar o servidor.
4. Alternativa Leve — dnsmasq para PME
O dnsmasq é um servidor DHCP + DNS caching + TFTP integrado numa única ferramenta. É muito mais leve que o ISC dhcpd e ideal para redes pequenas (PME, home lab, redes de teste). Combina três serviços que com dhcpd precisariam de três pacotes separados — DHCP, DNS forwarder e TFTP para PXE. A configuração é um único ficheiro /etc/dnsmasq.conf (ou ficheiros em /etc/dnsmasq.d/), mais legível que dhcpd.conf (Arch wiki — dnsmasq, man dnsmasq).
# /etc/dnsmasq.conf
# Interface de escuta
interface=eth0
bind-interfaces
# DHCP: range, lease, gateway, DNS
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,8h
dhcp-option=option:router,192.168.1.1
dhcp-option=option:dns-server,192.168.1.10,1.1.1.1
# Reservas estaticas por MAC
dhcp-host=00:11:22:33:44:55,192.168.1.50,impressora-laser
dhcp-host=aa:bb:cc:dd:ee:ff,192.168.1.60,grafana-node
# TFTP para PXE (activar quando chegarmos ao passo 7)
# enable-tftp
# tftp-root=/srv/tftp
# dhcp-boot=pxelinux.0
Instalação:
# Debian/Ubuntu
sudo apt install dnsmasq
sudo systemctl enable --now dnsmasq
# RHEL/Rocky/Alma
sudo dnf install dnsmasq
sudo systemctl enable --now dnsmasq
# Validar config e reiniciar
sudo dnsmasq --test
sudo systemctl restart dnsmasq
sudo journalctl -u dnsmasq -n 20
O dnsmasq arranca por omissão na porta 53 (DNS) e 67/udp (DHCP). Se o systemd-resolved estiver activo em Ubuntu, entra em conflito com a porta 53 — é preciso desactivá-lo ou mudar o dnsmasq para outra porta. Vemos isto na secção “Erros Comuns”.
5. Instalar TFTP Server e PXELINUX
O PXE precisa de um TFTP server para servir o bootloader e os ficheiros do menu de arranque. O TFTP é um protocolo simples, sem autenticação, que transfere ficheiros por UDP porta 69 — é purpose-built para boot de rede, não serve para transferências gerais. O PXELINUX é o bootloader da família Syslinux que sabe ler um menu em texto (default, label, kernel, append) e carregar o kernel que escolheres (Syslinux PXELINUX, Arch wiki — PXE, Arch wiki — Diskless).
# Debian/Ubuntu: instalar tftpd-hpa e syslinux-common
sudo apt install tftpd-hpa syslinux pxelinux
sudo mkdir -p /srv/tftp/pxelinux.cfg
sudo cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/ldlinux.c32 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/menu.c32 /srv/tftp/
sudo cp /usr/lib/syslinux/modules/bios/libutil.c32 /srv/tftp/
# RHEL/Rocky/Alma: instalar tftp-server e syslinux
sudo dnf install tftp-server syslinux-tftpboot
sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg
# Os ficheiros pxelinux.0 e modulos ja ficam em /var/lib/tftpboot/
Em RHEL 9, o tftp-server usa systemd socket activation. Para activar:
sudo systemctl enable --now tftp.socket
sudo systemctl enable --now tftp.service
Em Debian/Ubuntu, o tftpd-hpa arranca via sysvinit ou systemd consoante a versão. O ficheiro /etc/default/tftpd-hpa define o TFTP_DIRECTORY (por omissão /srv/tftp).
Para arranque UEFI (PCs modernos sem Legacy BIOS), o PXELINUX não funciona — é preciso usar syslinux/efi64 ou o bootloader GRUB EFI (grubx64.efi). O dhcpd entrega o ficheiro bootloader correcto consoante a opção 93 do cliente (client-arch). Voltamos a isto no passo 6.
6. Configurar PXE no dhcpd — option 66 e 67
Para um cliente PXE saber onde ir buscar o bootloader, o DHCP entrega duas opções extra: a opção 66 (next-server) com o IP do TFTP server, e a opção 67 (filename) com o nome do ficheiro a descarregar. Em dhcpd.conf, estas linhas adicionam PXE ao scope existente:
# Adicionar dentro do subnet 192.168.1.0/24 existente
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;
# PXE: indicar TFTP server e bootloader
next-server 192.168.1.10; # IP do servidor TFTP
filename "pxelinux.0"; # bootloader BIOS legacy
}
Para suportar BIOS legacy e UEFI no mesmo servidor, usa uma classe baseada na opção 93 (Client System Architecture Type). O dhcpd entrega um bootloader diferente consoante o tipo de firmware:
# /etc/dhcp/dhcpd.conf - classes PXE BIOS vs UEFI
class "pxe-clients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 192.168.1.10;
# BIOS legacy (opcao 93 = 0000)
if option arch = 00:00 {
filename "pxelinux.0";
}
# UEFI x64 (opcao 93 = 0007)
elsif option arch = 00:07 {
filename "syslinux/efi64/syslinux.efi";
}
# UEFI x64 (opcao 93 = 0009)
elsif option arch = 00:09 {
filename "syslinux/efi64/syslinux.efi";
}
}
Depois de configurar PXE no dhcpd, cria o ficheiro de menu em /srv/tftp/pxelinux.cfg/default (Debian) ou /var/lib/tftpboot/pxelinux.cfg/default (RHEL):
# /srv/tftp/pxelinux.cfg/default
default menu.c32
prompt 0
timeout 100 # 10 segundos antes de arrancar default
ontimeout local # se nada escolhido, arranca do disco local
menu title ### Menu PXE - Lab de Instalacao ###
label local
menu label Arrancar do Disco Local
localboot 0x80
label install-debian
menu label Instalar Debian 12 (Netboot)
kernel debian-installer/amd64/linux
append initrd=debian-installer/amd64/initrd.gz
label memtest
menu label MemTest86+
kernel memtest86+/memtest
Parâmetros do menu:
default menu.c32— carrega o módulo de menu gráfico do Syslinux (precisas de copiarmenu.c32para/srv/tftp/).timeout 100— tempo em décimos de segundo (100 = 10s) antes de arrancar a opçãoontimeout.localboot 0x80— arranque do primeiro disco local. Útil como fallback: se nada for escolhido, a máquina arranca normalmente do disco.kernel+append initrd=— indica o caminho (relativo à raiz TFTP) do kernel e do initrd.
Os kernels e initrds têm de ser copiados para a raiz TFTP. Para Debian netboot, descarrega a tarball oficial e extrai:
cd /srv/tftp
sudo wget https://deb.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/netboot.tar.gz
sudo tar xzf netboot.tar.gz
sudo rm netboot.tar.gz
sudo chown -R nobody:nogroup /srv/tftp # Debian
sudo chown -R tftp:tftp /var/lib/tftpboot # RHEL
7. Configurar PXE com dnsmasq (tudo-em-um)
Com dnsmasq, o DHCP, DNS e TFTP ficam num único serviço — não é preciso instalar tftpd-hpa separado. Para activar PXE, basta descomentar três linhas em /etc/dnsmasq.conf e apontar para os ficheiros PXELINUX:
# /etc/dnsmasq.conf - acrescentar ao DHCP basico do passo 4
# Activar TFTP embutido
enable-tftp
tftp-root=/srv/tftp
# PXE BIOS legacy
dhcp-boot=pxelinux.0
# Para suportar BIOS e UEFI simultaneamente:
# dhcp-match=set:efi-x86_64,option:client-arch,7
# dhcp-boot=tag:efi-x86_64,syslinux/efi64/syslinux.efi
# dhcp-boot=pxelinux.0
A directiva dhcp-match marca clientes cuja opção client-arch é 7 (UEFI x64) com a tag efi-x86_64, e dhcp-boot=tag:efi-x86_64,... entrega o bootloader UEFI só a esses. Sem tag, é entregue a todos. É a forma compacta de fazer o mesmo que as classes dhcpd do passo 6, mas numa única linha.
Depois de editar, reinicia e valida:
sudo dnsmasq --test
sudo systemctl restart dnsmasq
sudo ss -lunp | grep -E ':67|:69' # DHCP 67 + TFTP 69
sudo journalctl -u dnsmasq -n 30
| Aspecto | ISC dhcpd + tftpd | dnsmasq |
|---|---|---|
| Serviços separados | Sim (dhcpd + tftpd-hpa) | Não (tudo num binário) |
| Configuração | dhcpd.conf + tftpd config | dnsmasq.conf apenas |
| Failover DHCP | Sim (dhcpd failover peer) | Não nativo |
| DNS forwarder | Não (precisa bind9 à parte) | Sim (integrado) |
| Ideal para | Redes médias/grandes, enterprise | PME, home lab, redes pequenas |
| Memória típica | ~50-100 MB | ~5-15 MB |
8. Erros Comuns e Soluções
A tabela seguinte reúne os problemas mais frequentes em servidores DHCP e PXE. A maioria está relacionada com conflitos de portas, permissões TFTP e options PXE mal configuradas.
| Problema | Causa | Solução |
|---|---|---|
| dhcpd não arranca, “Not configured to listen on any interfaces” | Interface não declarada em INTERFACESv4 (Debian) ou sem IP na interface | Adicionar a interface em /etc/default/isc-dhcp-server; confirmar que a interface tem IP com ip addr show |
| Clientes não recebem IP | Outro DHCP na rede (modem router, switch L3) ou DHCP Snooping a bloquear | Desligar DHCP do router; configurar IP helper no switch L3; em Cisco, ip helper-address |
| IPs duplicados na rede | Dois DHCP com scopes sobrepostos no mesmo L2 | Desligar um dos DHCP ou usar scopes disjuntos (range não sobreposto) |
| PXE para em “TFTP download failed” | TFTP server não está a correr ou ficheiro não existe na raiz | Verificar ss -lunp | grep :69, confirmar que pxelinux.0 está na raiz TFTP, validar permissões de leitura |
| PXE carrega pxelinux.0 mas não encontra menu | Falta o ficheiro pxelinux.cfg/default ou módulos .c32 | Criar /srv/tftp/pxelinux.cfg/default e copiar menu.c32, ldlinux.c32, libutil.c32 |
| PC UEFI não arranca por PXE | dhcpd a entregar pxelinux.0 (BIOS) a um cliente UEFI | Usar classes dhcpd (option arch) ou dhcp-match dnsmasq para entregar syslinux.efi a UEFI |
| dnsmasq não arranca, “address already in use” | systemd-resolved ocupa porta 53 ou outro DNS ativo | Desactivar systemd-resolved (systemctl disable --now systemd-resolved) ou usar port=0 no dnsmasq.conf |
| dhcpd -t devolve erro de sintaxe | Falta ponto e vírgula no fim de uma linha ou chaveta não fechada | O erro indica a linha exacta. Verificar todas as linhas terminam em ; e cada { tem } correspondente |
| Leases não renovam, máquinas perdem IP | default-lease-time demasiado curto ou servidor reiniciado sem persistência | Aumentar default-lease-time (28800 = 8h típico); confirmar que dhcpd.leases está num directório persistente |
9. Checklist de Verificação
Antes de declarar o servidor DHCP + PXE pronto para produção, confirma cada item abaixo. Alguns são obrigatórios (sem eles nada funciona), outros são boas práticas que evitam problemas silenciosos mais tarde.
- Verificar portas 67/udp e 69/udp activas com
ss -lunp | grep -E ':67|:69'. Se 69 não aparecer, o TFTP não está a correr. - Correr dhcpd -t (ou dnsmasq –test) sem erros antes de reiniciar o serviço. Qualquer erro aqui significa que o serviço não vai arrancar.
- Confirmar que não há outro DHCP na rede. O maior causador de IPs duplicados. Verificar modem router, switches L3, access points (muitos APs têm DHCP activo por omissão).
- Validar permissões TFTP: o utilizador
nobody(Debian) outftp(RHEL) tem de conseguir ler todos os ficheiros em/srv/tftpou/var/lib/tftpboot. - Testar TFTP manualmente com
tftp 192.168.1.10 -c get pxelinux.0 /tmp/testa partir de outra máquina. Se devolver “File not found”, o ficheiro não está na raiz ou as permissões falham. - Confirmar next-server e filename no dhcpd.conf apontam para o IP correcto do TFTP server e para o bootloader certo (pxelinux.0 para BIOS, syslinux.efi para UEFI).
- Testar PXE numa máquina virtual (VirtualBox, KVM/libvirt, Hyper-V) com boot de rede activo. Configurar a VM para arrancar por PXE primeiro. Se o menu aparecer, a configuração está correcta.
- Configurar firewall para permitir 67/udp, 68/udp, 69/udp e tráfego TFTP passivo. Em firewalld:
sudo firewall-cmd --permanent --add-service={dhcp,tftp}e--reload. Em UFW:sudo ufw allow 67/udp && sudo ufw allow 69/udp. - Documentar reservas estáticas numa tabela (hostname, MAC, IP atribuído). Facilita troubleshooting e auditoria.
- Configurar relay DHCP se o servidor estiver noutra VLAN. Em Cisco:
ip helper-address <ip-dhcp>na interface VLAN. Em Linux com relay:dhcrelay -i <iface-client> <ip-dhcp-server>.
authoritative são os parâmetros com maior impacto negativo se mal configurados.- Dia 16: DNS Server no Linux — Bind9, unbound e Zonas — DHCP e DNS são complementares; o dnsmasq faz ambos.
- Dia 8: Redes Linux — ip, ss, nmcli e DNS — Fundamentos de rede que este artigo pressupõe.
- Dia 9: Firewalls Linux — iptables, nftables, UFW e firewalld — Abrir portas 67/69 para DHCP e TFTP.
- Dia 18: NFS e Samba — File Sharing Linux-Linux e Linux-Windows — Próximo dia do curso.