Протокол синхронизации времени ntp. Установка ntp в Ubuntu

06.04.2023 Советы

OS: Windows 2000/XP/2003/Vista/2008/7.

Задача: настроить Windows системы для получения показателей точного времени с определённых NTP серверов.

Наши NTP серверы будут поддерживать протокол версий 3 (три) и 4 (четыре).
Служба точного времени работает на порту udp:123. Обеспечиваем видимость наших NTP серверов по указанному порту.
Авторизацию при запросе клиентом точного времени у NTP сервера проводить не будем; отношения в сети достаточно доверительные, да и парк активных устройств разномастен - далеко не все могут поддерживать что-то ещё, кроме простого запроса показателей времени.


Пользователям операционных систем Windows XP/2003/2008 придётся проделать ряд манипуляций.

Указать на применяемые NTP серверы (где ntp.local, ntp1.local и так далее - наши NTP серверы):

# w32tm /config /syncfromflags:manual /manualpeerlist:ntp.local,ntp1.local,...,ntpX.local
# w32tm /config /update



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

# net time /setsntp:ntp.local
# net stop w32time && net start w32time
# w32tm /resync


В результате должны получить нечто вроде этого:

Команда синхронизации отправлена на local computer...
Команда выполнена успешно.


Через некоторое время можно проверить журнал событий системы. Если все настроено и отработало верно, то в журнале будет информационное сообщение от источника W32Time с кодом (ID) 35 и текстом "Служба времени выполняет синхронизацию системного времени с источником времени". Если возникли какие-то проблемы, то в журнал будут записаны ошибки с кодами. Поисковая система поможет и в этом.

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

# net time /querysntp


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

# w32tm /stripchart /computer:computer.name


Иногда помогает вульгарная перерегистрация службы времени Windows:

# w32tm /unregister
# w32tm /register


Как вариант, можно настроить синхронизацию времени с помощью графического интерфейса.

Можно указать на применяемые NTP серверы с помощью утилиты regedit.exe:


Необходимо пройти в ветку (если её нет - создать) "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers":


Создать или изменить строковые параметры с именами "0" и "1" указав в них доменные имена или IP адреса наших NTP серверов:


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

Иногда часы на компьютере Ubuntu сбиваются, начинают отставать или спешить. Хотя эта ситуация и не критическая но весьма неприятная и может иметь плачевные последствия начиная от путаницы в логах из-за неоднозначности времени и заканчивая опозданием на встречу потому что вы доверились не тем часам. Также точное время важно для корректной работы некоторых программ, например таких как анонимизатор Tor.

К счастью случается это не так уж часто и обычно связанно с такими нестандартными действиями как загрузка операционных систем использующих разные алгоритмы хранения машинного времени или обнуление памяти биос, Но это не означает что не нужно ничего делать, можно настроить синхронизацию локального времени через интернет, это довольно таки удобная вещь если вы часто сбиваете часы и вам лень их каждый раз настраивать. В Ubuntu для этого используется служба NTP и демон ntpd. Именно о них пойдет речь в данной статье.

Сначала немного о том как посмотреть время из терминала в Ubuntu. Чтобы узнать текущее время выполните команду:

Чтобы посмотреть данные в формате UTC наберите:

Узнаем насколько время нашей Ubuntu отстает от эталонного:

sudo ntpdate -q ntp.ubuntu.com

Далее намного теории, если вы пришли сюда только за инструкцией по установке смело листайте вниз. UTC расшифровывается как Coordinated Universal Time, то есть всемирное координированное время. Это стандарт времени по Гринвичу одинаковый для всего мира и именно в таком виде храниться системное время в Linux и в том числе Ubuntu, а поправка на часовые пояса уже прибавляется локально для каждого пользователя. Вот здесь и кроется причина сбоев времени при использовании Windows и Unix.

Как я уже сказал Ubuntu хранит время в формате UTC, тогда как Windows использует для этого локальный формат уже с прибавлением часового пояса. При каждом выключении или перезагрузке компьютера операционная система сохраняет значение своего таймера в таймере BIOS, а при загрузке считывает его от туда.

