Networking

NTP

Network Time Protocol — протокол синхронизации часов компьютера с эталонными серверами точного времени через сеть.

Что такое NTP

NTP («нтп») расшифровывается как Network Time Protocol — сетевой протокол времени. Он синхронизирует часы компьютера с эталонными источниками, компенсируя задержку самой сети. NTP-сервер — узел, который раздаёт точное время: публичный (pool.ntp.org), сервер провайдера или ваш собственный.

Зачем это нужно: кварцевый генератор в компьютере врёт. Дрейф в секунду за сутки — норма, и за месяц набегает полминуты. Виртуальные машины уходят ещё быстрее — их часы плывут при миграции и при высокой нагрузке на гипервизор.

Ключевое отличие от простой установки времени: NTP не переводит часы рывком, а плавно подгоняет их скорость. Прыжок времени назад ломает всё, что считает интервалы, — от СУБД до планировщиков.

Стратумы

Источники образуют иерархию, а её уровень называется стратумом:

Stratum 0   атомные часы, GPS-приёмник — сами по сети не отвечают
    ↓
Stratum 1   сервер, подключённый к такому источнику напрямую
    ↓
Stratum 2   синхронизируется от stratum 1  ← сюда попадают публичные пулы
    ↓
Stratum 3   синхронизируется от stratum 2  ← ваш внутренний NTP-сервер

Чем выше номер, тем дальше от эталона и тем больше накопленная погрешность; на практике stratum 2–3 даёт точность в единицы миллисекунд. Протокол работает поверх UDP на порту 123. Клиент опрашивает несколько серверов сразу, отбрасывает выбросы и усредняет остальное — поэтому один сбойный сервер в списке не сдвинет ваши часы.

Практика: chrony

На современных дистрибутивах стандарт — chrony. Он быстрее сходится и заметно лучше ведёт себя на виртуальных машинах, чем классический ntpd.

# /etc/chrony/chrony.conf
pool ru.pool.ntp.org iburst        # iburst — быстрая синхронизация при старте
makestep 1.0 3                     # первые 3 раза можно прыгнуть, дальше плавно
rtcsync                            # писать время в аппаратные часы
$ chronyc tracking
Reference ID    : C0248F97 (time.cloudflare.com)
Stratum         : 3
System time     : 0.000012843 seconds slow of NTP time
Frequency       : 12.345 ppm fast
Root delay      : 0.014891 seconds

$ chronyc sources
MS Name/IP address     Stratum Poll Reach LastRx Last sample
^* time.cloudflare.com       3    6   377    41   -14us[  -18us] +/-   11ms
^+ ntp1.stratum2.ru          2    6   377    38   +102us[ +102us] +/-   19ms

Как читать вывод: ^* — сервер, по которому идёт синхронизация, ^+ — годный резерв, ^? — недоступен. Reach 377 (восьмеричное, все биты) означает, что последние восемь опросов прошли успешно. System time — текущее расхождение: десятки миллисекунд норма, секунды — проблема. Общее состояние показывает timedatectl строкой System clock synchronized: yes.

Что ломается от рассинхрона

Это не абстрактная аккуратность — расхождение часов бьёт по вполне конкретным вещам:

  • TLS и сертификаты. Ушедшие часы делают валидный сертификат «ещё не действительным» или «просроченным». Загадочные ошибки TLS на свежей ВМ — первым делом проверьте время.
  • Аутентификация. JWT с полями exp и nbf, 2FA с одноразовыми кодами, Kerberos (там допуск обычно 5 минут) — всё завязано на время.
  • Логи и расследования. Собрать картину инцидента из логов десяти серверов с разным временем невозможно.
  • Распределённые системы. Реплики БД, Kafka, распределённые блокировки полагаются на метки времени.
  • Сертификаты Let's Encrypt и подписанные запросы к API просто перестают проходить.

В своей инфраструктуре

Разумная схема для парка серверов: два-три внутренних NTP-сервера синхронизируются с публичными пулами, остальные машины смотрят только на них. Так вы не зависите от доступа наружу, снижаете разброс внутри сети и получаете единое время даже при обрыве интернета.

Что учесть:

  • UDP/123 должен быть открыт исходящим — иначе синхронизации не будет, а сообщение об этом увидит только тот, кто заглянет в chronyc sources.
  • Открытый наружу NTP-сервер используют как усилитель DDoS: ответ больше запроса, а адрес источника в UDP подделывается. Слушать надо только внутреннюю сеть.
  • Мониторьте расхождение. Метрика рассинхронизации должна быть в алертах наравне с местом на диске.
  • Часовой пояс на серверах — UTC. Локальное время оставьте интерфейсам; переход на летнее время и разные пояса в логах кластера не нужны никому.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер