О том как работает DHCP можно целую книгу написать.
Протокол динамической конфигурации узлов (DHCP) — это та невидимая магия, которая раздает IP-адреса вашим устройствам. Обычно он работает безотказно, но когда возникают сбои (клиент не получает адрес, появляются дубли, пропадает связь), офис парализуется. В этот момент администратору нужны не догадки, а факты.
Главный инструмент расследования — это журналы DHCP. В этой статье мы разберем, как читать логи Windows Server, находить критические ошибки и настраивать систему так, чтобы вы могли заглянуть в прошлое глубже, чем на неделю.
Как работает DHCP: DORA
Клиент и сервер общаются в 4 шага, известных как аббревиатура DORA:
- Discover (Обнаружение): Клиент кричит в сеть: "Есть тут DHCP?".
- Offer (Предложение): Сервер отвечает: "Держи адрес 192.168.1.10".
- Request (Запрос): Клиент говорит: "Беру!".
- 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.
