NTP через DHCP Options в MikroTik: автоматическая раздача времени клиентам

Расхождение времени в сети — тихая проблема, которая взрывается в самый неудобный момент. Kerberos-аутентификация падает с ошибкой «The clock skew is too great», SSL-сертификаты перестают проверяться, логи с разных серверов невозможно сопоставить, а разработчики тратят часы на поиск проблемы, которой нет. Причина — часы на клиенте расходятся на несколько минут.

Самый надёжный способ решить это централизованно — раздача NTP через DHCP. Клиент получает IP NTP-сервера вместе с адресом, маской и шлюзом. Ничего не нужно настраивать вручную. В этой статье — как настроить DHCP Option 42 MikroTik, привязать её к сети и проверить что всё работает.

Когда это нужно: корпоративная сеть с AD, несколько VLAN, Windows-клиенты с Kerberos, требования к единому системному времени серверов.


Что такое DHCP Option 42 и как она работает

DHCP-опции — это дополнительные параметры, которые сервер передаёт клиенту вместе с IP-адресом. Option 42 (NTP Servers) описана в RFC 2132 и содержит список IP-адресов NTP-серверов.

Клиент получает Option 42 при получении или обновлении lease, и если операционная система поддерживает эту опцию — использует полученный IP как NTP-сервер автоматически.

Формат значения Option 42

Значение передаётся не строкой, а байтами IP-адреса в шестнадцатеричном формате. Каждый октет IP — два hex-символа. Порядок прямой (big-endian).

Пример: 192.168.1.1

  • 192 = C0
  • 168 = A8
  • 1 = 01
  • 1 = 01

Итого: 0xC0A80101

Ещё пример: 10.0.0.1

  • 10 = 0A
  • 0 = 00
  • 0 = 00
  • 1 = 01

Итого: 0x0A000001

Быстрый перевод в терминале Linux:

python3 -c "import socket,struct; print(hex(struct.unpack('!I', socket.inet_aton('192.168.1.1'))[0]))"

Почему не доменное имя. Option 42 принимает только IP-адреса. Доменные имена в RFC 2132 для этой опции не предусмотрены. Если указать имя — клиент получит мусор или проигнорирует опцию.

Особенности Windows-клиентов

Windows использует Option 42, но с нюансами. По умолчанию Windows XP и Server 2003 применяют полученный NTP-адрес без вопросов. Начиная с Vista/2008, если машина в домене — NTP-источником управляет доменная политика (W32tm), и Option 42 может игнорироваться. Для доменных машин правильнее настраивать NTP через GPO или PDC эмулятор.

Рабочие станции вне домена, Linux и macOS — Option 42 поддерживают хорошо.


Настройка NTP на MikroTik

Прежде чем раздавать NTP через DHCP — MikroTik сам должен синхронизировать время и работать как NTP-сервер для клиентов. Без этого настройка Option 42 RouterOS теряет смысл: клиенты будут указывать на сервер, который сам не синхронизирован.

RouterOS 7

В RouterOS 7 NTP-клиент и сервер объединены в одном пакете и настраиваются через /system/ntp.

Включить NTP-клиент (синхронизация времени самого роутера):

/system ntp client set enabled=yes servers=216.239.35.0,216.239.35.4

Или указать свой вышестоящий NTP:

/system ntp client set enabled=yes servers=10.0.0.254

Включить NTP-сервер (раздача времени клиентам):

/system ntp server set enabled=yes broadcast=no manycast=no

Проверить синхронизацию:

/system ntp client print

В выводе смотрите synced: yes и offset — расхождение в миллисекундах. Если synced: no — NTP-клиент не работает, дальше настраивать Option 42 бессмысленно.

/system ntp server print

Должно показать enabled: yes.

RouterOS 6

В RouterOS 6 NTP-клиент и сервер — отдельные подсистемы, и пакет NTP нужно устанавливать отдельно.

# Проверить установлен ли пакет
/system package print | grep ntp

# Если не установлен — скачать с mikrotik.com и загрузить через Files

Настройка NTP-клиента в RouterOS 6:

/system ntp client set enabled=yes primary-ntp=216.239.35.0 secondary-ntp=216.239.35.4

Настройка NTP-сервера в RouterOS 6:

/system ntp server set enabled=yes broadcast=no multicast=no

Отличие от RouterOS 7: в шестой версии команды primary-ntp и secondary-ntp вместо servers. Синтаксис /system ntp client set servers=... не работает — получите ошибку.


Создание DHCP Option 42

