NTP Server на Linux (ntpd)

14 января, 2011 Рубрики: HOWTO, Linux, NTP, Настройка сервера Linux

Доброго дня, гости и постоянные читатели  блога. Постепенно перехожу от основ к более углубленному изучению Linux. Сегодня хочу рассмотреть работу протокола ntp, а так же настройку сервера времени на Linux (ntp server). Итак, начнем с теории.

Протокол NTP

схема работы NTP stratumNetwork Time Protocol (NTP) — сетевой протокол для синхронизации внутренних часов компьютера с использованием сетей с переменной латентностью (читай “шириной”/качеством канала).

NTP использует для своей работы протокол UDP и порт 123.

Текущая версия протокола — NTP 4. NTP использует иерархическую систему «часовых уровней» (их так же называют Stratum). Уровень 0 (или Stratum 0) – это, обычно, устройства представляющие собой атомные часы (молекулярные, квантовые), GPS часы или радиочасы. Данные устройства обычно не публикуются во всемирную сеть, а подключаются напрямую к серверам времени уровня 1 посредством протокола RS-232 (на иллюстрации обозначены желтыми стрелками). Уровень 1 синхронизирован с высокоточными часами уровня 0, обычно работают в качестве источников для серверов уровня 2. Уровень 2 синхронизируется с одной из машин уровня 1, а так же возможна синхронизация с серверами своего уровня. Уровень 3 работает аналогично второму. Обычно в сеть публикуются сервера уровней от второго и ниже. Протокол NTP поддерживает до 256 уровней. Так же хочется отметить, что сервера уровней 1 и2, а иногда и 3 не всегда открыты для всеобщего доступа. Иногда, чтобы синхронизироваться с ними, необходимо послать запрос по почте – администраторам домена.

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

Назначение сервера NTP в локальной сети

Для чего нам может понадобиться NTP server? Например, существуют службы в операционных системах, которые могут зависеть от синхронизированного времени. Наиболее ярким примером таких служб является протокол аутентификации Kerberos. Для его работы необходимо, чтобы на компьютерах, доступ к которым осуществляется с использованием этого протокола, системное время различалось не более чем на 5 минут. Кроме того, точное время на всех компьютерах значительно облегчает анализ журналов безопасности при расследовании инцидентов в локальной сети.

Режимы работы NTP сервера/клиента

Клиент/сервер

Этот режим на сегодняшний день наиболее часто используется в сети Интернет. Схема работы – классическая. Клиент посылает запрос, на который в течение некоторого времени сервер присылает ответ. Настройка клиента производится с помощью директивы server в конфигурационном файле, где указывается DNS имя сервера времени.

Симметричный активный/пассивный режим

Этот режим используется в том случае, если производится синхронизация времени между большим количеством равноправных машин. Помимо того, что каждая машина синхронизируется с внешним источником, она также осуществляет синхронизацию со своими соседями (peer), выступая для них в качестве клиента и сервера времени. Поэтому даже если машина «потеряет» внешний источник, она все еще сможет получить точное время от своих соседей. Соседи могут работать в двух режимах – активном и пассивном. Работая в активном режиме, машина сама передает свое время всем машинам-соседям, перечисленным в секции peers конфигурационного файла ntp.conf. Если же в этой секции соседи не указаны, то считается, что машина работает в пассивном режиме. Для того чтобы злоумышленник не смог скомпрометировать другие машины, представившись в качестве активного источника, необходимо использовать аутентификацию.

Режим Broadcast

Этот режим рекомендуется использовать в тех случаях, когда малое количество серверов обслуживает большое количество клиентов. Работая в этом режиме, сервер периодически рассылает пакеты, используя широковещательный адрес подсети. Клиент, настроенный на синхронизацию таким способом, получает широковещательный пакет сервера и производит синхронизацию с сервером. Особенностью этого режима является то, что время доставляется в рамках одной подсети (ограничение broadcast-пакетов). Кроме того, для защиты от злоумышленников необходимо использовать аутентификацию.

Режим Multicast

Данный режим во многом похож на broadcast. Отличие заключается в том, что для доставки пакетов используются multicast-адреса сетей класса D адресного пространства IP-адресов. Для клиентов и серверов задается адрес multicast-группы, которую они используют для синхронизации времени. Это делает возможным синхронизацию групп машин, расположенных в различных подсетях, при условии, что соединяющие их маршрутизаторы поддерживают протокол IGMP и настроены на передачу группового трафика.

Режим Manycast

Этот режим является нововведением четвертой версии протокола NTP. Он подразумевает поиск клиентом среди своих сетевых соседей manycast-серверов, получение от каждого из них образцов времени (с использованием криптографии) и выбор на основании этих данных трех «лучших» manycast-серверов, с которыми клиент будет производить синхронизацию. В случае выхода из строя одного из серверов клиент автоматически обновляет свой список.

Для передачи образцов времени клиенты и серверы, работающие в manycast-режиме, используют адреса multicast-групп (сети класса D). Клиенты и серверы, использующие один и тот же адрес, формируют одну ассоциацию. Количество ассоциаций определяется количеством используемых multicast-адресов.

Время в Linux

Кратко расскажу, какое время существует в Linux и как его задать. В Linux, как и в другой ОС, существует 2 времени. Первые – аппаратные, иногда называемые Real Time Clock, сокращенно (RTC) (они же – часы BIOS) обычно они связаны с колеблющимся кварцевым кристаллом, имеющим точность хода до нескольких секунд в день. Точность зависит от различных колебаний, например, окружающей температуры. Вторые часы — внутренние программные часы, которые идут непрерывно, в том числе и при перерывах в работе системы. Они подвержены отклонениям, связанным с большой системной нагрузкой и задержкой прерываний. Однако система обычно считывает показания аппаратных часов при загрузке и потом использует системные часы.

Дата и время операционной системы устанавливается при загрузке на основании значения аппаратных часов, а так же настроек часового пояса. Настройки часового пояса берутся из файла /etc/localtime. Данный файл – есть ссылка (но чаще – копия) одного из файлов в структуре каталога /usr/share/zoneinfo/.

Аппаратные часы Linux могут хранить время в формате UTC (аналог GMT), либо текущее территориальное время. Общая рекомендация в том, какое время устанавливать (?) следующая: если на компьютере установлено несколько ОС и одна из них – Windows, то необходимо использовать текущее время (т.к. Windows берет время из BIOS/CMOS и считает его локальным). Если используются только  операционные системы UNIX семейства, то желательно хранить время в BIOS в UTC формате.

После загрузки операционной системы, часы операционной системы и BIOS полностью независимы. Ядро системы раз в 11 секунд синхронизирует системные часы с аппаратными.

Через некоторое время между аппаратными и программными часами может быть разница в несколько секунд. Какие же часы содержат правильное время? Ни те, ни другие, пока мы не настроим синхронизацию времени.

Примечание:

Ядро Linux’а всегда хранит и вычисляет время, как число секунд прошедших с полночи 1-го января 1970 года, в независимости от того, установлены ваши часы на локальное или всемирное время. Преобразование в локальное время производится в процессе запроса.

Поскольку количество секунд с 1-го января 1970 года всемирного времени сохраняется как знаковое 32-битное целое (это справедливо для Linux/Intel систем), ваши часы перестанут работать где-то в 2038 году. Linux не имеет проблемы 2000-го года, но имеет проблему 2038 года. К счастью, к тому времени все linux’ы будут запущены на 64-х разрядных системах. 64-х битное целое будет содержать наши часы приблизительно до 292271-миллионного года.

NTP Server Linux

Введение

Существует масса реализаций для синхронизации времени для ОС Linux. Наиболее известными являются Xntpd (NTP версия 3), ntpd (NTP версия 4), Crony и ClockSpeed. В нашем примере мы будем использовать ntp-сервер ntpd.