И получается что ОС от майкрософт сохраняет локальное время, а Ubuntu думает что это UTC... уже понимаете что происходит? Правильно, чем больше таких перезагрузок, тем сильнее время будет отличатся от реального. Но это я уже отошел от темы. Как настроить алгоритмы синхронизации в обоих системах я здесь рассказывать не буду, моя сегодняшняя цель - синхронизация времени в Ubuntu.

Установка NTP в Ubuntu

Утилита ntpdate для синхронизации времени поставляется вместе с ubuntu, и автоматически запускается при старте. Если вы хотите синхронизировать время в сейчас выполните в терминале:

ntpdate -s ntp.ubuntu.com

Сервис ntpd в стандартную комплектацию не входит, его задача - постоянно следить за системными часами и корректировать какие - либо отклонения. Для установки ntpd наберите:

sudo apt-get install ntp

Для запуска демона наберите:

sudo service ntp start

А для добавления в автозагрузку:

sudo rc-update add ntp defaults

Настроить сервера с которыми будет сверяться наша Ubuntu можно в файле /etc/ntp.conf. Формат записи - server address, например стандартная конфигурация:

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
server 0.ubuntu.pool.ntp.org
server 1.ubuntu.pool.ntp.org
server 2.ubuntu.pool.ntp.org
server 3.ubuntu.pool.ntp.org

После редактирования конфигурации не забудьте перезапустить сервис:

sudo service ntp restart

Решение проблем

Служба синхронизации использует порт 123 для соединения с сервером, поэтому если вы используете фаервол доступ к этим портам может блокироваться, необходимо разрешить доступ добавив следующие правила:

iptables -A output -p udp -s 192.168.1.1 --sport 1024:65535 -d 0/0 --dport 123 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A input -p udp -s 0/0 --sport 123 -d 192.168.1.1 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

Теперь часы на вашем компьютере всегда будут идти правильно.

Network Time Protocol — сетевой протокол для синхронизации внутренних часов компьютера с использованием сетей с переменной латентностью, основанных на коммутации пакетов.

Хотя традиционно NTP использует для своей работы протокол UDP, он также способен работать и поверх TCP. Система NTP чрезвычайно устойчива к изменениям латентности среды передачи.

Время, представляется в системе NTP 64-битным числом, состоящим из 32-битного счетчика секунд и 32-битного счетчика долей секунды, позволяя передавать время в диапазоне 2 32 секунд, с теоретической точностью 2 -32 секунды. Поскольку шкала времени в NTP повторяется каждые 2 32 секунды (136 лет), получатель должен хотя бы примерно знать текущее время (с точностью 68 лет). Также следует учитывать, что время отсчитывается с полуночи 1 января 1900 года, а не с 1970, поэтому из времени NTP нужно вычитать почти 70 лет (с учетом високосных лет), чтобы корректно совместить время с Windows или Unix-системами.

Как это работает

NTP-серверы работают в иерархической сети, каждый уровень иерархии называется ярусом (stratum). Ярус 0 представлен эталонными часами. За эталон берется сигнал GPS (Global Positioning System) или службы ACTS (Automated Computer Time Service). На нулевом ярусе NTP-серверы не работают.

NTP-серверы яруса 1 получают данные о времени от эталонных часов. NTP-серверы яруса 2 синхронизируются с серверами яруса 1. Всего может быть до 15 ярусов.

NTP-серверы и NTP-клиенты получают данные о времени от серверов яруса 1, хотя на практике NTP-клиентам лучше не делать этого, поскольку тысячи индивидуальных клиентских запросов окажутся слишком большой нагрузкой для серверов яруса 1. Лучше настроить локальный NTP-сервер, который ваши клиенты будут использовать для получения информации о времени.

Иерархическая структура протокола NTP является отказоустойчивой и избыточной. Рассмотрим пример его работы. Два NTP-сервера яруса 2 синхронизируются с шестью различными серверами яруса 1, каждый — по независимому каналу. Внутренние узлы синхронизируются с внутренними NTP-серверами. Два NTP-сервера яруса 2 координируют время друг с другом. В случае отказа линии связи с сервером яруса 1 или с одним из серверов уровня 2 избыточный сервер уровня 2 берет на себя процесс синхронизации.

