Перейти к основному содержанию

Логирование в DHCP сервере Windows

Windows Server

О том как работает DHCP можно целую книгу написать. 

Протокол динамической конфигурации узлов (DHCP) — это та невидимая магия, которая раздает IP-адреса вашим устройствам. Обычно он работает безотказно, но когда возникают сбои (клиент не получает адрес, появляются дубли, пропадает связь), офис парализуется. В этот момент администратору нужны не догадки, а факты.

Главный инструмент расследования — это журналы DHCP. В этой статье мы разберем, как читать логи Windows Server, находить критические ошибки и настраивать систему так, чтобы вы могли заглянуть в прошлое глубже, чем на неделю.

Как работает DHCP: DORA

Клиент и сервер общаются в 4 шага, известных как аббревиатура DORA:

  1. Discover (Обнаружение): Клиент кричит в сеть: "Есть тут DHCP?".
  2. Offer (Предложение): Сервер отвечает: "Держи адрес 192.168.1.10".
  3. Request (Запрос): Клиент говорит: "Беру!".
  4. Acknowledge (Подтверждение): Сервер фиксирует сделку.

Логи фиксируют каждый из этих шагов. Если один из них падает, вы увидите это в записях.

Где живут логи DHCP

Многие администраторы по привычке идут в Event Viewer (Просмотр событий). Event Viewer показывает только общее состояние службы (запуск/остановка). Для детальной разведки нужны текстовые файлы. Их местоположение по умолчанию: C:\Windows\system32\dhcp\.

Формат именования:

IPv4: DhcpSrvLog-<ДЕНЬ>.log (например, DhcpSrvLog-Mon.log)
IPv6: DhcpV6SrvLog-<ДЕНЬ>.log

Сервер хранит записи только за последние 7 дней. Каждый день недели перезаписывается. Если инцидент случился 8 дней назад — данных нет, если вы не настроили архивацию.

Анатомия лога

Файлы имеют расширение .log, но внутри это обычный CSV (почти).

Список Event ID

00    The log was started.
01    The log was stopped.
02    The log was temporarily paused due to low disk space.
10    A new IP address was leased to a client.
11    A lease was renewed by a client.
12    A lease was released by a client.
13    An IP address was found to be in use on the network.
14    A lease request could not be satisfied because the scope's address pool was exhausted.
15    A lease was denied.
16    A lease was deleted.
17    A lease was expired and DNS records for an expired leases have not been deleted.
18    A lease was expired and DNS records were deleted.
20    A BOOTP address was leased to a client.
21    A dynamic BOOTP address was leased to a client.
22    A BOOTP request could not be satisfied because the scope's address pool for BOOTP was exhausted.
23    A BOOTP IP address was deleted after checking to see it was not in use.
24    IP address cleanup operation has began.
25    IP address cleanup statistics.
30    DNS update request to the named DNS server.
31    DNS update failed.
32    DNS update successful.
33    Packet dropped due to NAP policy.
34    DNS update request failed.as the DNS update request queue limit exceeded.
35    DNS update request failed.
36    Packet dropped because the server is in failover standby role or the hash of the client ID does not match.
50+    Codes above 50 are used for Rogue Server Detection information.

Ключевые Event ID

В начале каждого лога есть легенда. Вот самые важные коды, которые вы должны знать:

  • 10 — Выдана новая аренда (клиент получил IP)
  • 11 — Аренда продлена (обновление через 4 дня) 
  • 12 — Аренда освобождена (ipconfig /release)
  • 13 — Конфликт IP-адресов (уже используется). Кто-то воткнул статику вручную или сбой в сети.
  • 14 — Пул адресов истощён (кончились IP). Сервер перегружен клиентами. Увеличивайте область или сокращайте время аренды.
  • 15 — Отказ в аренде. Сервер узнал клиента и сказал "Нет". Проверьте фильтры MAC-адресов.

Ищите в логах строки с ID 13, 14, 15. Это ваши цели при аварии.

Сценарии устранения неполадок

