Настройка NTP сервера

Установка chrony на Ubuntu/Debian

Клиент синхронизации времени на SystemD

В системах базирующихся на SystemD клиентом синхронизации времени, по умолчанию, выступает служба systemd-timesyncd.

Эта служба использует конфиг /etc/systemd/timesyncd.conf, именно в нём прописаны NTP сервера с которыми сервер синхронизирует своё время.

Установка и настройка chrony

Сервера времени называют NTP серверами, так как они используют NTP протокол. Для Linux таких серверов несколько, например chrony, ntp, openntpd. Рассмотрим первый, так как это самый современный NTP сервер.

В Ubuntu и Debianchrony устанавливается из стандартных репозиториев:

# apt install chrony

При установке этого пакета будет создана одноименная служба, которая будет запущена и помещена в автозапуск. А служба systemd-timesyncd будет выключена.

  • Служба этого приложения – chrony.

  • Конфигурационный файл – /etc/chrony/chrony.conf.

  • Серверный процесс – chronyd.

  • Утилита для получения информации – chronyc.

Конфигом для службы является файл /etc/chrony/chrony.conf. В нем нужно закомментировать используемый пул и добавить свои NTP сервера. А также можно указать разрешённую сеть для клиентов:

Приведу обозначение некоторых директив, используемых в файле chrony.conf:

  • server — данная директива описывает NTP-сервер, с которым необходимо синхронизироваться.

  • allow - используется для обозначения конкретной подсети, из которой клиентам NTP разрешен доступ к компьютеру в качестве NTP-сервера.

Он также контролирует доступ клиентов NTS-KE, когда на сервере включена NTS.

По умолчанию клиентам не разрешен доступ, т.е. chronyd работает исключительно как клиент NTP. Если используется директива allow , chronyd будет и клиентом своих серверов, и сервером для других клиентов.

Эту директиву можно использовать несколько раз.

Примеры использования директивы следующие:

allow 1.2.3.4 
allow 3.4.5.0/24 
allow 3.4.5 
allow 2001:db8::/32 
allow 0/0 
allow ::/0 
allow 

Первая директива разрешает доступ с адреса IPv4. Вторая директива разрешает доступ со всех компьютеров в подсети IPv4, указанной в нотации CIDR. Третья директива указывает ту же подсеть, используя более простую нотацию, в которой длина префикса определяется количеством точек. Четвертая директива определяет подсеть IPv6. Пятая и шестая директивы разрешают доступ со всех адресов IPv4 и IPv6 соответственно. Седьмая директива разрешает доступ со всех адресов (как IPv4, так и IPv6).

  • stratumweight — какую задержку следует добавить к источнику синхронизации для каждой группы. Значение по умолчанию – 0,0001.

  • driftfile —расположение и имя файла, содержащего данные смещения.

  • Makestep — эта директива заставляет сервис постепенно корректировать любое смещение во времени путем снижения скорости или замедления хода часов по мере необходимости.

  • logdir — путь к файлу журнала chrony.

  • pool name [option]... .Синтаксис этой директивы аналогичен синтаксису директивы server, за исключением того, что она используется для указания пула NTP-серверов, а не одного NTP-сервера. Предполагается, что имя пула будет разрешаться в несколько адресов, которые могут меняться с течением времени. Эта директива может использоваться несколько раз для указания нескольких пулов. Все опции, используемые в директиве server, могут быть использованы и в этой директиве. Есть одна опция, специфичная для директивы pool: maxsources sources Эта опция задает желаемое количество источников, которые будут использоваться из пула. chronyd будет неоднократно пытаться разрешить имя, пока не получит это количество источников, отвечающих на запросы. Значение по умолчанию равно 4, а максимальное значение - 16.

Примером директивы pool может служить

pool pool.ntp.org iburst maxsources 3

  • keyfile — файл, содержащий пары ID-ключей для аутентификации пакетов NTP

  • commandkey — используется для установки номера ключа, используемого для аутентификации пользовательских команд с помощью программы chronyc во время выполнения

  • generatecommandkey — если командный ключ не найден при запуске, chronyd создаст новый командный ключ из файла /dev/urandom и запишет его в файл ключа

  • noclientlog — клиентские обращения не должны регистрироваться

  • logchange — пороговое значение для настройки системных часов, которые будут генерировать сообщение системного журнала

  • logdir — путь к файлу журнала

