NTP-севера и клиенты

NTP-сервер — это сервер точного времени. К нему подключаются NTP-клиенты, чтобы синхронизировать своё время.

Перед тем, как изучать NTP, давайте немного рассмотрим теорию, как вообще работает время в Linux:

В ОС Linux есть два типа часов:

  • Системные часы — время операционной системы. Предоставляется ядром linux и реализуется простым подсчётом количества секунд от 0 часов 01.01.1970. NTP работает с системными часами! Посмотреть время системных часов можно командой: date
  • Аппаратные часы — часть материнской платы. Время, которое отображается в BIOS. Посмотреть время аппаратных часов: hwclock

При включении сервера, обычно ядро linux запрашивает время у аппаратных часов и отправляет его в системные часы.

Внутри самой ОС аппаратное время можно назначить системному и наоборот:

  • Назначить системное время аппаратному: hwclock —systohc
  • Назначить аппаратное время системному: hwclock —hctosys

Протокол NTP имеет иерархическую структуру, которая состоит из уровней:

  • Эталонные часы от которых начинается цепочка, обычно имеют уровень 0. К часам нельзя подключиться по ip, поэтому уровня 0 в NTP не существует.
  • К данным часам подключается сервер, у которого есть внешний адрес, и, иногда доменное имя. У сервера будет уровень 1.
  • Сервер который мы настраиваем у себя в локальной сети будет являться клиентом сервера с уровнем 1 и иметь уровень 2.
  • И т.д.

Если сервер уровня 1 перестаёт работать, то время нам будет отдавать сервер уровня 2. Максимальное количество уровней — 256.

Настройка NTP-сервера на CentOS 7

Предварительные условия: установлены обновления, отключен SElinux, работает firewalld.

  1. Установим ntpd демон: yum install -y ntp
  2. Очень важно чтобы на сервере работал только один NTP-демон. Остановим и уберём из автозагрузки демон chronyd:
systemctl stop chrony
systemctl disable chrony

3. Разрешим трафик NTP в firewalld:

firewall-cmd --zone=public --add-service=ntp --permanent
firewall-cmd --zone=public --add-port=123/udp --permanent
firewall-cmd --reload

#Проверим что порт 123 открыт
netstat -tulpn | grep 123
udp        0      0 192.168.200.200:123      0.0.0.0:*                           14943/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           14943/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           14943/ntpd
udp6       0      0 ::1:123                 :::*                                14943/ntpd
udp6       0      0 :::123                  :::*                                14943/ntpd

4. Устанавливаем часовой пояс (Москва, +3):timedatectl set-timezone Europe/Moscow

5. Вносим изменения в файл /etc/ntp.conf

vi /etc/ntp.conf

#Указываем файл, в котором будет храниться частота смещения времени
driftfile /var/lib/ntp/drift

#Устанавливаем запрет на подключение к серверу из вне
restrict default nomodify notrap nopeer noquery

#Разрешаем доступ с localhost
restrict 127.0.0.1
restrict ::1

#Разрешаем запрашивать время клиентов из сети 192.168.200.0/24
restrict 10.29.7.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server ntp1.stratum2.ru iburst
server ntp2.stratum2.ru iburst
server ntp3.stratum2.ru iburst
server ntp4.stratum2.ru iburst
#Параметры серверов: 
# iburst - отправка сразу нескольких пакетов к серверу
# true - отмечаем сервер как правильный

#Защита NTP-сервера от уязвимости CVE-2013-5211
disable monitor

#Указываем файл в который будут отправляться логи.
logfile /var/log/ntp.log

#Остальные параметры можно оставить как есть или удалить. 

6. Запускаем службу ntpd и добавляем её в автозагрузку:

systemctl start ntpd
systemctl enable ntpd

7. Проверяем, как сервер синхронизировался с внешним сервером:

ntpq -p 
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*unknown230-n1.h 88.147.254.229   2 u  242 1024  377   21.715   -0.402   0.202
+n1.sigma.d6.hsd 88.147.254.229   2 u 1020 1024  377   21.398    0.173   0.473
+ns1.hsdn.org    88.147.254.227   2 u  892 1024  377   21.658   -0.463   0.571