Демон ntpd является одновременно и сервером времени и клиентом, в зависимости от настроек конфигурационного файла /etc/ntpd.conf (иногда /etc/ntp.conf), демон может и “принимать” время с уделенных серверов и “раздавать” другим хостам время.

Общая схема синхронизации времени в локальной сети следующая: необходимо иметь 1 или 2 сервера, имеющие доступ в глобальную сеть, которые будут получать время из интернет. Все компьютеры локальной сети синхронизировать с указанными серверами, получающими время из интернет.

Установка ntpd

Собственно, установка демона сводится к установке следующих пакетов: ntp (пакет включающий самого демона), ntpdate (утилита для ручной синхронизации времени – устарела), ntp-doc (документация по пакету), в некоторых дистрибутивах нужно будет установить так же ntp-utils (утилиты для диагностики), в некоторых они включены в пакет ntp. Как производить установку программ в Linux , я описывал в управление ПО Linux. После установки пакета, в большинстве дистрибутивов, демон будет уже сконфигурирован как как ntp-клиент (например в Debian было так). Соответственно, автоматически были созданы основные конфигурационные файлы: /etc/ntp.conf и /var/lib/ntp/ntp.drift и автоматом запущен демон.

Перед настройкой демона на синхронизацию с внешним миром я бы посоветовал установить текущую системную дату на значение, максимально приближенное к реальному времени. Установка даты в Linux производится командой: date MMDDhhmmCCYY.ss, где MM — месяц, DD — день месяца, hh — часы, mm — минуты, CCYY — 4 цифры года, ss — секунды. При этом, значения CCYY.ss указывать не обязательно.

ntp-server:~# date 121720062010.30 Птн Дек 17 20:06:30 MSK 2010

Как видно, указанная команда установит текущие дату и время на 27 декабря 2010года, 20:06:30. Команда date без параметров, выводить текущее системное время. У данной команды есть куча параметров, с которыми можно ознакомиться в man date.

Так же, необходимо правильно настроить аппаратные часы и часовой пояс. Как говорилось выше, часовой пояс настраивается копированием необходимого файла зоны из каталога /usr/share/zoneinfo/ в файл /etc/localtime:

ntp-server:~# cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Аппаратные часы я настроил на UTC:

[ntp1@proxy ~]# cat /etc/sysconfig/clock | grep UTC
# UTC=true indicates that the clock is set to UTC;
UTC=true
ntp2-server:~# cat /etc/default/rcS | grep UTC
UTC=yes

В первом примере указан конфигурационный файл, определяющий использование UTC для RH, второй – для Deb-дистрибутивов.

Кроме установки настроек на использование времени в формате UTC, необходимо задать аппаратное время. (в большинстве случаев в этом нет необходимости, потому что заданное системное время неизбежно синхронизируется с аппаратным, силами ядра). Но все же, если у вас есть желание это сделать… Команда hwclock читает и устанавливает аппаратные часы на основании переданных ему параметров. Доступные параметры описаны в странице руководства команды. Вот несколько примеров использования hwclock:

ntp-server# hwclock                        # считывает время из аппаратных часов
ntp-server# hwclock --systohc --utc        # устанавливает время аппаратных часов равным
                                           # UTC на основании системного времени
ntp-server# hwclock --systohc              # устанавливает время аппаратных часов
                                           # равным местному на основании системного  времени
ntp-server# hwclock --set --date "22 Mar 2002 13:17"  # устанавливает время аппаратных часов
                                           # равным указанной строке

Другим вариантом изменения времени в аппаратных часах – это доступ в BIOS при загрузке системы. Поскольку время ОС независимо от аппаратных часов, любые изменения в BIOS будут учтены при следующей загрузке.

Теперь, когда у нас все подготовлено и установлено, приступим к настройке.

Управление демоном ntpd

Управление демоном ntpd ничем не отличается от управления любыми другими демонами. Запуск или перезапуск службы ntpd:

#/etc/init.d/ntp start
#/etc/init.d/ntp restart

Остановка:

#/etc/init.d/ntp stop

Или:

#/bin/kill `cat /var/run/ntpd.pid`

Демон имеет следующие параметры запуска:

-p  – PID-файл,
-g – разрешить переход на большой скачек времени
-c – конфиг файл
-q – принудительная ручная синхронизация

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

Первым делом, посоветую изменить параметры запуска демона в следующем конфигурационном файле :

Debian:

ntp-server:~# cat /etc/default/ntp
NTPD_OPTS='-g'

RedHat:

[ntp2@proxy ~]# cat /etc/sysconfig/ntpd
# Parameters for NTP daemon.
# See ntpd(8) for more details.
....
# Specifies additional parameters for ntpd.
NTPD_ARGS="-g"

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

Итак, как я уже говорил, информация о конфигурации демона ntpd лежит в файле /etc/ntp.conf. Синтаксис файла стандартен, как и во многих других конфигах: пустые строки и строки, начинающиеся с символа “#” игнорируются. Вот простой пример:

ntp-server:~# cat /etc/ntp.conf
 server ntplocal.example.com prefer
 server timeserver.example.org
 server ntp2a.example.net

 driftfile /var/db/ntp.drift

Параметр server задает, какие серверы будут использоваться для синхронизации, по одному в каждой строке. Если сервер задан с аргументом prefer, как ntplocal.example.com, то этому серверу отдается предпочтение перед остальными. Ответ от предпочтительного сервера будет отброшен, если он значительно отличается от ответов других серверов, в противном случае он будет использоваться безотносительно к другим ответам. Аргумент prefer обычно используется для серверов NTP, о которых известно, что они очень точны, такими, на которых используется специальное оборудование точного времени.

Параметр driftfile задает файл, который используется для хранения смещения частоты системных часов. На сколько я понял, данный файл постоянно хранит какое-то значение, которое формируется на основании анализа прошедших корректировок времени и если внешние источники времени становятся недоступны, то корректировка времени происходит по значению из файла drift. Он не должен изменяться никакими другими процессами. И перед указанием данного файла в конфигурации – файл должен быть создан.

По умолчанию сервер NTP будет доступен всем хостам в Интернет. Параметр restrict в файле /etc/ntp.conf позволяет вам контролировать, какие машины могут обращаться к вашему серверу. Если вы хотите запретить всем машинам обращаться к вашему серверу NTP, добавьте следующую строку в файл /etc/ntp.conf:

restrict default ignore

Если вы хотите разрешить синхронизировать свои часы с вашим сервером только машинам в вашей сети, но запретить им настраивать сервер или быть равноправными участниками синхронизации времени, то вместо указанной добавьте строчку:

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

где 192.168.1.0 является IP адресом вашей сети, а 255.255.255.0 её сетевой маской. /etc/ntp.conf может содержать несколько директив restrict.

Для корректной и более точной работы демона, желательно выбрать сервера уровня – от stratum 2 (можно конечно stratum1, но придется убить время на поиски такого сервера) и из выбранных stratum 2 те, до которых минимальное “расстояние”. Обычно такие сервера могут предоставляться вашим провайдером. Количество выбираемых серверов желательно – более 2-х  3-х, чем больше тем лучше, но в разумных пределах. Если Вам лень выбирать лучшие сервера, то можно взять список открытых серверов второго уровня отсюда: http://support.ntp.org/bin/view/Servers/StratumTwoTimeServers.

Выбираем список эталонных NTP серверов

Идем по указанному адресу (http://support.ntp.org/bin/view/Servers/StratumTwoTimeServers) и подбираем список начальных серверов. Из данного списка выбираем удовлетворяющий нашим требованиям серверы, с помощью анализа вывода команды ntpdate. При выполнении команды, применяется следующий синтаксис:

ntpdate параметры серверы_через_пробел

Для того чтобы наш запрос не вносил изменения в систему, необходимо использовать параметр -q, который указывает на использование запроса без внесения изменений. Так же, возможно использовать ключ -d, указывающий, что команда будет выполняться в отладочном режиме, с выводом дополнительных сведений, без внесения реальных изменений (при данном ключе выводится куча другого мусора :), который нам в данный момент не нужен ). Остальные параметры можно посмотреть в man 8 ntpdate. Из указанной ссылки я выбрал все сервера Open Access, расположенные в России (RU) + тот, который предоставил провайдер и запустил команду, получилось примерно следующее:

