Введение
Наверняка всем известно, что правильно настроенное время – это важная и неотъемлемая часть, которую необходимо выполнять при первоначальной настройке сервера. В противном случае можно столкнуться с проблемами. Например, когда в логах разное время, или же когда не может пройти аутентификация в приложении из-за разницы времени на сервере и клиенте всего в одну секунду. На самом деле список проблем может быть куда больше.
Чтобы избежать всякого рода проблем, необходимо разобраться, как правильно настраивается время на сервере с Linux.
В качестве сервера, на котором выполняется всё нижеописанное, будет Centos 7. Также подойдет любой другой дистрибутив Linux.
Реализация NTP-протокола
Network Time Protocol – протокол сетевого времени, актуальная версия на момент написания статьи – v4, описан в rfc5905. Для работы с данным протоколом используются различные реализации. Самыми известными и популярными являются NTPD и Chrony. О них следует кратко рассказать, в чём отличия. Есть также openntpd, но он не столь популярен.
NTPD
Одна из старых реализаций протокола NTP, по умолчанию используется в Centos 7. Весьма рабочий и надёжный инструмент, если необходимо настроить простой сервер времени или клиента.
Chrony
А реализация chrony является более новой со своими преимуществами, поэтому уже в Centos 8 используется по умолчанию, а ntpd и вовсе отсутствует.
В Red Hat рекомендуют переходить на chrony, они даже запилили python-скрипт, который может сконвертировать текущую конфигурацию ntpd для chrony. Но в данном случае лучше обойтись ручной настройкой.
Почему всё же для сервера времени предпочтительнее использовать chrony, вместо ntpd? Ответ прост. Chrony может синхронизировать системные часы быстрее с большей точностью времени и особенно полезен для систем, которые не всегда находятся в сети. В целом и общем, если нужно просто настроить клиента\простой сервер, подойдёт любая реализация, но если идти в ногу со временем и следовать рекомендациям, то выбор за chrony — быстрее, выше, сильнее.
Для тех, кому интересны более детальные подробности в различиях, можно посмотреть документацию
Установка и настройка chrony в качестве сервера
Установка проста и пакет chrony версии 3.4 доступен из базового репозитория:
yum install chrony
Конфигурационный файл располагается по пути /etc/chrony.conf. Минимально рабочий конфиг
server 0.ru.pool.ntp.org iburst
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst
allow 10.10.4.0/26
driftfile /var/lib/chrony/drift
local stratum 10
makestep 1.0 3
rtcsync
- В поле server указываются вышестоящие серверы времени, с которыми необходимо производить синхронизацию. Здесь предпочтительнее указать близлежащие серверы. Например, серверы провайдера или же публичные серверы проекта pool.ntp.org более близкого региона. Последний вариант как раз и используется в данном случае – серверы расположены в РФ.
- директива allow указывает подсети, которые могут запрашивать время для синхронизации
- директива driftfile задает путь до файла, в котором располагаются данные с историей изменения времени. Это необходимо на тот случай, если вышестоящие серверы времени станут недоступны. Тогда системные часы будут брать значения как раз-таки из driftfile.
- local stratum 10. Серверы NTP работают на основе иерархии. Это и есть stratum. Уровень stratum 0 – это максимально точные часы (атомные или GPS, например). Серверы stratum 1 – это серверы, синхронизирующие своё время с серверами stratum 0. А серверы stratum 2 синхронизируются с серверами со stratum 2. Ну, и так далее до 15. Обычно указывается значение stratum 10.
- makestep 1.0 3. Метод корректировки системных часов, когда разница разница очень большая и время корректировки может быть достаточно долгим. Для этого данная директива позволяет изменять часы, если превышено пороговое значение в 1 секунду. Но только в том случае, если с момента запуска демона не было больше обновлений времени, чем указанный предел, т.е. синхронизация была выполнена всего 3 раза.
- директива rtcsync информирует ядро ОС о том, что системные часы синхронизированы, и ядро будет обновлять часы реального времени (RTC) каждые 11 минут.
- logdir /var/log/chrony – путь до логов, можно не указывать. Все логи будут попадать в /var/log/messages.
Теперь, когда минимально рабочий конфиг подготовлен, можно запускать демона chronyd. Так же отключается ntpd, если используется:
systemctl disable ntpd --now && systemctl enable chronyd --now
На сервере должен быть настроен firewall, чтобы пропускать UDP-трафик от клиентов.
Настройка клиента chrony
Установка chrony для клиента ничем не отличается от сервера:
yum install chrony
Только в конфигурационном файле /etc/chrony.conf будут некоторые различия:
server 10.10.4.24 iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
В поле server уже необходимо указать адрес ntp-сервера, настроенного выше.
Теперь остаётся также отключить ntpd при его наличии и запустить демон chronyd:
systemctl disable ntpd --now && systemctl enable chronyd --now
Управление временем и анализ данных
Сервер и клиент настроен, но может возникнуть логичный вопрос: как понять, что chrony работает и работает правильно?
Для ответа на вопрос выше есть утилита chronyc (аналог ntpq). Но при использовании systemd есть также команда timedate:
timedatectl status
Local time: Thu 2020-10-15 13:58:10 MSK
Universal time: Thu 2020-10-15 10:58:10 UTC
RTC time: Thu 2020-10-15 10:58:10
Time zone: Europe/Moscow (MSK, +0300)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
На выходе можно увидеть следующее время:
- локальное
- UTC
- RTC
- Timezone
И также интересный момент – после запуска chrony на клиенте, NTP synchronized должен быть в состоянии “yes”. Таким образом можно вручную управлять chrony и синхронизацией времени, включая или отключая:
timedatectl set-ntp 0
timedatectl status
Local time: Thu 2020-10-15 14:00:14 MSK
Universal time: Thu 2020-10-15 11:00:14 UTC
RTC time: Thu 2020-10-15 11:00:14
Time zone: Europe/Moscow (MSK, +0300)
NTP enabled: no
NTP synchronized: yes
RTC in local TZ: no
Для включения синхронизации достаточно выполнить обратное действие: timedatectl set-ntp 1
. В syslog можно увидеть, что появились записи о синхронизации времени.
Использование timedatectl set-ntp
является первым самым простым способом ручной (manual) синхронизации времени. Вторым же способом является использование утилиты chronyc:
chronyc -a 'burst 4/4'
chronyc -a makestep
И самое интересное – это интерпретация работы chrony и получение статистики. Для этого есть команда chronyc sources
. Команда является аналогом ntpq -pn
и её результаты наиболее вероятно будут нужны в случае выяснения каких-либо проблем со временем. Результат выполнения и интерпретация следующие:
- M – Mode of source, т.е. тип источника. Символ “^” означает сервер, символ “=” означает одноранговый узел (peer), символ комментария “#” – локальные часы;
- S – State of source, т.е. состояние. Символ “*” означает текущий сервер, выбранный для синхронизации, символ “+” – доступный сервер для синхронизации, символ “-” – исключенный сервер, символ “?” – недоступный сервер, к которому не удаётся подключиться;
- Name/IP Address – адрес или домен источника времени, может быть несколько при наличии более одного источника;
- Stratum показывает уровень сервера в иерархии ntp. Близлежащие серверы обычно имеют значение 2 или 3;
- Poll показывает скорость опроса источника времени в виде логарифма по основанию 2 интервала в секундах. Таким образом, значение 6 будет означать, что измерение выполняется каждые 64 секунды;
- Значение reach 377 указывает, что корректный ответ от указанных серверов времени был получен для всех последних восьми передач. Значение в восьмеричной системе, обновляется при каждом полученном или пропущенном пакете от сервера-источника;
- LastRx показывает, как давно из этого источника было получено время (в секундах). Значение 10y указывает на то, что данные из этого источника еще не поступали;
- Last sample показывает смещение, т.е. разницу во времени между системными часами и источником времени – это число в квадратных скобках, ns – наносекунды, us – микросекунды, ms – миллисекунды, s – секунды. Число слева от квадратных скобок – исходное измерение времени. Число после “+/-” – погрешность измерения.
Итого среди всех вышеописанных параметров интересны будут состояние сервера S, Stratum, Reach и Last sample со значением в квадратных скобках. Таким образом можно будет понять, в каком состоянии сервер, насколько он удаленный, какое состояние последних проверок и какая задержка времени. Число в квадратных скобках со знаком минус говорит об отставании локального времени относительно источника времени (с учётом погрешности).
Есть так же ключ -v, который кратко выведет всю справку по описанным выше параметрам:
Другие утилиты для статистики – это chronyc sourcestats
и chronyc tracking
, их подробное описание можно посмотреть в документации, т.к. информации от chronyc sources
обычно хватает для диагностики.
Заключение
В данной статье была рассмотрена реализация NTP-протокола под названием chrony. Это более новая и рекомендуемая крупными вендорами к использованию реализация NTP. Chrony быстрее ntpd и более устойчив к сетевым задержкам. Конфигурация похожа на ntpd.
Также добавлю, что в рунете не так много статей, которые бы подробно описывали chrony – всё-таки большинство людей, по всей видимости, консервативно относятся к изменениям и продолжают использовать старые проверенные инструменты, даже если кто-то советует переходить на что-то новое.