Установка и настройка сервера времени в Centos 7

Введение

Наверняка всем известно, что правильно настроенное время – это важная и неотъемлемая часть, которую необходимо выполнять при первоначальной настройке сервера. В противном случае можно столкнуться с проблемами. Например, когда в логах разное время, или же когда не может пройти аутентификация в приложении из-за разницы времени на сервере и клиенте всего в одну секунду. На самом деле список проблем может быть куда больше.

Чтобы избежать всякого рода проблем, необходимо разобраться, как правильно настраивается время на сервере с 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

Information

На сервере должен быть настроен 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
[root@dub-app-veb-docker-2 dorofeev]#
[root@dub-app-veb-docker-2 dorofeev]# 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 – всё-таки большинство людей, по всей видимости, консервативно относятся к изменениям и продолжают использовать старые проверенные инструменты, даже если кто-то советует переходить на что-то новое.

Добавить комментарий

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