Аналогично узлы и устройства яруса 3 могут использовать любой из серверов яруса 2. Что еще более важно, так это то, что наличие избыточной сети серверов NTP гарантирует постоянную доступность серверов времени. Синхронизируясь с несколькими серверами точного времени, NTP использует данные всех источников, чтобы высчитать наиболее точное временя.

Стоит отметить, что протокол NTP не устанавливает время в чистом виде. Он корректирует локальные часы с использованием временного смещения, разницы между временем на NTP-сервере и локальных часах. Серверы и клиенты NTP настраивают свои часы, синхронизируясь с текущим временем постепенно либо единовременно.

Управление временем - один из ключевых аспектов системного администрирования. Как правило, все клиентские серверы и рабочие станции синхронизируют время с доменом Active Directory, однако откуда берется точное время в AD? Это зависит от разных факторов. В стандартной конфигурации время синхронизируется с серверами Microsoft, а виртуальные машины обычно получают данные от хост-сервера.

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

За синхронизацию компьютеров и серверов Windows отвечает сетвой протокол Network Time Protocol (NTP ). NTP использует для своей работы протокол UDP порт по умолчанию 123. Что бы в дальнейшем можно было настроить работу этого сетевого протокола, необходимо проверить, не блокирует ли этот порт фаерволл.

Способы указания NTP Сервера.

1) Команда w32tm позволяет задать список пиров, предоставляющих информацию о точном времени для домена. Чтобы получить дополнительные сведения о команде w32tm, введите в командной строке указанную команду w32tm /?
Первым, что необходимо сделать, это выяснить в каком состоянии находятся контролеры домена в домене. Для этого запускаем в командной строке команду (если у вас права доменного администратора, то можете запустить командную строку на своей рабочей станции)
w32tm /monitor - команда позволяет посмотреть с каким сервером (серверами)/сервисом происходит синхронизация и какая разница во времени с эталонным севером.
w32tm /config /manualpeerlist:time.windows.com /syncfromflags:manual /reliable:yes /update - этой командой мы указываем с каким сервисом/сервером будет происходить синхронизация (в данном примере с time.windows.com).
Эта команда выполняется на контроллере домена однократно и записывает указанные адреса в реестр (по пути HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\Parametrs в параметре NTPServer должно быть прописано time.windows.com). Можно указать сразу несколько серверов, разделенных пробелами.


2) Еще один способ указать контролеру домена сервер с кем он будет синхронизироваться по времени, это локальные или групповые политики. Запускаем реестр- Нажмите кнопку Пуск, выберите команду Выполнить, введите в командную строку gpedit.msc и нажмите кнопку ОК . Заходим «Конфигурация компьютера- Политики- Административные шаблоны- Система- Служба времени Windows- Поставщики времени» и настраиваем политику. В данном примере в значении NTPServer прописываем time.windows.com , в значении Тип указываем NTP . Тип- указывает узлы одноранговой сети, принимающие синхронизацию следующих типов:
NoSync - Служба времени не синхронизируется с другими источниками.
NTP- Служба времени выполняет синхронизацию с серверами, указанными в записи реестра NtpServer.
NT5DS- Служба времени выполняет синхронизацию на основе иерархии домена.
AllSync- Служба времени использует все доступные механизмы синхронизации.

Значение CrossSiteSyncFlags выбираем 2.

CrossSiteSyncFlags. Определяет возможность выбора службой партнеров по синхронизации за пределами домена компьютера.
Нет 0
PdcOnly 1
Все 2

В значении ResolvePeerBackoffMinutes прописываем 15

ResolvePeerBackoffMinutes- указывает первоначальный интервал ожидания (в минутах) перед тем, как начать поиск узла одноранговой сети для синхронизации. Если службе времени Windows не удается успешно синхронизироваться с источником времени, будут выполняться повторные попытки с использованием указанных значений параметров ResolvePeerBackoffMinutes и ResolvePeerBackoffMaxTimes.

