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.
- Установим ntpd демон: yum install -y ntp
- Очень важно чтобы на сервере работал только один 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-клиента:
- Устанавливаем ntp: yum install -y 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.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
| Name | Value |
tools.syncTime | 0 |
time.synchronize.continue | 0 |
time.synchronize.restore | 0 |
time.synchronize.resume.disk | 0 |
time.synchronize.shrink | 0 |
time.synchronize.tools.startup | 0 |
time.synchronize.tools.enable | 0 |
time.synchronize.resume.host | 0 |