DHCP cheio no Windows Server: como liberar IPs inativos e evitar o esgotamento do pool (guia PowerShell)

DHCP lotado no Windows Server 2019? Este guia prático mostra como liberar IPs “inativos” com PowerShell sem derrubar clientes, sincronizar com o DNS e aplicar medidas para o pool não voltar a esgotar. Inclui scripts reutilizáveis, checklists e boas práticas de planejamento.

Índice

Visão geral do problema

Quando o escopo IPv4 do DHCP esgota, novos dispositivos deixam de obter endereço e a rede aparenta “cair” para quem chega depois. Em Windows Server 2019, isso costuma se relacionar a:

  • Leases expirados ou marcados como conflito (endereço “declined”/BAD_ADDRESS) que não foram reaproveitados.
  • Lease time longo em ambientes com muitos dispositivos transitórios (salas de reunião, Wi‑Fi de visitantes, VDI, PDV, escolas etc.).
  • Sub-rede pequena para a demanda real (por exemplo, /24 onde o pico exige >250 clientes simultâneos).
  • DNS sujo, o que atrapalha resoluções e automações (não é causa direta do esgotamento, mas agrava sintomas e troubleshooting).

Confirme o esgotamento e defina o que é “inativo”

Antes de sair apagando leases, meça a ocupação do(s) escopo(s) e conheça os estados de concessão. Use PowerShell no servidor DHCP (ou de uma estação com RSAT):

# Estatísticas por escopo: % em uso, livres, reservas etc.
Get-DhcpServerv4ScopeStatistics

Estatísticas de um escopo específico:
Get-DhcpServerv4ScopeStatistics -ScopeId 192.168.10.0

Todas as concessões (inclui ativas, expiradas e declined)
Get-DhcpServerv4Lease -ScopeId 192.168.10.0 -AllLeases | 
  Select-Object IPAddress, ClientId, HostName, LeaseExpiryTime, AddressState | 
  Format-Table -Auto

Estados que importam na limpeza:

Estado (AddressState)DefiniçãoRemover agora?Risco
ActiveConcessão válida; o cliente provavelmente está em uso e mantém o IP até expirar.NãoRemover pode gerar duplicidade e conflitos sem “derrubar” o cliente imediatamente.
ExpiredConcessão vencida; o cliente não renovou no prazo.SimBaixo. O cliente renegociará e poderá receber outro IP.
Declined (BAD_ADDRESS)Marcado por conflito/duplicidade de IP após checagem ARP.SimMédio. Limpe, mas investigue a origem do conflito (estático sobreposto, duplicação, etc.).

Limpeza pontual sem derrubar clientes

Importante: apagar a concessão no servidor não força o cliente a renovar de imediato; ele continuará usando o IP até o próximo ciclo de renovação. A limpeza serve para liberar o endereço dentro do pool, não para desconectar máquinas.

Remover apenas endereços em conflito

Em versões mais novas do módulo DHCP há parâmetro específico para bad leases. Em servidores sem esse parâmetro, filtre por AddressState -eq 'Declined':

# Filtrar e pré-visualizar
Get-DhcpServerv4Lease -ScopeId 192.168.10.0 -AllLeases |
  Where-Object { $_.AddressState -eq 'Declined' } |
  Select ScopeId, IPAddress, ClientId, HostName

Executar a remoção
Get-DhcpServerv4Lease -ScopeId 192.168.10.0 -AllLeases |
  Where-Object { $_.AddressState -eq 'Declined' } |
  Remove-DhcpServerv4Lease -Confirm:$false

Remover concessões expiradas e declinadas

# Pré-visualização
Get-DhcpServerv4Lease -ScopeId 192.168.10.0 -AllLeases |
  Where-Object { $_.AddressState -in @('Expired','Declined') } |
  Select ScopeId, IPAddress, ClientId, HostName, AddressState

Remoção efetiva

Get-DhcpServerv4Lease -ScopeId 192.168.10.0 -AllLeases |
Where-Object { $\_.AddressState -in @('Expired','Declined') } |
Remove-DhcpServerv4Lease -Confirm:\$false 

“Paliativo” de emergência

Reiniciar o serviço DHCP às vezes reaproveita registros antigos, mas é medida temporária e pode afetar logs e renovações em progresso. Use apenas se necessário:

net stop dhcpserver
net start dhcpserver

Sincronize com o DNS (se usar DNS dinâmico)

