среда, 15 августа 2018 г.

Клиент SNTP в MikroTik

  Начиная с версии прошивки 6.27 в MikroTik имеется соединение с облаком Cloud (IP – Cloud), позволяющем синхронизировать время на MikroTik, который не имеет энергонезависимого источника питания.


Детальных сведений в сети на русском языке о синхронизации времени через Cloud мне найти не удалось. Единственная найденная мной информация на Wiki MikroTik указывает, что:

а) точность устанавливаемого времени при выключенном клиенте NTP может составить несколько секунд: approximate time (accuracy of several seconds, depends on UDP packet latency, useful when NTP is not available);

б) опросы производятся каждые 60 секунд, а ожидание ответа от Cloud составляет 15 секунд: Router checks for outgoing IP address change: every 60 seconds
Router waits for cloud server response: 15 seconds

в) при включённом режиме Cloud зашифрованные пакеты upd передаются на порт 15252 узла cloud.mikrotik.com: UPD When enabled '/ip cloud' will send encrypted packets to hosts UDP/15252 port that resolves from cloud.mikrotik.com

Если на MikroTik нужен сервер NTP, синхронизация времени в Cloud отключена (галочка в поле "Update Time" отсутствует), а клиент DHCP не настроен или не получает адресов серверов NTP от провайдера (Use Peer NTP),


то имеется необходимость настройки клиента NTP (SNTP Client).

Когда клиент DHCP получает адреса DNS и NTP серверов от вышестоящего MikroTik, то ничего делать не надо, достаточно включить SMTP Client.




Встроенный в MikroTik клиент SNTPклиент получает синхронизацию от серверов времени NTP. При его активизации (System – SNTP Client) вводятся адреса IP основного и дополнительного серверов точного времени NTP, например:


Если вместо адреса IP водить имена конкретных серверов, то клиент распознает их адреса IP и автоматически подставит необходимые значения.

В процессе работы клиент опрашивает основной и дополнительный серверы, выбирает из них наилучший и синхронизирует с ним своё время. После успешной синхронизации времени повторный цикл "опрос – выборы – синхронизация" проводится через 64 секунды, затем интервал между циклами возрастает (128, 256, 300 секунд), пока не достигнет значения в 900 секунд.


Клиент SNTP MiroTik имеет недостаток. Дело в том, что адреса IP серверов точного времени могут меняться. В частности, в течение суток при пингах сервера времени timeserver.ru были возвращены значения 185.22.183.74 и 185.22.183.73  Клиент же SNTP MikroTik такие изменения не отслеживает, продолжая использовать предыдущий адрес IP. Поэтому может возникнуть ситуация, при которой синхронизация времени произведена не будет и в поле (см. рис. выше) Last Bad Packet From будет указан IP сервера NTP, с которым ему синхронизироваться не удалось.

Можно, конечно, периодически пингом опрашивать доступность введённых IP серверов NTP и при изменении их IP вносить новые адреса, а можно доверить решение данного вопроса скрипту автоматической коррекции адресов серверов IP.

Сам скрипт заимствован с одного из комментариев то ли к публикации на сайте, то ли одного из форумов (сейчас уже и не вспомню). Надеюсь, что автор комментария не станет мне выставлять претензию на "нарушение его авторских прав", тем более что, по его же словам, текст скрипта "//честно стибрен с официальной вики".

Текст скрипта следующий:

# Change the following line as needed as progName should match script name
:local progName "SetNtpServers";

