WindowsServerのNTP設定で苦戦した話

先日、プライマリにあたるNTPが落ちた場合にセカンダリにあたるNTPから時刻同期ができるかという内容の試験にドはまりした。

 

本番環境

OS:WindowsServer2016(ADサーバ用として構築済み)

NTP:プライマリ、セカンダリともスイッチ(Nexus93180YC)のNTP機能を利用して時刻同期

 

最初、WindowsServerのレジストリ値は以下を設定していた。

 ・キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

  値 : AnnounceFlags
  データ:5
 ・キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
      値 : Type
  データ:NTP
      値 : NtpServer
  データ:192.168.10.31,0x9 192.168.10.30,0xa

※Ntpserverのデータに記載したレジストリ値の意味は以下。

0x1 Symmetric Activeモードで同期/Windowsで実装した一定間隔での同期

0x2 Symmetric Activeモードで同期/フォールバック時に利用するNTPサーバを指定

0x4 Symmetric Activeモードで同期/RFC1305に準拠した間隔での同期

0x8 Clientモードで同期/RFC1305に準拠した間隔での同期

※上記の0x1~0x8はそれぞれを組み合わせて使うこともできるそう。

例:0x8 + 0x2 =0xa

 

今回は、最初にも話した通り、プライマリにあたるNTPが落ちた場合にセカンダリにあたるNTPから時刻同期ができるようにしたいため、192.168.10.31,0x9(プライマリ) 192.168.10.30,0xa(セカンダリ)としていた。

 

プライマリ側のスイッチ(NTP)の電源をNW担当の方に落としてもらい、時刻同期をコマンドの w32tm /query /statusで確認したところソースIDが192.168.10.31から全然かわらない...。

おや?と思い30分以上時間をおいてみたがソースIDが変更されることもなく、さらには最終正常同期時刻もつい最近の時間ではないか...。

電源を落としているのにプライマリ側から時刻を取ってるなんておかしいと思い、とりあえず、w32tm /resync で強制同期をかけてセカンダリのNTPから時刻同期ができるか確認してみたら今度は、

 

「再同期コマンドをローカル コンピューターに送信しています
時刻データが利用できなかったため、コンピューターは同期をとり直しませんでした。」

 

と表示される。また、ソースIDもローカルクロックを参照していることになっていた。NW担当に聞いてみたらセカンダリのスイッチ(NTP)の電源は入っているとのこと。

 

何が原因なのかと自宅の検証環境でも実施。

ちなみに検証環境はこんな感じ。

自宅検証環境

OS:WindowsServer2016(ADサーバ用として構築済み)

NTP:CentOS7を使用してプライマリ、セカンダリ用で2台NTPサーバを構築 

レジストリ値は本番環境と同じ値で記載し、時刻同期できるかプライマリのNTPサーバの電源を落として確認してみたところ、やはりできない。

レジストリ値を以下にしてみる。

  ・キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

       値 : NtpServer
  データ:192.168.10.31,0x8 192.168.10.30,0x2

検証時には0xaの意味もわかっていなかったので0x8と0x2にして、Windowsタイムサービスを再起動し、再度プライマリ側のNTPサーバの電源を落として確認してみたところうまくいった。

 

後日、検証でうまくいったから本番でもうまくいくだろうと検証と同じレジストリ値にしてやってみたが、うまくいかず振り出しに戻ってしまった。。

 

さらに深く検索してみると以下、二つの記事にたどり着いた。

 

http://forfreeworld.com/archives/51667734.html

https://serverfault.com/questions/725810/windows-2012-r2-ntp-server-unable-to-sync-with-cisco-nexus

どうやらWindowsServer2016からは0x9で設定すると時刻同期がされなかったり、ローカルクロックでの時刻同期になったりするとのこと。

おっ、、、最初に起きていた事象と同じじゃないか!

 

 

また、もう一つのサイトを読んでみるとNexusのNTP機能は時刻の同期に使用している「モード」がWindowsと違うらしくWindowsServerからの要求を拒否している可能性が高いらしい。

そのため、CiscoNexusのNTP機能を使用して時刻同期するには 0x8 は必須とのこと。

 

と、、なると以下が正解なのでは?と思いレジストリ値を変更。

  ・キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

       値 : NtpServer
  データ:192.168.10.31,0x8 192.168.10.30,0xa

再び、タイムサービスを再起動し、プライマリ側のスイッチを落としてもらい、セカンダリから時刻同期ができるか確認してみたところうまくいった。

 

こんなので1日半以上使ってしまった。。