Chrony - это программа, реализующая протокол NTP для Linux, которая синхронизирует системные часы с внешними источниками времени. Демон chronyd работает в фоне, а утилита chronyc позволяет управлять им и смотреть статистику. В RHEL/CentOS 8+, Ubuntu 20.04+ и Debian 11+ Chrony идет по умолчанию вместо устаревшего ntpd. Если часы на сервере уходят, ломаются логи, транзакции в базах данных, TLS-сертификаты и кластеры. Проверить состояние синхронизации можно командой chronyc tracking: поле System time показывает текущее смещение. Если оно меньше 1 мс, все в порядке.
В этой статье вы найдете готовые конфигурации chrony.conf для физических серверов и виртуальных машин, настройку локального NTP-сервера для закрытой сети, разбор диагностики через chronyc sources и tracking, а также чек-лист причин большого смещения часов. Все команды проверены на актуальных версиях Chrony 4.x.
Что такое Chrony и зачем нужна точная синхронизация времени на Linux
Chrony решает задачу поддержания системного времени в соответствии с эталонными источниками. Она быстрее ntpd сходится после перезагрузки, стабильнее работает при потерях пакетов и эффективнее на виртуальных машинах. В дистрибутивах RHEL 8+, CentOS Stream, Fedora, Ubuntu 20.04+, Debian 10+ Chrony установлен по умолчанию. Классический ntpd больше не входит в базовую поставку многих систем.
Chrony vs ntpd: ключевые отличия
Chrony корректирует время чаще, использует аппаратные метки времени (если поддерживаются сетевой картой) и лучше переносит нестабильные каналы. ntpd сходится медленнее и хуже работает в облаках и на VPS. Для виртуальных машин Chrony предпочтительнее из-за более агрессивной коррекции дрейфа.
Последствия неточного времени для инфраструктуры
Разница в 1-2 секунды между серверами ломает аутентификацию по Kerberos, 2FA и TLS. Базы данных с MVCC, например PostgreSQL, могут нарушить порядок транзакций. Kubernetes и etcd требуют синхронизации в пределах 100 мс, иначе кластер теряет консистентность. Логи с неверными метками времени невозможно сопоставить при разборе инцидентов.
Установка и базовая настройка chronyd
Установка Chrony в разных дистрибутивах
В Debian и Ubuntu:
apt update && apt install chrony
В RHEL, CentOS, Fedora, Rocky Linux, AlmaLinux:
dnf install chrony
В большинстве современных систем Chrony уже предустановлен. Проверьте:
chronyd --version
Если вы только начинаете работу с Linux, изучите практическое руководство по базовому администрированию.
Минимальный chrony.conf: источники времени и driftfile
Файл конфигурации находится в /etc/chrony.conf (или /etc/chrony/chrony.conf). Базовый набор директив:
pool pool.ntp.org iburst driftfile /var/lib/chrony/drift makestep 1.0 3 rtcsync
pool указывает пул NTP-серверов. iburst ускоряет начальную синхронизацию, отправляя серию запросов. driftfile хранит оценку дрейфа часов, что ускоряет калибровку при следующем запуске. makestep 1.0 3 разрешает резкий скачок времени, если смещение превышает 1 секунду, в первые три обновления. rtcsync синхронизирует аппаратные часы (RTC) каждые 11 минут.
Запуск и проверка службы chronyd
Включите автозапуск и запустите демон:
systemctl enable --now chronyd
Проверьте статус:
systemctl status chronyd
Убедитесь, что синхронизация идет:
chronyc tracking chronyc sources
Настройка локального NTP-сервера для закрытой сети
В изолированном контуре нет доступа к внешним NTP-серверам. Один сервер можно назначить источником времени, а остальные машины настроить как клиенты.
Конфигурация chronyd в режиме сервера
На сервере времени укажите внешние источники, если они доступны, и разрешите отдавать время клиентам. Пример chrony.conf для закрытой сети:
server 0.ru.pool.ntp.org iburst allow 192.168.1.0/24 local stratum 10 driftfile /var/lib/chrony/drift
Если внешних источников нет, директива local stratum 10 заставляет chronyd работать как локальный источник даже без синхронизации. Stratum 10 означает, что часы считаются менее точными, но клиенты будут использовать их.
Безопасные ACL: ограничение доступа к NTP-серверу
По умолчанию chronyd не отвечает на запросы извне. Директива allow открывает доступ для указанных подсетей. Запретить всем остальным можно через deny:
allow 192.168.1.0/24 deny all
Ограничьте скорость ответов, чтобы защититься от NTP amplification атак:
ratelimit interval 3 burst 8
Это ограничит частоту ответов на запросы от одного клиента.
Настройка клиентов на использование локального NTP-сервера
В chrony.conf клиентов укажите IP вашего сервера и отключите внешние pool:
server 192.168.1.10 iburst driftfile /var/lib/chrony/drift makestep 1.0 3
Перезапустите chronyd и проверьте источники:
systemctl restart chronyd chronyc sources
Если вы используете облачные серверы, например, Timeweb Cloud, убедитесь, что NTP настроен корректно.
Диагностика синхронизации: chronyc tracking и sources
Как читать вывод chronyc tracking
Команда chronyc tracking показывает состояние синхронизации. Ключевые поля:
- Reference ID - IP или имя текущего источника времени.
- Stratum - уровень источника. 1 - атомные часы, 2 - сервер, синхронизированный с 1, и так далее.
- System time - текущее смещение системных часов относительно источника. Стремится к нулю.
- Last offset - смещение при последней коррекции.
- RMS offset - среднеквадратичное смещение за последнее время.
- Frequency - оценка дрейфа часов в ppm (частей на миллион).
- Skew - оценка погрешности частоты.
- Root delay - задержка до источника.
- Root dispersion - суммарная погрешность.
- Update interval - интервал между обновлениями.
- Leap status - статус високосной секунды (Normal - все в порядке).
Если System time превышает 1 секунду, синхронизация не работает или идет с большим смещением. Для комплексной диагностики производительности сервера используйте метрики CPU, памяти, диска и сети.
Анализ chronyc sources: выбор источника и Reach
Команда chronyc sources выводит список источников. Символы в первом столбце:
- ^* - текущий выбранный источник.
- ^+ - кандидат, доступен и может быть использован.
- ^- - исключен из-за большого расхождения.
- ^? - недоступен или не прошел проверки.
Столбец Reach - восьмеричное число, показывающее успешность последних 8 запросов. 377 означает все 8 успешны, 0 - ни одного. Если Reach = 0, сервер не отвечает.
Типовые ошибки при диагностике и их решение
Если chronyc tracking показывает большое смещение, проверьте chronyc sources. Reach = 0 указывает на проблему с сетью или firewall. Убедитесь, что UDP порт 123 открыт. Источник с меткой ^- исключен из-за расхождения, возможно, он сам неточен. Проверьте логи chronyd:
journalctl -u chronyd
Типовые причины большого смещения часов и способы их устранения
Проблемы с виртуальными машинами
Гипервизоры KVM, VMware, Hyper-V могут предоставлять гостевой ОС свою синхронизацию времени. Она конфликтует с chronyd. Отключите синхронизацию времени гипервизором и используйте chronyd. В KVM это делается через службу qemu-guest-agent: уберите опцию -rtc или настройте chrony. В VMware снимите галочку Synchronize guest time with host. В Hyper-V отключите интеграционную службу Time Synchronization.
Блокировка NTP-трафика и проблемы с сетью
Проверьте доступность NTP-сервера:
chronyc sources ping pool.ntp.org nc -vzu pool.ntp.org 123
Если сервер за firewall, откройте исходящий UDP 123. Для ускорения начальной синхронизации используйте iburst.
Аппаратные проблемы и дрейф часов
Севшая батарейка CMOS приводит к сбросу времени при выключении. Высокая температура или износ кварцевого резонатора увеличивают дрейф. driftfile помогает компенсировать дрейф, но при больших отклонениях нужна замена оборудования. Проверьте аппаратные часы:
hwclock --show
Поиск узкого места в системе может помочь выявить проблемы с производительностью, влияющие на синхронизацию. Смотрите пошаговый разбор bottleneck.
Параметры makestep и driftfile: тонкая настройка
Разница между step и slew
Step - мгновенное изменение времени. Может нарушить работу приложений, которые чувствительны к скачкам. Slew - плавная коррекция, безопасна для большинства сервисов. Директива makestep управляет переходом к step.
Рекомендации по makestep для серверов и виртуальных машин
Для физических серверов:
makestep 1.0 3
Для виртуальных машин:
makestep 1.0 -1
makestep 1.0 -1 разрешает step при любом смещении больше 1 секунды в любое время. Это полезно, если время сильно уходит после миграции или приостановки ВМ.
Для критичных систем, где скачок времени недопустим, используйте только slew, не указывая makestep.
Настройка driftfile для компенсации дрейфа
driftfile хранит частоту дрейфа часов в ppm. chronyd записывает туда значение и использует при следующем запуске. Это ускоряет синхронизацию и повышает точность. Убедитесь, что файл доступен для записи:
driftfile /var/lib/chrony/drift
Влияние скачка времени на базы данных, логи и TLS
Резкое изменение времени (step) может привести к серьезным сбоям. Рассмотрим отдельно.
Базы данных: нарушение транзакций и репликации
В PostgreSQL и MySQL скачок времени нарушает порядок транзакций. В асинхронной репликации могут возникнуть ошибки. PostgreSQL использует MVCC, и метки времени транзакций влияют на видимость данных. Рекомендуется использовать makestep только при старте или в крайних случаях.
Логи: неверная хронология и проблемы отладки
Логи с разных серверов невозможно сопоставить, если время рассинхронизировано. Это усложняет анализ инцидентов и поиск первопричин. Для распределенных систем используйте централизованный сбор логов с единым источником времени.
TLS: ошибки валидации сертификатов
Сертификаты имеют срок действия notBefore и notAfter. Если время на сервере сильно отличается, TLS-соединения будут отклоняться с ошибками certificate expired или not yet valid. Это ломает HTTPS, VPN, API-интеграции. Проверьте время перед настройкой TLS.
Рассинхронизация времени также ломает 2FA: ошибка Invalid code часто вызвана именно этой причиной. Подробнее в статье решение проблем с 2FA.
Часто задаваемые вопросы по Chrony и NTP
Как проверить, синхронизировано ли время на сервере
Выполните:
chronyc tracking timedatectl status
Смотрите поле System time в chronyc tracking. Если оно меньше 1 мс, синхронизация хорошая.
Что делать, если chronyd не синхронизируется
Проверьте chronyc sources, доступность UDP 123, firewall, логи chronyd. Убедитесь, что в chrony.conf указаны рабочие NTP-серверы. Попробуйте добавить iburst.
Как настроить Chrony в закрытом контуре без интернета
Используйте local stratum 10 на сервере времени. Настройте один сервер как источник (с аппаратными часами), остальные - клиенты. Пример конфигурации приведен выше.