Сценарий 1: "Всё встало. Дуплет!"

  • Симптом: Пользователь не выходит в сеть. Ошибка "IP-адрес уже используется".
  • Действие: Открываем лог, ищем Event ID 13.
  • Что пишет: An IP address was found to be in use on the network.
  • Решение: Лог покажет MAC-адрес и IP. Идите и выключите устройство, которое украло адрес.

Сценарий 2: "Сотрудникам не хватает IP"

  • Симптом: Часть устройств не подключается, старые работают.
  • Действие: Ищем Event ID 14.
  • Что пишет: Lease request unsatisfied due to pool exhaustion.
  • Решение: Увеличьте размер Scope (диапазона) или уменьшите время аренды (Lease Duration) с 8 дней до 1 дня, чтобы адреса возвращались быстрее.

Сценарий 3: "DHCP не отвечает"

  • Симптом: Клиент висит на "Получение адреса".
  • Действие: Смотрим логи на наличие ID 10 или 11. Если их нет, а сервер запущен — проблема в маршрутизации (DHCP Relay).

Как настроить архивацию

По умолчанию DhcpSrvLog-Sun.log перезаписывается каждое воскресенье. Если аудит нужен за месяц, внедрите автоматизацию через планировщик задач и PowerShell.

Пример скрипта для архивации (PowerShell). Этот скрипт копирует воскресный лог и добавляет в имя файла сегодняшнюю дату, убирая риск перезаписи.

# Архивация IPv4 лога за воскресенье
Copy-Item "C:\Windows\system32\dhcp\DhcpSrvLog-Sun.log" "D:\DHCP_Archive\DhcpSrvLog-Sun-$(Get-Date -Format 'yyyy-MM-dd').log"

# Архивация IPv6 лога за воскресенье
Copy-Item "C:\Windows\system32\dhcp\DhcpV6SrvLog-Sun.log" "D:\DHCP_Archive\DhcpV6SrvLog-Sun-$(Get-Date -Format 'yyyy-MM-dd').log"

Давайте придумаем скрипт для ежедневного запуска (скрипт не проверял):

<#
.SYNOPSIS
    Архивация ежедневных логов DHCP-сервера Windows
.DESCRIPTION
    Скрипт копирует логи DHCP за вчерашний день (IPv4 и IPv6) в архивную папку.
    Предназначен для ежедневного запуска через планировщик задач.
.NOTES
    Author: IT Admin
    Version: 1.0
#>

# ===== НАСТРОЙКИ =====
$SourcePath = "C:\Windows\system32\dhcp"
$ArchivePath = "D:\DHCP_Archive"  # Измените на нужный путь
$RetentionDays = 90  # Через сколько дней удалять старые архивы

# Маппинг дней недели (Windows использует 3-буквенные аббревиатуры на английском)
$DayMap = @{
    "Monday"    = "Mon"
    "Tuesday"   = "Tue"
    "Wednesday" = "Wed"
    "Thursday"  = "Thu"
    "Friday"    = "Fri"
    "Saturday"  = "Sat"
    "Sunday"    = "Sun"
}

# ===== ОСНОВНАЯ ЛОГИКА =====

# 1. Определяем вчерашний день недели (на английском)
$Yesterday = (Get-Date).AddDays(-1)
$YesterdayDayName = $Yesterday.ToString("dddd")  # "Monday", "Tuesday" и т.д.
$YesterdayAbbr = $DayMap[$YesterdayDayName]      # "Mon", "Tue" и т.д.
$DateSuffix = $Yesterday.ToString("yyyy-MM-dd")  # 2026-06-10

Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Архивация DHCP-логов за $($Yesterday.ToString('yyyy-MM-dd')) ($YesterdayAbbr)" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan

# 2. Проверяем наличие исходной папки с логами
if (-not (Test-Path $SourcePath)) {
    Write-Error "Исходная папка не найдена: $SourcePath"
    exit 1
}

# 3. Создаём архивную папку, если её нет
if (-not (Test-Path $ArchivePath)) {
    New-Item -ItemType Directory -Path $ArchivePath -Force | Out-Null
    Write-Host "Создана архивная папка: $ArchivePath" -ForegroundColor Green
}

# 4. Формируем список файлов для архивации (IPv4 и IPv6 за вчера)
$FilesToArchive = @()