Столбцы означают следующую информацию:

  • remote — имя хоста или адрес NTP-сервера
  • refid — адрес вышестоящего сервера
  • st — уровень (stratum) сервера
  • t — тип клиента (u-unicast, m-multicast)
  • when — прошло секунд от последней синхронизации
  • poll — период синхронизации в секундах
  • reach — состояние доступности сервера; после восьми успешных попыток синхронизации значение этого параметра становится равным 377
  • delay — задержка ответа сервера
  • ofset — разница во времени между серверами (- часы отстают, + часы спешат)
  • jitter — джиттер

Слева от перечисленных серверов располагаются символы, означающие состояние NTP-сервера:

  • * пригоден для обновления
  • + рекомендован для обновления
  • не рекомендуется синхронизироваться
  • x сервер недоступен

Настройка NTP-клиента:

  1. Устанавливаем ntp: yum install -y ntp
  2. Остановим и уберём из автозагрузки демон chronyd:
systemctl stop chrony
systemctl disable chrony

3. Разрешим трафик NTP в firewalld:

firewall-cmd --zone=public --add-service=ntp --permanent
firewall-cmd --zone=public --add-port=123/udp --permanent
firewall-cmd --reload

#Проверим что порт 123 открыт
netstat -tulpn | grep 123
udp        0      0 192.168.200.1:123       0.0.0.0:*                           14943/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           14943/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           14943/ntpd
udp6       0      0 ::1:123                 :::*                                14943/ntpd
udp6       0      0 :::123                  :::*                                14943/ntpd

4. Устанавливаем часовой пояс (Москва, +3):timedatectl set-timezone Europe/Moscow

5. Вносим изменения в файл /etc/ntp.conf

vi /etc/ntp.conf

#Указываем файл, в котором будет храниться частота смещения времени
driftfile /var/lib/ntp/drift

#Устанавливаем запрет на подключение к серверу из вне
restrict default nomodify notrap nopeer noquery

#Разрешаем доступ с localhost
restrict 127.0.0.1
restrict ::1

#Разрешаем запрашивать время клиентов из сети 192.168.200.0/24
restrict 10.29.7.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 192.168.200.200 iburst true
server 192.168.200.201 iburst

#Параметры серверов: 
# iburst - отправка сразу нескольких пакетов к серверу
# true - отмечаем сервер как правильный
# true используют когда указано 2 сервера, чтобы не было конфликта при синхронизации

#Защита NTP-сервера от уязвимости CVE-2013-5211
disable monitor

#Указываем файл в который будут отправляться логи.
logfile /var/log/ntp.log

6. Запускаем службу ntpd и добавляем её в автозагрузку:

systemctl start ntpd
systemctl enable ntpd

7. Проверяем, как сервер синхронизировался с внешним сервером:

ntpq -p 
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+192.168.200.200 88.147.254.235   3 u  248  512  377    0.495   -0.156   0.050
*192.168.200.201 88.147.254.237   3 u  247  512  377    0.297    0.119   0.067

На этом настройка NTP-сервера и клиента завершена.

Если вы планируете разворачивать NTP-сервера на виртуальной машине (например я использую vmWare ESXi), то стоит учитывать что гипервизор иногда синхронизирует время на гостевой машине со своими часами. Если при синхронизации будет большой разрыв, то демон перестанет работать, и в логах можно будет увидеть следующие ошибки:

  • При запросе состояния (service ntpd status):
    • ntp systemd[1]: ntpd.service: main process exited, code=exited, status=255/n/a
    • ntp systemd[1]: Unit ntpd.service entered failed state.
    • ntp systemd[1]: ntpd.service failed.
  • При просмотре логов (less /var/log/ntp.log):
    • 0.0.0.0 0617 07 panic_stop -2106 s; set clock manually within 1000 s

Одним из вариантов решения данной проблемы будет полное отключение синхронизации времени. Более подробно это рассказывается тут.

Если кратко, то помимо отключения снятия галочки time synchronization в настройках ВМ, необходимо выключить машину и дописать следующие параметры: VM Options — Advanced options — Configuration Parameters — Edit Configuration

NameValue
tools.syncTime0
time.synchronize.continue0
time.synchronize.restore0
time.synchronize.resume.disk0
time.synchronize.shrink0
time.synchronize.tools.startup0
time.synchronize.tools.enable0
time.synchronize.resume.host0

Оставьте комментарий