После настройки сервера нужно перезапустить службу:

# systemctl restart chrony

Проверим источники времени (без указания опции -N):

В выводе, сервер обозначенный звездочкой (в моём случае 3.ru.pool.ntp.org) является наилучшим и текущем сервером для синхронизации времени.

Сервер времени chrony, также как и другие NTP сервера слушает порт udp 123:

Вдобавок к порту 123 вы можете заметить ещё один порт – udp 323. Он используется для того чтобы утилита chronyc подключалась к процессу chronyd. А именно с помощью этой утилиты мы смотрели источники времени.

Настраиваем правило для NTP на вашем фаерволе

Кроме этого, вы можете посмотреть количество активных и не активных источников:

Заметьте, если Chrony не сможет получить время из интернета, то клиенты перестанут синхронизировать своё время с этим сервером. Поэтому нужно следить, чтобы у сервера Chrony всегда были рабочие источники времени.

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

Изменение часового пояса в Linux

Перед изменением часового пояса вам нужно узнать длинное название часового пояса, который вы хотите использовать. В соглашении об именах часовых поясов обычно используется формат «Регион / Город».

Чтобы просмотреть все доступные часовые пояса, используйте команду timedatectl или перечислите файлы в каталоге /usr/share/zoneinfo :

timedatectl list-timezones
...
America/Montserrat
America/Nassau
America/New_York
America/Nipigon
America/Nome
America/Noronha
...

Как только вы определите, какой часовой пояс соответствует вашему местоположению, выполните следующую команду от имени пользователя root или sudo :

sudo timedatectl set-timezone <your_time_zone>

Например, чтобы изменить часовой пояс системы на America/New_York , введите:

sudo timedatectl set-timezone America/New_York

Чтобы проверить изменение, снова вызовите команду timedatectl :

timedatectl
                      Local time: Tue 2019-12-03 13:55:09 EST
                  Universal time: Tue 2019-12-03 18:55:09 UTC
                        RTC time: Tue 2019-12-03 18:02:16
                       Time zone: America/New_York (EST, -0500)
       System clock synchronized: no
systemd-timesyncd.service active: yes
                 RTC in local TZ: no

Настройка клиентских серверов

Теперь нужно, на остальных серверах, прописать наш сервер Chrony в качестве источника синхронизации времени. Для этого укажем его адрес в /etc/systemd/timesyncd.conf на остальных серверах. А затем перезапустим службу синхронизации времени, и проверим работу:

Для большей информации вы можете использовать следующие команды:

Также, на сервере времени вы можете посмотреть клиентов, которые к нему подключились:

В выводе:

  • Hostname – имя или адрес клиента;

  • NTP – количество NTP-пакетов, полученных от клиентов;

  • Drop – сколько NTP-пакетов было отброшено из-за ограничения скорости отклика;

  • Int – средний интервал между NTP-пакетами;

  • Last – время с момента получения последнего NTP-пакета;

  • Остальные поля я не рассматриваю, так как обычно этих достаточно.

Установка Chrony на CentOS 8

Запустить обновление системы

Чтобы синхронизировать системные пакеты с их последними версиями, просто выполните команду;

dnf update

Установка Chrony на CentOS 8

Пакет Chrony по умолчанию устанавливается на производных от RHEL, включая CentOS 8. Однако вы можете проверить это, выполнив команду ниже;

rpm -q chrony

Если пакет установлен, вы должны получить такой вывод:

chrony-3.5-1.el8.x86_64

В противном случае вы получите такой результат:

package chrony is not installed

Чтобы увидеть больше информации о Chrony;