ntp-server:~# ntpdate -q ntp2.ntp-servers.net ntp1.vniiftri.ru ntp2.vniiftri.ru ntp4.vniiftri.ru ntp0.ntp-servers.net ntp1.ntp-servers.net ntp3.vniiftri.ru ntp.corbina.net
server 88.147.255.85, stratum 1, offset 0.006494, delay 0.09918
server 62.117.76.142, stratum 1, offset 0.002552, delay 0.06920
server 62.117.76.141, stratum 1, offset 0.003147, delay 0.06918
server 62.117.76.140, stratum 1, offset 0.004823, delay 0.07350
server 88.147.254.228, stratum 1, offset -0.002355, delay 0.12030
server 88.147.254.229, stratum 1, offset -0.000922, delay 0.10577
server 62.117.76.138, stratum 1, offset 0.005331, delay 0.07401
server 195.14.40.141, stratum 2, offset 0.002846, delay 0.07188
13 Jan 19:14:09 ntpdate[1946]: adjust time server 62.117.76.141 offset 0.003147 sec

В примере наши сервера удачно выдали уровень stratum1, что не может не радовать (кроме сервера провайдера :( ), offset – это расхождение во времени с этим сервером в секундах, delay – задержка синхронизации в секундах. Обычно, бОльшая точность получается при использовании серверов, которые имеют низкую задержку передачи пакетов по сети. Для выявления этого, возможно воспользоваться утилитами ping и traceroute. Соответственно, выбрав сначала те, у которых время ответа меньше, а из них – те, до которых меньше хопов. Я же, чтобы не терять время, воспользуюсь всем указанными серверами и впишу их в конфигурационный файл. Итого, зная все вышеперечисленное, опишу свой получившийся файл /etc/ntp.conf:

ntp-server:~# cat /etc/ntp.conf
# Сервера локальной сети (закомментированы, не используются - в сети один сервер)
#server 192.168.0.2
#server 192.168.0.5

# интернет-сервера
server  ntp2.ntp-servers.net
server  ntp1.vniiftri.ru
server  ntp2.vniiftri.ru
server  ntp4.vniiftri.ru
server  ntp0.ntp-servers.net
server  ntp1.ntp-servers.net
server  ntp3.vniiftri.ru
server  ntp.corbina.net

# Файлы сервера
driftfile       /var/lib/ntp/ntp.drift
logfile /var/log/ntpstats

# ограничение доступа к серверу:
# по умолчанию игнорируем все
restrict        default ignore

# локалхост без параметров - значит разрешено все. Параметры идут только на запреты.
restrict        127.0.0.1

# далее описываются сервера с которыми мы синхронизируемся в локальной сети.
# Разрешаем им все кроме трапов и запросов к нам
restrict        192.168.0.2     noquery notrap
restrict        192.168.0.5     noquery notrap

# для локалки так же разрешаем все, кроме трапов и модификаций
restrict        192.168.0.1  mask 255.255.255.0 nomodify notrap nopeer

# разрешаем внешним источникам времени доступ:
restrict  ntp2.ntp-servers.net
restrict  ntp1.vniiftri.ru
restrict  ntp2.vniiftri.ru
restrict  ntp4.vniiftri.ru
restrict  ntp0.ntp-servers.net
restrict  ntp1.ntp-servers.net
restrict  ntp3.vniiftri.ru
restrict  ntp.corbina.net

# а этот хак, который выставляет уровень доверия серверу (strata) самому себе равный 3
# в двух словах чем выше уровень-тем меньше число. 0 - это атомные часы,
# 1 - это синхронизированные с ними, 2 - с первым, и так далее.
server  127.127.1.1
fudge   127.127.1.1     stratum 3

Для более углубленного понимания и настройки сервера, опишу некоторые параметры конфигурации ntpd, о которых не упоминал::

  • enable/disable auth/monitor/pll/pps/statsвключить/выключить режим работы:
    • auth – с неупомянутыми соседями общаться только в режиме аутентификации;
    • monitor – разрешить мониторинг запросов;
    • pll – разрешить настраивать частоту местных часов по NTP;
    • stats – разрешить сбор статистики;
  • statistics loopstats – при каждой модификации локальных часов записывает строчку в файл loopstats;
  • statistics peerstats – каждое общение с соседом записывается в журнал, хранящийся в файле peerstats;
  • statistics clockstats – каждое сообщение от драйвера локальных часов записывается в журнал, хранящийся в файле clockstats;
  • statsdir {имя_каталого_со_статистикой} – задает имя каталога, в котором будут находится файлы со статистикой сервера;
  • filegen [file {filename}] [type {typename}] [flag {flagval}] [link|nolink] [enable|disable]– определяет алгоритм генерации имен файлов, которые состоят из:
    • префикс – постоянная часть имени файла, задается либо при компиляции, либо специальными командами конфигурации;
    • имя файла – добавляется к префиксу без косой черты, две точки запрещены, может быть изменена ключем file;
    • суффикс – генерируется в зависимости от typename;
  • restrict numeric-address [mask {numericc-mask}] [flag] – задает ограничение доступа: пакеты сортируются и маскам, берется исходный адрес и последовательно сравнивается, от последнего удачного сравнения берется флаг  [flag]доступа:
    • нет флагов – дать доступ;
    • ignore – игнорировать все пакеты;
    • noquery – игнорировать пакеты NTP 6 и 7 (запрос и модификация состояния);
    • nomodify – игнорировать пакеты NTP 6 и 7 (модификация состояния);
    • limited – обслуживать только ограниченное количество клиентов из данной сети;
    • nopeer – обслуживать хост, но не синхронизироваться с ним;
  • clientlimit limit – для флага limited определяет максимальное количество обслуживаемых клиентов (по дефолту 3);

Итого, мы получили ntpd-server, который синхронизируется с внешним миром, позволяет получать время для клиентов из локальной сети 192.168.0.1  с маской 255.255.255.0, а так же может синхронизироваться с локальным сервером (если раскомментировать несколько строк). Нам осталось настроить клиентов и узнать, как наблюдать за нашим сервером.

Наблюдение за сервером ntpd и за синхронизацией

Когда у вас все настроено. NTP будет держать время в синхронизированном состоянии. Этот процесс можно наблюдать при помощи команды NTP Query (ntpq):

ntp-server:~# ntpq -p
remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-n3.time1.d6.hsd .PPS.            1 u   34   64  177   70.162    2.375   8.618
+ntp1.vniiftri.r .PPS.            1 u   33   64  177   43.479   -0.020  10.198
*ntp2.vniiftri.r .PPS.            1 u    6   64  177   43.616   -0.192   0.688
+ntp4.vniiftri.r .PPS.            1 u    4   64  177   43.623    0.440   0.546
-n1.time1.d6.hsd .PPS.            1 u   53   64   77   92.865  -11.358  38.346
-ns1.hsdn.org    .GPS.            1 u   40   64  177   78.057   -3.292  35.083
-ntp3.vniiftri.r .PPS.            1 u   44   64   77   47.667    2.292   2.611
-scylla-l0.msk.c 192.43.244.18    2 u   62   64   77   41.565   -1.564  28.914

Данная команда с ключом -p выводит на стандартный вывод список источников времени с их характеристиками (остальные параметры команды в man ntpq). Значение каждой колонки следующее:

remote

Имя удаленного NTP-сервера. Если указать ключ -n, вы получите IP-адреса серверов вместо имён.

refid

Указывает, откуда каждый сервер получает время в данный момент. Это может быть имя хоста или что-то вроде .GPS., указывающее на источник глобальной системы позиционирования (Global Positioning System).

st

Stratum (уровень) это число от 1 до 16, указывающее на точность сервера. Единица означает максимальную точность, 16 — сервер недоступен. Ваш уровень будет равен уровню наименее точного удаленного сервера плюс 1.

poll

Интервал между опросами (в секундах). Значение будет изменяться между минимальной и максимальной частотой опросов. В начале интервал будет маленьким, чтобы синхронизация происходила быстро. После того как часы синхронизируются, интервал начинает увеличиваться, чтобы уменьшить трафик и нагрузку на популярные сервера времени.

reach

Восьмеричное представление массива из 8 бит, отражающего результаты последних восьми попыток соединения с сервером. Бит выставлен, если удаленный сервер ответил.

delay

Количество времени (в секундах) необходимого для получения ответа на запрос “который час? “.

offset

Наиболее важное поле. Разница между временем локального и удаленного серверов. В ходе синхронизации это значение должно понижаться (приближаться к нулю), указывая на то, что часы локальной машины идут все точнее.

jitter

Дисперсия (Jitter) — это мера статистических отклонений от значения смещения (поле offset) по нескольким успешным парам запрос-ответ. Меньшее значение дисперсии предпочтительнее, поскольку позволяет точнее синхронизировать время.

Значение знаков перед именами серверов

x – фальшивый источник по алгоритму пересечения;
. – исключён из списка кандидатов из-за большого расстояния;
– – удалено из списка кандидатов алгоритмом кластеризации;
+ – входит в конечный список кандидатов;
# – выбран для синхронизации, но есть 6 лучших кандидатов;
* – выбран для синхронизации;
o – выбран для синхронизации, но используется PPS;
пробел – слишком большой уровень, цикл или явная ошибка;

Служба ntpd “умная” и сама отсеивает источники времени слишком выбивающиеся за рамки разумного. Через некоторое время после запуска ntpd выберет наиболее достоверные источники данных и будет синхронизироваться с ними. Представленный нами список эталонных NTP серверов регулярно пересматривается службой.

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

ntp-server:~# ntpdate -q localhost
server 127.0.0.1, stratum 2, offset -0.000053, delay 0.02573
server ::1, stratum 2, offset -0.000048, delay 0.02571
14 Jan 14:49:57 ntpdate[2231]: adjust time server ::1 offset -0.000048 sec

Из вывода команды видно, что наш сервер уже стал уровня stratum 2. Для достижения данного уровня, необходимо некоторое время. Возможно, в первые 10-15 минут уровень сервера будет выше.

О корректной работе сервера ntp можно так же судить по логам демона ntpd:

ntp-server:~# cat /var/log/ntpstats/ntp
13 Jan 20:13:16 ntpd[1764]: Listening on interface #5 eth0, fe80::a00:27ff:fec1:8059#123 Enabled
13 Jan 20:13:16 ntpd[1764]: Listening on interface #6 eth0, 192.168.0.8#123 Enabled
14 Jan 14:31:00 ntpd[2217]: synchronized to 62.117.76.142, stratum 1
14 Jan 14:31:10 ntpd[2217]: time reset +10.291312 s
14 Jan 14:31:10 ntpd[2217]: kernel time sync status change 0001
14 Jan 14:34:31 ntpd[2217]: synchronized to 88.147.255.85, stratum 1
14 Jan 14:36:04 ntpd[2217]: synchronized to 62.117.76.141, stratum 1
14 Jan 15:04:36 ntpd[2217]: synchronized to 62.117.76.142, stratum 1
14 Jan 15:10:58 ntpd[2217]: synchronized to 62.117.76.140, stratum 1
14 Jan 15:17:54 ntpd[2217]: no servers reachable
14 Jan 15:31:49 ntpd[2217]: synchronized to 62.117.76.140, stratum 1
14 Jan 15:32:14 ntpd[2217]: time reset +13.139105 s

Настройка netfilter (iptables) для NTP сервера

Настроив работу сервера, неплохо было бы его защитить. Мы знаем, что сервер работает на 123/udp порту, при этом запросы так же отправляются с порта 123/udp. Ознакомившись со статьей, что такое netfilter и правила iptables и ознакомившись с практическими примерами iptables, можно создать правила фильтрации сетевого трафика:

ntp ~ # iptables-save
# типовые правила iptables для DNS
*filter
:INPUT DROP [7511:662704]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
# разрешить доступ локальной сети к NTP серверу:
-A INPUT -s 192.168.1.1/24 -d 192.168.1.1/32 -p udp -m udp --dport 123 -m conntrack --ctstate NEW -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p udp -m udp --sport 32768:61000 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 32768:61000 -j ACCEPT
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# разрешить доступ NTP серверу совершать исходящие запросы
-A OUTPUT -p udp -m udp --sport 123 --dport 123 -m conntrack --ctstate NEW -j ACCEPT
COMMIT

Это типовой пример! Для задания правил iptables под Ваши задачи и конфигурацию сети, необходимо понимать принцип работы netfilter в Linux, почитав вышеуказанные статьи.

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

Для синхронизации времени на UNIX-машинах локальной сети целесообразно использовать утилиту ntpdate, запуская ее при помощи демона cron несколько раз в сутки, например каждый час. Для этого, в кронтаб пользователя root необходимо добавить следующую строку:

0 * * * * /usr/sbin/ntpdate -s <IP-адрес или FQDN-имя NTP-сервера локальной сети>

Ключ -s направляет вывод команды демону syslog. Если на клиентских машинах есть пару лишних мегабайт оперативки, то можно запустить демон ntpd, как и на сервере со следующим конфигом:

server <IP-адрес или FQDN-имя NTP-сервера локальной сети>
restrict default ignore
restrict <IP-адрес или FQDN-имя NTP-сервера локальной сети> noquery notrap
restrict 127.0.0.1 nomodify notrap

Думаю, в данном конфиге все понятно: источник времени (server) – локальный ntpd-сервер, доступ всем запретить, разрешить только локальному ntpd-серверу.

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

Для настройки NTP клиента Windows, необходимо выполнить в консоли следующие команды:

C:\>net time /setsntp:<IP-адрес или FQDN-имя NTP-сервера локальной сети>
The command completed successfully.
C:\>net stop w32time
The Windows Time service is stopping.
The Windows Time service was stopped successfully.
C:\>net start w32time
The Windows Time service is starting.
The Windows Time service was started successfully.
C:\>net time /querysntp
The current SNTP value is: <IP-адрес или FQDN-имя NTP-сервера локальной сети>
The command completed successfully.

Заключение

Ну вроде все! Объем статьи получился громадным… Даже сам не ожидал. Подведу маленький итог изложенному. В данной статье нам, надеюсь, стало понятно что есть и как работает NTP-сервер. Научились настраивать сервер и клиентов на UNIX и Windows машинах. В нескольких словах, структура синхронизации времени в локальной сети следующая: Имеется 1,2 или более серверов точного времени в локальной сети, они синхронизируют свое время с внешними источниками в глобальной сети. Настройки сервера и клиентов основаны на файлах /etc/ntp.conf (основной конфигурационный файл демона ntpd), /etc/localtime (файл текущего часового пояса), а так же /etc/sysconfig/ntp (для RH) и /etc/default/ntp (для Deb) – файлы параметров запуска демона. Для локального ntp-сервера в конфигурационном файле указываются внешние сервера для получения времени и разрешается доступ для этих серверов параметром restrict, а так же для компьютеров локальной сети, для клиентов указывается источник времени – локальные сервера в локальной сети, а так же запрещается доступ для всех, кроме источника времени в локальной сети. Все. Всем спасибо за внимание! Буду рад комментариям!

Что могу посоветовать почитать дополнительно:

  • тут (архив статьи) описано, как подключить GPS к серверу для организации своего сервера точного времени уровня Stratum1.
  • тут описано, как настроить авторизацию на ntp-сервере.

Upd 2012.02.14: добавил настройку netfilter для NTP

С Уважением, Mc.Sim!


Другие материалы в категории NTP


Теги: , ,

84 комментария к “NTP Server на Linux (ntpd)”

  1. 28 апреля, 2011 at 22:12
    1

    Автор – просто умница. Статья очень подробная и соответствует духу блога! 8)

    • 29 апреля, 2011 at 09:37
      2

      Спасибо!

  2. evlmn
    14 июля, 2011 at 10:15
    3

    Хорошая статья!

    Но, у меня появились сомнения. В последнем примере, про настройку клиента UNIX-машин в строке

    restrict nomodify noquery notrap

    nomodify – запрещает серверу корректировать время на клиентской машине. Получается что время корректироваться не будет?

    • 14 июля, 2011 at 14:37
      4

      Все верно.
      Ошибочка… Поправил.
      Спасибо за замечание.

  3. Mad
    12 августа, 2011 at 13:37
    5

    Огромное спасибо за статью!
    От себя хочу добавить что синхронизация с локальным сервером возможна не сразу после запуска ntpd (service ntpd start), а по прошествии определенного времени, когда сервер получит уровень точности выше некоего порогового значения, у меня это stratum 3.
    Так что не стоит пугаться, если ntpdate выдает “no server suitable for synchronization found”, нужно просто подождать некоторое время. =)

  4. Mad
    12 августа, 2011 at 13:43
    6

    Как изменить интервал синхронизации времени в Windows:
    По умолчанию в Windows установлен этот интервал в одну неделю. Новое значение можно установить в реестре. Для этого надо запустить редактор реестра: Пуск->Выполнить, в командной строке написать regedit.

    В разделе: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W32Time\TimeProviders\NtpClient, выбрать параметр SpecialPollInterval и изменить его значение, указывается оно в секундах. По умолчанию равно 604800 секунд (7 дней). Для одного часа, например, нужно указать 3600.

    Взято отсюда:
    http://kapuchin.livejournal.com/232133.html

    • 12 августа, 2011 at 15:19
      7

      Спасибо за дополнения.

  5. Алексей
    8 декабря, 2011 at 17:29
    8

    Спасибо за статью, очень подробно и доступно. Помогло разобраться с ntpd, да и не только !!! =) Спасибо за удобочитаемость и понятливость !!! Таких людей побольше бы ;)

    • 9 декабря, 2011 at 00:32
      9

      Пожалуйста. Приходите еще )

  6. Саша
    2 апреля, 2012 at 12:00
    10

    Доброго времени суток. У меня такая проблема:
    Не вижу логов самой службы ntp. Указал в конф файле куда писать (logfile /var/log/ntpstats/ntp) Файл создался, но там
    29 Mar 18:55:44 ntpd[16036]: inappropriate address 127.0.0.1 for the fudge command, line ignored

    и всё. а хотелось бы видеть кто(какие клиенты) обращается за получением времени и статус операций. создаются файлы loopstats и peerstats , но там не то.
    (debian6.0.9)

    • 2 апреля, 2012 at 13:09
      11

      Приветствую. Можно увидеть весь конфиг?

      • Саша
        10 апреля, 2012 at 09:55
        12

        Почему-то не даёт вставить конфиг сюда :(

        • 10 апреля, 2012 at 10:06
          13

          можно вставить на pastebin.ru

  7. Саша
    10 апреля, 2012 at 10:06
    14

    Доброго времени суток. Вот конфиг
    driftfile /var/lib/ntp/ntp.drift
    logfile /var/log/ntpstats/ntp
    statsdir /var/log/ntpstats/
    statistics loopstats peerstats clockstats
    filegen loopstats file loopstats type day enable
    filegen peerstats file peerstats type day enable
    filegen clockstats file clockstats type day enable
    может частями

  8. Саша
    10 апреля, 2012 at 10:08
    15

    продолжение
    restrict default ignore
    restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap nopeer
    restrict 192.168.19.0 mask 255.255.255.0 nomodify notrap nopeer
    restrict 127.0.0.1
    restrict ::1
    и ещё список серверов с которых брать время

  9. Саша
    10 апреля, 2012 at 11:08
    16

    тут полный
    http://pastebin.ru/ZDGu5xMb

    • 10 апреля, 2012 at 11:27
      17

      Да, действиетльно, последние версии ntp пишут в лог только системные события. В манах описания уровня логирования не нашел :( Вот тут описан параметр logconfig, но заставить его работать у меня не получилось…

  10. Саша
    10 апреля, 2012 at 12:56
    18

    Мда странно как-то ведёт себя служба в плане логов.
    вбил
    logconfig =clockall +peerall +sysall +syncall
    logfile /var/log/ntpstats/ntplog
    в логах показывает только то, что сам сервер синхронизирует время, но ничего о том, что кто-то к нему обращается за временем.
    единственное (чтоб уж убедится, что всё работает) выполнил
    tcpdump -i eth0 -n port 123
    всё равно спасибо за участие.
    а такой вопрос – вы с заббиксом не работали?

    • 10 апреля, 2012 at 13:15
      19

      Системы мониторинга обязательно буду рассматривать в будущем. Но сейчас приоритет – допилить squid, далее почтовый сервер.

      • Саша
        10 апреля, 2012 at 13:24
        20

        Когда-то пришлось перепробовать различные прокси сервера. В конце-концов остановился именно на squid. Тогда использовал мандриву.
        За разбор почтового сервера тут буду думаю не один я благодарен. Хотелось бы ещё узнать процедуру публикации почтового сервера в интернете.

        • 10 апреля, 2012 at 13:26
          21

          Почтовый сервер буду на реальном примере поднимать. Поэтому все нюансы DNS и прочего постараюсь описать как можно подробней.

  11. Гость
    20 ноября, 2012 at 18:41
    22

    Если бы все писали так, как написан этот мануал, у нас пол страны были бы продвинутыми админами. Спасибо.

  12. lone_wolf
    30 декабря, 2012 at 08:12
    23

    Замечательная статья, но у мене не понятно что такое notrap ? :-[

    • 30 декабря, 2012 at 23:46
      24

      На сколько я понял, демон может переходить в некий командный режим, в котором он может удаленно управляться. Переход в этот режим осуществляется с помощью управляющих команд, т.н. trap, которые могут быть отправлены с помощью команды ntpdc.
      Вот notrap указывает демону не принимать данные трапы. подробней тут http://www.eecis.udel.edu/~mills/ntp/html/accopt.html

      • lone_wolf
        31 декабря, 2012 at 20:25
        25

        Спасибо за пояснение *THUMBS UP*

  13. Виталий
    29 марта, 2013 at 12:03
    26

    обновите ссылку на материалы: “тут описано, как подключить GPS к серверу для организации своего сервера точного времени уровня Stratum1.”

    • 1 апреля, 2013 at 11:27
      27

      Виталий,
      нашел в архиве статью. ссылку добавил.
      Спасибо за замечание

  14. Виталий
    1 апреля, 2013 at 11:29
    28

    Спасибо за оперативность.

    • 1 апреля, 2013 at 11:32
      29

      Пожалуйста, приходите еще. )

      • Виталий
        1 апреля, 2013 at 11:36
        30

        Есть софт по синхронизации tardis там в настройках тоже можно использовать GPS по карйней мере, на одной из закладок фигурирует GPS. Софт виндовый (сервер) может и под linux есть не смотрел. Так вот с ним не работали?

        • 1 апреля, 2013 at 11:40
          31

          К сожалению, даже не слушал о таком…
          Но могу сказать, что подключение GPS обычно происходит либо по COM порту, либо в виде Ethernet устройства.

          • Виталий
            1 апреля, 2013 at 11:43
            32

            Скорее всего через com порт должен подключаться.
            Вот ссылка на софт.

            • 1 апреля, 2013 at 12:09
              33

              Да, он может получать от GPS время, но устройства, с которыми он может работать должны соответствовать стандартам, описанным в документации.
              Думаю, что у Вас проблема не в tardis, а в настройке устройства GPS.

              • Виталий
                1 апреля, 2013 at 12:22
                34

                У нас вообще нет gps. Подбираю еще только. А вопрос точного времени стоит остро, люди на работу ходят секундное опоздание – наказали, раньше ушел – тоже самое. Вот и пинют нас типа у вас часы идут не правильно. Согласен, сейчас у каждого свое время.

              • 1 апреля, 2013 at 13:03
                35

                Если у Вас домен и есть доступ интернет из локальной сети, то не вижу смысла GPS покупать.
                Достаточно просто NTP корректно настроить работать через сеть.

  15. Виталий
    1 апреля, 2013 at 13:13
    36

    Выхода в Internet нет, и наверное не скоро появится. Хочу “пробить” а то сложно сервера адмнить, особенно когда ночью звонят и говорят у нас камеры не показывают…

    • 1 апреля, 2013 at 14:26
      37

      Даже если нет доступа в интернет, то организовать одинаковое время между системой учета опозданий и компьютерами сети тоже не является проблемой, даже с помощью того же tardis. Без GPS

      • Виталий
        1 апреля, 2013 at 14:50
        38

        Да, все время надо корректировать системное время на сервере tardis. Часы за неделю разбегаются с реальным на 2 минуты. :( А люди по “Маяку”(радио) домой идут.
        Вот собственно отсюда ноги и растут.

  16. sergey
    28 апреля, 2013 at 12:06
    39

    Приветствую, а может кто подсказать, как повесить ntpd на конкретный адрес. У меня несколько сетевух и на каждой несколько алиасов.

    • 29 апреля, 2013 at 09:25
      40

      Приветствую,
      Попробуйте указать в конфиге опцию interface (man)

  17. nicronomikon
    22 мая, 2013 at 22:46
    41

    Mc.Sim огромное спасибо за столь развёрнутую статью!
    Только как начал пробовать самостоятельно настроить NTP, немного запутался.. Для настройки клиентов обязательно устанавливать пакеты NTP и NTPDATE? Или достаточно NTPDATE?
    При настройке unix-клиентов у Вас было указано server
    restrict default ignore
    restrict noquery notrap
    restrict 127.0.0.1 nomodify notrap

    Для чего указываем restrict 127.0.0.1?
    Заранее прошу прощения за возможно глупые вопросы и заранее благодарю за ответ!

    • 22 мая, 2013 at 23:16
      42

      обязательно устанавливать пакеты NTP и NTPDATE? Или достаточно NTPDATE?

      Тут ключевой момент в том, что ntp более “гладко” выравнивает время на клиенте, и при недоступности сервера может еще некоторое время продолжать его актуализировать. NTPDATE это более топорный вариант. Он тупо смотрит локальное время и отрубает убежавшее веред или прилепляет недобежавшее каждый раз, когда запускается.

      Для чего указываем restrict 127.0.0.1?

      Это сделано для того, чтобы локальный клиентский ntp мог сам с собой обмениваться статистикой.

  18. nicronomikon
    27 мая, 2013 at 13:17
    43

    Mc.Sim, а скажите пож-та, можно ли в локальной сети разместить ntp сервер, который не будет синхронизитоваться с какими-либо ntp серверами из вне, а просто в своей локальной сети будет раздовать время?

    И можно ли как-нибудь такому серверу принудительно понизить стратум?

    • 30 мая, 2013 at 09:24
      44

      Без проблем.
      Для этого сервера необходимо указать себя самого как источник времени и задать себе самому нужны уровень, например:
      server 127.0.1.1
      fudge 127.0.1.1 stratum 1

  19. Eagle
    9 июля, 2013 at 08:13
    45

    Mc.Sim, подскажи пожалуйста в тему прошлому вопросу.
    На время умершего серевера точного времени , необходимо организовать синхронизацию с одной из локальных машин, вот ее ntp.conf:

    server 127.127.1.0
    # local clock (LCL)
    fudge 127.127.1.0 stratum 5
    driftfile /var/lib/ntp/drift/ntp.drift
    # path for drift file

    logfile /var/log/ntp
    server 192.168.128.15 — это сервер точного времени, он умер временно

    А это конфиг клиента, который должен синхронизироваться с нашим локальным сервером:
    server 127.127.1.0
    # local clock (LCL)
    fudge 127.127.1.0 stratum 10

    driftfile /var/lib/ntp/drift/ntp.drift
    # path for drift file

    logfile /var/log/ntp
    server 192.168.128.15 — это сервер точного времени, он умер временно
    server 192.168.128.19 — это наш временный источник точного времени

    Выполнение команды ntpq на клиенте дает следующий результат:
    serv2:~ # ntpq -p
    remote refid st t when poll reach delay offset jitter
    ==============================================================================
    *LOCAL(0) .LOCL. 10 l 23 64 377 0.000 0.000 0.001
    timeserv.emk.ko .INIT. 16 u – 1024 0 0.000 0.000 0.000
    serv1.emk.ko LOCAL(0) 6 u 13 1024 377 0.088 31.239 0.035

    То есть несмотря на то, что стратум намного ниже (6 против 10 ) клиент(serv2) не хочет доверять serv1
    Как можно исправить эту ситуацию? Слижком низкий стратум ставить не хочется, т.к. скоро сервер точного времени вернется в работу.

    • 15 июля, 2013 at 23:29
      46

      На сервере и клиенте не видно директив restrict….
      На клиенте нет необходимости задавать fudge 127.127.1.0 stratum 10. Попробуйте убрать, перезапустить и посмотреть результат через пол часика.
      Так же, не вижу причин не сделать Вашему временному серверу стратум, ну например, 2 или 3. Когда ваш ntp вернется на место – он займет свой стратум.

  20. yuriy
    24 июля, 2013 at 18:25
    47

    Не понятно, в начале статьи написано, Дата и время операционной системы устанавливается при загрузке на основании значения аппаратных часов.После загрузки операционной системы, часы операционной системы и BIOS полностью независимы. Ядро системы раз в 11 секунд синхронизирует системные часы с аппаратными.
    Тоесть системное время корректирует аппаратное? или наоборот, если допустим нет инета, кто кого скоректирует через 11 сек.
    И еще вопрос может кто сталкивался, у меня vmware workstation, там пишет stratum 0 на все внешние сервера синхронизации, в wmware tools синхронизация времени с хостом отключена, немогу понять 0 -это же не верно,соответсвенно и нет offsetа.
    Возникает вопрос а корректируются часы впринцыпе или нет, сервера из пулов все выводит как и должно быть но stratum 0 меня сбивает с толку.

    • 16 августа, 2013 at 13:59
      48

      Тоесть системное время корректирует аппаратное? или наоборот, если допустим нет инета, кто кого скоректирует через 11 сек.

      Часы операционной системы синхронизируются с аппаратными каждые 11 секунд не зависимо от того, есть интернет или нет.
      По поводу Вашей проблемы, хотелось бы увидеть ваш конфиг и вывод команды ntpq -p.

  21. Vladislav
    6 ноября, 2013 at 08:54
    49

    Статья – просто бомба =) . Большое спасибо от всех чайников. И как вам не лень было писать так много букафф =) На таких как вы этот мир держится *IN LOVE*

  22. Turok
    10 ноября, 2013 at 02:16
    50

    Здрасти.
    Не могу сделать, чтобы ntp раздавал время, порт 123 ни как не открывается.
    Строчка restrict 192.168.0.4 (ip моего компа) – не помогает.
    Где рыть дальше?

    • 28 ноября, 2013 at 12:07
      51

      Здравствуйте. Покажите вывод iptables-save.

  23. Turok
    10 ноября, 2013 at 04:12
    52

    Поправачка: 123 оказался открыт, я его искал как tcp, а он udp.
    Но время всё равно не синхронизируется на windows 7, возможно на винде своя система синхронизации.

    • 28 ноября, 2013 at 12:08
      53

      проблема еще актуальна?
      Что в вендовых логах?

  24. Andrey
    14 марта, 2014 at 18:33
    54

    Здравствуйте!
    При работе с ntp возникает следующая проблема: запускаем ntp сервер с помощью /etc/init.d/ntp start. начинаем обращаться к серверу с помощью ntpdate . через какое-то время (может минут 10-15) при обращении к серверу выдаётся ошибка “no server suitable for synchronization found”. может быть вы знаете как на сервере запустить службу ntp, чтобы её не приходилось постоянно перегружать?

    • 17 марта, 2014 at 09:37
      55

      Здравствуйте.
      Во время проявления проблемы, выполните на сервере команды ntpq -pn и iptables-save. И покажите вывод команд.
      А так же покажите файл конфигурации.

  25. Ivan
    7 апреля, 2014 at 01:11
    56

    Доброго времени суток! У меня такой вопрос – везде пишут, что точность времени в протоколе NTP порядка 1 мс. Но служба ntpdate выдает offset порядка 10^-6. может вы знаете как такое происходит?

    • 24 июня, 2014 at 19:33
      57

      Не могу согласиться с данным утверждением.
      Мой сервер при синхронизации расходится лишь на -0.077 мс
      MEDIA ~ # ntpq -pn
      remote refid st t when poll reach delay offset jitter
      ==============================================================================
      -91.226.136.141 .GPS. 1 u 184 1024 337 40.456 -3.010 0.199
      +89.109.251.22 .PPS. 1 u 782 1024 377 24.145 0.074 1.498
      +89.109.251.24 .PPS. 1 u 332 1024 377 23.750 0.215 1.599
      -91.226.136.138 .GPS. 1 u 415 1024 377 40.622 -5.043 0.629
      -91.226.136.139 .GPS. 1 u 589 1024 377 40.327 -0.235 0.142
      *89.109.251.23 .PPS. 1 u 322 1024 377 22.895 -0.077 0.131
      -195.14.40.141 194.190.168.1 2 u 520 1024 377 21.274 -0.322 0.398

      точность времени для NTP – это плавающее значение. Чем доступней и ближе NTP сервер, тем точнее время. Но могу сказать, что я не встречал случаев, чтобы время расходилось с сервером более чем на 1 минуту. Кроме того, большой плюс NTP в том, что он плавно корректирует время, в отличие от ntpdate.

  26. vetal
    11 июля, 2014 at 17:35
    58

    Приветствую!!
    Время постоянно уходит вперед, наверняка из-за того что ОС (Red Hat 5.5) установлена на ВМ. Поэтому без синхронизации никак.
    Через ntp время не синхронизируется. Работает только через ntpdate -u IPадрес
    Буду рад любой помощи.

    ntpq -p

    ntp.conf

    ntpd

    clock

    drift

    ntpstats

    • 15 июля, 2014 at 13:47
      59

      Сколько времени прошло между запуском NTP и выполнением команды ntpq -p?

  27. Артём
    29 августа, 2014 at 10:31
    60

    Доброе время суток!
    А как сделать для такой схемы: 1 сервер у него есть 3 клиента, доступа к нету нет… нужно что бы сервер синхронизировался по времени от своих часов и раздавал эту синхру своим 3м клиентам.
    Р.С. точности времени на сервере вполне достаточно своих внутренних часов.

    • 13 октября, 2014 at 21:35
      61

      Доброго.
      Нужно серверу, который у вас выступает в качестве источника, указать в конфиге вот такие строчки:
      server 127.127.1.1
      fudge 127.127.1.1 stratum 3

      Таким образом он будет выступать в качестве источника времени уровня 3.

  28. woodyfon
    8 мая, 2015 at 03:27
    62

    Наверное, самая полная инфо в интернете про NTP. Не понял некоторые моменты: необходимо ли устанавливать ntpd для синхронизации времени после загрузки системы и/или во время загрузки? Требуется единожды синхронизировать время с серверами точного времени по интернету.

    • 7 июня, 2015 at 22:46
      63

      Если требуется один раз синхронизировать время, то можно обойтись выполнением команды ntpdate с необходимыми ключами. NTP сервер в таком случае нет необходимости настраивать.

  29. Fabeldyr
    30 июня, 2015 at 12:37
    64

    Здравствуйте, имеется ntp сервер на виртуальной машине с ОС Debian, файл ntp.conf:

    driftfile /var/lib/ntp/ntp.drift

    statistics loopstats peerstats clockstats
    filegen loopstats file loopstats type day enable
    filegen peerstats file peerstats type day enable
    filegen clockstats file clockstats type day enable

    restrict -4 default kod notrap nomodify nopeer noquery
    restrict -6 default kod notrap nomodify nopeer noquery

    restrict 127.0.0.1
    restrict ::1

    server 127.127.1.1
    fudge 127.127.1.1 stratum 3

    скопировал всё, что не закомментировано
    хочу синхронизировать свою машину (ОС Windows 7) c виртуальной
    запускаю cmd, ввожу команду w32tm /monitor /computers:127.127.1.1, пишет NTP: ошибка ERROR_TIMEOUT – нет ответа от сервера
    я понимаю, что команда monitor не синхронизирует, а просто смотрит время, но не видит
    что я делаю не так?

    • Fabeldyr
      30 июня, 2015 at 15:29
      65

      наверное дело в этом “NTP server was not designed to run inside of a virtual machine.”

      • 10 октября, 2015 at 13:16
        66

        В целом, запуск NTP на виртуалке – не очень хорошая идея. Но тем не менее это вполне рабочее решение, если NTP серверу синхронизироваться с внешними источниками и нет требования к высокой точности времени.
        Судя по ошибке, NTP не отдает время. А так же, судя по тому, что на винде вы проверяете адрес 127.127.1.1 (который принадлежит сети, зарезервированной для loopback), то NTP у вас не заработает.
        Используйте IP адреса для локальных сетей.

        • Fabeldyr
          10 октября, 2015 at 23:32
          67

          я на самом деле просто проверил работоспособность без виртуальной машины – с двумя реальными, но за ответ всё равно спасибо

  30. Stanislav
    21 июля, 2015 at 16:39
    68

    Здравствуйте!
    Не могу найти информацию по времени синхронизации. Например на нашем компьютере установлено время на час меньше, чем на сервере синхронизации (эталонное). Сколько оно будет синхронизироваться? А если на сутки разница? Какие проблемы могут возникнуть при такой разнице и от чего зависит время схождения? Спасибо.

    • 10 октября, 2015 at 13:27
      69

      По умолчанию, большинство NTP клиентов не синхронизируют время при больших расхождениях. Для того, чтобы этого избежать, в статье приведен ключ -g.
      Обычно, синхронизация может длиться до нескольких минут.
      Все зависит от версии вашего сервера и клиента. Еще, разница в час может быть из-за некорректной настройки временной зоны.

  31. Rin
    8 октября, 2015 at 07:59
    70

    у вас написано:

    # для локалки так же разрешаем все, кроме трапов и модификаций
    restrict 192.168.0.1 mask 255.255.255.0 nomodify notrap nopeer

    а должно быть:

    # для локалки так же разрешаем все, кроме трапов и модификаций
    restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap nopeer

    вы же всю сеть указываете?

    • 10 октября, 2015 at 14:31
      71

      На самом деле, на результат это не повлияет, даже если указать 192.168.0.253 255.255.255.0, но с точки зрения эстетики -да.

  32. Say
    3 июня, 2016 at 13:45
    72

    Спасибо за статью!
    У меня вопрос о настройке альтернативных источников времени. Я имею в локальной изолированной от внешнего мира сети сервер, к которому присоединен GPS. И от этого сервера получают время n-ое количество машин-клиентов. Я хочу чтобы если GPS отваливается/ломается/исчезает синхронизация от сервера по прежнему продолжалась, т.е. меня интересует в этом аварийном случае синхронность часов на сервере и клиентах. Казалось бы все просто и понятно, но видимо я в чем то не разобрался. В net.conf сервера написано следующее (привожу только строки касаемые источников времени):
    #GPS
    restrict 127.127.20.2
    server 127.127.20.2 mode 0 iburst minpoll 4 maxpoll 5 prefer true
    fudge 127.127.20.2 time1 0.100 stratum 0
    #LOCAL TIME
    restrict 127.127.1.0
    server 127.127.1.0 iburst minpoll 4 maxpoll 5
    fudge 127.127.1.0 stratum 2

    Когда все нормально (GPS в норме) получается какая-то непонятная возня между GPS и LOCAL, не смотря на то что у GPS выше стратум и стоит prefer, сервер начинает синхронизироваться от LOCAL, т.е. сам от себя и время естественно постепенно убегает от реального, получаемого через GPS. По моему мнению алгоритм ntp выбирает LOCAL по джиттеру, оффсету и делэй. И как это побороть я не знаю. Подскажите, что делать…
    Спасибо!

    • 4 августа, 2016 at 21:46
      73

      Попробуйте для fudge 127.127.1.0 stratum 2 указать stratum, например 3 или 4 или даже 5.
      А так же, убрать строку fudge 127.127.20.2 time1 0.100 stratum 0. Он итак станет нужным стратумом без накрутки.

  33. Anton
    12 января, 2017 at 10:22
    74

    Спасибо за отличную, полную и понятную статью! Настроил ntpd у себя в локальной сети (без выхода в интернет, RH). Но появилось два вопроса:
    1) Хотелось бы, чтобы ntpd запускался сам, вместе с загрузкой системы на всех компьютерах в локальной сети, начинал и поддерживал синхронизацию с самого начала работы. Думаю, это вполне возможно, но не смог найти информацию по данной теме. Не подкажете?
    2) И еще один вопрос, обсуждения которого в интернете также не нашел. Такая ситуация: Если на компьютере-сервере я меняю время (вручную или прибором, подключаемым в COM-порт) при уже запущенном ntpd, то… клиенты на это не реагируют без команды restart. ntpq -p показывает так, как будто у сервера все еще старое время и ntpd не предпринимает никаких действий (ждал около 15 минут толку – ноль). Это можно как-нибудь исправить?
    Заранее спасибо!

    • 25 июля, 2018 at 10:56
      75

      Сори, что так долго отвечаю.
      1. Чтобы сервис стартовал автоматом, его нужно включить в автозагрузку. Если это redhat, то скорей всего командой chkconfig ntpd on. Точно могу сказать ,если скажите версию ОС.
      2. Я правильно понял, что меняете именно время операционной системы?
      Если так, то нужно настроить, чтобы ntpd использовал либо источник времени от COM порта, либо использовал время ОС, как основное. Иначе – NTPd будет менять системное время, а не наоборот.
      Если покажите Ваш конфиг, то можно попробовать это дело настроить.

  34. Poke
    17 марта, 2017 at 13:13
    76

    Очень крутая статья! Спасибо! Возник только один вопрос: сделал все, как написано у вас (правда, в моей локалке нет подключения к интернету, но сервер работает). Но дабы сжать время синхронизации (компы постоянно выключаются и на сервере периодически переводится время), хотелось бы запускать сначала утилиту ntpdate, а уже после запускать сам ntp сервер. Но ntpdate IPServer выдает no server suitable for synchronization found.
    Подскажите, пожалуйста, в чем может быть проблема?
    Спасибо!

    • 9 февраля, 2019 at 13:43
      77

      в ntpdate вы передаете IP или хостнейм?
      В общем, нужно понимать, какой IP нужно указывать и какой у вас прописан в ntp.conf.
      Если NTP работает только на интерфейсе lo, то ntpdate 127.0.0.1 работать будет, а ntpdate 10.0.0.1 – нет.
      Чтобы ntpdate запускался при старте, его можно прописать в init-скрипты. Более подробную рекомендацию можно дать, если знать, какой у Вас дистрибутив.

  35. Bootmen
    17 апреля, 2017 at 16:52
    78

    Здравствуйте. Спасибо. Второй раз настраиваю в жизни ntp-сервер. Первый раз несколько лет назад на федоре делал. Тогда меня подловили хакерюги из-за из за дыры в ntp-сервере.
    Счас снова понадобился такой сервер. Причем клиенты заходят с Инета.
    Я потестил ваши настройки. Все нормально. Только немного тут не ясно:
    если отсутствует строка
    “restrict default ignore”
    то все могут ломится за услугой.
    Но, если в конфиге появляется например:
    “restrict 192.168.0.2 noquery notrap”
    то это работает как:
    restrict default ignore ?

    • 9 февраля, 2019 at 13:53
      79

      Думаю, что тут зависит от дистрибутива и версии NTP сервера.
      Разные версии могут иметь разные параметры по дефолту.
      Я имею ввиду, что если явно не указано restrict default ignore, то поведение может зависеть от версии сервера.
      В целом, директива restrict ограничивает определенные типы запросов типы запросов идут через пробем после имени хоста или слова default.
      Default, если склюроз мне не изменяет применяется ко все, кто не перечислен явно.
      Так, строки имеют разные наборы запросов:
      restrict 192.168.0.2 noquery notrap
      restrict default ignore

      Думаю, что вывод напрашивается сам собой )

  36. Влад
    8 апреля, 2018 at 12:47
    80

    Здравствуйте! Вопрос такой, хочу чтоб вся локальная сеть при синхронизации использовала локальный сервер синхронизации. К примеру windows-системы обычно используют time.windiws.com, а linux-системы pool.ntp.org, так вот хочу чтоб с этими настройками они в любом случае синхронизировались именно с локальным сервером. Пока то что я в iptables дал такую команду:
    $IP4T -t nat -A PREROUTING -p udp --dport $NTP -j REDIRECT --to-ports $NTP
    $IP6T -t nat -A PREROUTING -p udp --dport $NTP -j REDIRECT --to-ports $NTP

    Переменные естественно заданы. Но у меня сомнения, сам ntp сервер как будет синхронизироваться, не сам ли от себя? Правильнее в iptables указать FORWARD, но пока не знаю как правильно. Можно конечно в локальном dns настроить, но тогда имя будет резолвится в локальный ip, не хотелось бы.

    • 10 февраля, 2019 at 11:18
      81

      Я не уверен, что NTP сервер будет корректно отрабатывать запросы, которые перенаправлены действием REDIRECT.
      Мне кажется, что более правильным решением будет прописать нужный NTP на клиентах.

  37. Не Димон
    28 апреля, 2018 at 09:08
    82

    выставил stratum 3, а где указать зону, правильное время выдаётся клиентам если выставить GMT. но тачка-то не в гмт

    • 10 февраля, 2019 at 13:00
      83

      NTP всегда хранит и обменивается информацией в GMT зоне.
      Настройка временной зоны – это чисто клиентская функция. То есть настраивать отображение времени в нужной таймзоне нужно непосредственно на клиенте NTP.

      Настройки часового пояса берутся из файла /etc/localtime. Данный файл – есть ссылка (но чаще – копия) одного из файлов в структуре каталога /usr/share/zoneinfo/.

  38. Не Димон
    28 апреля, 2018 at 09:11
    84

    и превед!

Написать комментарий