Limpar leases não apaga automaticamente registros DNS antigos. Para evitar “lixo”:

  1. Habilite Aging/Scavenging no servidor DNS e nas zonas relevantes (defina intervalos de No-refresh e Refresh condizentes com o lease time).
  2. Execute o Scavenging sob demanda após a limpeza de leases:
Start-DnsServerScavenging -Verbose

Além disso, no console do DHCP (IPv4 → Propriedades → guia DNS), marque:

  • “Atualizar dinamicamente os registros A e PTR…” de acordo com sua política;
  • “Descartar registros A/AAAA e PTR quando a concessão for excluída”.

Automatização: script de limpeza segura

O script abaixo remove apenas concessões Expired e Declined em um ou mais escopos, com registro em CSV e opção de dry-run para conferência.

# Save as: Clean-DhcpLeases.ps1
[CmdletBinding(SupportsShouldProcess = $true)]
param(
  [Parameter(Mandatory = $false)]
  [string[]] $ScopeId,

  [switch] $IncludeExpired = $true,
  [switch] $IncludeDeclined = $true,

  [string] $CsvPath = "C:\Temp\DhcpLeasesCleaned.csv",

  [switch] $WhatIf
)

function Get-TargetScopes {
  if ($null -ne $ScopeId -and $ScopeId.Count -gt 0) { return $ScopeId }
  return (Get-DhcpServerv4Scope | Select-Object -ExpandProperty ScopeId)
}

$scopes = Get-TargetScopes
$removed = @()

foreach ($s in $scopes) {
  Write-Verbose "Processando escopo $s"
  $leases = Get-DhcpServerv4Lease -ScopeId $s -AllLeases
  $targets = $leases | Where-Object {
    ( $IncludeExpired  -and $_.AddressState -eq 'Expired' ) -or
    ( $IncludeDeclined -and $_.AddressState -eq 'Declined' )
  }

  if (-not $targets) {
    Write-Verbose "Nada a remover em $s"
    continue
  }

  $targets |
    Select-Object @{n='ScopeId';e={$s}},IPAddress,ClientId,HostName,AddressState,LeaseExpiryTime |
    Tee-Object -Variable preview | Out-Host

  if ($PSCmdlet.ShouldProcess("$($preview.Count) concessões em $s","Remover","Clean-DhcpLeases")) {
    $targets | Remove-DhcpServerv4Lease -Confirm:$false
    $removed += $preview
  }
}

if ($removed.Count -gt 0) {
  $dir = Split-Path -Path $CsvPath -Parent
  if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir | Out-Null }
  $removed | Export-Csv -NoTypeInformation -Path $CsvPath -Append
  Write-Host "Concluído. Removidas $($removed.Count) concessões. Log: $CsvPath"
} else {
  Write-Host "Nenhuma concessão removida."
}

Como usar:

  • Pré-visualização em todos os escopos (sem remover de fato):
    .\Clean-DhcpLeases.ps1 -WhatIf -Verbose
  • Remover apenas em um escopo:
    .\Clean-DhcpLeases.ps1 -ScopeId 192.168.10.0
  • Exportar log CSV para auditoria:
    .\Clean-DhcpLeases.ps1 -CsvPath "C:\Logs\limpeza.csv"

Monitore a ocupação para não lotar de novo

Automatize um alerta quando um escopo ultrapassar, por exemplo, 80% de uso.

# Mostra escopos acima de 80% de utilização
Get-DhcpServerv4ScopeStatistics |
  Where-Object { $_.PercentageInUse -gt 80 } |
  Sort-Object PercentageInUse -Descending |
  Format-Table ScopeId, Free, InUse, PercentageInUse -Auto

Exemplo simples de alerta por e-mail (ajuste para seu servidor SMTP ou use webhook/ITSM):

$criticos = Get-DhcpServerv4ScopeStatistics | Where-Object { $_.PercentageInUse -ge 90 }
$alertas  = Get-DhcpServerv4ScopeStatistics | Where-Object { $.PercentageInUse -ge 80 -and $.PercentageInUse -lt 90 }

if ($criticos -or $alertas) {
  $body = @()
  if ($criticos) {
    $body += "Críticos (>=90%):"
    $body += ($criticos | Format-Table ScopeId,InUse,Free,PercentageInUse -Auto | Out-String)
  }
  if ($alertas) {
    $body += "Alerta (>=80%):"
    $body += ($alertas | Format-Table ScopeId,InUse,Free,PercentageInUse -Auto | Out-String)
  }
  # Substitua pelo método de notificação preferido
  Send-MailMessage -To "noc@empresa.com" -From "dhcp@empresa.com" `
    -Subject "[DHCP] Escopos com alta ocupação" `
    -Body ($body -join "`r`n") -SmtpServer "smtp.empresa.com"
}