В значении ResolvePeerBackoffMaxTimes прописываем 7

ResolvePeerBackoffMaxTimes- указывает максимальное число раз удвоения интервала ожидания в случае, если повторяющиеся попытки поиска узла одноранговой сети для синхронизации не дали результата. Нулевое значение предполагает, что интервал ожидания всегда равен первоначальному, указанному в параметре ResolvePeerBackoffMinutes.

В значении SpecialPollInterval прописываем 3600

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

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

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

Начиная с Windows 2000 все операционные системы Windows включают в себя службу времени W32Time . Эта служба предназначена для синхронизации времени в пределах организации. W32Time отвечает за работу как клиентской, так и серверной части службы времени, причем один и тот же компьютер может быть одновременно и клиентом и сервером NTP (Network Time Protocol).

По умолчанию служба времени в Windows сконфигурирована следующим образом:

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

Такая схема работает в большинстве случаев и не требует вмешательства. Однако структура сервиса времени в Windows может и не следовать доменной иерархии, и надежным источником времени можно назначить любой компьютер. В качестве примера я опишу настройку NTP-сервера в Windows Server 2008 R2, хотя со времен Windows 2000 процедура не особо изменилась.

Запуск NTP сервера

Сразу отмечу, что служба времени в Windows Server (начиная с 2000 и заканчивая 2012) не имеет графического интерфейса и настраивается либо из командной строки, либо путем прямой правки системного реестра. Лично мне ближе второй способ, поэтому идем в реестр.

Итак, первым делом нам надо запустить сервер NTP. Открываем ветку реестра
HKLM\System\CurrentControlSet\services\W32Time\TimeProviders\NtpServer.
Здесь для включения сервера NTP параметру Enabled надо установить значение 1 .

Затем перезапускаем службу времени командой net stop w32time && net start w32time

После перезапуска службы NTP сервер уже активен и может обслуживать клиентов. Убедиться в этом можно с помощью команды w32tm /query /configuration. Эта команда выводит полный список параметров службы. Если раздел NtpServer содержит строку Enabled:1 , то все в порядке, сервер времени работает.

Для того, чтобы NTP-сервер мог обслуживать клиентов, не забудьте на файерволле открыть UDP порт 123 для входящего и исходящего траффика.

Основные настройки NTP сервера

NTP сервер включили, теперь надо его настроить. Открываем ветку реестра HKLM\System\CurrentControlSet\services\W32Time\Parameters. Здесь в первую очередь нас интересует параметр Type , который задает тип синхронизации. Он может принимать следующие значения:

NoSync — NTP-сервер не синхронизируется с каким либо внешним источником времени. Используются часы, встроенные в микросхему CMOS самого сервера;
NTP — NTP-сервер синхронизируется с внешними серверами времени, которые указаны в параметре реестра NtpServer;
NT5DS — NTP-сервер производит синхронизацию согласно доменной иерархии;
AllSync — NTP-сервер использует для синхронизации все доступные источники.

Значение по умолчанию для компьютера, входящего в домен — NT5DS , для отдельно стоящего компьютера — NTP.

И параметр NtpServer , в котором указываются NTP-сервера, с которыми будет синхронизировать время данный сервер. По умолчанию в этом параметре прописан NTP-сервер Microsoft (time.windows.com, 0x1), при необходимости можно добавить еще несколько NTP-серверов, введя их DNS имена или IP адреса через пробел. Список доступных серверов времени можно посмотреть например .

В конце каждого имени можно добавлять флаг (напр. ,0x1 ) который определяет режим для синхронизации с сервером времени. Допускаются следующие значения:

0x1 – SpecialInterval, использование специального интервала опроса;
0x2 – режим UseAsFallbackOnly;
0x4 – SymmetricActive, симметричный активный режим;
0x8 – Client, отправка запроса в клиентском режиме.