Теперь создаём саму опцию. Это и есть настройка Option 42 RouterOS — объявляем опцию один раз, потом привязываем к нужным сетям.

/ip dhcp-server option add code=42 name=ntp-server value=0xC0A80101

Разбор команды:

  • code=42 — номер опции по RFC 2132, всегда 42 для NTP
  • name=ntp-server — произвольное имя, по нему будем привязывать к сети
  • value=0xC0A80101 — IP 192.168.1.1 в hex-формате

Несколько NTP-серверов. Option 42 поддерживает список IP — записываются подряд без разделителей:

# 192.168.1.1 и 192.168.1.2
/ip dhcp-server option add code=42 name=ntp-servers value=0xC0A80101C0A80102

Проверить что опция создана:

/ip dhcp-server option print

Важно: значение value должно начинаться с 0x — это префикс hex-формата. Если написать IP строкой ("192.168.1.1") или числом — клиент получит некорректные данные или не получит ничего.


Привязка Option к DHCP-сети

Созданная опция сама по себе ничего не делает — её нужно привязать к конкретной DHCP-сети.

Сначала смотрим список сетей:

/ip dhcp-server network print

Вывод покажет номер (0, 1, 2…) каждой сети. Запоминаем номер нужной.

Привязываем опцию:

/ip dhcp-server network set 0 dhcp-option=ntp-server

Где 0 — номер сети из предыдущей команды.

Если уже есть другие опции — добавляем через запятую, не заменяем:

/ip dhcp-server network set 0 dhcp-option=ntp-server,other-option

Применение к нескольким VLAN

В продакшене у меня обычно несколько VLAN с отдельными DHCP-сетями. Опция одна, привязываем к каждой сети:

/ip dhcp-server network print
# Допустим, нужные сети с номерами 0, 2, 4

/ip dhcp-server network set 0 dhcp-option=ntp-server
/ip dhcp-server network set 2 dhcp-option=ntp-server
/ip dhcp-server network set 4 dhcp-option=ntp-server

Или через Winbox: IP → DHCP Server → Networks → выбрать сеть → поле DHCP Options.

Если у каждого VLAN свой NTP-сервер — создаём отдельную опцию для каждого:

/ip dhcp-server option add code=42 name=ntp-vlan10 value=0xC0A80A01
/ip dhcp-server option add code=42 name=ntp-vlan20 value=0xC0A81401

/ip dhcp-server network set 1 dhcp-option=ntp-vlan10
/ip dhcp-server network set 2 dhcp-option=ntp-vlan20

Проверка работы

После привязки опции клиенты получат NTP-сервер при следующем обновлении lease. Ждать истечения аренды необязательно — можно обновить вручную.

Обновление lease на клиенте

Windows:

ipconfig /release
ipconfig /renew

Linux:

sudo dhclient -r && sudo dhclient

Или через systemd:

sudo systemctl restart NetworkManager

Проверка на Windows

ipconfig /all

В выводе ищем строку:

   DHCP Options  . . . . . . . . . : NTP Servers
   NTP Servers . . . . . . . . . . : 192.168.1.1

Проверить что NTP работает:

w32tm /query /status
w32tm /query /source

Проверка на Linux

timedatectl status

Или если используется chrony:

chronyc sources -v
chronyc tracking

Посмотреть какой NTP получен через DHCP (dhclient):

cat /var/lib/dhcp/dhclient.leases | grep ntp

Проверка через Wireshark

Если хочется убедиться что Option 42 действительно передаётся — захватываем DHCP-трафик:

Фильтр: bootp или dhcp

В пакете DHCP ACK раскрываем: Bootstrap Protocol → Options → Option: (42) Network Time Protocol Servers

Там должен быть IP вашего NTP-сервера. Если Option 42 в пакете нет — опция не привязана к сети или lease не обновлён.

Проверка на MikroTik

# Посмотреть активные lease и когда выдавались опции
/ip dhcp-server lease print detail

# Проверить время на самом роутере
/system clock print

# Проверить синхронизацию NTP
/system ntp client print

Типовые ошибки

IP указан не в hex

Самая частая ошибка при настройке DHCP Option 42 MikroTik. Пишут строкой:

# Неправильно
value="192.168.1.1"

# Правильно
value=0xC0A80101

Клиент получит опцию, но разберёт её как набор ASCII-кодов, а не IP-адрес. NTP работать не будет, ошибки в логах не будет — просто тихо ничего не произойдёт.

DHCP lease не обновлён