Agende a execução via Task Scheduler (Executar com privilégios elevados e conta com permissões no DHCP/DNS):

# Exemplo de agendamento diário 07:00
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\Clean-DhcpLeases.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 07:00
Register-ScheduledTask -TaskName "DHCP-CleanAndAlert" -Action $action -Trigger $trigger -RunLevel Highest

Corrija a causa raiz

Ajuste a duração do lease

Em muitos ambientes, um lease de 8 dias (padrão) é excessivo. Reduzir o tempo acelera a devolução de IPs “fantasmas”. Ajuste por escopo conforme o perfil:

AmbienteSugestão de LeaseObservações
Wi‑Fi de visitantes, eventos4–24 horasAlta rotatividade; ganhos rápidos na recuperação de IPs.
Escritório padrão2–4 diasEquilíbrio entre tráfego de renovação e disponibilidade.
Dispositivos fixos (IoT, PDV)7–14 diasBaixa rotatividade; pode manter mais longo.
# Exemplo: 1 dia (formato d.hh:mm:ss)
Set-DhcpServerv4Scope -ScopeId 192.168.10.0 -LeaseDuration 1.00:00:00

Expanda a capacidade do pool

Se a demanda é real, aumentar o pool é inevitável. Existem três caminhos, do mais rápido ao mais estruturado:

Ampliação rápida com Superscope

Crie um segundo escopo contíguo (por ex., 192.168.11.0/24) e agrupe em um superscope. É uma forma de ganhar fôlego sem renumerar toda a rede. Lembre-se de ajustar roteamento/DHCP Relay (IP Helper) para novas sub-redes, se aplicável.

Resubnetting (ex.: /24 → /23)

Planejar uma máscara mais ampla pode dobrar os endereços disponíveis. Exemplos de capacidade:

MáscaraTotal de endereçosUsáveisGanho vs /24
/24256254
/23512510~2×
/2210241022~4×

Renumerar sub-rede exige janela de manutenção, atualização de VLANs/ACLs, DHCP Relay e reservas. Porém é a solução correta quando o bloco original não comporta o crescimento.

Adicionar um novo segmento

Se o broadcast está pesado, dividir usuários em múltiplas VLANs + escopos menores pode ser preferível a concentrar todos em um /22. Planeje de acordo com fluxos de tráfego e QoS.

Reduza conflitos e “fugas” de IP

  • Evite sobreposição com estáticos: documente faixas excluídas (exclusion ranges) e migre impressoras/IoT para reservas DHCP.
  • Higiene no AD/DNS: habilite scavenging; considere GPO para desabilitar atualizações DNS no cliente quando o DHCP for autoritativo.
  • Port Security / NAC: 802.1X ou port-security reduzem “switch de mesa” com vários clientes atrás de uma única porta pegando IPs sem controle.
  • Bloqueie DHCP rogue: habilite recursos de switch (DHCP Snooping) quando disponíveis.

Alta disponibilidade e escalabilidade

Implementar DHCP Failover ajuda em picos e contingência. Dois modelos comuns:

  • Load balance (p. ex., 50/50): ambos servem o mesmo escopo.
  • Hot standby (p. ex., 5/95): um primário, outro reserva.
# Exemplo ilustrativo (ajuste para seu ambiente)
Add-DhcpServerv4Failover `
  -Name "SiteA-Failover" `
  -PartnerServer "DHCP02.contoso.local" `
  -Scopes 192.168.10.0 `
  -LoadBalancePercent 50 `
  -MaxClientLeadTime 01:00:00 `
  -AutoStateTransition $true

Boas práticas e armadilhas comuns

  • Não apague em massa leases Active. Isso não “derruba” o cliente e ainda cria risco de duplicidade quando outro pega o IP liberado.
  • “Declined” é sintoma, não causa. Limpe e investigue: IP estático dentro do pool, clonagem de VM sem sysprep, bridge Wi‑Fi/ethernet improvisada, etc.
  • Centralize reservas no DHCP (em vez de estáticos manuais), para que a vida útil e auditoria fiquem sob o mesmo guarda-chuva.
  • Audite periodicamente os arquivos em C:\Windows\System32\dhcp (logs do serviço) e o log “DHCP Server/Operational” no Visualizador de Eventos.
  • Documente opções (003 Gateway, 006 DNS, 015 Sufixo, etc.) por escopo; mudanças evitam “fantasmas” de DNS e reduzem chamados.