rpm -qi chrony
Name        : chrony
Version     : 3.5
Release     : 1.el8
Architecture: x86_64
Install Date: Sun 01 Mar 2020 08:07:16 PM EAT
Group       : System Environment/Daemons
Size        : 692391
License     : GPLv2
Signature   : RSA/SHA256, Thu 05 Dec 2019 01:51:32 AM EAT, Key ID 05b555b38483c65d
Source RPM  : chrony-3.5-1.el8.src.rpm
Build Date  : Tue 19 Nov 2019 06:32:41 PM EAT
Build Host  : x86-01.mbox.centos.org
Relocations : (not relocatable)
Packager    : CentOS Buildsys <>
Vendor      : CentOS
URL         : https://chrony.tuxfamily.org
Summary     : An NTP client/server
Description :
chrony is a versatile implementation of the Network Time Protocol (NTP).
It can synchronise the system clock with NTP servers, reference clocks
(e.g. GPS receiver), and manual input using wristwatch and keyboard. It
can also operate as an NTPv4 (RFC 5905) server and peer to provide a time
service to other computers in the network.

Если по каким-то причинам он не установлен по умолчанию, вы всегда можете установить его, выполнив команду ниже;

dnf install chrony

Настройте Chrony как NTP-сервер в CentOS 8

Предполагая, что Chrony установлен, вы можете приступить к его настройке для обеспечения синхронизации времени.

Файл конфигурации Chrony по умолчанию — /etc/chrony.conf. Поэтому мы внесем большинство изменений конфигурации в этот файл.

Установить серверы времени

По умолчанию Chrony использует в 2.centos.pool.ntp.orgкачестве сервера времени по умолчанию. Вам необходимо определить серверы времени, близкие к вашему региону.

Чтобы получить список серверов NTP, близких к вашему региону, перейдите на страницу « Интернет-кластер серверов NTP» и выберите свой регион. Например, если вы находитесь в Европе, ниже перечислены доступные серверы NTP;

server 0.europe.pool.ntp.org
server 1.europe.pool.ntp.org
server 2.europe.pool.ntp.org
server 3.europe.pool.ntp.org

