NTP в домене Windows

Текст: 

Казалось бы, по теме синхронизации времени в домене Windows написаны десятки подробных статей статей, например, качественная How the Windows Time Service Works.

Но пытаясь объяснить поведение ОС при изменении части настроек столкнулся с большими затруднениями - в статьях оказалось много пробелов, а местами и неточностей. На опыты и уяснение их результатов ушло несколько дней. Надеюсь статья поможет вам сэкономить время и посвятить его более приятным занятиям.

Начнем. Зачем нам в домене нужно точное время на всех компьютерах?

Во-первых из-за Kerberos. Компьютер начинает проверку своей подлинности на контроллере с посылки Authentication Service Request (AS_REQ).  Составной частью пакета является зашифрованная отметка времени. На котроллере домена отметка времени сравнивается с текущим временем системы и при разнице более 300 секунд запрос отклоняется. Эта мера безопасности затрудняет передачу измененных AS_REQ.

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

Если в первом случае, достаточно синхронизировать время внутри домена, то во втором необходима также синхронизация с внешним источником точного времени. Это может быть собственный NTP сервер, построенный на базе устройств спутниковой навигации GPS или ГЛОНАСС. Но обычно используются бесплатные NTP сервера доступные в Интернет.

В теории все получается просто, при вводе в домен на компьютерах автоматически настраиваются параметры и все клиентские станции начинают синхронизировать свое время с домен контроллером на котором они прошли аутентификацию. В свою очередь контроллеры домена синхронизируются с контроллером на котором находится FSMO роль PDC. По умолчанию, PDC синхонизируется с time.windows.com и его необходимо вручную настроить на нужный источник. Чтобы разобраться в текущей ситуации, можно последовательно выполнить команду

w32tm /query /peers

на рабочей станции, на домен контроллере с которого она берет время и на PDC.

Поняв текущую схему, можно переходить к изменениям настроек. Здесь нужно понимать, что есть сервис Windows Time (W32Time) и его субкомпонент который переводит часы на компьютере или изменяет их тактовую частоту. Сейчас мы будем говорить о настройках W32Time касающихся работы с NTP серверами.

Настройки расположены в двух разделах реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\W32Time

При установке ОС создается только первый раздел, второй появляется при применении локальной или доменной политики и имеет приоритет. Из командной строки настройки Windows Time можно помотреть командой w32tm /query /configuration. Причем, настройки взятые из первого раздела будут отображаться с отметкой (Local), из второго с отметкой (Policy).

Настройки достаточно подробно описаны в Windows Time Service Tools and Settings. У меня, сложности вызвал, параметр HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\NtpServer

Он представляет собой перечисление NTP серверов с которыми может синхронизироваться данный сервер. Каждый сервер представляет собой IP адрес или DNS имя, а также флаг, относящийся к данному NTP серверу. Флаг следует после имени сервера и отделяется от него запятой. Сервера в строке разделяются пробелами. (Внимание. Допустим только один пробел, двойной пробел считается концом строки и имена серверов после него не рассматриваются).

Пример строки:

ntp1.vniiftri.ru,0x02 ntp2.vniiftri.ru,0x02 ntp3.vniiftri.ru,0x02 ntp4.vniiftri.ru,0x02

Используется два основных флага 0x01 и 0x02.

0x01 SpecialInterval

От этого флага зависит как будет Windows Time использоват параметры:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient\SpecialPollInterval

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\MinPollInterval

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\MaxPollInterval

Если данный флаг присутствует, то сервер NTP будет опрашиваться через заданный параметром SpecialPollInterval период времени (секунды).

При отсутствии флага будет использоваться динамический интервал, ограниченный параметрами MinPollInterval и MaxPollInterval (двоичный логарифм от секунд, например, значение параметра 6 значит опрос сервера будет происходит через 2 в степени 6 = 64 секунды).

Посмотреть интервалы опроса и время оставшееся до следующего опроса можно командой w32tm /query /peers - строки PeerPoll Interval и Time Remaining.

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

Имеются неожиданные последствия, если все сервера указать с данным флагом - они перейдут в статус Pending. Если выполнить команду w32tm /monitor то можно увидеть, что RefId изменился на 'LOCL' [0x4C434F4C]. То есть, сервер не стал синхронизироваться с внешними NTP и выбрал источником синхронизации Local CMOS Clock (идентификатор этого источника 0x4C434F4C). С таким сервером часть клиентов синхронизироваться не будет, например, UNIXы в зависимости от настроек.

