DHCP BAD_ADDRESS: This address is already in use

Обновлено 18.11.2022

DHCP error logoДобрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В прошлый раз мы с вами производили миграцию отказоустойчивого DHCP сервера с Windows Server 2012 R2 на Windows Server 2019. В момент переноса я уже получал ряд сопутствующих ошибок, что успешно было устранено. Но они были еще не последними, так как на одной из областей DHCP я стал получать много ошибок со статусом BAD_ADDRESS: This address is already in use, что для конечных пользователей было критично, так как пропадала сеть WIFI. Давайте я попробую описать свой опыт и методы диагностики с устранениями.

Описание ошибки BAD_ADDRESS: This address is already in use

На новой паре DHCP-серверов я стал на области WIFI получать много ошибок:

BAD_ADDRESS: This address is already in use

Ошибка получения IP адреса на DHCP. BAD_ADDRESS This address is already in use

Первое, что я сделал это принудительно, удалил такие IP адреса, и отреплицировал область между серверами DHCP. Еще обратите внимание, что на вашем scope появится значок предупреждения, я выделил его стрелкой.

DHCP Server replicate scope

Далее, что я стал делать, это смотреть логи DHCP сервера, для этого в просмотре событий есть соответствующие журналы:

  • Microsoft-Windows-DHCP Server Events/Admin
  • Microsoft-Windows-DHCP Server Events/Operational
  • Microsoft-Windows-DHCP Client Events/Admin

Первое чем были забиты логи, это предупреждение с ID 1063:

There are no IP addresses available for lease in the scope or superscope "WIFI_Pyatilistnik".

There are no IP addresses available for lease in the scope or superscope

Предупреждение ID 1342:

IP address range of scope WIFI is out of IP addresses.

IP address range of scope WIFI is out of IP addresses.

Я увидел, что Ip-адреса из определенного скоупа просто закончились. Остальные клиенты, которые пытались получить от DHCP-сервера IP-адрес, просто дропались, это видно в событии ID 20287.

DHCP client request from F09E40097EC1 was dropped since the applicable IP address ranges in scope

DHCP client request from MAC was dropped since the applicable IP address ranges in scope

Это так же спровоцировало шквал ошибок ID 20292.

ID 20292: A BINDING-ACK message with transaction id: 28044 was received for IP address: 10.xx.xx.82 with reject reason: (Outdated binding information ) from partner server: dhcp04.pyatilistnik.org for failover relationship: dhcp03.pyatilistnik.org-dhcp04.pyatilistnik.org.

A BINDING-ACK message with transaction id

Зайдя в свойства области я лицезрел картину, как свыше 2000 IP-адресов были зарезервированы, и люди просили еще😄

Закончились IP-адреса на области DHCP

Как устранить ошибку BAD_ADDRESS

В данной ситуации у меня наложились два момента:

  • 1️⃣Количество пользователей увеличилось с 1200 до 1600 + их мобильные устройства
  • 2️⃣В момент загрузки информации, об областях и аренде в них, были скопированы записи аренды со статусом Expired, но об этом чуть ниже.

Ранее в другой статье я вам рассказывал интересный момент работы DHCP-сервера Microsoft, там после окончания аренды, если клиент не стал продлевать, данный IP забирает DHCP-сервер, но он его по умолчанию не отдает еще целых 4-часа, это называется льготный период (grace period). Его нужно уменьшать. В моем случае, когда все IP-адреса заняты и куча со статусом BAD_ADDRESS, нужно искать Expired адреса и чистить их. Для этого у вас должен быть ScopeId и мои команды😄. Чтобы посмотреть все IP-адреса со статусом Expired находящихся в льготном периоде, выполните в PowerShell в режиме администратора на первом DHCP-сервере команду:

Get-DhcpServerv4Lease -ScopeId 10.168.31.0 -AllLeases | where-object {$_.AddressState -like "Expired"}

Вывод всех IP адресов со статусом Expired

На дворе было 15 ноября 2022, а записи были аж от 28 октября 2022, это оставшийся мусор после миграции DHCP, который по какой-то причине не почистился сервером из области льготного периода.

Вывод всех IP адресов со статусом Expired-2

Я решил посчитать, сколько у меня так застряло IP адресов, для этого можно использовать вот такой код:

$obj = Get-DhcpServerv4Lease -ScopeId 10.168.31.0 -AllLeases | ? {$_.AddressState -like "Expired"}

($obj | Measure-Object).Count

Таких застрявших оказалось свыше 540 штук, что было 25% от общего пуля.

Количество IP-адресов со статусом Expired

