みなさん、こんにちは。
昨日の投稿に引き続きインターネット接続が許可されない環境でシステムを構築する話題です。
IoT端末すべてで時刻を同期したい場合、NTPサーバーが必要になりますよね。
今回はオフライン環境下のWindows ServerでNTPサーバーを構築する方法について説明します。
もしLinuxを使いたい場合は、UbuntuでNTPサーバーを構築する方法も別記事で解説していますので、こちらをご参考ください。
オフライン環境向けNTPサーバー構築の基本概念
Windows Serverには、標準で「Windows Time Service(W32Time)」が搭載されています。このサービスは、ドメイン環境内での時刻同期を基本とし、外部との同期も可能ですが、インターネット接続がない場合は、外部の時刻ソースに頼る必要はありません。
かわりに、以下の2点を設定する必要があります。
- AnnounceFlags の設定
オフライン環境下では、当該サーバーを「信頼できる時刻ソース」として内部に通知するため、AnnounceFlags の値を「5」に設定します。これにより、クライアントはこのサーバーからの時刻提供を信頼できるようになります。 - NtpServer の値を空にする
通常、NtpServer には同期元サーバーのアドレスが設定されますが、オフライン環境では外部との同期は行わないため、この値を空にしておきます。つまり、余計な外部時刻ソースへの参照を排除し、サーバー自身の時刻を基準とする構成にします。
これらの設定により、Windows Serverは自らの内部クロックを基に、ネットワーク内の各端末に対して正確な時刻を提供するNTPサーバーとして動作するようになります。
レジストリ設定によるNTPサーバーの有効化
それでは、実際の設定手順を詳しく見ていきましょう。
以下の手順は、管理者権限でレジストリエディタを操作することを前提としています。
1. Windows Time ServiceのNTPサーバー機能の有効化
- レジストリエディタの起動
「regedit.exe」を管理者権限で実行し、以下のパスに移動します。- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer
- NtpServer の有効化
- 右ペインに表示される「Enabled」エントリーの値を確認し、「1」 に設定してください(デフォルト値は「0」)。これにより、NTPリクエストに対してサーバーが応答可能な状態となります。
2. オフライン環境向けの追加設定
インターネット接続がない環境では、通常の同期元設定は不要です。そのかわり、以下の変更を加えます。
- AnnounceFlags の設定
次のレジストリキーにアクセスします。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
- この中の「AnnounceFlags」というエントリーを探し、その値を「5」に変更します(デフォルト値は「a」)。この設定は、サーバー自身が信頼できる時刻ソースであることを内部にアナウンスする役割を持ちます。
- NtpServer の値のクリア
同じく、上記の「Config」キー内にある「NtpServer」のエントリーを空にします(またはデフォルト値「time.windows.com,0x8」を削除します)。これにより、外部の時刻サーバーへの同期設定を無効にし、あくまで内部クロックを基準とする構成に切り替えます。
これらの設定変更後、Windows Time Serviceを再起動することで、設定が有効となります。
UDPポート123の開放
NTPはUDPの123番ポートを使用して時刻同期の通信を行います。
したがって、ファイアウォールやセキュリティ機器において、UDP123ポートがブロックされていないか必ず確認してください。
ポートが閉じていると、ネットワーク内のクライアントは時刻同期を行えず、結果として各端末の時刻にずれが生じる可能性があります。
大幅な時刻ずれに対する対策
システムの起動直後や、何らかの理由で内部時計が大幅にずれている場合、Windows Time Serviceは自動的に時刻の同期を拒否することがあります。
- LocalClockDispersion の設定
次のレジストリキーにアクセスします。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
- この中の「LocalClockDispersion」というエントリーを探し、その値を「0」に変更します(デフォルト値は「a」)。
この設定でも解決しない場合、次項のMaxPosPhaseCorrection や MaxNegPhaseCorrection といったレジストリ値の修正を検討してください。ただし、オフライン環境ではあらかじめ正確な時刻を設定しておくことが推奨されます。
Linuxクライアントとの時刻同期の注意点
ネットワーク内でWindows ServerのNTPサーバーとLinuxクライアント間で時刻同期を試みる際、双方のプロトコル仕様や初期設定の違いにより、同期がうまくいかない場合があります。
基本的には、前述のオフライン環境向け設定(AnnounceFlags の変更と NtpServer の値のクリア)により、多くの環境では正常に同期が行われるはずですが、万が一 Linux クライアント側で同期に問題が発生する場合は、以下の追加対策を試みてください。
レジストリの MinPollInterval と MaxPollInterval の調整
Windows Time Service は、クライアントからの時刻同期要求に対し、一定のポーリング間隔で応答します。これらの間隔は、レジストリ内の MinPollInterval および MaxPollInterval の値によって決定されており、環境やクライアントの特性によっては、デフォルト値がLinuxクライアントに適さない場合があります。
- MinPollInterval と MaxPollInterval の確認と変更
レジストリエディタで以下のキーにアクセスし、MinPollInterval と MaxPollInterval の値を確認します。これらは通常、NTPクライアント側の設定となっていますが、サーバーとして応答する際にも影響を及ぼす場合があります。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
- Linuxクライアントとの同期が上手くいかない場合、MinPollInterval をより短い値(例えば 6 など)に、MaxPollInterval を適宜延長(例えば a など)に設定して、サーバーのポーリング間隔を調整してください。
※設定値は、環境やネットワークの特性に合わせて調整する必要があります。変更後は、必ず Windows Time Service の再起動を行い、設定が反映されているか確認してください。
この調整により、Linuxクライアントがより柔軟にサーバーの時刻情報を受信できるようになり、同期の安定性が向上する可能性があります。
Hyper-V環境での特記事項
サーバーがHyper-V上で稼働している場合、Windows Time Serviceはホストとの時刻同期を行うため、VMICTimeProviderという機能が自動的に有効となっています。
しかし、オフライン環境で独自のNTPサーバーとして動作させる場合、この設定が干渉するため、無効化します。
VMICTimeProvider の無効化手順
- レジストリエディタでの設定
以下のパスに移動します。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\VMICTimeProvider
- 設定変更
右ペインにある「Enabled」エントリーの値を「0」に変更してください。これにより、Hyper-Vによる自動時刻同期が停止し、NTPサーバーとしての動作が安定します。
Hyper-V環境下では、ホストとゲスト間での自動同期が原因で、意図しない時刻補正が行われるリスクがあるため、上記の設定変更を必ず実施するようにしてください。
まとめ
今回の記事では、インターネット接続がないオフライン環境において、Windows Serverを利用したNTPサーバーの構築手順を解説しました。主なポイントは以下の通りです。
- NTPサーバー機能の有効化
Windows Time Serviceの「NtpServer」機能を有効化し、レジストリ上で「Enabled」を「1」に設定する。 - AnnounceFlags の設定と NtpServer の値クリア
外部同期元が存在しない環境では、同期元設定は不要です。代わりに、「AnnounceFlags」を「5」に設定し、「NtpServer」の値を空にすることで、サーバー自身を信頼できる時刻ソースとして内部にアナウンスする。 - UDPポート123の開放
NTP通信に必須のUDP123ポートがネットワーク上でブロックされていないかを確認すること。 - 大幅な時刻ずれの対策
起動直後の大幅な時刻誤差に対しては、システム時刻の初期設定や補正用レジストリ値の見直しが必要となる。 - Linuxクライアントとの連携
WindowsとLinux間での時刻同期においても、今回の設定変更が正しく行われていれば、問題なく動作するはずです。 - Hyper-V環境特有の注意点
Hyper-V上で稼働している場合は、VMICTimeProviderを無効化することで、ホストとの干渉を回避し、NTPサーバーとしての正確な動作を確保します。
正確な時刻は、システムの信頼性や運用の安定性に直結します。インターネットに依存しない環境下でも、上記の手順をしっかり実施することで、ネットワーク全体の時刻管理が向上し、各種運用トラブルを未然に防ぐことが可能です。
ぜひ、この記事を参考に、自身の環境に最適なNTPサーバーの構築と運用に取り組んでみてください。
それでは、良いIoTライフをお過ごしください!
ピンバック: 閉域網でUbuntuをNTPサーバーに!chronyで簡単時刻同期 - ビューローみかみ
ピンバック: 閉域網でUbuntuをNTPサーバーに!chronyで簡単時刻同期 – ビューローみかみ