Чтобы использовать пул серверов NTP в вашем регионе, просто закомментируйте ( добавьте # в начале ) строку, pool 2.centos.pool.ntp.org iburstзаменив ее следующим образом;

vim /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# pool 2.centos.pool.ntp.org iburst
server 0.europe.pool.ntp.org
server 1.europe.pool.ntp.org
server 2.europe.pool.ntp.org
server 3.europe.pool.ntp.org

Настройка контроля доступа к серверу NTP

Chrony не разрешает доступ к серверу NTP. Чтобы ограничить или контролировать доступ к NTP службе, работающей в системе, используйте директиву allow. Эта директива просто предназначена для обозначения определенных серверов, с которых клиентам NTP разрешен доступ к компьютеру, в качестве сервера NTP.

Например, чтобы разрешить всем серверам в сетевой подсети 192.168.56.0/24 доступ к вашему серверу NTP;

# Allow NTP client access from local network.
#allow 192.168.0.0/16
allow 192.168.56.0/24

Подробнее на man chrony.conf,.

Откройте порт 123 UDP NTP на брандмауэре

Чтобы разрешить клиентам NTP доступ к вашему серверу NTP, вам необходимо открыть порт 123 / UDP на брандмауэре.

firewall-cmd --add-port=123/udp --permanent
firewall-cmd --reload

Открыть доступ NTP клиенту и серверу в IPTables необходимо добавить правила:

sudo iptables -A OUTPUT -p udp -m udp -m multiport --dports 123 -m state --state NEW -j ACCEPT
sudo iptables -A INPUT -m state --state NEW -p udp --dport 123 -j ACCEPT

Чтобы открыть доступ только конкретной сети, например 10.0.0.0/24:

sudo iptables -A OUTPUT -p udp -m udp -m multiport --dports 123 -m state --state NEW -j ACCEPT
sudo iptables -A INPUT -s 10.0.0.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

Удалить правило укажем ту же команду, заменив -A на -D, например:

sudo iptables -D OUTPUT -p udp -m udp -m multiport --dports 123 -m state --state NEW -j ACCEPT
sudo iptables -D INPUT -m state --state NEW -p udp --dport 123 -j ACCEPT

Посмотреть список правил можно командой:

sudo iptables -nvL
sudo iptables -nvL | grep 10.0.0

Запуск Chrony на CentOS 8

Chronydдемон управляет реализацией NTP. Таким образом, вы можете запустить и разрешить его запуск при загрузке системы, выполнив команду ниже;

systemctl enable --now chronyd
systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-03-01 20:59:01 CET; 10s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: 6685 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: 6681 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 6683 (chronyd)
    Tasks: 1 (limit: 5047)
   Memory: 828.0K
   CGroup: /system.slice/chronyd.service
           └─6683 /usr/sbin/chronyd
...

Проверьте синхронизацию времени chronyc

Команды chronyc используются для проверки синхронизации времени Chrony с помощью параметров командной строки, таких как sources, tracking, sourcestats.

Чтобы отобразить информацию об источниках текущего времени, к которым обращается chronyd, выполните команду;

chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^+ 85.129.0.126                  2   6    77    30  -1023us[-1499us] +/-  124ms
^+ valoo.patate.ninja            2   6    77    29  +3687us[+3687us] +/-  123ms
^* leeto.nicolbolas.org          2   6    77    30    -79us[ -555us] +/-   75ms
^+ backup.kabelnetveendam.nl     2   6    77    30  -3653us[-4129us] +/-  146ms

М колонка указывает режим источника;

  • ^ означает сервер

  • = означает одноранговый

  • # указывает на локально подключенные опорные часы

S колонка показывает состояние источников;

  • “*” Указывает на источник, с которым в настоящее время синхронизируется chrony.

  • “+” Указывает на приемлемые источники, которые объединены с выбранным источником.

  • “-” Допустимые источники, которые исключаются алгоритмом объединения.

  • “?” Источники, подключение к которым было потеряно или чьи пакеты не проходят все тесты. Это состояние также отображается при запуске, пока не будет собрано по крайней мере 3 образца.

  • “x” Обозначает часы, которые хронид считает фальшивыми (их время несовместимо с большинством других источников).

  • “~” Указывает на источник, время которого кажется слишком изменчивым.

Для отображения детальной информации о синхронизации времени введите:

chronyc tracking
Reference ID    : C39AAED1 (leeto.nicolbolas.org)
Stratum         : 3
Ref time (UTC)  : Sun Mar 01 18:14:38 2020
System time     : 0.001563942 seconds fast of NTP time
Last offset     : +0.001314329 seconds
RMS offset      : 0.002229846 seconds
Frequency       : 2.614 ppm fast
Residual freq   : +0.147 ppm
Skew            : 24.449 ppm
Root delay      : 0.150412217 seconds
Root dispersion : 0.008927128 seconds
Update interval : 128.5 seconds
Leap status     : Normal
  • Reference ID — идентификатор и имя, с которым компьютер в настоящее время синхронизирован.

  • Stratum — количество переходов к компьютеру с установленными основными часами.

  • Ref time — это время по Гринвичу, в которое было выполнено последнее измерение из эталонного источника.

  • System time — задержка системных часов от синхронизированного сервера.

  • Last offset — расчетное смещение последнего обновления часов.

  • RMS offset — долгосрочное среднее арифметическое значения смещения.

  • Frequency — это частота, на которой часы системы будут работать неправильно, если хронограф не проведет коррекцию. Она выражена в ppm – ч/м (частей на миллион).

  • Residual freq — остаточная частота указывает на разницу между измерениями от опорного источника и используемой в настоящее время частотой.

  • Skew — расчетная погрешность, связанная с погрешностью частоты.

  • Root delay — суммарная задержка сетевого пути к опорному серверу, с которым синхронизируется компьютер.

  • Leap status — это статус, который может иметь одно из следующих значений – нормальное, добавить второй, удалить второй или не синхронизироваться.

Для ручного обновления времени можно запустить команду:

chronyc makestep

Если ответ 200 OK, тогда chrony произвел соединение с эталонным сервером и синхронизировал время.

Дополнительные параметры команды см. в man chronyc.

Настройка клиента NTP с помощью Chrony на CentOS 8

Поскольку наш NTP-сервер, использующий Chrony в CentOS 8, настроен и работает, пришло время проверить, может ли он обслуживать наших клиентов NTP, как ожидалось.

В этой демонстрации мы используем другую виртуальную машину CentOS 8 в качестве нашего NTP-клиента.

Проверьте, установлен ли Chrony;

rpm -q chrony
chrony-3.5-1.el8.x86_64

Настройка клиента NTP в CentOS 8 аналогична настройке сервера NTP, как описано выше, за исключением того, что у клиента не установлены разрешения на доступ, поэтому ни один сервер не может запрашивать у него информацию о времени.

Откройте файл конфигурации и настройте сервер NTP, как показано ниже;

vim /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#pool 2.centos.pool.ntp.org iburst
server ntp.kifarunix-demo.com iburst

Убедитесь, что имя хоста сервера NTP разрешимо, в противном случае используйте IP-адрес.

Проверьте подключение к NTP-серверу UDP-порт 123

Чтобы убедиться, что клиент NTP подключен к серверу NTP через порт 123 UDP, просто используйте команду netcat, как показано ниже;

dnf install nc -y

Для проверки подключения к UDP-порту 123;

nc -uzv ntp.kifarunix-demo.com 123
Ncat: Connected to 192.168.56.133:123.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.14 seconds.

Отлично. Теперь вы можете перейти к перезагрузке и разрешить запуск chronyd при загрузке системы.

systemctl restart chronyd
systemctl enable chronyd

Проверить синхронизацию времени NTP

Чтобы убедиться, что синхронизация времени работает, можно использовать команду отслеживания источников с командой chronyc, как показано ниже;

chronyc tracking
Reference ID    : C0A83885 (ntp.kifarunix-demo.com)
Stratum         : 4
Ref time (UTC)  : Sun Mar 01 18:56:03 2020
System time     : 0.000000034 seconds slow of NTP time
Last offset     : +0.000032892 seconds
RMS offset      : 0.000032892 seconds
Frequency       : 2.246 ppm fast
Residual freq   : +14.373 ppm
Skew            : 0.564 ppm
Root delay      : 0.151499271 seconds
Root dispersion : 0.001610240 seconds
Update interval : 2.0 seconds
Leap status     : Normal
  • Reference ID — идентификатор и имя, с которым компьютер в настоящее время синхронизирован.

  • Stratum — количество переходов к компьютеру с установленными основными часами.

  • Ref time — это время по Гринвичу, в которое было выполнено последнее измерение из эталонного источника.

  • System time — задержка системных часов от синхронизированного сервера.

  • Last offset — расчетное смещение последнего обновления часов.

  • RMS offset — долгосрочное среднее арифметическое значения смещения.

  • Frequency — это частота, на которой часы системы будут работать неправильно, если хронограф не проведет коррекцию. Она выражена в ppm – ч/м (частей на миллион).

  • Residual freq — остаточная частота указывает на разницу между измерениями от опорного источника и используемой в настоящее время частотой.

  • Skew — расчетная погрешность, связанная с погрешностью частоты.

  • Root delay — суммарная задержка сетевого пути к опорному серверу, с которым синхронизируется компьютер.

  • Leap status — это статус, который может иметь одно из следующих значений – нормальное, добавить второй, удалить второй или не синхронизироваться.

Используя команду sources;

chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* ntp.kifarunix-demo.com        3   6    37     7   -671ns[  -12us] +/-   77ms

Проверить статистику источников

chronyc sourcestats
210 Number of sources = 1
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
ntp.kifarunix-demo.com      5   3    70     +0.408      4.663    +24us    27us

Клиент NTP теперь подключен к нашему серверу NTP.

Итог

Теперь вы знакомы с сервером времени Chrony. Он позволяет запустить свой локальный NTP сервер и синхронизировать время с другими NTP серверами. Chrony может работать и в качестве клиента и в качестве сервера.

Подробнее почитать про утилиту chrony и её директивы можно по в man:

man chrony

Или на оф. сайте проекта:

Last updated