# Array of NTP pools to use (check www.pool.ntp.org) one or a maximum of two, a primary & secondary
# Modify the following line and array variable based on your locale (default is north america).
:local arrNtpSystems ("0.us.pool.ntp.org", "1.us.pool.ntp.org");
# Alternatively the US related pool below can be used.
#:local arrNtpSystems ("0.us.pool.ntp.org", "1.us.pool.ntp.org");
#
# No modification is necessary beyond this line.
:put "$progName: Running...";
:log info "$progName: Running...";
:set arrNtpSystems [ :toarray $arrNtpSystems ];
:if (( [ :len $arrNtpSystems ] < 1 ) or ( [ :len $arrNtpSystems ] > 2 )) do={
:put "$progName: ERROR NTP Systems array (\$arrNtpSystems) must be either one or two DNS names.";
:log info "$progName: ERROR NTP Systems array (\$arrNtpSystems) must be either one or two DNS names.";
} else={
:local arrRosNtpSetting ("primary-ntp", "secondary-ntp");
:local i 0;
:foreach strNtpSystem in ($arrNtpSystems) do={
:local ipAddrNtpSystem [ :resolve $strNtpSystem ];
:local strRosNtpSetting [ :pick $arrRosNtpSetting $i ];
:local strCurrentNtpIp [ /system ntp client get $strRosNtpSetting ];
:put "$progName: NTP server DNS name $strNtpSystem resolves to $ipAddrNtpSystem.";
:log info "$progName: NTP server DNS name $strNtpSystem resolves to $ipAddrNtpSystem.";
:put "$progName: Current $strRosNtpSetting setting is $strCurrentNtpIp.";
:log info "$progName: Current $strRosNtpSetting setting is $strCurrentNtpIp.";
:if ( [ :toip $ipAddrNtpSystem ] != [ :toip $strCurrentNtpIp ] ) do={
:put "$progName: Changing $strRosNtpSetting setting to $ipAddrNtpSystem.";
:log info "$progName: Changing $strRosNtpSetting setting to $ipAddrNtpSystem.";
:local strCommand [ :parse "/system ntp client set $strRosNtpSetting=\"$ipAddrNtpSystem\"" ];
$strCommand;
} else={
:put "$progName: No changes were made for the $strRosNtpSetting NTP setting.";
:log info "$progName: No changes were made for the $strRosNtpSetting NTP setting.";
}
:set i ($i + 1);
}
}
:put "$progName: Done.";
:log info "$progName: Done.";

Обратите внимание на строку

       :local arrNtpSystems ("0.us.pool.ntp.org", "1.us.pool.ntp.org");

В ней указаны серверы NTP. Вы можете указать свои серверы NTP или пулы серверов NTP.

Какие адреса серверов NTP использовать? Можно их поискать. Например, при просмотре результатов русскоязычного поиска меня заинтересовал ntp.time.in.ua (подробности), в описании которого указано, что он имеет 1-й уровень точности. А сервер в Донецке уровня stratum2 на своей странице даже покажет смещение часов компьютера.

Можете указать целые пулы серверов NTP, для чего кликните на регион и на странице найдите страну своего пребывания:


Например, для Российской Федерации найдены записи:

0.ru.pool.ntp.org
1.ru.pool.ntp.org
2.ru.pool.ntp.org
3.ru.pool.ntp.org

Результирующий текст скрипта (без воды в виде комментариев) будет следующим (пример):

:local progName "SetNtpServers";
:local arrNtpSystems ("0.ru.pool.ntp.org", "1.ru.pool.ntp.org");
:put "$progName: Running...";
:log info "$progName: Running...";
:set arrNtpSystems [ :toarray $arrNtpSystems ];
:if (( [ :len $arrNtpSystems ] < 1 ) or ( [ :len $arrNtpSystems ] > 2 )) do={
:put "$progName: ERROR NTP Systems array (\$arrNtpSystems) must be either one or two DNS names.";
:log info "$progName: ERROR NTP Systems array (\$arrNtpSystems) must be either one or two DNS names.";
} else={
:local arrRosNtpSetting ("primary-ntp", "secondary-ntp");
:local i 0;
:foreach strNtpSystem in ($arrNtpSystems) do={
:local ipAddrNtpSystem [ :resolve $strNtpSystem ];
:local strRosNtpSetting [ :pick $arrRosNtpSetting $i ];
:local strCurrentNtpIp [ /system ntp client get $strRosNtpSetting ];
:put "$progName: NTP server DNS name $strNtpSystem resolves to $ipAddrNtpSystem.";
:log info "$progName: NTP server DNS name $strNtpSystem resolves to $ipAddrNtpSystem.";
:put "$progName: Current $strRosNtpSetting setting is $strCurrentNtpIp.";
:log info "$progName: Current $strRosNtpSetting setting is $strCurrentNtpIp.";
:if ( [ :toip $ipAddrNtpSystem ] != [ :toip $strCurrentNtpIp ] ) do={
:put "$progName: Changing $strRosNtpSetting setting to $ipAddrNtpSystem.";
:log info "$progName: Changing $strRosNtpSetting setting to $ipAddrNtpSystem.";
:local strCommand [ :parse "/system ntp client set $strRosNtpSetting=\"$ipAddrNtpSystem\"" ];
$strCommand;
} else={
:put "$progName: No changes were made for the $strRosNtpSetting NTP setting.";
:log info "$progName: No changes were made for the $strRosNtpSetting NTP setting.";
}
:set i ($i + 1);
}
}
:put "$progName: Done.";
:log info "$progName: Done.";

