Mikrotik — скрипт, хосты DHCP в DNS

Краткая статья по добавлению в функционал DHCP сервера маршрутизаторов Mikrotik, работающих на операционной системе RouterOS (версии 6.4*.*) функции добавления имени хоста, которому выдается IP адрес, в статическую запись DNS сервера, работающего на этом же маршрутизаторе.

Зачем это нужно?

Да кто ж Вас знает, зачем Вам это нужно, но как-то вы на эту статью зашли =).

В моём случае, у меня основным шлюзом в интернет, также как и соответственно сервером DHCP и DNS выступает именно маршрутизатор Mikrotik. В сети также есть сервер Zabbix, который мониторит оборудование. В сети отсутствует контроллер и собственно сам домен. Простая сеть небольшой фирмы. И если у ПК с Windows есть возможность узнавать имя своих «соседей» по NetBIOS, у ПК с Linux и соответственно у сервера Zabbix, такой возможности по умолчанию — нет. И если в большинстве случаев Zabbix сервер можно настроить для работы сугубо по IP адресам, не используя имена DNS, то например ноутбуки на разных интерфейсах получают различные статические IP адреса и гораздо удобнее к ним обращаться независимо от того какой у них IP.

Есть альтернативные способы решения данной задачи. От ручного добавления на всех Linux устройствах записей для необходимых имён в файл hosts, до установки пакета winbind (и возможно парочки библиотек) на всех устройствах.

Мне же захотелось что бы независимо от используемого устройства, оно спокойно могло по имени связываться с другими устройствами в сети благодаря существующему DNS серверу.


Итак, для реализации и успешной работы данного скрипта, обязательным условием является то что маршрутизатор на котором будет выполняться данный скрипт корректно настроен и является основным DHCP и DNS сервером.

Скрипт будет выполняться непосредственно на самом DHCP сервере при его работе. Для этого необходимо зайти в IP > DHCP Server > DHCP и открыть настройки Вашего основного DHCP сервера на вкладке Script.

Далее сам скрипт, который можно скопировать и вставить в открывшееся поле:

local dhcpaddr
local dhcphost
local IPRangeMin 192.168.1.40
local IPRangeMax 192.168.1.99

# Подключение к DHCP серверу
if ( $leaseBound = 1) do {
   set $dhcphost $"lease-hostname"

   if ( [ ip dns static find name="$dhcphost" ] != "") do {
      log info "Обновление таблицы DNS, запись для хоста: $dhcphost уже существует."
   } else {
      set $dhcpaddr $leaseActIP

      if ( $dhcpaddr != nil and $dhcpaddr > $IPRangeMin - 1 and $dhcpaddr < $IPRangeMax + 1 ) do {
         ip dns static add name="$dhcphost" address="$dhcpaddr"
         log info "Обновление таблицы DNS, добавлена статическая запись для хоста: $dhcphost по адресу: $dhcpaddr."
      }
   }
}

# Отключение от DHCP сервера
if ( $leaseBound = 0 ) do {
   set $dhcphost $"lease-hostname"

   if ( [ ip dns static find name="$dhcphost" ] != "") do {
      set $dhcpaddr $leaseActIP

      if ( $dhcpaddr != nil and $dhcpaddr > $IPRangeMin - 1 and $dhcpaddr < $IPRangeMax + 1 ) do {
         ip dns static remove ( get [ find name="$dhcphost" ] )
         log info "Обновление таблицы DNS, удалена статическая запись для хоста: $dhcphost по адресу: $dhcpaddr."      
      }
   }
}

Собственно после нажатия кнопки Ok, данный скрипт начнёт работать сразу же. Единственное что необходимо настроить это диапазон IP адресов, записи для которых Вы хотите добавлять в таблицу статических на DNS сервере. Также следует упомянуть что Mikrotik не всегда адекватно отображает сообщения на кириллице, поэтому все комментарии и записи в логе могут отображаться абракадаброй, можете это смело заменить например на любые сообщения на английском или транслитом, кому как удобней, у меня например и кириллица нормально работает =).

Немного подробнее по скрипту:

Начало:

local dhcpaddr
local dhcphost
local IPRangeMin 192.168.1.40
local IPRangeMax 192.168.1.99

Это объявление переменных для IP адреса и имени хоста, которые DHCP сервер выдаёт в аренду, либо которые утрачивают свою аренду. А переменные IPRangeMin и IPRangeMax задают начало и конец диапазона IP адресов для которого будет работать данный скрипт.


# Подключение к DHCP серверу
if ( $leaseBound = 1) do {
   set $dhcphost $"lease-hostname"

   if ( [ ip dns static find name="$dhcphost" ] != "") do {
      log info "Обновление таблицы DNS, запись для хоста: $dhcphost уже существует."
   } else {
      set $dhcpaddr $leaseActIP

      if ( $dhcpaddr != nil and $dhcpaddr > $IPRangeMin - 1 and $dhcpaddr < $IPRangeMax + 1 ) do {
         ip dns static add name="$dhcphost" address="$dhcpaddr"
         log info "Обновление таблицы DNS, добавлена статическая запись для хоста: $dhcphost по адресу: $dhcpaddr."
      }
   }
}

Этот блок скрипта отвечает за подключение устройств к DHCP серверу и срабатывает каждый раз когда $leaseBound = 1, то есть когда сервер даёт клиенту настройки IP. Далее с помощью $dhcphost значение которого устанавливается на $»lease-hostname» (имя хоста который только что получил адрес) проверяется нет ли записи для этого хоста в таблице DNS и только в случае если запись отсутствует, IP адрес текущего хоста — $leaseActIP, назначается в переменную $dhcpaddr, после чего проверяется что адрес действительно существует и находиться в диапазоне между $IPRangeMin и $IPRangeMax. После чего создаётся новая статическая запись на DNS сервере с заданными переменными.


# Отключение от DHCP сервера
if ( $leaseBound = 0 ) do {
   set $dhcphost $"lease-hostname"

   if ( [ ip dns static find name="$dhcphost" ] != "") do {
      set $dhcpaddr $leaseActIP

      if ( $dhcpaddr != nil and $dhcpaddr > $IPRangeMin - 1 and $dhcpaddr < $IPRangeMax + 1 ) do {
         ip dns static remove ( get [ find name="$dhcphost" ] )
         log info "Обновление таблицы DNS, удалена статическая запись для хоста: $dhcphost по адресу: $dhcpaddr."      
      }
   }
}

Эта часть блока работает фактически как и предыдущая, но срабатывает в момент когда $leaseBound = 0, то есть когда клиент теряет аренду IP адреса или отключается от DHCP сервера. Далее ищется запись с текущим именем хоста в списке статических записей DNS сервера и если запись найдена — проверяется IP адрес на соответствие диапазону и запись удаляется.

Author: Ameteus

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