Опция добавлена, но клиент продолжает работать по старому lease. Option 42 передаётся только при получении нового lease.

# На Windows принудительно обновить
ipconfig /release && ipconfig /renew

# Или на MikroTik удалить lease руками
/ip dhcp-server lease remove [find where address=192.168.1.100]

Ошибка из практики: добавил Option 42, проверил через ipconfig /all — NTP не появился. Полчаса смотрел конфиг. Оказалось — просто не обновил lease. После ipconfig /renew всё появилось.

RouterOS 6 несовместимость

В RouterOS 6 синтаксис NTP-клиента отличается. Если настраиваете по инструкции для RouterOS 7 — получите ошибку или роутер применит пустое значение.

# RouterOS 6 — правильно
/system ntp client set enabled=yes primary-ntp=216.239.35.0

# RouterOS 7 — правильно
/system ntp client set enabled=yes servers=216.239.35.0

Клиент игнорирует Option 42

Windows-машина в домене Active Directory скорее всего проигнорирует Option 42 — NTP управляется через W32tm и доменные политики. PDC-эмулятор синхронизируется с внешним источником, остальные машины — с PDC.

Для таких клиентов Option 42 не нужна. Нужно правильно настроить W32tm на PDC:

w32tm /config /manualpeerlist:"192.168.1.1" /syncfromflags:manual /reliable:yes /update
net stop w32tm && net start w32tm

NTP-сервер недоступен

Клиент получил IP из Option 42, но не может до него достучаться. NTP работает на UDP порту 123.

# Проверить доступность NTP с MikroTik
/tool ping 216.239.35.0

# Проверить что порт 123 не заблокирован firewall
/ip firewall filter print | grep 123

# Разрешить NTP для локальной сети
/ip firewall filter add chain=input protocol=udp dst-port=123 src-address=192.168.0.0/16 action=accept

Из практики: в одной сети firewall на роутере блокировал UDP 123 от клиентов. Option 42 раздавалась корректно, клиенты получали NTP-сервер, но пакеты не проходили. В логах клиентов — тайм-аут. Решение — добавить разрешающее правило до запрещающего.

Неправильная привязка опции к сети

Опция создана, но забыли привязать к DHCP-сети. Проверяем:

/ip dhcp-server network print detail

В выводе должна быть строка dhcp-option=ntp-server. Если её нет — опция не будет передаваться.


Best Practice

Раздавать локальный NTP, а не pool.ntp.org

Никогда не раздавайте через Option 42 адреса публичных NTP-серверов (pool.ntp.org, time.google.com). Клиент получит доменное имя в опции вместо IP — это не работает. Кроме того, если интернет упадёт — синхронизация времени во всей сети прекратится.

В продакшене я делаю так: MikroTik синхронизируется с pool.ntp.org или вышестоящим сервером, а клиентам через Option 42 раздаётся IP самого MikroTik. Клиенты синхронизируются локально — быстро и независимо от интернета.

MikroTik как NTP relay

# MikroTik синхронизируется с внешним NTP
/system ntp client set enabled=yes servers=216.239.35.0,216.239.35.4

# MikroTik раздаёт время локальным клиентам
/system ntp server set enabled=yes

# Option 42 указывает на IP MikroTik в локальной сети
/ip dhcp-server option add code=42 name=ntp-server value=0xC0A80101
# 0xC0A80101 = 192.168.1.1 = IP MikroTik

Отдельный NTP для AD-окружения

Если в сети есть домен Active Directory — не пытайтесь управлять временем доменных машин через Option 42. Настройте PDC-эмулятор на синхронизацию с MikroTik или внешним NTP, остальное AD сделает само по иерархии W32tm.

Option 42 оставьте для устройств вне домена: принтеры, IP-телефоны, IoT, Linux-серверы без домена, рабочие станции гостевой сети.

Проверять время на самом RouterOS

Перед тем как разворачивать NTP через DHCP — убедитесь что время на самом MikroTik корректно. Если роутер раздаёт неправильное время, все клиенты получат неправильное время.

/system clock print
/system ntp client print

Если synced: no — разбираемся с NTP-клиентом на роутере в первую очередь.

Мониторинг синхронизации

В продакшене добавляю простую проверку в The Dude или Zabbix — мониторинг NTP offset на ключевых серверах. Если расхождение больше 1 секунды — алерт. Это спасает от ситуации когда NTP тихо перестал работать за неделю до инцидента с Kerberos.

over_dude
Author: over_dude

Поделитесь:

Оставьте комментарий

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

Прокрутить вверх