При использовании флага SpecialInterval, необходимо установленное значение интервала в ключе SpecialPollInterval . При значении флага UseAsFallbackOnly службе времени сообщается, что данный сервер будет использоваться как резервный и перед синхронизацией с ним будут выполнятся обращения к другим серверам списка. Симметричный активный режим используется NTP-серверами по умолчанию, а клиентский режим можно задействовать в случае проблем с синхронизацией. Подробнее о режимах синхронизации можно посмотреть , либо не морочиться и просто ставить везде ,0x1 (как советует Microsoft).

Еще один важный параметр AnnounceFlags находится в разделе реестра HKLM\System\CurrentControlSet\services\W32Time\Config. Он отвечает за то, как о себе заявляет NTP-сервер и может принимать следующие значения:

0x0 (Not a time server) — сервер не объявляет себя через NetLogon, как источник времени. Он может отвечать на NTP запросы, но соседи не смогут распознать его, как источник времени;
0x1 (Always time server) — сервер будет всегда объявлять о себе вне зависимости от статуса;
0x2 (Automatic time server) — сервер будет объявлять о себе только, если он получает надежное время от другого соседа (NTP или NT5DS);
0x4 (Always reliable time server) — сервер будет всегда заявлять себя, как надежный источник времени;
0x8 (Automatic reliable time server) — контроллер домена автоматически объявляется надежным если он PDC-эмулятор корневого домена леса. Этот флаг позволяет главному PDC леса заявить о себе как об авторизованном источнике времени для всего леса даже при отсутствии связи с вышестоящими NTP-серверами. Ни один другой контроллер или рядовой сервер (имеющие по умолчанию флаг 0x2 ) не может заявить о себе, как надежном источнике времени, если он не может найти источник времени для себя.

Значение AnnounceFlags составляет сумму составляющих его флагов, например:

10=2+8 — NTP-сервер заявляет о себе как о надежном источнике времени при условии, что сам получает время из надежного источника либо является PDC корневого домена. Флаг 10 задается по умолчанию как для членов домена, так и для отдельно стоящих серверов.

5=1+4 — NTP-сервер всегда заявляет о себе как о надежном источнике времени. Например, чтобы заявить рядовой сервер (не домен-контроллер) как надежный источник времени, нужен флаг 5.

Ну и настроим интервал между обновлениями. За него отвечает уже упоминавшийся выше ключ SpecialPollInterval, находящийся в ветке реестра HKLM\System\CurrentControlSet\services\W32Time\TimeProviders\NtpClient. Он задается в секундах и по умолчанию его значение равно 604800, что составляет 1 неделю. Это очень много, поэтому стоит уменьшить значение SpecialPollInterval до разумного значения, скажем до 1 часа (3600).

После настройки необходимо обновить конфигурацию сервиса. Сделать это можно командой w32tm /config /update. И еще несколько команд для настройки, мониторинга и диагностики службы времени:

w32tm /monitor – при помощи этой опции можно узнать, насколько системное время данного компьютера отличается от времени на контроллере домена или других компьютерах. Например: w32tm /monitor /computers:time.nist.gov
w32tm /resync – при помощи этой команды можно заставить компьютер синхронизироваться с используемым им сервером времени.
w32tm /stripchart – показывает разницу во времени между текущим и удаленным компьютером, причем может выводить результат в графическом виде. Например, команда w32tm /stripchart /computer:time.nist.gov /samples:5 /dataonly произведет 5 сравнений с указанным источником и выведет результат в текстовом виде.

w32tm /config – это основная команда, используемая для конфигурирования службы NTP. С ее помощью можно задать список используемых серверов времени, тип синхронизации и многое другое. Например, переопределить значения по умолчанию и настроить синхронизацию времени с внешним источником, можно командой w32tm /config /syncfromflags:manual /manualpeerlist:time.nist.gov /update
w32tm /query — показывает текущие настройки службы. Например команда w32tm /query /source покажет текущий источник времени, а w32tm /query /configuration выведет все параметры службы.

Ну и на крайний случай 🙁
w32tm /unregister — удаляет службу времени с компьютера.
w32tm /register – регистрирует службу времени на компьютере. При этом создается заново вся ветка параметров в реестре.