# IPv4 лог
$Ipv4Log = Join-Path $SourcePath "DhcpSrvLog-$YesterdayAbbr.log"
if (Test-Path $Ipv4Log) {
    $FilesToArchive += $Ipv4Log
    Write-Host "Найден IPv4 лог: $Ipv4Log" -ForegroundColor Green
} else {
    Write-Warning "IPv4 лог не найден: $Ipv4Log"
}

# IPv6 лог
$Ipv6Log = Join-Path $SourcePath "DhcpV6SrvLog-$YesterdayAbbr.log"
if (Test-Path $Ipv6Log) {
    $FilesToArchive += $Ipv6Log
    Write-Host "Найден IPv6 лог: $Ipv6Log" -ForegroundColor Green
} else {
    Write-Warning "IPv6 лог не найден (возможно, IPv6 отключён): $Ipv6Log"
}

# 5. Архивация найденных файлов
if ($FilesToArchive.Count -eq 0) {
    Write-Warning "Не найдено ни одного лог-файла для архивации за вчерашний день"
    exit 0
}

foreach ($File in $FilesToArchive) {
    $FileName = [System.IO.Path]::GetFileNameWithoutExtension($File)
    $Extension = [System.IO.Path]::GetExtension($File)
    $ArchivedName = "$FileName-$DateSuffix$Extension"
    $Destination = Join-Path $ArchivePath $ArchivedName
    
    try {
        Copy-Item -Path $File -Destination $Destination -Force
        Write-Host "Скопирован: $FileName$Extension -> $ArchivedName" -ForegroundColor Green
    }
    catch {
        Write-Error "Ошибка копирования $FileName$Extension : $_"
    }
}

# 6. Очистка старых архивов (опционально)
Write-Host "`nПроверка старых архивов (старше $RetentionDays дней)..." -ForegroundColor Yellow
$OldFiles = Get-ChildItem -Path $ArchivePath -Filter "*.log" | Where-Object {
    $_.LastWriteTime -lt (Get-Date).AddDays(-$RetentionDays)
}

if ($OldFiles.Count -gt 0) {
    foreach ($OldFile in $OldFiles) {
        Remove-Item -Path $OldFile.FullName -Force
        Write-Host "Удалён старый архив: $($OldFile.Name)" -ForegroundColor Red
    }
    Write-Host "Удалено старых файлов: $($OldFiles.Count)" -ForegroundColor Red
} else {
    Write-Host "Старых архивов для удаления не найдено" -ForegroundColor Green
}

Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "Архивация завершена" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan

Лучшие практики

  • Включите аудит: В консоли DHCP → Свойства IPv4 → вкладка Advanced → галочка "Enable DHCP audit logging" (обычно включена по умолчанию).
  • Выделите отдельный том для логов (не диск C:), чтобы при росте логов не убить систему. 
  • Настройте сжатие старых архивов раз в месяц.
  • Включите Conflict Detection Attempts (в свойствах IPv4) со значением 1 или 2. Сервер будет пинговать адрес перед выдачей — это снизит количество ошибок ID 13.
  • Настройте архивацию любым скриптом (см. выше), чтобы хранить историю > 7 дней.
  • Ищите сначала ошибки: ID 13 (конфликт), ID 14 (истощение), ID 15 (отказ).
  • Интегрируйте вашу SIEM систему с папкой C:\Windows\system32\dhcp, чтобы логи не лежали мертвым грузом.
  • Если в подсети имеются статические IP адреса, не включайте их в диапазон выдаваемых IP адресов сервером DHCP.

Теги

 

Похожие материалы

BAT скрипт для передергивания сети на сервере Windows Server 2012 R2

Однажды наши виртуальные Windows сервера стали терять сеть. Проблему удалось выявить с сетевыми адаптерами VMware E1000. Примечательно, что в Ubuntu эти сетевухи работают без нареканий, а вот в Windows Server 2012 R2 - сеть иногда зависала.

PktMon — анализатор сетевого трафика

PktMon.exe — встроенная утилита в Windows 10 и Windows Server 2019, позволяющая перехватывать и анализировать сетевой трафик, проходящий через компьютер, на котором запущена данная программа.

Теги