WindowsサーバをLinuxからも同期できるNTPサーバとして構成する

##時刻同期は大切です！
![nebou_man.png](https://qiita-image-store.s3.amazonaws.com/0/83224/85abc2ec-aad8-ab7d-25bc-a25c8a6c45ef.png)
WindowsサーバをNTPサーバにするとLinuxからの時刻同期に手こずることがよく有りますよね？そんな人のために設定手順をまとめてみました。

##環境
* 外部NTPサーバ: ntp.jst.mfeed.ad.jp (210.173.160.87)
* 内部NTPサーバ: 192.168.0.1（Windows Server 2012 R2）
* 内部NTPクライアント: 192.168.0.23（CentOS 7.x）

※Active Directory 環境の場合はFSMO（PDCエミュレータ）を持っているドメインコントローラ、それ以外のドメインコントローラーともにデフォルト状態でLinuxから時刻同期をすることができました。確認したのはWindows Server 2016になります。

<dl>
  <dt>時刻同期フロー</dt>
  <dd>外部NTP←内部NTP←（Linux、Windows、ルータ等のNTPクライアント）</dd>
  <dd>※NTPプロトコルが通信できるようファイアウォールなどの許可設定が別途必要です</dd>
</dl>

##NTP設定
レジストリを編集します。

```ntp.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
"NtpServer"="ntp.jst.mfeed.ad.jp,0x8"
"Type"="NTP"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config]
"LocalClockDispersion"=dword:00000000
"AnnounceFlags"=dword:00000005
"MinPollInterval"=dword:00000006
"MaxPollInterval"=dword:0000000a
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer]
"Enabled"=dword:00000001
```

<dl>
  <dt>Parameters - NtpServer</dt>
  <dd>外部NTPサーバを記述します。RFC準拠でMin/MaxPollIntervalを使えるよう0x8フラグを指定します。複数記載する場合は区切り文字にスペースを使います。</dd>
  <dd>デフォルト値：time.windows.com,0x9</dd>
  <dt>Parameters - Type</dt>
  <dd>タイプをNTPにします</dd>
  <dd>デフォルト値：NTP（AD環境の場合はNT5DS）</dd>
  <dt>Config - LocalClockDispersion</dt>
  <dd>0x0を指定します。</dd>
  <dd>デフォルト値：0xa</dd>
  <dt>Config - AnnounceFlags</dt>
  <dd>権威ある時刻サーバを意味する0x5を指定します。</dd>
  <dd>デフォルト値：0xa</dd>
  <dt>Config - MinPollInterval</dt>
  <dd>0x6（2の6乗＝64秒）を指定します。Linuxのntpdの<a href="https://access.redhat.com/solutions/39194">minpoll値</a>がデフォルトで6の為。ntpdのminpoll値を変更している場合は調整が必要かもしれません。</dd>
  <dd>デフォルト値：0xa（AD環境の場合は0x6）</dd>
  <dt>Config - MaxPollInterval</dt>
  <dd>0xa（2の10乗＝1024秒）を指定します。Linuxのntpdの<a href="https://access.redhat.com/solutions/39194">maxpoll値</a>がデフォルトで10の為。ntpdのmaxpoll値を変更している場合は調整が必要かもしれません。</dd>
  <dd>デフォルト値：0xf（AD環境の場合は0xa）</dd>
  <dt>TimeProviders\NtpServer - Enabled</dt>
  <dd>NTPサーバを有効にする為、0x1を指定します。</dd>
  <dd>デフォルト値：0x0（AD環境の場合は0x1）</dd>
</dl>

※各デフォルト値は検証環境のWindows Server 2008 R2の場合です。後日、Windows Server 2016で確認すると一部異なるものもありました。

##サービス設定
スタートアップ設定を行い自動起動するようにします。
※AD環境の場合はデフォルトで自動起動の為、スタートアップ設定は不要です

```
sc config w32time start= auto
```

レジストリ変更を反映させる為、サービス再起動します。

```
sc stop w32time && sc start w32time
```

##NTP動作確認（Windowsサーバ）
w32tmコマンドにて確認を行います。

```
>w32tm /query /status /verbose
閏インジケーター: 0 (警告なし)
階層: 3 (二次参照 - (S)NTP で同期)
精度: -6 (ティックごとに 15.625ms)
ルート遅延: 0.1221313s
ルート分散: 0.8496165s
参照 ID: 0xD2ADA057 (ソース IP:  210.173.160.87)　←　ソースIPが表示されていればOK
最終正常同期時刻: 2015/11/20 16:22:11
ソース: ntp.jst.mfeed.ad.jp,0x8
ポーリング間隔: 7 (128s)

フェーズ オフセット: -0.0090275s
クロック レート: 0.0156250s
State Machine: 1 (保留)
タイム ソース フラグ: 0 (なし)
サーバーのロール: 576 (高信頼タイム サービス)
最終同期エラー: 0 (コマンドは正しく完了しました。)　←　このメッセージが表示されていればOK
最終正常同期時刻からの時間: 36.9219284s
```
　上記のステータスになっていれば基本的には正常なのですが、この状態でもしばらく待たないとLinuxから同期できないことがあります。（通常、w32timeサービス再起動から1～2分程度）
　ソースが「Local CMOS Clock」となっている場合は、外部NTPサーバと正常に同期できていません。設定を確認し問題無い場合は参照する外部NTPサーバを変更してみてください。

##Linuxの設定と動作確認
設定ファイルを編集します。

```/etc/ntp.conf
server 192.168.0.1 iburst
```

サービスを再起動しntpq -pコマンドで同期確認を行います。

```
# systemctl restart ntpd
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*192.168.0.23    210.173.160.87   3 u   21   64    1    0.253   42.460   0.517
↑
内部NTPサーバ（192.168.0.23）の先頭にアスタリスクが付いていること
refidに外部NTPサーバのIPアドレスが表示されていること
```

##バック・トゥ・ザ・フューチャー？
コレでサーバが未来や過去にタイムトラベルすることが無くなりますねッ！
![time_machine.png](https://qiita-image-store.s3.amazonaws.com/0/83224/aee06a6e-bf64-6733-a18f-c459b3b4e106.png)