Cisco 機器の時刻を Windows マシンと NTP で同期する

Cisco 機器の時刻を、到達可能なネットワーク上にある Windows マシンと同期する方法について、本職のほうで長いこと試験してたのがやっと成功した。普通にググってもうまいこといく方法が見つからなかったけど、いろいろいじくってたらうまくいったので情報共有。

Windows XP と 2003 に搭載されている Windows タイムサービスに対して、Cisco 機器から NTP リクエストを送って時刻を同期する方法。Windows タイムサービスは Windows 2000 にもあるけど、XP 以降のバージョンといろいろ違うし、検証もしてないのでここでは除外。

Microsoft のサポート技術情報には「Windows XP で権限のあるタイム サーバーを構成する方法」なんて情報もあるけど、ここに書いてある情報ではうまくいかない。で、最終的には「SpecialPollInterval を小さい値にする」っていうのが正解。

挙動から推測すると、Windows タイムサービスには以下のような 3 つの内部状態があるっぽい。

# 状態 説明
1 上位サーバーと同期していない サービスが起動した直後
2 上位サーバーと同期している サービスが起動して、初回の同期が成功した
3 上位サーバーとの同期状態が保たれている 初回の同期が成功して以降、定期的な同期が成功している

NTP のリクエストに対しては、どの状態でもそれに対応したレスポンスをちゃんと返す。でも、Cisco 機器が実際に「信頼できる時刻情報」として同期するのは 3 の状態のレスポンスに対してだけ。それで、2 の状態から 3 の状態に移行するのに SpecialPollInterval に指定した時間がかかる。サポート技術情報にも書いてあるけど、この値のデフォルトは、ドメインのメンバで 1 時間で、ワークグループだと 7 日。ずっとワークグループのデフォルト設定のままで試験していて、2 の状態の Windows に対してリクエストを送っていたのでまったく同期してくれなかったというわけ。

そこで、SpecialPollInterval を、たとえば 1 分にしてサービスを再起動すると、短時間で 3 の状態になり、Cisco 機器が Windows マシンを信頼できる時刻源として認識し、同期するようになる。

ちなみに、試験では Allied Telesis のハブも使ったけど、この子は 2 の状態でも平気で同期してた。