Сидячи коли на сревере і тихо-мирно попиваючи пиво від неробства мені в голову прийшла ідея створити сервер синхронізації часу по локальній мережі. Т. к. в стандартую посавку дистрибутивів Linux (а в мене на роботі стоїть ASPLinux, підтримку вітчизняного виробника 🙂 я не використовую більш надійні типу «шапки» або «слаки») входить програма xntpd то не довелося копатся в неті для пошуку потрібної програмки. Так трохи теорії про мережевому протоколі часу.

Мережевий протокол часу

Протокол NTP призначений для синхронізації клієнта або сервера з іншим сервером точного часу. Для локалки служба NTP здатна реалізувати точністю до мілісекунди, а для розподіленої (зокрема Інтернету) досяжна точність синхронізації порядку декількох десятків мілісекунд. В якості мережевого протоколу використовується протокол UDP, потр 123. Для передачі і зберігання часу використовується беззнакове 64-бітове число з фіксованою крапкою, яке зберігає число секунд у UTC. Старші 32 біта — число секунд, молодші 32 біта — дробова частина секунд. Досяжна точність — 232 пикосекунды. 0 означає безпосереднє час.

Ну думаю теорії вистачить. Для UNIX-платформи, в тому числі і для Linux, як я говорив існує сервер точного часу, що носить ім’я xntpd. Цей сервер повністю реалізує стандарт RFC1305. Установка його я думаю не складе проблем. Файл конфігурації — /etc/ntp.conf

Конфігурація сервера

Варіанти настройки сервера залежать від класу обслуговування, сервер має досить багато налаштувань, які в основному містяться в конфігураційному файлі. Я опишу налаштування сервера в режимі multicast, т. к. я налаштовував сервер для локальної мережі. Відкриваємо файл конфігурації і починаємо «издеватся» над пінгвіном 🙂

broadcast {address} [key {key}] [version {version}] [ttl {ttl}]
{address} — адреса симетричного сервера;
{key} — 32-бітовий ключ для поля аутенификации (по дефолту відсутня);
{version} — версія протоколу;
{tll} — час життя пакету.
broadcastclient [{address}] {address} — адресу клієнта, який одержує інформацію;
broadcastdelay {секунд} — дозволяє вказати затримку в поширенні пакета.

Загальні параметри

Опишу загальні параметри налаштування сервера xntpd:

driftfile {driftfile} — визначається файл, у якому зберігається і витягається при запуску зсув частоти місцевих годин;
enable/disable auth/monitor/pll/pps/stats — включити/вимкнути режим роботи:
auth — з неупомянутыми сусідами общатся тільки в режимі аутенификации;
monitor — дозволити моніторинг запитів;
pll — дозволити налаштовувати частоту місцевих годин по NTP;
stats — дозволити збір статистики;
statistics loopstats — при кожній модифікації локальних годин записує рядок у файл loopstats;
statistics peerstats — кожне спілкування з сусідом записується в журнал, що зберігається у файлі peerstats;
statistics clockstats — кожне повідомлення від драйвера локальних годин записується в журнал, що зберігається у файлі clockstats;
statsdir {имя_каталого_со_статистикой} — задає ім’я каталогу, в якому будуть знаходиться файли зі статистикою сервера;
filegen [file {filename}] [type {typename}] [flag {flagval}] [link|nolink] [enable|disable] — визначає алгоритм генерації імен файлів, які складаються з:
префікс — постійна частина імені файлу, задається або при компіляції, або спеціальними командами конфігурації;
ім’я файлу — додається до префікса без косою риси, дві точки заборонені, може бути змінена ключем file;
суфікс — генерується в залежності від typename;
restrict numeric-address [mask {numericc-mask}] [flag] — задає обмеження доступу: пакети сортуються і маскам, береться вихідний адресу і послідовно порівнюється, від останнього вдалого порівняння береться прапор доступу:
немає прапорів — дати доступ;
ignore — ігнорувати всі пакети;
noquery — ігнорувати пакети NTP 6 і 7 (запит та модифікація стану);
nomodify — ігнорувати пакети NTP 6 і 7 (модифікація стану);
limited — обслуговувати тільки обмежена кількість клієнтів з даної мережі;
nopeer — обслуговувати хост, але не синхронизироватся з ним;
clientlimit limit — для прапора limited визначає максимальну кількість обслуговуваних клієнтів (по дефолту 3);

Забезпечення безпеки сервера

Якщо сервер точного часу використовується тільки у внутрішній локальній мережі, то бажано закрити порт 123 для доступу, що б уникнути можливої атаки типу denial of service (відмова в обслуговуванні), оскільки це загрожує неправильним функціонуванням сервера. Крім цього необхідно використовувати шифрування трафіку.

Сам по собі сервер точного часу безполезен, якщо у користувачів відсутнє програмне забезпечення для синхронізації дати/часу. В даний час практично для всіх операційних систем є програми отримання точного часу з серверів NTP. Ось частина з них:

UNIX/Linux

Утиліта ntpdate -B {ntp1} {ntp2}, де {ntp1} {ntp2} адреси серверів точного часу
Windows

Для цього Осі існує більше десятка клієнтів служби точного часу. зокрема програма AboutTime, яку можна отримати за адресою www.listsoft.ru/programs/536/. Або програма AnalogX Atomic TimeSync, яку можна завантажити за адресою www.analogx.com/contents/download/network/ats.htm