понедельник, 2 января 2017 г.

Автоматическая регистрация имён хостов в DNS на MikroTik

Данная задача является узкоспециализированной и может возникнуть для сетей, в которых имеется необходимость автоматического внесения адресов хостов в DNS MikroTik, IP-адреса которых соответствуют полученным от DHCP сервера MikroTik. В доменах Microsoft Windows такое действие осуществляется автоматически и, наверное, эти лавры славы долгое время не давали покоя. 

Решение данной задачи возможна двумя способами. Первый из них заключается в запуске определённого скрипта с указанной периодичностью, а второй – по команде самого сервера DHCP MikroTik.


Автоматическая регистрация имён хостов в DNS на MikroTik по команде планировщика

Перейдите в System – Scripts и в поле "Source" впишите текст скрипта:


:local topdomain;
:set topdomain "vot";
:local ttl;
:set ttl "00:14:29";
:local hostname;
:local hostip;
:local free;
/ip dns static;
:foreach a in=[find] do={
  :if ([get $a ttl] = $ttl) do={
    :put ("Removing: " . [get $a name] . " : " . [get $a address]);
    remove $a;
  }
}
/ip dhcp-server lease ;
:foreach i in=[find] do={
  /ip dhcp-server lease ;
  :if ([:len [get $i host-name]] > 0) do={
    :set free "true";
    :set hostname ([get $i host-name] . "." . $topdomain);
    :set hostip [get $i address];
    /ip dns static ;
    :foreach di in [find] do={
      :if ([get $di name] = $hostname) do={
        :set free "false";
        :put ("Not adding already existing entry: " . $hostname);
      }
    }
    :if ($free = true) do={
      :put ("Adding: " . $hostname . " : " . $hostip ) ;
      /ip dns static add name=$hostname address=$hostip ttl=$ttl;
    }
  }
}

По умолчанию, предлагается имя скрипта script1, но ему можно дать и своё наименование, например autoreg.

:set topdomain "vot"; – здесь vot является именем Вашего локального домена, который выдаётся параметром DHCP.


:set ttl "00:14:29"; – здесь 00:14:29 является временем жизни записи хоста в DNS, по истечении которого данная запись должна быть обновлена. TTL указано в формате "часы:минуты:секунды". Обратите внимание, что статические записи в DNS MikroTik также имеют свой TTL, который по умолчанию соответствует одним суткам.


Сам скрипт будет просматривать список арендованных IP-адресов и вносить в список статических записей DNS полные имена хостов (имя.домен), соответствующих полученным ими IP-адресам c указанием их TTL. При каждом последующем запуске полученные таким образом предыдущие значения будут автоматичечки удаляться. Нетронутыми останутся только записи, внесённые в DNS вручную.

Теперь логично было бы внести в планировщик заданий запуск этого скрипта с периодом, не превышающим значение TTL.

Перейдите в "System – Sheduler", создайте новую задачу и в поле "On Event" впишите /system script run autoreg (вместо autoreg укажите назначенное Вами имя скрипту авторегистрации хостов в DNS).


Start Date:  – это дата, начиная с которой планировщик будет запускать назначенное задание.

Start Time:  – это время, начиная с которого планировщик осуществит первый запуск назначенного задания.

В поле StartTime вместо времени можно указать Startup и скрипт будет запускаться каждый раз при перезагрузке или включении MikroTik.

Interval:  – это время, по истечении которого задание будет запущено снова, т.е. интервал между запусками задания. Вместо 00:00:00 укажите свои часы:минуты:секунды.

Значения TTL в тексте скрипта, а также Interval в планировщике заданий Вы определяете самостоятельно, исходя из потребностей Вашей ЛВС.

После первого запуска скрипта в логах MikroTik появляется запись


а в статических адресах сервера DNS MikroTik будут отображены добавленные хосты.


При последующих запусках, как было указано выше, эти записи будут удалены (static dns entry removed by admin) и взамен будут внесены хосты, срок аренды IP-адресов которых ещё не истёк (static dns entry added by admin).


Указанное в протоколах работы MikroTik "by admin" является указанием на то, что скрипт был запущен от имени пользователя MiroTik-а admin.

Запуски скрипта фиксируются счётчиками планировщика и самого скрипта.




Автоматическая регистрация имён хостов в DNS на MikroTik по команде сервера DHCP MikroTik

Указанный выше текст скрипта поместите в поле "Lease Script". Т.е. скрипт будет выполняться по событиям, связанным с арендами IP-адресов (добавление или удаление).


В этом случае в строке :set ttl "???"; вместо знаков вопроса целесообразно установить значение, совпадающее со значением Lease Time (см. рисунок выше).

После сохранения внесённых изменений при первом наступившем после этого событии аренды скрипт сработает в первый раз.


На рисунке выше показана часть протокола событий. При получении аренды от DHCP адреса 192.168.188.11 скрипт был запущен в первый раз и имена узлов, имеющих аренду адреса IP (4 шт.) были внесены в записи статических адресов сервера DNS.

После изъятия сервером DHCP IP-адресов, аренда которых не была продлена, и передаче этих адресов в свободный пул скрипт снова будет запущен и, по заложенному алгоритму, удалит все внесённые предыдущим запуском скрипта статические адреса узлов и внесёт в DNS IP-адреса тех узлов, аренда адресов которых ещё действует.



Огромная благодарность Waldemar Storch, без подсказки которого моих мозгов явно бы не хватило на то, чтобы разобраться в языке скриптов для MikroTik. Так что эта картинка уж точно про меня:


Те, кого интересует язык скриптов в MikroTik, могут обратиться к соответствующему разделу документации MikroTik.

2 комментария:

  1. Здравствуйте. А можете сделать скрипт который бы запраишивал записи статик днс у другого микротика и добавлял к своим? Ну типа синхронизации? И можно ли туда жобавить записи вида _ldap._tcp.dc._msdcs.domain.lan

    ОтветитьУдалить
  2. Ну, может быть, подойдёт что-то типа переадресации?

    https://14bytes.ru/conditional-dns-forwarding-mikrotik/

    ОтветитьУдалить