0x02 UseAsFallbackOnly

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

Я рекомендую не указывать никаких флагов, а просто задать имена серверов разделенные пробелами:

ntp1.vniiftri.ru ntp2.vniiftri.ru ntp3.vniiftri.ru ntp4.vniiftri.ru

и управлять частотой опроса через параметры MinPollInterval и MaxPollInterval

Все настройки сделанные в реестре вручную либо через политику вступают в силу после рестарта сервиса W32Time.

Собственно все, про NTP, в реализации от Микрософт.

Теперь немного о субкомпоненте (clock discipline subcomponent) который переводит локальные часы системы или изменяет их тактовую частоту в соответствии с данными NTP.

Он также настраивается через реестр, выше была приведена статья с описанием настроек, к данному субкомпоненту относятся:

FrequencyCorrectRate
HoldPeriod
LargePhaseOffset
MaxAllowedPhaseOffset
MaxNegPhaseCorrection
MaxPosPhaseCorrection
PhaseCorrectRate
PollAdjustFactor
SpikeWatchPeriod
UpdateInterval

В большинстве случаев их изменение не требуется.

Но иногда таки приходится.

Например, параметр MaxAllowedPhaseOffset (по умолчанию 300 секунд) управляет способом перевода локальных часов. Если расхождение между локальным временем и NTP источником меньше MaxAllowedPhaseOffset то W32Time пытается скорректировать время изменением тактовой частоты часов. Если - больше то локальное время переводится согласно полученному от NTP сервера.

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

Лучше попробовать способ с изменением тактовой частоты, для этого в первую очередь нужно установить MaxAllowedPhaseOffset = 350. Это необходимое, но недостаточное условие. Также должно выполнятся соотношение:

|CurrentTimeOffset| / (PhaseCorrectRate*UpdateInterval) < SystemClockRate / 2

SystemClockRate получим командой w32tm /query /status /verbose строка вывода ClockRate: 0.0156250s переведем секунды в такты ОС (1ms = 10000 тактов): 0.0156250s*1000*10000 = 156250 тактов.

В XP w32tm /query еще не поддерживается и значение SystemClockRate можно взять из реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\LastClockRate

Выполняем команду w32tm /query /configuration - берем строки вывода UpdateInterval: 100 и PhaseCorrectRate: 1 (можно взять эти же значения из реестра).

UpdateInterval - по единицам измерения данной величины в источниках от Микрософт есть противоречие. В вышеприведенной статье указано, что величина измеряется в тактах и ее нужно подставлять в формулу как есть. В описании групповой политики единица измерения указана 1/100 секунды. В микрософтовском примере значение UpdateInterval используется без пересчета (по моим опытам это действительно так). PhaseCorrectRate - скалярная величина используем ее как есть.

Подставляем в условие:

|3200 000 000| / (1*100) < 156250 / 2

32 000 000 < 78125 не выполняется.

Подберем значение UpdateInterval с которым условие будет выполняься = 40960. Сделаем запас и установим UpdateInterval = 45000.

|3200 000 000| / (1*45000) < 156250 / 2

71111 < 78125 второе условие выполнено.

Изменяем значение UpdateInterval в реестре, перезапускаем сервис W32Time. Устраняем причину неработоспособности NTP (если необходимо выполняем w32tm /resync) и ... локальные часы начинают плавно синхронизироваться, путем корректировки тактовой частоты.

Комментарии

Да, внутренние настройки -

Да, внутренние настройки - это хорошо, но и это очень важный момент:

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

Проблема как раз в обнаружении проблемы. Я на простом домашнем компе написал батник, который синхронизирует время и засунул ярлык в автозагрузку. Когда внешне всё в порядке, то всё нормально синхронизируется. После этого службу даже можно остановить, чтобы не путалась под ногами. А если внешний сервер отвалится? w32tm об этом сообщит и завершит работу вроде бы штатно, при этом errorlevel=0. И окно cmd закроется, тем более, что оно у меня вообще свёрнуто. И я буду думать, что синхронизация продолжается. А как сделать так, чтобы неудачная попытка синхронизации изменяла поведение батника?

Добавить комментарий.

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
CAPTCHA на основе изображений
Введите символы, которые показаны на картинке.