При указании серверов точного времени рекомендуют использовать региональные пулы адресов серверов NTP. Хотя причина данной рекомендации больше обусловлена тем, что региональные серверы NTP просто географически ближе. А так разницы нет. Главное, чтобы какой-нибудь сервер NTP "не банил" Ваш IP.  Меня, например, смутила такая запись на странице https://ntp-servers.net/servers.html:

"При использовании наших NTP серверов, старайтесь не отправлять слишком много запросов за короткий промежуток времени, в противном случае ваш IP адрес может быть заблокирован на срок не менее 30 суток с момента начала блокировки."

Как понимать высказывание "слишком много запросов"? Запросы с моего MikroTik с интервалами 64, 128, 256 c. (см. пояснение выше) это "слишком много" или нормально?

При вводе имён серверов точного времени необходимо вводить так, как они указаны. Например:

:local arrNtpSystems ("ntp.time.in.ua", "ntp2.time.in.ua");

то есть без 0. и 1. перед их именами. В противном случае при запуске скрипта получите его бесконечное выполнение, связанное с невозможностью распознавания их адресов IP.

Создайте скрипт (System – Scripts)


укажите ему имя (в приводимом примере timeservers), а в поле Source вставьте текст скрипта.


Далее вызовите планировщик заданий "System – Sheduler", в котором определите с какого времени и с какой периодичностью производить запуск скрипта timeservers (или определённого Вами наименования скрипта):



В поле On Event впишите  /system script run имя_вашего_скрпта

Периодичность (Interval) установите такую, которую считает нужной. В приводимом примере она указана как 1d:00:00:00, то есть каждые 24 часа (раз в сутки). Если это нужно делать, например, каждые 4 часа, то укажите 00:04:00:00  То есть, формат представления состоит из 4 групп цифр – дней:часов:минут:секунд

После отработки скрипта в протоколе работы MikroTik (Log) должны появиться записи, касающиеся результатов выполнения созданного скрипта:


Если будут присутствовать строки "No changes made for the primary-ntp NTP settings" и "No changes made for the secondary-ntp NTP settings", то это означает, что адреса IP при их очередном распознавании не изменились и никаких изменений в IP адреса серверов точного времени клиента SNTP MikroTik внесено не было.

А в разделе System – SNTP Client можно посмотреть результат последней синхронизации времени. На рисунке ниже видно, что состоялись "выборы" и с наилучшим сервером произведена синхронизация часов MikroTik, в ходе которой осуществлена коррекция на 779 микросекунд.


Обратите внимание, что при добавлении сервера NTP такой подробной картинки в клиенте SNTP Вы наблюдать не будете. Вместо SNTP Client у Вас будет отображаться NTP Client c уведомлением о том, что время синхронизировано (synchronized).


Может возникнуть вопрос: зачем а настройках SNTP Client указано значение 192.168.224.81 в поле Server DNS Names, которое в приводимом примере соответствует адресу сервера DNS MikroTik в локальной сети.

Если Вами используется Peer DNS Names, то это поле можно и не заполнять. Но если Вы не используете имени серверов, предоставляемых провайдером, предпочитая для распознавания имён использовать другие DNS интернета, а в статических адресах DNS сервера MikroTik такие значения как time.windows.com, ntp.ubuntu.com, time.google.com указывают на определённые адреса IP, не совпадающие с их действительными значениями (например, ближайшим сервером NTP), то есть вероятность получить невозможность синхронизации времени клиентским компьютером (server-ip-mismatch).


Второй причиной ввода значений в поля Server DNS Names является ситуация, при которой сервер DNS MikroTik не используется, поэтому для распознавания имён серверов точного времени требуется указание адресов серверов DNS, используемых для преобразования имён серверов NTP в адреса IP. Это отражено в Wiki MiroTik.

В протоколе MikroTik работа скрипта помечена записями SetNtpServers. Чтобы установить своё наименование измените его в самой первой строчке скрипта:

       :local progName "SetNtpServers";

Комментариев нет:

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