|
Bog BOS: Network Time Protocol
|
Последнее изменение файла: 2025.03.24
Скопировано с www.bog.pp.ru: 2025.03.25
Bog BOS: Network Time Protocol
Рекомендуется предварительное знакомство с
системами отсчета времени.
В статье описывается высокоточный протокол синхронизации времени NTP
(Network Time Protocol),
его реализация в Unix (Linux) и Cisco,
приводятся ссылки на списки публичных NTP серверов,
которые можно использовать для синхронизации.
Назначение протокола состоит в синхронизации клиента или
сервера с сервером или источником точного времени (радио, атомные часы или еще что).
Синхронизируется не только текущее
значение времени, но и частота отсчета таймера. Обеспечивает точность до
милисекунды в пределах LAN и десятков милисекунд посредством WAN. Предусмотрена
криптографическая защита (шифрование контрольной суммы), одновременное
подключение к нескольким серверам на случай аварии, алгоритмы усреднения и т.д.
Поддерживает самонастраиваемую иерархическую архитектуру сети синхронизации
(симметричный механизм обмена пакетами). Главные сервера (напрямую
присоединенные к источнику точного времени) образуют первый слой (stratum),
присоединенные непосредственно к ним - второй слой, и т.д.
Для обмена информацией между используется протокол UDP (порт 123).
Используется довольно сложные алгоритмы фильтрации, селекции и
комбинации пакетов на принципах максимальной вероятности. Протокол
обеспечивает поддержку множества
резервных серверов и путей передачи (выбор лучшего на основе алгоритма
взвешенного голосования). Достигаемая точность первичного сервера -
милисекунды. Типичный интервал опроса - от 1
минуты (в начале работы) до 17 минут (если все хорошо).
Сервер непрерывно корректирует ход локальных часов, используя вычисленную
информацию об отклонениях их частоты от истинной. Это позволяет уменьшить
частоту опроса и удерживать отклонения показаний часов от истинных при
временных сбоях сети. Подстройка частоты обеспечивает приличную точность
часов даже при модемном соединении с Интернет.
При больших отклонениях (более 128 мс) местного
времени от времени выбранного сервера коррекция производится скачком,
иначе путем подстройки частоты местных часов.
В качестве значения времени используется беззнаковое 64-битовое число с
фиксированной точкой, число секунд в UTC.
Первые 32 бита - число секунд, вторые 32 бита - дробная часть. Точность 232
пикосекунды. Старший бит взведен где-то в 1968 году,
переполнение наступит в 2036 году. 0 означает неопределенное время.
Возможные классы обслуживания:
- multicast: для использования в быстрой локальной сети с
множеством клиентов и без необходимости в высокой точности, один или более
NTP-серверов рассылают broadcast, клиенты определяют время исходя из
предположения, что задержка составляет несколько милисекунд; сервер не
принимает ответных NTP сообщений
- procedure-call: в условиях когда нужна высокая точность, а multicast
недоступен; NTP-клиент посылает NTP-запрос на сервер, который
обрабатывает его и немедленно посылает ответ; сервер не
синхронизируется с клиентом
- symmetric: динамически реконфигурируемая иерархия серверов, каждый сервер
синхронизирует и синхронизируется своими соседями в
соответствии с правилами выбора соседей; активный режим
используется серверами низшего уровня (большой номер страта) с
преконфигурированными адресами соседей, пассивный режим
используется серверами близкими к корню и
взаимодействующими с соседями с заранее
неизвестными адресами; для каждой пары серверов, обменивающися
сообщениями, создается ассоциация.
Типичная конфигурация в небольшой организации включает 3 местных сервера,
каждый из которых подключен к трем внешним серверам
(9 различных внешних серверов!), местные сервера соединены между собой.
Не рекомендуется соединять между собой более 10 серверов.
Клиенты подключены к каждому из трех местных серверов.
При описании алгоритма используются следующие термины
- стабильность
- способность удерживать постоянную частоту
- точность (аккуратность?)
- совпадение с национальным стандартом
- разрешение
- точность измерения
- смещение часов
- разница во времени между ними
- skew (расхождение?)
- разница в частоте между ними
- надежность
- доля времени, в которое часы доступны
- синхронизация часов
- синхронизация частоты и времени
- первичный (primary) источник
- синхронизированный с национальным стандартом (провод, радио,
атомные часы)
Формат NTP-пакета:
- LI (leap indicator) - в конце суток должна быть вставлена секунда для
синхронизации атомных (TAI) и астрономических часов (GMT)
- VN - номер версии (3 или 4)
- mode - режим работы
- stratum - слой
- precision - разрешение местных часов (log2)
- poll interval - интервал запросов (используется минимальный из своего и
соседского, log2)
- synchronization distance - полный цикл обмена
сообщениями (roundtrip delay) до первичного источника
- synchronization dispersion - дисперсия этих задержек
- reference clock identifier - тип опорных часов
- reference timestamp - время последнего изменения опорных часов
(используется для управления)
- originate timestamp - время соседа, когда последнее NTP-сообщение было
отправлено (копировано по прибытии из transmit timestamp)
- receive timestamp - местное время получения этого последнего NTP-сообщения
- transmit timestamp - местное время отправки текущего сообщения
- authenticator (96 bit) - опция - ключ и шифрованная контрольная сумма
сообщения
Хотя для обмена информацией используется протокол UDP
(connectionless), сервера хранят информацию о соседях в переменных
состояния:
- 32-битные IP-адреса и 16-битные номера портов сервера и соседа,
определяющие ассоциацию
- счетчик, управляющий интервалами посылки NTP-сообщений (определяется
динамически)
- достижим ли сосед
- регистр фильтра: измеренные задержка/смещение и отдельный экземпляр
задержки/смещения
- задержка, смещение, дисперсия
- источник синхронизации: сосед, определенный алгоритмом выбора
- местные часы
Для защиты от помех и ошибок передачи (UDP!) используются
следующие методы:
- Если в течении 8 последовательных интервалов опроса от соседа не было
сообщений, то он считается недостижимым.
- Делается проверка времен: если время передачи совпадает с
предыдущим сообщением, то это несомненно дубль; если originate timestamp в
сообщении не совпадает со значением передачи в переменных данной
ассоциации, то нас пытаются обмануть.
- Делаются дополнительные защиты от очень старых сообщений и не полностью
синхронизованных ассоциаций.
- Аутентификатор состоит из ключа и шифрованной
контрольной суммы - деляется с помощью алгоритма DES и
DES cipher block-chaning (CBC),
обеспечивает непрерывную цепочку сообщений между узлами, в которую
невозможно влезть (необходима компенсация времени шифровки).
Используются алгоритмы, время работы которых не зависит от ключа и шифруемого текста.
Версия 4 обеспечивает
большую
точность за счет учета дрожания (jitter) источника и скорости работы сети,
улучшенных алгоритмов обработки и подстройки локальных часов,
более быстрой "сходимости" при запуске (минуты вместо дней).
Это позволяет уменьшить частоту опроса клиентом серверов.
Добавлены возможности наносекундного разрешения локальных часов (Linux?),
управления с помощью SNMP и
автоматической конфигурации клиентов (multicast) с обеспечением безопасности
методами криптографии. В дополнение к алгоритмам симметричного шифрования
(к DES CBC добавлен MD5) используется алгоритм с открытым ключом (autokey,
работы не завершены).
chrony (chronyd как клиент и сервер) - реализация клиента и сервера протокола NTP.
Основным преимуществом перед ntpd декларируется возможность синхронизации времени клиентом при непостоянном доступе к сети
или непостоянной работе (виртуальные машины, гибернация), большая точность (миллисекунды в Интернет, десятки микросекунд в локальной сети,
меньше микросекунды пи использовании PTP).
Сравнение chronyd, ntpd:
- + время можно устанавливать вручную
- + улучшенная фильтрация источников
- - нет кластеризации
- + независмое управление фазой и частотой
- + возможность синхронизации при нестабильном сетевом подключении
- + готовность клиента к ассиметричному джитеру
- + произвольный шаг
- + предел синхронизации может быть более 1000 секунд
- + максимальный уход 100000 ppm вместо 500 ppm
- + температурная компенсация
- + возможность синхронизации при использовании режима сохранения энергии
- - клиент не умеет broadcast, multicast и manycast
- + можно настроить порт клиента и сервера
- - сервер не умеет multicast и manycast
- - отсутствует autokey, кстати, небезопасный
- + имеется поддержка аппаратных отметок времени в пакетах
- - не реализованы драйверы аппаратных часов, предлагается обращаться к внешним программам (SHM или сокеты)
- + поддержка режима реального времени
- ? особенности обработки лишней секунды
- - отсутствие возможности удалённой конфигурации (зато порт не открыт по умолчанию вместе с возможностью удалённого управления и умножителем трафика!)
Изменения
- chrony 4.5 (RHEL8.10) относительно chrony 4.0
- борьба с сертификаторами NTS
- опция copy в директивах server и pool
- опция local директивы refclock
- опция maxdelayquant в директивах server и pool и peer
- опция selection в директиве log
- опция maxpoll в директиве hwtimestamp
- директива hwtstimeout (PTP)
- периодическое обновление адресов источников
- команда selectopts
- поддержка активации сокета в systemd
- chrony 4.0 относительно 3.5.1
- аутентификация Network Time Security (NTS)
- директива authselectmode для управления аутентификацией
- директивы binddevice, bindacqdevice, bindcmddevice
- директива confdir (сюда можно складывать кусочки конфигурации)
- директива sourcedir и команда reload sources для поддержки динамических адресов источников
- директива clockprecision
- директива dscp (управление QoS)
- ключ -L для управления сообщениями в журнал
- ключ -p (вывод настроек вместе с включёнными файлами)
- ключ -U (запуск не под суперпользователем)
- команда "add pool"
- команда "reset sources" (сбросить статистику)
- команда authdata (вывести информацию об аутентификации)
- команда selectdata (информация о выборе источников)
- ключ -N и команда sourcename (определение DNS имени)
- опции -k (выбор), -p (лимит), -r (сброс) для команд
- удалена поддержка ключей RIPEMD (RMD128, RMD160, RMD256, RMD320)
- удалена поддержка readline
- chrony 3.5.1 относительно 3.4 (RHEL7.9)
- пакет chrony 3.4 в RHEL 7.9, относительно chrony 3.2
- опция burst в директивах server и pool
- опции stratum и tai в директиве refclock
- команда shutdown
- опция filter в директивах server и pool и peer
- опции minsamples и maxsamples в директиве hwtimestamp
- по умолчанию pid файл в /var/run/chrony/chronyd.pid
- auto_offline
- команда onoffline
- пакет chrony 3.2 в RHEL 7.5, относительно chrony 3.1
- поддержка режима NTP interleaved (?)
- TAI-UTC (leapsectz)
- опции mindelay и asymmetry в директивах описания сервера, соседа и пула
- опции extpps и pps и width (фильтрация пульсаций) директивы refclock
- опция rxfilter директивы hwtimestamp
- возможность запретить управлять системными часами (-x)
- журнал в файл вместо syslog (-l)
- возможность указать несколько ключей командной строки (?)
- возможность запуска без привилегий суперпользователя и ключе "-Q"
- ? аппаратная синхронизация на групповых Ethernet интефейсах (bonding, bridging)
- пакет chrony 3.1 в RHEL 7.4
- пакет chrony 2.1.1 в RHEL 7.0
Ключи запуска chronyd:
- --help
- -4 # только IPv4
- -6 # только IPv6
- -f /etc/chrony.conf # файл с настройками
- -n # не отсоединяться от терминала
- -d # не отсоединяться от терминала и выводить на терминал вместо syslog
- -l имя-файла # выводить сообщения в файл вместо syslog
- -L уровень # -1 - отладка, 0 - информация (по умолчанию), 1 - предупреждения, 2 - несмертельные ошибки, 3 - только смертельные ошибк
- -q # установить системные часы и завершиться
- -Q # вывести требуемое смещение, но не устанавливать системные часы, выполняется без привилегий суперпользователя
- -r # загрузить историю обращений к серверам и источникам из файлов ("chronyc dump") и удалить файлы; каталог задаются директивой dumpdir
- -R # игнорировать положительные смещения в директивах initstepslew и makestep
- -s # установить системное время по часам реального времени (RTC) со смещением задаваемым driftfile
- -t секунд # ожидание при использовании "-q" и "-Q"
- -u пользователь # chrony, под каким пользователем работать после сброса привилегий
- -U # запускаться под непривилегированным пользователем без предварительных проверок
- -F режим # 0; режим использования фильтров системных вызовов: 0 - не фильтровать, 1 и 2 - убивать процесс, если он вызвал запрещённый системный вызов,
-1 и -2 - выдавать сигнал SIGSYS вместо SIGKILL; 1 - использовать список разрешённых вызовов, 2 - использовать список запрещённых вызовов
- -P приоритет # 0; приоритет реального времени (от 0 до 100)
- -m # не позволять вытеснять в swap
- -x # не изменять системное время, но можно работать как NTP сервер; полезно для контейнеров
- -v # вывести версию и опции сборки
- -p # вывести конфигурацию (вместе с включёнными файлами) и завершить работу
Через переменную окружения LISTEN_FDS systemd может передавать открытый сокет.
Файл настроек (по умолчанию /etc/chrony.conf) имеет строчный формат, каждая директива на отдельной строке
в произвольном порядке, используется последнее встреченное значение (кроме директив server).
Директивы могут быть указаны в командной строке.
Комментарии начинаются с символов "#", "%", ";" или "!" после нуля или многих пробелов.
Основные директивы:
- для клиента:
- server имя-хоста-или-IP [опции] # описывет источник времени, вышестоящий в иерархии; DNS-запросы до победного конца;
при потере связи или проблемах синхронизации DNS запрос повторяется; опции:
- minpoll степень-2-секунд # по умолчанию - 6, минимальный интервал опроса, может быть отрицательная степень (-1 - это 0.5 секунды)
- maxpoll степень-2-секунд # по умолчанию - 10
- iburst # интервал между первыми 4 (8) опросами будет 2 секунды
- burst # при проблемах синхронизации выдавать запросы почаще
- key номер # номер пароля из keyfile (от 1), пароль используется для генерации контрольной суммы пакетов
- nts # использовать для аутентификации NTS (Network Time Security) - TLS, не требуется общий секрет (используется протокол NTS-KE - NTS Key Establishment)
- ntsport 4460 # порт для NTS-KE
- certset номер # по умолчанию 0 (системный набор); номер набора доверенных сертификатов для NTS (задаётся в ntstrustedcerts)
- maxdelay секунд # по умолчанию - 3, игнорировать задержавшиеся в пути ответы
- maxdelayratio отношение # по умолчанию выключено; вместо секунд использовать отношение к минимальной задержке
- maxdelaydevratio отношение # по умолчанию 10.0; игнорировать задержавшиеся в пути ответы
- maxdelayquant квантиль # по умолчанию выключено; игнорировать задержавшиеся в пути ответы
- mindelay задержка # использовать указанное число в maxdelayratio вместо реальной задержки
- asymmetry отношение # от -0.5 до +0.5; по умолчанию вычисляется автоматически; ассиметрия дрожания сети (jitter)
- offset секунд # 0.0; поправка на ассиметрию путей (половина ассиметрии задержек)
- minsamples число # перекрывает значение директивы minsamples
- maxsamples число # перекрывает значение директивы maxsamples
- filter опросов # медианный фильтр
- offline # не опрашивать до получения команды online
- auto_offline # автоматически переводить в offline
- prefer # предпочтительный источник
- noselect # не использовать, но отслеживать
- trust # считать правильным, если нет противоречий с другими доверенными источниками
- require # для установки часов д.б. выбран хотя бы 1 источник с этой опцией
- xleave # запрашивать от сервера "клиентоориентированный" режим (interleaved)
- polltarget 8 # целевое количество измерений (используется для определения интервала запросов)
- port 123
- presend степень-2-секунд # предварительный запрос за 2 секунды для обновления ARP кеша перед реальным запросом
- minstratum уровень # не использовать некачественный источник
- version 4 # версия-протокола
- copy # клиент и сервер работают на одном хосте
- pool имя-DNS [опции] [maxsources 4] # имя DNS описывает несколько IP-адресов серверов, возможно изменяющихся во времени;
опции такие же как в server
- peer имя-хоста-или-IP [опции] # описывает равноправный сервер NTP; не рекомендуется без опции key;
рекомендуется заменить на server в двух направлениях;
опции такие же как в server, кроме iburst, burst, nts, presend, copy
- refclock ... # описание аппаратного источника времени
- manual # разрешить использовать команду "chronyc settime"
- acquisitionport UDP-порт # для исходящих запросов; по умолчанию, для каждого запроса выбирается случайный порт;
0 - один случайный порт для всех запросов
- bindacqaddress IP-адрес # к какому IP адресу привязывать запросы клиента
- bindacqdevice интерфейс # к какому интерфейсу привязывать запросы клиента
- dscp 0 # настройка QoS DSCP (Differentiated Services Code Point)
- dumpdir каталог # место хранения истории измерений; используется при перезапуске с ключом "-r"
- dumponexit # сохранять историю измерений при выходе (устарело)
- maxsamples число # максимальное количество отсчётов, хранимых для каждого источника, по умолчанию - 0, т.е. бесконечность
- minsamples число # минимальное количество отсчётов, хранимых для каждого источника, по умолчанию - 6
- ntsdumpdir каталог # место хранения NTS-KE кук (отдельный файл для каждого сервера)
- ntsrefresh 2419200 # интервал обновления NTS-KE в секундах
- ntstrustedcerts [номер] файл-или-каталог # место хранения сертификатов (PEM) доверенных CA или серверов для NTS; 0 - системный набор
- nosystemcert # не использовать системный набор сертификатов для NTS
- nocerttimecheck 0 # 0 - всегда проверять время выпуска сертификата для NTS; 1 - не проверять в первый раз
- refresh секунд # по умолчанию - 1209600; интервал между переопределениями IP адресов по DNS именам; 0 - бесконечность
- authselectmode режим # политика выбора источника в зависимости от наличия аутентификации
- require # выбирать только аутентифицированные источники
- prefer # предпочитать аутентифицированные источники
- mix # по умолчанию после версии 4.0; аутентифицированные источники автоматически получают опции require и trust
- ignore # по умолчанию до версии 4.0; не делать предпочтения аутентифицированным источникам
- combinelimit 3 # не комбинировать больше указанного количества источников
- maxdistance 3 # источник не д.б. дальше указанного количества секунд от корня (включая половину задержки и дисперсию)
- maxjitter 1 # максимальное дрожание (jitter) источника, в секундах
- minsource 1 # д.б. не менее указанного количества подходящих источников для обновления локальных часов
- reselectdist 0.0001 # премия дистанции для текущего источника в алгоритме выбора следующего наиболее подходящего
- stratumweight 0.001 # премия за каждый слой (stratum) в алгоритме выбора следующего наиболее подходящего
сервер:
- {allow | deny} [all] [IP-адрес/длина-маски-сети] # разрешить доступ к NTP серверу, по умолчанию доступ запрещён;
можно использовать несколько директив, действует первая подходящая, но all перекрывает действие предыдущих директив;
имеются внутренние ограничения (маска округляется до 4 бит),
так что сложные конфигурации рекомендуется проверять командой "chrony accheck адрес"
- bindaddress IP-адрес # к какому IP адресу привязывать сервер
- binddevice интерфейс # к какому интерфейсу привязывать сервер
- broadcast интервал-в-секундах широковещательный-IP-адрес [UDP-порт]
- clientloglimit байт # размер журнала доступа клиентов, по умолчанию 524288 (тысячи клиентов)
- noclientlog # не хранить журнал доступа (не будет работать "chronyc clients")
- local опции # сам себе источник времени
- stratum слой # серверу будет приписан указанный слой при отсутствии синхронизации с внешним источником; по умолчанию - 10
- distance секунд # лимит времени доступа к источнику (задержка/2+дисперсия), после которго сервер будет считать себя самостоятельным; по умолчанию - 1
- orphan # сервера из того же слоя не воспринимаются как источники (необходимо, чтобы не колбасило при временной изоляции сети)
- ntpsigndsocket каталог # smbd может подписывать ответы на запросы клиентов MS-SNTP
- ntsport 4046 # порт NTS-KE
- ntsservercert имя-файла # файл с сертификатом сервера chronyd (PEM) для NTS-KE
- ntsserverkey имя-файла # файл с приватным ключом сервера chronyd (PEM) для NTS-KE; необходим доступ для процесса chronyd и запрет доступа для прочих
- ntsprocesses 1 # число вспомогательных процессов для NTS-KE; 0 - запросы обслуживает самостоятельно
- maxntsconnections 100 # максимальное количество соединений NTS-KE к процессу
- ntsdumpdir имя-каталога # каталог для хранения файла ntskeys с временными ключами и куки
- ntsntpserver доменное-имя # для NTS-KE, если он отличается от имени NTP
- ntsrotate 604800 # интервал смены ключа NTS-KE в секундах
- port 123 # порт NTP для запросов к серверу; 0 - не обслуживать никого
- ratelimit # ограничения на ответы клиенту (деление клиентов по IP адресам, максимальное количество IP адресов определяется clientloglimit)
- interval 3 # степень двойки секунд, минимальный интервал между запросами, по умолчанию - 3 (8 секунд)
- burst 8 # количество первоначальных запросов в обход лимита на интервал
- leak 2 # степень-1/2-секунд, доля запросов, пропускаемых в обход лимитов
- ntsratelimit # ограничения на запросы NTS-KE, формат аналогичен ratelimit
- smoothtime максимальное-изменение-частоты-ppm частота-изменения-частоты-ppm [leaponly] # сглаживание времени перед отдачей клиентам,
не рекомендуется если клиенты используют несколько серверов
управление (команды chronyc)
- bindcmdaddress IP-адрес-или-сокет # к какому IP адресу или сокету привязывать управление;
по умолчанию - 127.0.0.1:323 и [::1]:323 и /var/run/chrony/chronyd.sock или /run/chrony/chronyd.sock
(/var/run/chrony имеет права доступа 750 для chrony:chrony);
для запрета сокета надо указать "/"
- bindcmddevice интерфейс # к какому интерфейсу привязывать управление
- {cmdallow | cmddeny} [all] [IP-адрес/длина] # см. allow и deny; разрешить управляющий доступ (chronyc) к NTP серверу, по умолчанию доступ разрешён с 127.0.0.1
- cmdport 323 # UDP-порт для управления; 0 - запретить
- cmdratelimit # ограничения на запросы мониторинга по сети; запросы к локальному интерфейсу не ограничиваются; опции - см. ratelimit
системные часы
- initstepslew секунд [сервер] ... # если при старте chronyd расхождение с серверами больше указанного,
то поменять системное время скачком, иначе использовать плавную подстройку;
рекомендуется заменить на makestep и server с iburst (для ожидания завершения процесса при загрузке использовать chronyc waitsync)
- clockprecision секунд # ожидаемоая точность системных часов; по умолчанию измеряется время обращения к часам
- corrtimeratio отношение # по умолчанию - 3; скорость постепенного смещения часов для выравнивания ошибки;
увеличение уменьшает ошибку частоты системных часов, но увеличивает время подстройки
- driftfile /var/lib/chrony/drift # место хранения характеристик местных часов, позволяет подстраивать системное время до завершения
синхронизации с источником; хранит поправку частоты (ppm) и уклон (skew)
- fallbackdrift минимум максимум # в секундах, степени двойки; когда откатываться в автономный режим при отсутствии синхронизации
- leapsecmode {system | step | slew | ignore} # что делать с лишними секундами между UTC и TAI;
по умолчанию - system (ядро делает скачок в 00:00:00); пример: TZ=right/UTC date -d 'Dec 31 2008 23:59:60'
- leapsectz right/UTC # часовой пояс, описание которого надо проверять на секунду расхождения между UTC и TAI
- makestep секунд число-изменений # если расхождение времени больше указанного, то изменять время скачком первые "число" раз;
для ожидания завершения процесса при загрузке рекомендуется использовать "chronyc waitsync"
- maxchange лимит число-изменений число-превышений # если расхождение времени больше лимита (в секундах) после указанного числа изменений,
то не синхронизовать время и выйти после указанного числа превышений; по умолчанию - ?
- maxclockerror 1 # ожидаемая стабильность системных часов; максимальная предполагаемая ошибка частоты (в ppm) системных часов между синхронизациями
- maxdrift 500000 # ppm; максимально допустимая ошибка частоты системных часов; по умолчанию - 500000 (драйвер Linux не умеет более 100000)
- maxupdateskew 1000 # считать измерения ненадёжными, если уход больше указанного лимита в ppm; для локальной сети д.б. порядка 10
- maxslewrate 83333.333 # 1/12; максимальная скорость подстройки системных часов (см. также corrtimeratio) в ppm (драйвер Linux не умеет более 100000)
- tempcomp ... # температурная компенсация
часы реального времени
- hwclockfile /etc/adjtime # имя файла, используемого hwclock (скорость ухода часов реального времени и текущий уход - игнорируется?
часы реального времени содержат локальное время или UTC - настраивается rtconutc)
- rtcautotrim секунд # подводить часы реального времени в соответствии с системными часами при превышении расхождения, обязательно настроить rtcfile;
несовместим с rtcsync
- rtcdevice /dev/rtc # кстати, права доступа 600 для root:root
- rtcfile имя-файла # куда писать измерения RTC (/var/lib/chrony/rtc), несовместим с rtcsync
- rtconutc # часы реального времени в UTC или показывают локальное время;
по умолчанию - нет или извлекаются из файла (см. hwclockfile)
- rtcsync # не отслеживать точность часов реального времени, ядро самостоятельно сохраняет системное время в часы реального времени каждые 11 минут
журналы
- log имя-журнала ... # записывать указанный журнал:
- rawmeasurements # каждый пакет от источника записывается в measurements.log
- measurements # прошедшие проверку пакеты от синхронизированных источников в measurements.log
- statistics # статистика источников в statistics.log (время, IP, ожидаемое стандартное отклонение, ожидаемое смещение и пр.)
- selection # журнал выбора источника для каждого измерения в selection.log; растёт квадратично от числа источников
- tracking # изменения в работе локального времени относительно источника в tracking.log (время, IP, стратум, отклонение частоты в ppm,
ошибка изменения частоты в ppm, смещение, leap-секунда, количество комбинированных источников, ожидаемое стандартное отклонение смещения,
недоделанная коррекция смещения, задержка и дисперсия источника,
максимальная ожидаемая ошибка (смещение+задержка+дисперсия_задержки+недоделанная_коррекция)
- rtc # статистика часов реального времени в rtc.log, если отслеживается
- refclocks # статистика аппаратного источника времени в refclocks.log
- tempcomp # статистика температурной компенсации в tempcomp.log
- logbanner 32 # через сколько строк журнала вставлять строку с описанием колонок; 0 - не вставлять
- logchange 1 # секунд; при превышении указанного предела при изменении системных часов генерируется сообщение на syslog
- logdir каталог # куда писать журналы (/var/log/chrony)
- mailonchange адрес секунд # при превышении изменения системных часов более указанного предела посылается письмо на указанный адрес
прочее
- confdir каталог ... # включать файлы .conf из указанных каталогов как часть конфигурации; обычно /etc/chrony.d
- sourcedir каталог ... # включать файлы .sources из указанных каталогов как часть конфигурации; только директивы server, pool и peer
- include шаблон-имён-файлов # включать файлы согласно шаблону
- hwtimestamp {имя-интерфейса | *} [опции] # использовать PTP;
наличие аппаратной возможности проверяется "ethtool -T имя-интерфейса";
в журнале д.б. записи вида "chronyd: Enabled HW timestamping on ...";
подхватился ли можно понять по "chronyc ntpdata"
- hwtstimeout 0.001 # сколько ждать аппаратной отметки PTP
- keyfile имя-файла # /etc/chrony.keys, содержит строки с номерами, типами (по умолчанию MD5)
и симметричными ключами для генерации MAC (message authentication code); файл д.б. закрыт от чтения посторонними
- lock_all # не вытеснять chromyd из памяти
- pidfile /run/chrony/chronyd.pid
- ptpport 0 # порт NTP-over-PTP 319
- sched_priority приоритет-реального-времени # от 0 до 100, pthread_setschedparam() с SCHED_FIFO
- user chrony # после инициализации переключиться на указанное имя пользователя
Утилита chronyc позволяет управлять сервером chronyd в режиме командной строки
локально (сокет /var/run/chrony/chronyd.sock или /run/chrony/chronyd.sock, /var/run/chrony имеет права доступа 750 для chrony:chrony)
или по сети, по умолчанию - только локально и от 127.0.0.1.
По сети в новых версиях доступны только команды мониторинга: activity, manual list, rtcdata, smoothing, sourcename, sources, sourcestats, tracking, waitsync.
Изменения конфигурации, внесённые утилитой chronyc, будут утеряны при перезапуске chronyd.
При отсутствии аргументов переходит в интерактивный режим.
Ключи chronyc:
- -4 # только IPv4
- -6 # только IPv4
- -n # не преобразовывать DNS имена в IP адреса
- -N # выводить исходные DNS имена (по умолчанию DNS имя из конфигурации преобразуется в IP адрес, а затем из IP адреса в DNS имя)
- -c # вывод в формате CSV, без преобразований величин
- -d # выводить отладочную печать
- -h имя-хоста # по умолчанию - /run/chrony/chronyd.sock,127.0.0.1,::1
- -m # каждый аргумент воспринимается как отдельная команда
- -p управляющий-порт # 323 по умолчанию
- -v # вывод версии и завершение работы
- --help
Основные команды chronyc:
- help
- exit | quit
- activity # что вообще происходит?! сколько у нас серверов и соседей в различных состояниях
- serverstats # количество полученных и потерянных пакетов, команд
- tracking # состояние синхронизации: идентификатор источник (IP адрес, 7F7F0101 - локальный источник),
наш стратум, предполагаемое время последнего измерения, смещение системного времени от предполагаемого, смещение при последнем измерении, среднее смещение,
отклонение частоты системного времени в ppm, ожидаемая ошибка частоты, сетевая задержка до стратума 1, отклонение задержки, интервал измерений,
лишняя секунда (Normal, Insert second, Delete second, Not synchronised)
- sources [-a] [-v] # информация о текущем состоянии источников: режим, состояние, IP адрес, стратум, интервал (степень 2), доступность (восьмеричное),
последний приход, смещение, полная ошибка; -a - все источники, -v - пояснительная записка
- sourcestats [-a] [-v] # статистика качества источников;
-a - все источники, -v - пояснительная записка
- selectdata [-a] [-v] # параметры, влияющие на выбо или не выбор источника
- ntpdata [адрес] # подробности из пакета NTP
- makestep [секунд число-изменений] # если расхождение времени больше указанного, то изменять время скачком первые "число" раз;
для ожидания завершения процесса при загрузке рекомендуется использовать "chronyc waitsync"
- waitsync [число-попыток [максимально-допустимая-корректировка [максимально-допустимый-уход [интервал]]]] # ожидать синхронизации;
по умолчанию 0 (бесконечность) попыток с интервалом по 10 секунд
- reselect # выбрать источник
- add server адрес [опции]
- add peer адрес [опции]
- add pool адрес [опции]
- delete адрес
- offline [адрес[/длина-маски]]
- online [адрес[/длина-маски]]
- refresh # заново определить IP адреса по DNS именам
- manual {on | off | list | reset} # разрешить команду settime
- settime время # установить время вручную в формате getdate (требуется manual)
- accheck адрес # проверить доступность сервера клиенту с указанного адреса
- cmdaccheck адрес # проверить доступность мониторинга клиенту с указанного адреса
- clients [-r] # получить список клиентов; -r - сброс счётчиков (не работает)
- allow [all] [подсеть] # разрешить доступ клиентам
- cmdallow[all] [подсеть] # разрешить мониторинг клиентам
- deny [all] [подсеть]
- cmddeny [all] [подсеть]
- local off # мы не источник
- local опции
- smoothing # работает ли сглаживание
- smoothtime {activate | reset} # включение и сброс сглаживания
- rtcdata # состояние часов реального времени
- trimrtc # приведение часов реального времени в соответствие с системным временем
- writertc # сохранить особенности часов реального времени в файл
- cyclelogs # переоткрыть файлы журналов (позволяет их переименовать)
- dump # записать историю измерений в каталог, указанный директивой dumpdir
- rekey # перечитать файл ключей и куки
- reset sources # начать синхронизацию заново
- shutdown # остановить chronyd
- dns -n # выводить IP адреса без преобразования в имена
- dns +n # преобразовывать IP адреса в имена
- timeout 1000 # милисекунд
- retries 2
- keygen номер тип длина-ключа # генерация случайного ключа для записи в файл ключей # 1 SHA1 256
Имеется служба chronyd.service для запуска NTP сервера chrony в systemd (/usr/lib/systemd/system/chronyd.service),
ключи chronyd можно задать в /etc/sysconfig/chronyd (по умолчанию пусто).
Отсутствует reload.
Служба chrony-wait.service (/usr/lib/systemd/system/chrony-wait.service) позволяет организовать ожидание завершения синхронизации (600 секунд).
Имеется скрипт /etc/dhcp/dhclient.d/chrony.sh для обработки запросов DHCP
(вызывает скрипт /usr/libexec/chrony-helper с параметром update_daemon).
Информация о серверах NTP от DHCP хранится в /var/lib/dhclient/chrony.servers.ИмяИнтерфейса
(хранилась ибо в Rocky Linux 8.10 переехала в /run/chrony-helper/added_servers и /run/chrony-helper/nm-dhcp.bond0 (лежат старые значения)).
Скрипт /usr/libexec/chrony-helper также умеет обрабатывать SRV записи DNS типа _ntp._udp.
Использует chronyc для динамического добавления директив server в текущие настройки.
Забытые файлы от удалённых интерфейсов подсовывают лишние источники.
как его отключить? Цепляет сам себя. Пришлось править настройки DHCP. Для ntpd работало размещение "PEERNTP=no" в /etc/sysconfig/network
Скрипт /etc/NetworkManager/dispatcher.d/20-chrony вызывается при поднятии и опускании сетевых интерфейсов
и вызывает chronyc для редактирования списка NTP серверов по ответам DHCP.
/var/lib/chrony/rtc
Скрипт для архивации журналов - /etc/logrotate.d/chrony.
Для псевдоизолированной сети настраивал следующим образом (схема из времён, когда ещё не было режима orphan):
- сервер ntfref имеет доступ к внешним NTP серверам (server IP-адрес; ...; driftfile /var/lib/chrony/drift; rtcsync; local stratum 10; allow ...
- сервера ntp1 и ntp2 обращаются к ntfref (driftfile /var/lib/chrony/drift; rtcsync; local stratum 11; allow ...)
- остальные узлы сети обращаются к ntp1 и ntp2
Аналог ntpdate: "chronyd -q 'pool pool.ntp.org iburst'".
logwatch ничего про chrony не знает.
В любом случае для надежной работы рекомендуется
организовать от 3 до 5 локальных серверов NTP, объединенных "соседскими"
связями и каждый из которых синхронизуется не менее чем с 3 внешними серверами
желательно с использованием различных маршрутов доступа. Крайне нежелательно
использовать несимметричные маршруты (туда по модему, обратно по спутниковому
каналу).
- RFC 5905 June 2010 (Network Time Protocol Version 4: Protocol and Algorithms Specification)
- RFC 5906 June 2010 (Network Time Protocol Version 4: Autokey Specification)
- RFC 1708 D. Gowin, "NTP PICS PROFORMA For the Network Time Protocol Version 3", 10/26/1994. (бланк, заполняемый владельцем сервиса NTP)
- RFC 1589 D. Mills, "A Kernel Model for Precision Timekeeping", 03/03/1994. (как реализовать управление временем (в частности, в SunOS), чтобы можно было стыковаться с NTP; наверное, для разработчиков ядра Unix это интересно ;)
- RFC 1305 D. Mills, "Network Time Protocol (v3)", 04/09/1992. (отменил RFC-1119, RFC-1059, RFC-958)
- RFC 1165 J. Crowcroft, J. Onions, "Network Time Protocol (NTP) over the OSI Remote Operations Service", 06/25/1990. (работа NTP в условиях сервиса, ориентированного на соединение - не наш случай)
- RFC 1129 D. Mills, "Internet time synchronization: The Network Time Protocol", 10/01/1989. (более свежая версия текста)
- RFC 1128 D. Mills, "Measured performance of the Network Time Protocol in the Internet system", 10/01/1989. (итог исследования: 1% хостов поддерживает NTP, 30% из них дает точность 30мс, 99% дает точность 10 секунд, NTP дает точность в 1000 раз выше, чем TIME или ICMP Timestamp)
- RFC 1119 D. Mills, "Network Time Protocol version 2 specification and implementation", 09/01/1989. (Obsoletes RFC1059) (STD 12) (Obsoleted by RFC1305)
- RFC 1059 D. Mills, "Network Time Protocol version 1 specification and implementation", 07/01/1988. (Obsoletes RFC0958) (Obsoleted by RFC1119)
- RFC 958 D. Mills, "Network Time Protocol NTP", 09/01/1985. (Obsoleted by RFC1059)
|
Bog BOS: Network Time Protocol
|
Copyright © 1996-2025 Sergey E. Bogomolov; www.bog.pp.ru