Естественно я попытался их почистить, для этого есть PowerShell код:

$computername = "Тут пишите адрес вашего DHCP"

$scopeid = "Тут пишите имя вашей области"

foreach ($object in Get-DhcpServerv4Lease -ComputerName $computername -ScopeId $scopeid)

{

if ($object.leaseExpiryTime -le (Get-Date))

{

$object.hostname

Remove-DhcpServerv4Lease -ComputerName $computername -IPAddress ($object.IPAddress).IPAddressToString

}

}

или

$computername = "Тут пишите адрес вашего DHCP"

$scopeid = "Тут пишите имя вашей области"

foreach ($object in (Get-DhcpServerv4Lease -AllLeases -ComputerName $computername -ScopeId $scopeid))
{

if ($object.leaseExpiryTime -le (Get-Date))
{
$object.hostname

Remove-DhcpServerv4Lease -ComputerName $computername -IPAddress ($object.IPAddress).IPAddressToString # -WhatIf
}
else
{
# $object.leaseExpiryTime
}
}

Массовое удаление IP-адресов со статусом DHCP

Но у меня повалилась куча ошибок:

Remove-DhcpServerv4Lease : Failed to delete lease 10.xx.xx.142 on DHCP server dhcp03.pyatilistnik.org.
At line:12 char:9
+ Remove-DhcpServerv4Lease -ComputerName $computername -IPAddre ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (10.xx.xx.142:root/Microsoft/...cpServerv4Lease) [Remove-DhcpServerv4Lease], CimException
+ FullyQualifiedErrorId : WIN32 232,Remove-DhcpServerv4Lease

В итоге в области namespaces нет данных Ip-адресов, через netsh так же не удалялось.

Ошибка удаления IP-адресов со статусом Expired

Если на первом сервере выбрать в команде второй DCHP, то ошибка сохранится, а вот если зайти на второй DHCP по RDP ну или удаленно подключиться через PowerShell, то вот там как раз все прекрасно удалится, дошел я до этого не сразу.

Еще оговорюсь, что я мог пересоздать scope, но мне не хотелось делать лишних телодвижений и менять настройки, тем более со скоупом в 2000 клиентов

Успешное удаление Ip-адресов со статусом Expired

В результате 500 IP-адресов снова появились в доступном обращении.

Уменьшение времени льготного периода и очистки базы данных DHCP

В больших сетях, где большое количество клиентов я советую  grace period на небольшой промежуток, то используют два ключа реестра.

  • Интервал очистки базы данных можно сократить, обновив раздел реестра DatabaseCleanupInterval тип DWORD в разделе HKLM/System/CurrentControlSet /Services / DHCPServer/Parameters. Хочу отметить, что по умолчанию значение у ключа DatabaseCleanupInterval  составляет 60 минут, когда он будит проходить и вычищать Expired записи после того, как заканчивается "Льготный период (grace period)". По умолчанию он создан уже на DHCP сервере, я советую выставить его минут 30. Так же его можно задать и через PowerShell

Set-DhcpServerDatabase -ComputerName "dhcpserver.pyatilistnik.org" -FileName "D:\NewDhcpPath\dhcp.mdb" -BackupPath "D:\NewDhcpPath\backup" -CleanupInterval 30

Смена периода очистки адресов в DHCP через DatabaseCleanupInterval

  • Вы можете сократить льготный период аренды, создав или обновив раздел реестра LeaseExtension тип DWORD в разделе HKLM/System/CurrentControlSet /Services/DHCPServer/Parameters. Значение может быть указано в десятичном формате и должно быть в минутах. Я обычно ставлю 60 секунд.

Создание ключа реестра LeaseExtension

После этого вам необходимо произвести перезапуск службы DHCP, либо через графическую оснастку services.msc, которую можно запустить через "окно Выполнить" или же введите команду в PowerShell.

Restart-Service DHCPServer

Согласование БД DHCP

Еще на уровне scope или всего сервера DHCP, есть такая функция согласования (reconcline), используйте ее когда у вас есть какие-то проблемы на DHCP с БД.

согласования (reconcline) на DHCP сервере

Вы должны добиться того, что у вас БД ответила "The database is consistent"

успешно выполнено согласования (reconcline)

Дополнительные ссылки

  • https://learn.microsoft.com/en-us/powershell/module/dhcpserver/set-dhcpserverdatabase
  • https://windata.ru/windows-world/lokalnaya-set/vosstanovlenie-bd-dhcp-soglasovanie-oblastej/

Надеюсь, что вам удалось решить свою проблему с моим скромным опытом. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *