DHCP BAD_ADDRESS: This address is already in use
Добрый день! Уважаемые читатели и гости 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 получать много ошибок:
Первое, что я сделал это принудительно, удалил такие IP адреса, и отреплицировал область между серверами DHCP. Еще обратите внимание, что на вашем scope появится значок предупреждения, я выделил его стрелкой.
Далее, что я стал делать, это смотреть логи DHCP сервера, для этого в просмотре событий есть соответствующие журналы:
- Microsoft-Windows-DHCP Server Events/Admin
- Microsoft-Windows-DHCP Server Events/Operational
- Microsoft-Windows-DHCP Client Events/Admin
Первое чем были забиты логи, это предупреждение с ID 1063:
Предупреждение ID 1342:
Я увидел, что Ip-адреса из определенного скоупа просто закончились. Остальные клиенты, которые пытались получить от DHCP-сервера IP-адрес, просто дропались, это видно в событии ID 20287.
Это так же спровоцировало шквал ошибок ID 20292.
Зайдя в свойства области я лицезрел картину, как свыше 2000 IP-адресов были зарезервированы, и люди просили еще😄
Как устранить ошибку BAD_ADDRESS
В данной ситуации у меня наложились два момента:
- 1️⃣Количество пользователей увеличилось с 1200 до 1600 + их мобильные устройства
- 2️⃣В момент загрузки информации, об областях и аренде в них, были скопированы записи аренды со статусом Expired, но об этом чуть ниже.
Ранее в другой статье я вам рассказывал интересный момент работы DHCP-сервера Microsoft, там после окончания аренды, если клиент не стал продлевать, данный IP забирает DHCP-сервер, но он его по умолчанию не отдает еще целых 4-часа, это называется льготный период (grace period). Его нужно уменьшать. В моем случае, когда все IP-адреса заняты и куча со статусом BAD_ADDRESS, нужно искать Expired адреса и чистить их. Для этого у вас должен быть ScopeId и мои команды😄. Чтобы посмотреть все IP-адреса со статусом Expired находящихся в льготном периоде, выполните в PowerShell в режиме администратора на первом DHCP-сервере команду:
На дворе было 15 ноября 2022, а записи были аж от 28 октября 2022, это оставшийся мусор после миграции DHCP, который по какой-то причине не почистился сервером из области льготного периода.
Я решил посчитать, сколько у меня так застряло IP адресов, для этого можно использовать вот такой код:
$obj = Get-DhcpServerv4Lease -ScopeId 10.168.31.0 -AllLeases | ? {$_.AddressState -like "Expired"}
($obj | Measure-Object).Count
Таких застрявших оказалось свыше 540 штук, что было 25% от общего пуля.
Естественно я попытался их почистить, для этого есть 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
}
}
Но у меня повалилась куча ошибок:
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 так же не удалялось.
Если на первом сервере выбрать в команде второй DCHP, то ошибка сохранится, а вот если зайти на второй DHCP по RDP ну или удаленно подключиться через PowerShell, то вот там как раз все прекрасно удалится, дошел я до этого не сразу.
В результате 500 IP-адресов снова появились в доступном обращении.
Уменьшение времени льготного периода и очистки базы данных DHCP
В больших сетях, где большое количество клиентов я советую grace period на небольшой промежуток, то используют два ключа реестра.
- Интервал очистки базы данных можно сократить, обновив раздел реестра DatabaseCleanupInterval тип DWORD в разделе HKLM/System/CurrentControlSet /Services / DHCPServer/Parameters. Хочу отметить, что по умолчанию значение у ключа DatabaseCleanupInterval составляет 60 минут, когда он будит проходить и вычищать Expired записи после того, как заканчивается "Льготный период (grace period)". По умолчанию он создан уже на DHCP сервере, я советую выставить его минут 30. Так же его можно задать и через PowerShell
- Вы можете сократить льготный период аренды, создав или обновив раздел реестра LeaseExtension тип DWORD в разделе HKLM/System/CurrentControlSet /Services/DHCPServer/Parameters. Значение может быть указано в десятичном формате и должно быть в минутах. Я обычно ставлю 60 секунд.
После этого вам необходимо произвести перезапуск службы DHCP, либо через графическую оснастку services.msc, которую можно запустить через "окно Выполнить" или же введите команду в PowerShell.
Согласование БД DHCP
Еще на уровне scope или всего сервера DHCP, есть такая функция согласования (reconcline), используйте ее когда у вас есть какие-то проблемы на DHCP с БД.
Вы должны добиться того, что у вас БД ответила "The database is consistent"
Дополнительные ссылки
- 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.