Текст:
Казалось бы, по теме синхронизации времени в домене 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) и ... локальные часы начинают плавно синхронизироваться, путем корректировки тактовой частоты.
Комментарии
Сегодня столкнулся с
Опубликовано пользователем manager
Сегодня столкнулся с проблемой - все сконфигурировано правильно, но время не синхронизируется.
Оказалось, что NTP сервера ntp*.vniiftri.ru блокируют трафик от определенных Интернет провайдеров.
Выявить такие ситуации можно анализируя сетевой трафик, например с помощью Network Monitor. Будет видно, что ваш сервер посылает правильный запрос, а в ответ ему ничего не приходит.
P.S. Аналогично time.windows.com и часть серверов ru.pool.ntp.org
Да, внутренние настройки -
Опубликовано пользователем Николай (не проверено)
Да, внутренние настройки - это хорошо, но и это очень важный момент:
"Допустим, что в вашем домене, по какой-либо причине, в течении длительного времени не было синхронизации с внешним NTP. Обнаружив проблему вы видите, что разница составляет 320 секунд."
Проблема как раз в обнаружении проблемы. Я на простом домашнем компе написал батник, который синхронизирует время и засунул ярлык в автозагрузку. Когда внешне всё в порядке, то всё нормально синхронизируется. После этого службу даже можно остановить, чтобы не путалась под ногами. А если внешний сервер отвалится? w32tm об этом сообщит и завершит работу вроде бы штатно, при этом errorlevel=0. И окно cmd закроется, тем более, что оно у меня вообще свёрнуто. И я буду думать, что синхронизация продолжается. А как сделать так, чтобы неудачная попытка синхронизации изменяла поведение батника?
На вопрос так как он
Опубликовано пользователем manager
На вопрос так как он поставлен ответа у меня нет, но позволю предложить свое решение.
1. служба w32time остается включенной и настраивается на требуемый режим синхронизации, под ногами она совершенно не путается, это не какой-нибудь там windows search или diagnostic policy
2. в task scheduler регулярно запускается bat файл сверяющий время на локальном компьютере и ntp сервере при помощи команды w32tm /stripchart /computer:ntp1.vniiftri.ru /dataonly /samples:2
вывод там будет такой
The current time is 28.03.2018 17:40:53.
17:40:53, +00.3551899s
его можно распарсить и при расхождении во времени больше заданного выдавать оповещение
А как синхронизировать время
Опубликовано пользователем Bob (не проверено)
А как синхронизировать время на сетевых устройствах (принтера, свитчи, камеры) с контроллером домена? Их в домен не добавить и реестра у них нет.
Клиентом может быть любое
Опубликовано пользователем manager
Клиентом может быть любое устройство поддерживающее протокол NTP.
Вводить в домен не обязательно.
Просто задайте на устройстве адрес вашего домен контроллера и убедитесь, что на сетевом уровне открыты порты для NTP.
Добавить комментарий.