При наличии большого количества подсетей зачастую требуется аудит и мониторинг адресного пространства в них, для этого прекрасно подходит такой инструмент, как IPAM.
В качестве инструмента будем использовать Netbox и nmap.
Установка
Для установки нам потребуется скачать уже готовый скрипт от пользователя @lckrspirit с gitlab.
Для удобства его можно разместить где ни будь в каталоге c NetBox.
Качаем nmap, устанавливаем зависимости:
---Активируем виртуальное окружение (например в venv Netbox)--
$ cd/usr/local/share/netbox/
$ .venv/bin/activate
(venv)$ cd /usr/local/share/netbox/scripts
(venv)$ git clone https://gitlab.com/lckrspirit/netbox-ipam-auto-discovery.git
(venv)$ cd netbox-ipam-auto-discovery/
(venv)$ pip install python-nmap pynetbox
Так же его можно скачать
Заходим в NetBox в меню "Аутентификация" и получаем токен для обращения к API:

Генерируем токен (под суперпользователем это лучше не делать, а создать отдельного)

Открываем скрипт текстовым редактором и вводим адрес NetBox и сгенерированный Token

P.S. В netbox_url должны быть указаны адреса перечисленные в блоке "ALLOWED HOSTS" файла конфигурации Netbox configuration.py.
Запуск скрипта
Для запуска сканирования сети достаточно выполнить:
Теперь можно идти в меню IPAM и мы увидим отсканированные IP адреса.

Если мы еще добавим сеть в меню "Диапазоны IP- адресов мы сможем увидеть статистику использование адресного пространства в данном сегменте сети.

Скрипт сам обновляет и удаляет адреса, его можно назначить в задания cron на выполнение к примеру каждые 3 часа.
Дополнительно мы можем создать VLAN, группы и назначения, после чего связать с существующим диапазоном адресов.
Что бы мы могли видеть еще и свободные адреса, необходимо добавить префикс для нашей сети:

Указываем нашу сеть в поле префикс, статус, и ставим флаг, что данная сеть является пулом.
Синхронизация DNS записей.
Если в качестве DNS сервера используется роль Windows Server, то можно при помощи powershell-скрипта сопоставить найденные nmap ip адреса с записями DNS.
Пример скрипта:
$netboxUrl = "https://netbox.example.com/api"
$netboxToken = "ce9b6897b23e6fadd70649628e9e86aa1af48b72"
# Параметры DNS-сервера
$dnsServer = "dc01.example.com" # Или IP-адрес DNS-сервера
$dnsZone = "example.com" # Зона, которую нужно обработать
# Функция для обновления DNS-имени в NetBox
function Update-NetBoxDnsRecord {
param (
[string]$name,
[string]$ipAddress
)
# Формируем URL для запроса к NetBox API
$url = "$netboxUrl/ipam/ip-addresses/"
try {
# Получаем все IP-адреса из NetBox
$response = Invoke-RestMethod -Uri $url -Method Get -Headers @{
Authorization = "Token $netboxToken"
Accept = "application/json"
}
# Ищем запись с совпадающим IP (игнорируя маску)
$matchingRecord = $response.results | Where-Object {
($_.address -split '/' | Select-Object -First 1) -eq $ipAddress
}
if ($matchingRecord) {
# Если запись найдена, обновляем DNS-имя
$recordId = $matchingRecord.id
$body = @{
dns_name = $name
} | ConvertTo-Json
Invoke-RestMethod -Uri "$netboxUrl/ipam/ip-addresses/$recordId/" -Method Patch -Headers @{
Authorization = "Token $netboxToken"
"Content-Type" = "application/json"
} -Body $body
Write-Host "Обновлена запись для IP $ipAddress с DNS-именем $name"
} else {
Write-Host "Запись для IP $ipAddress не найдена в NetBox, пропускаем."
}
} catch {
Write-Host "Ошибка при запросе к NetBox: $_"
}
}
# Получаем DNS-записи с сервера
$dnsRecords = Get-DnsServerResourceRecord -ZoneName $dnsZone -ComputerName $dnsServer
# Обрабатываем каждую запись
foreach ($record in $dnsRecords) {
if ($record.RecordType -eq "A") {
$name = $record.HostName
$ipAddress = $record.RecordData.IPv4Address.IPAddressToString
# Обновляем запись в NetBox
Update-NetBoxDnsRecord -name $name -ipAddress $ipAddress
}
}
Write-Host "Обновление DNS записей в NetBox завершено."
Данный скрипт можно закинуть в планировщик задач и запускать его по расписанию