Checklist de emergência

AçãoComando/ondeObjetivo
Medição rápidaGet-DhcpServerv4ScopeStatisticsConfirmar % em uso por escopo.
Inventário de leasesGet-DhcpServerv4Lease -AllLeasesVer Active/Expired/Declined.
Limpar Declined... | Where AddressState 'Declined' | Remove-DhcpServerv4LeaseEliminar conflitos marcados.
Limpar Expired... | Where AddressState 'Expired' | Remove-DhcpServerv4LeaseReaproveitar IPs de quem foi embora.
Scavenging de DNSStart-DnsServerScavenging -VerboseRemover registros obsoletos.
Reduzir leaseSet-DhcpServerv4Scope -LeaseDurationAcelerar devolução de IPs.
Alertas ≥80%Get-DhcpServerv4ScopeStatistics | Where PercentageInUse -gt 80Evitar novo esgotamento.

FAQ rápido

Apagar o lease “derruba” a máquina?

Não. O cliente mantém o IP até a próxima renovação. Para forçar nova concessão, o comando precisa ocorrer no cliente (ipconfig /release e /renew) ou via ferramenta de gerenciamento remoto.

Apaguei leases mas o pool continua cheio. Por quê?

Possibilidades: muitos Active legítimos (capacidade realmente insuficiente), conflitos contínuos (endereços estáticos sobre o pool), DHCP rogue, ou lease time ainda longo para sua rotatividade. Verifique também se há reservas excessivas ocupando boa parte do bloco.

“Declined” volta após a limpeza. O que fazer?

Trate a raiz: identifique dispositivos com IP fixo dentro do pool, VMs clonadas sem nova identidade, ou dois NICs no mesmo segmento compartilhando MAC/bridge. Ajuste exclusões, migre estáticos para reservas e reconfigure hosts problemáticos.

Limpei o DHCP, mas o DNS segue sujo. Alguma dica?

Habilite Aging/Scavenging no DNS e marque “Descartar registros A/AAAA e PTR quando a concessão for excluída” no DHCP (guia DNS). Execute Start-DnsServerScavenging após grandes limpezas.

Qual lease time escolher?

Depende do perfil. Como base, inicie com 1 dia para visitantes, 2–4 dias para escritórios e até 14 dias para dispositivos fixos. Monitore a ocupação e ajuste fino conforme comportamento real.

Exemplos completos de rotina

Relatório de ocupação com exportação

Get-DhcpServerv4ScopeStatistics |
  Select-Object ScopeId, Free, InUse, PercentageInUse |
  Tee-Object -FilePath "C:\Temp\dhcp-ocupacao.csv" |
  Format-Table -Auto

Limpeza e sincronização DNS em um único play

$scope = '192.168.10.0'

1) Limpar Declined e Expired

Get-DhcpServerv4Lease -ScopeId \$scope -AllLeases |
Where-Object { $\_.AddressState -in @('Declined','Expired') } |
Remove-DhcpServerv4Lease -Confirm:\$false

2) Rodar scavenging no DNS

Start-DnsServerScavenging -Verbose

3) Conferir ocupação pós-limpeza

Get-DhcpServerv4ScopeStatistics -ScopeId \$scope 

Resumo prático

  1. Meça a ocupação com Get-DhcpServerv4ScopeStatistics e liste as concessões com Get-DhcpServerv4Lease -AllLeases.
  2. Limpe com segurança apenas Expired e Declined (conflitos), usando Remove-DhcpServerv4Lease — comece com pré-visualização e só então execute.
  3. Sincronize/higienize o DNS (Aging/Scavenging + “Descartar registros quando o lease é excluído”).
  4. Evite recorrência: reduza o lease time, planeje expansão de pool (superscope, resubnetting ou novas VLANs) e monitore alertas >=80%.
  5. Trate causas de Declined: estáticos na faixa, VMs clonadas, bridges, DHCP rogue.

Seguindo este passo a passo, você libera endereços “parados” com segurança, mantém o DNS limpo e constrói um ambiente DHCP que não volta a lotar na próxima segunda-feira de manhã.

Índice