Debianシステム時刻を合わせる:NTP活用法と設定例

はい、承知いたしました。Debianシステムで時刻を合わせるためのNTP活用法と設定例について、約5000語の詳細な記事を作成します。


Debianシステム時刻を合わせる:NTP活用法と設定例

はじめに:なぜ正確な時刻が重要なのか

コンピューターシステムにおいて、正確な時刻は単なる「現在の時間」を示す以上の意味を持ちます。特にサーバーシステムや複数のコンピューターが連携する環境では、システムの正常な運用、トラブルシューティング、セキュリティ維持において極めて重要な要素となります。

ログファイルのタイムスタンプを想像してみてください。システム障害が発生した際、様々なコンポーネントやサービスからのログを集めて原因究明にあたります。もしこれらのログが不正確な、あるいは互いにずれた時刻で記録されていたらどうなるでしょうか? イベントの発生順序が分からなくなり、問題の特定は困難を極めるでしょう。

また、分散システム、例えばデータベースクラスタ、認証システム(Kerberosなど)、ファイル共有(NFSなど)、メッセージキューシステムなどでは、各ノード間の時刻が正確に同期していることが前提となります。時刻のずれは、データの不整合、認証失敗、トランザクションエラーなどを引き起こす可能性があります。

セキュリティの観点からも、正確な時刻は不可欠です。SSL/TLS証明書の有効期限チェック、ワンタイムパスワード生成、ログの相関分析など、時刻がずれていると正しく機能しない、あるいは攻撃の痕跡を見逃すといったリスクが発生します。

さらに、cronジョブのような自動化されたタスクは、指定された時刻に正確に実行される必要があります。ファイルシステムのタイムスタンプも、ファイルの更新や同期において正確な時刻情報に依存します。

これらの理由から、現代のシステム運用において、正確な時刻同期は必須のプラクティスとなっています。そして、その時刻同期を実現するためのデファクトスタンダードとなっているプロトコルが NTP (Network Time Protocol) です。

この記事では、Debianシステム上でNTPを利用して正確な時刻を維持する方法について、NTPの仕組みから、Debianで利用可能な主要なNTPクライアントの設定方法、トラブルシューティングまで、詳細かつ実践的に解説します。

NTP (Network Time Protocol) とは

NTPは、ネットワーク経由でコンピューターの時刻を同期するためのプロトコルです。インターネット上で利用可能な高精度な参照クロックを基に、数ミリ秒、あるいはそれ以下の精度でシステム時刻を合わせることができます。

NTPの基本概念

  • 階層構造 (Stratum): NTPネットワークは階層構造を形成しています。

    • Stratum 0: 外部の時刻源(原子時計やGPSなど)に直接接続された高精度な機器。サーバーとしては機能しません。
    • Stratum 1: Stratum 0 の時刻源に直接同期しているサーバー。プライマリタイムサーバーとも呼ばれます。
    • Stratum 2: Stratum 1 サーバーに同期しているサーバー。セカンダリタイムサーバーとも呼ばれます。
    • Stratum 3 以降: Stratum N サーバーに同期している Stratum N+1 サーバー。
      クライアントは、通常 Stratum 2 以降のサーバーに接続して時刻を同期します。階層が深くなるほど、同期精度は理論上わずかに低下しますが、インターネット上の公開NTPサーバーは通常 Stratum 2 または 3 であり、ほとんどの用途で十分な精度を提供します。
  • 参照クロック: NTPサーバーが時刻情報の基にするクロックソースです。Stratum 1 サーバーであれば原子時計やGPS受信機など、Stratum 2 以降であれば同期先のNTPサーバーが参照クロックとなります。

NTPの仕組み

NTPクライアントは、NTPサーバーに対して時刻情報の要求パケットを送信します。サーバーは自身のシステム時刻を含む応答パケットを返します。クライアントは、パケットの往復時間(ラウンドトリップタイム)を考慮して、サーバーとの時刻のオフセット(ずれ)を計算します。

このオフセット計算は、単純な往復時間の半分を引くだけではなく、より洗練されたアルゴリズム(例えば Marzullo’s algorithm など)を用いて、複数のサーバーからの応答を分析し、外れ値を除外し、最も信頼できる時刻源を選択します。また、ネットワーク遅延の変動(ジッター)の影響を最小限に抑えるための工夫も含まれています。

NTPデーモン(NTPクライアントソフトウェア)は、一度時刻を合わせた後も定期的にサーバーと通信し、システムクロックの「ドリフト」(進みや遅れ)を継続的に補正します。これにより、常に高精度な時刻を維持することができます。システムクロックは水晶発振子によって生成されますが、温度変化などの影響を受けてわずかに周波数が変動するため、ドリフト補正は必須です。

NTPプロトコルのバージョン

NTPプロトコルにはいくつかのバージョンがありますが、現在広く利用されているのは NTPv3 と NTPv4 です。NTPv4は、IPv6のサポート、より高度な認証メカニズム、より詳細な統計情報など、いくつかの改善が加えられています。Debianで提供されている主要なNTPクライアントは、NTPv4をサポートしています。

時刻同期の精度

時刻同期の精度は、以下の要素によって影響を受けます。

  • 参照クロックの精度: Stratum 0 に近いほど高精度です。
  • ネットワーク状態: 遅延、ジッター、パケットロスが大きいと精度が低下します。
  • NTPクライアントの実装: 時刻補正アルゴリズムの性能によります。
  • システム負荷: システムが高負荷状態にあると、NTPデーモンの処理が遅延し、精度に影響を与える可能性があります。
  • ハードウェアクロック (RTC): システム停止中も時刻を保持するハードウェアクロック(Real Time Clock)。起動時の初期時刻として使用されます。システムクロックとは独立しており、精度はシステムクロックよりも低いのが一般的です。NTPクライアントは、システムクロックをRTCに定期的に書き戻す機能を持つものもあります (rtcsync オプションなど)。

DebianにおけるNTPクライアントの選択肢

Debianには、時刻同期のためのNTPクライアントとしていくつかの選択肢があります。それぞれ特徴があり、用途に応じて適切なものを選択することが重要です。主要なものを紹介します。

  1. systemd-timesyncd: systemdに統合された軽量なNTPクライアントです。
  2. chrony: 高精度な時刻同期を目指した比較的新しいNTPクライアントです。
  3. ntpsec: 従来の ntpd (NTPリファレンス実装) をフォークし、セキュリティ強化を目的としたクライアント/サーバー実装です。

これらのクライアントは、通常いずれか一つだけをインストールして使用します。複数の時刻同期サービスを同時に起動すると、予期せぬ動作や時刻の不安定を招く可能性があります。

1. systemd-timesyncd

systemd-timesyncd は、systemdパッケージの一部として提供される、シンプルで軽量なSNTP (Simple Network Time Protocol) クライアントです。SNTPはNTPのサブセットであり、クライアント機能のみに特化しており、NTPサーバーとして機能することはできません。また、NTPのような高度なアルゴリズムによるドリフト補正は行わず、定期的に時刻を問い合わせて調整するシンプルな動作です。

特徴:
* 軽量でリソース消費が少ない。
* systemdに統合されており、設定がシンプル。
* デフォルトでインストールされていることが多い(Debian 9 Stretch 以降)。
* クライアント機能のみ提供。
* 基本的な時刻同期には十分だが、高精度な同期やサーバー機能は不要な場合に適しています。デスクトップ環境や、クリティカルでないサーバーでの利用に向いています。

インストール:
Debian 9以降では通常デフォルトでインストールされています。インストールされていない場合は、systemd パッケージの一部としてインストールされます。

“`bash
sudo apt update

systemd パッケージに含まれています

systemd-timesyncd サービスが有効になっているか確認

systemctl status systemd-timesyncd
“`

有効になっていない場合は、有効化して起動します。

bash
sudo systemctl enable systemd-timesyncd
sudo systemctl start systemd-timesyncd

他のNTPサービス(chronyntpsec)がインストールされていると、systemd-timesyncd は無効化されていることがあります。

設定:
設定ファイルは /etc/systemd/timesyncd.conf です。デフォルトではコメントアウトされています。NTPサーバーを指定するには、[Time] セクションの NTP= 行を編集します。複数のサーバーを指定する場合は、スペースで区切ります。

“`ini

/etc/systemd/timesyncd.conf

[Time]

NTP=

FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org

RootDistanceMaxSec=5

PollIntervalMinSec=32

PollIntervalMaxSec=2048

“`

例:日本のNTPプールサーバーを使用する場合

“`ini

/etc/systemd/timesyncd.conf

[Time]
NTP=ntp.jst.mfeed.ad.jp ntp.sakura.ne.jp
“`

または、pool.ntp.org の国別プールを指定する場合

“`ini

/etc/systemd/timesyncd.conf

[Time]
NTP=jp.pool.ntp.org
“`

設定変更後は、systemd-timesyncd サービスを再起動します。

bash
sudo systemctl restart systemd-timesyncd

使い方 (timedatectl):
systemd-timesyncd の状態確認や、時刻・タイムゾーンの変更には timedatectl コマンドを使用します。

bash
timedatectl status

出力例:

Local time: Tue 2023-10-27 10:30:00 JST
Universal time: Tue 2023-10-27 01:30:00 UTC
RTC time: Tue 2023-10-27 01:30:00
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

System clock synchronized: yes および NTP service: active であれば、正常に動作しています。
timedatectl timesync-status で同期の詳細情報を確認できます。

bash
timedatectl timesync-status

出力例:

Server: ntp.jst.mfeed.ad.jp (ntp.jst.mfeed.ad.jp)
Poll interval: 2min 8s (min: 32s; max: 34min 8s)
Leap: normal
State: synchronized
Offset: +17.566ms
Delay: 38.381ms
Packets: 18/18
Aktive: yes

長所: 軽量、設定が容易、systemdとの親和性が高い。
短所: クライアント専用、SNTPベースで高精度な時刻同期には不向き、詳細な状態確認や制御機能が少ない。

2. chrony

chrony は、特に仮想環境や断続的にネットワークに接続される環境(ノートPCなど)での使用を考慮して設計された、高精度かつ堅牢なNTPクライアント/サーバー実装です。NTPリファレンス実装である ntpd に比べて、より高速な初期同期、オフライン状態からの復帰、CPU負荷の低減、時刻の急激な調整(ステップ)を避けるためのスムーズな調整などが特徴です。また、ハードウェアクロック (RTC) との連携機能も強化されています。

特徴:
* 高精度な時刻同期が可能。
* ネットワークが断続的な環境や、仮想環境での性能が良い。
* システムクロックのドリフトを効率的に学習し、オフライン時でも比較的正確な時刻を維持できる。
* 時刻の急激な変更を避け、スムーズに調整する(デフォルト)。
* クライアントとしてもサーバーとしても機能可能。
* 豊富な設定オプションと強力な管理コマンド (chronyc)。

インストール:
bash
sudo apt update
sudo apt install chrony

インストール時に、既存のNTPサービス(systemd-timesyncdntpsec)は無効化されます。

設定:
設定ファイルは /etc/chrony/chrony.conf です。非常に多くのオプションがありますが、主要なものを解説します。

“`ini

/etc/chrony/chrony.conf (主要な設定項目)

利用するNTPサーバーを指定します。poolまたはserverを使用します。

pool: pool.ntp.org のようなラウンドロビンDNSに対応したホスト名。

server: 特定のサーバーのホスト名またはIPアドレス。

pool jp.pool.ntp.org iburst burst maxpoll 10 minpoll 6

Stratum 1 のNTPサーバーを直接指定する場合の例

server ntp.jst.mfeed.ad.jp iburst

オフライン時やNTPサーバーに同期できない場合に、ローカルクロックを代替の参照として使用します。

stratum : ローカルクロックのStratumレベルを指定します。通常は 10 とします。

distance : ルートディスタンスを指定します。通常は 0.3 とします。

allow : ローカルクロックをNTPサーバーとして提供する場合にアクセスを許可するネットワーク。

local stratum 10

システムクロックのドリフト情報を記録するファイル。

これにより、再起動時にドリフトを素早く学習できます。

driftfile /var/lib/chrony/chrony.drift

RTC (ハードウェアクロック) をシステムクロックに同期させます。

システムクロックがNTPで同期された後、定期的にその時刻がRTCに書き込まれます。

rtcsync

時刻のずれが大きい場合、一度に時刻を大きく進める(ステップ)か、

ゆっくりと調整するかを制御します。

makestep

max_offset: この値 (秒) を超えるずれが発生した場合、ステップを行います。

step_limit: ステップを許可する回数 (起動後)。0 の場合、ステップは行いません。

デフォルトでは、ずれが大きい場合でもステップではなくゆっくり調整しようとします。

起動時の初回同期で大きなずれを許容してステップしたい場合は設定します。

例: 起動時に1秒以上のずれがあればステップ、その後はステップしない

makestep 1 1

ログの設定

logdir : ログファイルを保存するディレクトリ

log measurements statistics tracking rtcclient

logdir /var/log/chrony

NTPサーバーとして機能する場合のアクセス制御

allow 192.168.1.0/24

deny all

“`

主要な設定ディレクティブの詳細:

  • pool <ホスト名> [オプション...]: pool.ntp.org のような複数のサーバーを束ねたホスト名を指定します。chrony は DNS で解決された複数のサーバーを自動的に利用します。
    • iburst: 起動時またはネットワーク接続確立時に、指定したサーバーに素早く複数のクエリを送信し、早期に同期を確立しようとします。初期同期を早めるのに役立ちます。
    • burst: 通常の動作中に、指定したサーバーに素早く複数のクエリを送信します。通常は iburst と組み合わせて使用します。
    • minpoll <N>, maxpoll <N>: 時刻を問い合わせる間隔を 2^N 秒の範囲で指定します。デフォルトは minpoll 6 (64秒) と maxpoll 10 (1024秒) です。ネットワーク状態やサーバーの負荷に応じて調整できますが、通常はデフォルトで問題ありません。
    • rtcsync: このサーバーとの同期が確立したら、ハードウェアクロック (rtcsync ディレクティブ) の同期にこのサーバーを使用します。(通常は rtcsync ディレクティブ単独で設定することが多いですが、特定のサーバーに紐づけたい場合に使うこともあります)
  • server <ホスト名またはIP> [オプション...]: 特定の単一NTPサーバーを指定します。オプションは pool と同様です。
  • local [options]: オフライン時などにローカルクロックをフォールバックとして利用する設定です。
    • stratum <N>: ローカルクロックのStratumレベルを指定します。通常は公開NTPサーバーよりも深い階層を示す高い値(例: 10)を指定します。
    • distance <seconds>: ルートディスタンス(Stratum 0 からの距離)を指定します。
  • driftfile <ファイルパス>: システムクロックのドリフト(進みや遅れの傾向)を学習し、次回起動時にこのファイルから読み込むことで素早く正確な同期を開始できます。重要な設定です。
  • rtcsync: システムクロックがNTPによって正確に同期された後、その時刻をハードウェアクロック (RTC) に定期的に書き込みます。これにより、システム停止中もRTCが比較的正確な時刻を保持し、次回起動時の時刻のずれを最小限に抑えることができます。
  • makestep <max_offset> <step_limit>: 時刻の急激な変更(ステップ)を制御します。chrony は通常、時刻を少しずつ進めたり遅らせたりして調整(スムーシング)しますが、ずれが非常に大きい場合にのみ、一度に時刻を変更するステップを行います。
    • max_offset: 時刻のずれがこの値 (秒) を超えた場合、ステップを検討します。
    • step_limit: 起動後、この回数だけステップを許可します。通常は起動時に1回だけ大きなずれを修正したい場合、makestep 1 1 のように設定します。デフォルトでは、起動時でもほとんどステップを行いません。本番サーバーでは、時刻のステップがログやアプリケーションに影響を与える可能性があるため、慎重に検討が必要です。
  • allow <ネットワーク/ホスト>: chrony をNTPサーバーとして動作させる場合に、特定のネットワークやホストからの問い合わせを許可します。
  • deny <ネットワーク/ホスト>: chrony をNTPサーバーとして動作させる場合に、特定のネットワークやホストからの問い合わせを拒否します。

設定変更後は、chrony サービスを再起動します。

bash
sudo systemctl restart chrony

使い方 (chronyc):
chrony の状態確認や設定変更には chronyc コマンドを使用します。これは chrony デーモンと通信するためのコマンドラインインターフェースです。

主な chronyc コマンド:

  • chronyc sources: 現在同期を試みているNTPソース(サーバー)の状態を表示します。

    bash
    chronyc sources

    出力例:

    210 Number of sources = 4
    MS Name/IP address Stratum Poll Lean/Rt Latency SDU Offset Freq Skew
    ===============================================================================
    ^+ ntp.jst.mfeed.ad.jp 2 10 20 12.526 1.840 +0.021 +0.006 0.016
    ^* ntp.sakura.ne.jp 2 10 18 15.112 2.112 -0.015 -0.002 0.021
    ^+ ntp.canonical.com 2 10 19 22.345 3.015 +0.005 +0.001 0.019
    ^? time.cloudflare.com 3 10 14 30.567 4.123 +0.123 +0.005 0.030

    * M: Source mode (^=server, ==peer, #=local)
    * S: Source state (*=synchronized, +=selectable, -=discarded, x=falseticker, ?=unknown)
    * Name/IP address: サーバー名またはIPアドレス
    * Stratum: サーバーのStratumレベル
    * Poll: 問い合わせ間隔 (2^N 秒)
    * Lean/Rt: トラッキング情報。Lean は同期の傾き、Rt はルートディスタンス (Root Dispersion)
    * Latency: サーバーまでのラウンドトリップ遅延
    * SDU: Standard Deviation of the measurement Unit (測定単位の標準偏差)
    * Offset: サーバーとの時刻のずれ(オフセット)
    * Freq: システムクロック周波数の学習されたオフセット (ppm)
    * Skew: 周波数オフセットの推定誤差 (ppm)
    S 列に * がついているサーバーが、現在同期に使用されているサーバーです。+ は同期可能だが現在は使用されていないサーバーです。

  • chronyc sourcestats: 各NTPソースに関するより詳細な統計情報を表示します。

    bash
    chronyc sourcestats

  • chronyc tracking: 現在のシステムクロックの同期状態を表示します。

    bash
    chronyc tracking

    出力例:

    Reference ID : C0A80101 (ntp.sakura.ne.jp) # 同期しているサーバーのIDまたはIP
    Stratum : 3 # このシステムのStratumレベル (通常は同期先+1)
    Leap status : Normal # うるう秒の状態
    RTT variance : 0.003 seconds # ラウンドトリップタイムのばらつき
    Root distance : 0.025 seconds # Stratum 0 からの推定距離
    Update interval : 1024.0 seconds # 次回の問い合わせ間隔
    Leap expiry : 0 # うるう秒情報の有効期限
    Leap offset : 0.0 seconds # うるう秒によるオフセット
    System time : 0.000005678 seconds slow of NTP time # システム時刻とNTP時刻のずれ
    Last offset : -0.000010123 seconds # 最後に観測されたオフセット
    RMS offset : 0.000015000 seconds # オフセットのRMS (二乗平均平方根)
    Frequency : +0.567 ppm # システムクロック周波数の学習されたオフセット
    Frequency skew : 0.010 ppm # 周波数オフセットの推定誤差
    Phase offset : 0.000005678 seconds # 位相オフセット
    Poll interval : 10 (1024 seconds) # 現在の問い合わせ間隔
    RTCSync mode : enabled # RTCSync が有効か
    RTC offset : -0.000123 seconds # システムクロックとRTCのずれ

    System time slow/fast of NTP time の行は、現在のシステム時刻がNTP時刻に対してどれだけずれているかを示します。この値が小さいほど高精度に同期されています。

  • chronyc activity: NTPソースのアクティビティ統計を表示します。

    bash
    chronyc activity

  • chronyc clients: chrony がNTPサーバーとして動作している場合に、クライアント情報を表示します。

    bash
    chronyc clients

  • chronyc makestep: 時刻のずれを強制的に修正(ステップ)させます。通常は自動調整に任せますが、初期設定時や大きなずれが発生した場合に手動で修正したい場合に利用できます。

    bash
    chronyc makestep

長所: 高精度、仮想環境や断続的なネットワークに強い、オフライン時のドリフト補正、豊富な機能と管理コマンド。
短所: 設定がやや複雑(ntpsecほどではない)。

3. ntpsec (旧 ntpd)

ntpsec は、従来のNTPリファレンス実装である ntpd をベースに、セキュリティ強化を目的としてフォークされたプロジェクトです。多くのセキュリティに関する脆弱性が修正され、コードベースが整理されています。歴史が長く、多くのシステムで利用されてきた実績があります。chronyと同様に、クライアントおよびサーバーとして機能します。

特徴:
* NTPリファレンス実装をベースにしており、機能が豊富。
* セキュリティに重点が置かれている。
* クライアントとしてもサーバーとしても機能可能。
* 設定オプションが多く、詳細なカスタマイズが可能。

インストール:
bash
sudo apt update
sudo apt install ntpsec

インストール時に、既存のNTPサービス(systemd-timesyncdchrony)は無効化されます。

設定:
設定ファイルは /etc/ntpsec/ntp.conf です。ntpsec は従来の ntpd とほぼ同じ設定ファイル形式を使用します。

“`ini

/etc/ntpsec/ntp.conf (主要な設定項目)

利用するNTPサーバーを指定します。poolまたはserverを使用します。

pool: pool.ntp.org のようなラウンドロビンDNSに対応したホスト名。

server: 特定のサーバーのホスト名またはIPアドレス。

iburst: 起動時に素早く同期を試みます。

pool jp.pool.ntp.org iburst

server ntp.jst.mfeed.ad.jp iburst

システムクロックのドリフト情報を記録するファイル。

これにより、再起動時にドリフトを素早く学習できます。

driftfile /var/lib/ntpsec/ntp.drift

ログファイル

logfile /var/log/ntpsec.log

アクセス制御リスト (ACL)

restrict <アドレス> [オプション…]

default (全て): nomodify notrap nopeer noquery

restrict default kod notrap nomodify nopeer noquery

localhost (このホスト自身) からのアクセスは全て許可 (状態確認など)

restrict 127.0.0.1
restrict ::1

NTPサーバーとして機能する場合に、特定のネットワークからのクエリを許可

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

ハードウェアクロック (RTC) の扱い

カーネルの時刻同期機能 (adjtimex) を使用する場合、明示的な設定は不要です。

ntpd はデフォルトでカーネル機能を利用し、システムクロックとRTCを同期します。

必要に応じてローカルクロックをフォールバックとして設定することも可能ですが、

通常は pool や server ディレクティブがあれば不要です。

server 127.127.1.0 # local clock driver

fudge 127.127.1.0 stratum 10

オプション:うるう秒ファイル

leapfile /usr/share/zoneinfo/leap-seconds.list

認証設定 (高度なトピック)

keys /etc/ntpsec/ntp.keys

trustedkey 1

requestkey 1

“`

主要な設定ディレクティブの詳細:

  • pool <ホスト名> [オプション...]: pool.ntp.org のようなホスト名を指定します。ntpsec は DNS で解決されたサーバーを使用します。
    • iburst: 起動時に素早く同期を試みます。
    • burst: 通常動作中に素早く同期を試みます。
    • minpoll <N>, maxpoll <N>: 問い合わせ間隔を 2^N 秒の範囲で指定します。
    • noselect: このサーバーを同期元としては使用せず、情報収集のみ行います。
    • prefer: このサーバーを優先的に同期元として選択します。
  • server <ホスト名またはIP> [オプション...]: 特定の単一NTPサーバーを指定します。オプションは pool と同様です。
  • driftfile <ファイルパス>: システムクロックのドリフト情報を記録します。
  • logfile <ファイルパス>: ntpd のログ出力を指定したファイルにリダイレクトします。
  • restrict <アドレス> [オプション...]: 特定のホストやネットワークからのNTPパケットに対するアクセス制御を設定します。これはNTPサーバーとして運用する場合に特に重要ですが、クライアントとして運用する場合でも、不要なポート開放を防ぐためにデフォルト設定を確認することが推奨されます。
    • <アドレス>: default (全て), 127.0.0.1, ::1, ホスト名, IPアドレス, ネットワーク/マスク 形式で指定します。
    • nomodify: 設定変更コマンド (ntpdc config など) を拒否します。
    • notrap: トラップサービス要求 (リモートログ収集) を拒否します。
    • nopeer: このホストとのピア関係確立を拒否します。
    • noquery: 状態確認コマンド (ntpq など) を拒否します。
    • kod: KoD (Kiss-o’-Death) パケットを送信して過剰なリクエストを制限します。
  • fudge <アドレス> [オプション...]: ローカルクロックなどの特殊な擬似的なクロックソースを設定します。stratum <N> オプションでStratumレベルを指定できます。
  • disable <機能>: 特定の機能を無効にします (auth, ntp – NTPプロトコル処理, trap, kernel – カーネル時刻同期機能)。通常はデフォルトのままです。

設定変更後は、ntpsec サービスを再起動します。

bash
sudo systemctl restart ntpsec

使い方 (ntpq, ntpdc):
ntpsec の状態確認には主に ntpq コマンドを使用します。より詳細な制御には ntpdc も使用できますが、ntpdc は非推奨とされています。

  • ntpq -p: 現在同期を試みているNTPサーバーの状態を表示します。

    bash
    ntpq -p

    出力例:

    remote refid st t when poll reach delay offset jitter
    ==============================================================================
    +ntp.jst.mfeed. 203.216.225.205 2 u 47 64 377 12.345 -0.010 0.020
    *ntp.sakura.ne. 133.243.238.243 2 u 48 64 377 15.678 0.005 0.015
    +ntp.canonical. 172.253.197.108 2 u 46 64 377 22.987 0.020 0.030
    -time.cloudflare 162.159.200.123 3 u 49 64 377 31.123 0.150 0.040

    * remote: サーバー名またはIPアドレス。先頭の文字はサーバーの状態を示します (*=同期中, +=同期可能, -=破棄, x=偽時計, #=選択外)。
    * refid: 参照しているサーバーのReference IDまたはIPアドレス。
    * st: Stratum レベル。
    * t: タイプ (u=unicast, b=broadcast, l=local, m=multicast)。
    * when: 最後にパケットを受信してからの秒数。
    * poll: 問い合わせ間隔 (秒)。
    * reach: 過去8回のポーリングの到達可能性を示すオクタル値 (377は8回連続成功)。
    * delay: サーバーまでの往復遅延。
    * offset: サーバーとの時刻のずれ(オフセット)。
    * jitter: オフセットのばらつき。

  • ntpq -c rv: システム変数とピア変数を表示します。rv は “read variables” を意味します。

    bash
    ntpq -c rv

    このコマンドで、同期状態 (synchronised), 参照ID (refid), Stratum レベル (stratum), システム時刻とNTP時刻のずれ (sys_offset), システムクロック周波数のずれ (frequency), 時刻の安定性 (sys_jitter), ルートディスタンス (rootdelay, rootdisp) などを確認できます。

  • ntpdc -c sysinfo: システムの概要情報を表示します。

    bash
    ntpdc -c sysinfo

長所: 歴史があり実績が豊富、機能が豊富、詳細な設定が可能、ntpsecでセキュリティが強化された。
短所: 設定が複雑になりやすい、起動時の同期に時間がかかることがある、chronyに比べて仮想環境など特定の環境での性能が劣る場合がある。

どのクライアントを選ぶべきか

特徴/用途 systemd-timesyncd chrony ntpsec (ntpd)
軽量性/シンプルさ
クライアント機能 ○ (専用)
サーバー機能 ×
高精度 △ (SNTP) ◎ (優れる)
断続ネットワーク ◎ (優れる)
仮想環境 ◎ (優れる)
オフライン時の精度 ◎ (ドリフト学習)
設定の容易さ
管理コマンド 低 (timedatectl) 高 (chronyc) 中 (ntpq)
開発状況 活発 (systemdの一部) 活発 活発
Debianでの採用 デスクトップ/軽量環境のデフォルト サーバー環境での推奨が増加中 伝統的な選択肢
  • デスクトップ環境や軽量なコンテナ: systemd-timesyncd が最もシンプルで十分です。
  • 一般的なサーバー: chrony が推奨されるケースが増えています。初期同期の速さ、仮想環境への対応、オフライン時の精度維持などが優れています。
  • 高精度な時刻同期が絶対的に必要、またはレガシーシステムとの互換性が重要: ntpsec が有力な選択肢です。詳細な設定が必要な場合にも適しています。NTPサーバーとして複数のクライアントに時刻を提供する場合は、chrony または ntpsec を選択する必要があります。

注意: Debianでは、これらのNTPサービスは systemd によって管理されます。通常、いずれか一つのサービスのみが有効化されて起動するように設定されます。複数のNTPサービスが同時に起動していると、時刻が不安定になる可能性があります。インストール時に依存関係やサービス設定で自動的に他のサービスが無効化されることが多いですが、手動で確認・調整が必要な場合もあります (sudo systemctl status <サービス名>, sudo systemctl enable <サービス名>, sudo systemctl disable <サービス名>)。

時刻合わせの具体的な設定例

ここでは、最も一般的なシナリオである「インターネット上の公開NTPサーバーにクライアントとして同期する」場合の設定例を、各クライアントごとに示します。

systemd-timesyncd の設定例

  1. 他のNTPサービスを無効化:
    もし chronyntpsec がインストールされていて有効になっている場合は、無効化します。

    “`bash
    sudo systemctl disable chrony # chrony を使う場合
    sudo systemctl stop chrony

    sudo systemctl disable ntpsec # ntpsec を使う場合
    sudo systemctl stop ntpsec
    ``systemd-timesyncd` が有効になっているか確認します。

    bash
    sudo systemctl status systemd-timesyncd

    inactive の場合は有効化して起動します。

    bash
    sudo systemctl enable systemd-timesyncd
    sudo systemctl start systemd-timesyncd

  2. 設定ファイルの編集:
    /etc/systemd/timesyncd.conf を編集します。NTP= 行をアンコメントし、使用したいNTPサーバーを指定します。ここでは日本のpool.ntp.orgサーバーを指定します。

    bash
    sudo nano /etc/systemd/timesyncd.conf

    以下の内容に編集します。

    “`ini
    [Time]
    NTP=jp.pool.ntp.org

    FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org

    RootDistanceMaxSec=5

    PollIntervalMinSec=32

    PollIntervalMaxSec=2048

    “`

  3. サービスの再起動:
    設定を反映させるためにサービスを再起動します。

    bash
    sudo systemctl restart systemd-timesyncd

  4. 状態の確認:
    timedatectl コマンドで同期状態を確認します。

    bash
    timedatectl status
    timedatectl timesync-status

    System clock synchronized: yes と表示されれば成功です。

chrony の設定例

  1. 他のNTPサービスを無効化:
    systemd-timesyncdntpsec が有効になっている場合は無効化します。

    “`bash
    sudo systemctl disable systemd-timesyncd
    sudo systemctl stop systemd-timesyncd

    sudo systemctl disable ntpsec
    sudo systemctl stop ntpsec
    “`

  2. chrony のインストール:
    bash
    sudo apt update
    sudo apt install chrony

    インストールにより chrony サービスが有効化され、起動します。

  3. 設定ファイルの編集:
    /etc/chrony/chrony.conf を編集します。デフォルト設定で pool.ntp.org を利用するようになっていることが多いですが、確認・変更します。

    bash
    sudo nano /etc/chrony/chrony.conf

    以下の行が含まれていることを確認します。日本のプールサーバーと、初期同期を早める iburst オプション、RTC同期 (rtcsync) を有効にします。

    “`ini

    /etc/chrony/chrony.conf の一部

    Use servers from the NTP Pool Project.

    pool jp.pool.ntp.org iburst

    This directive is used to enable the kernel synchronisation of the real-time clock (RTC).

    rtcsync

    driftfile, logdir, makestep など、必要に応じて他の設定も確認・調整します。

    driftfile /var/lib/chrony/chrony.drift

    logdir /var/log/chrony

    makestep 1 1

    “`

  4. サービスの再起動:
    設定を反映させるためにサービスを再起動します。

    bash
    sudo systemctl restart chrony

  5. 状態の確認:
    chronyc コマンドで同期状態を確認します。

    bash
    chronyc sources
    chronyc tracking

    chronyc sources の出力でサーバー名の左に * が表示されていれば、そのサーバーと同期中です。
    chronyc tracking の出力で Stratum が 2以上になっており、System time のずれが小さければ正常に動作しています。

ntpsec の設定例

  1. 他のNTPサービスを無効化:
    systemd-timesyncdchrony が有効になっている場合は無効化します。

    “`bash
    sudo systemctl disable systemd-timesyncd
    sudo systemctl stop systemd-timesyncd

    sudo systemctl disable chrony
    sudo systemctl stop chrony
    “`

  2. ntpsec のインストール:
    bash
    sudo apt update
    sudo apt install ntpsec

    インストールにより ntpsec サービスが有効化され、起動します。

  3. 設定ファイルの編集:
    /etc/ntpsec/ntp.conf を編集します。デフォルト設定で pool.ntp.org を利用するようになっていることが多いですが、確認・変更します。

    bash
    sudo nano /etc/ntpsec/ntp.conf

    以下の行が含まれていることを確認します。日本のプールサーバーと、初期同期を早める iburst オプションを指定します。

    “`ini

    /etc/ntpsec/ntp.conf の一部

    /etc/ntpsec/ntp.conf, configured for LCL=.(LOCAL).

    See the NTP documentation for help.

    driftfile /var/lib/ntpsec/ntp.drift

    Enable this if you want statistics to be logged.

    statsdir /var/log/ntpsecstats/

    You could just use the pool.ntp.org servers, but a nearby Stratum 1 server

    would be a better choice if you could find one.

    If you are in a country which has its own pool, use that one.

    pool 0.debian.pool.ntp.org iburst

    Use servers from the NTP Pool Project.

    pool jp.pool.ntp.org iburst

    Access control

    Default: nomodify notrap nopeer noquery

    restrict default kod notrap nomodify nopeer noquery

    localhost is allowed all ntp access except for config

    restrict 127.0.0.1
    restrict ::1

    Kernel sync disabled because ntpd doesn’t need it, the kernel adjtimex does it

    disable kernel

    ``restrict` 行は、クライアントとしてのみ使用する場合でも、デフォルトの制限とローカルホストからのアクセス許可が設定されていることを確認しておくと安全です。

  4. サービスの再起動:
    設定を反映させるためにサービスを再起動します。

    bash
    sudo systemctl restart ntpsec

  5. 状態の確認:
    ntpq コマンドで同期状態を確認します。

    bash
    ntpq -p
    ntpq -c rv

    ntpq -p の出力でサーバー名の左に * が表示されていれば、そのサーバーと同期中です。
    ntpq -c rv の出力で synchronised=yes と表示され、sys_offset が小さい値になっていれば正常に動作しています。

ファイアウォール設定

NTPプロトコルは UDPポート 123 を使用します。NTPクライアントとしてインターネット上のサーバーと同期する場合、ローカルシステムから外部のUDP/123への「アウトバウンド」接続が許可されている必要があります。ほとんどの場合、デフォルトのファイアウォール設定でアウトバウンド接続は許可されていますが、厳密なルールを設定している場合は確認が必要です。

“`bash

例: UFW を使用している場合 (クライアントとしてのみなら通常不要)

sudo ufw allow out 123/udp

例: iptables を使用している場合 (クライアントとしてのみなら通常不要)

sudo iptables -A OUTPUT -p udp –dport 123 -j ACCEPT

“`

もしNTPサーバーとして機能させる場合は、外部からローカルシステムのUDP/123への「インバウンド」接続を許可する必要があります。

“`bash

例: UFW を使用している場合 (NTPサーバーとして)

sudo ufw allow 123/udp

例: iptables を使用している場合 (NTPサーバーとして)

sudo iptables -A INPUT -p udp –dport 123 -j ACCEPT
“`
設定後はファイアウォールサービスを再起動または再読み込みしてください。

トラブルシューティング

時刻同期がうまくいかない場合、いくつかの原因が考えられます。

  1. ファイアウォール: 最もよくある原因の一つです。UDP/123 ポートでの通信がブロックされていないか確認してください。クライアントの場合はアウトバウンド、サーバーの場合はインバウンドとアウトバウンドの両方です。

    • telnet <ntpサーバーのIP> 123: コネクション確立はできませんが、ポートが開いているかどうかの簡易的な確認に使えます(UDPなので正確ではありませんが、応答がない場合は疑わしいです)。
    • tcpdump -n port 123: クライアントからサーバーへのパケットが送信され、応答が受信されているかを確認できます。
    • ファイアウォール設定 (ufw status, iptables -L など) を確認します。
  2. NTPサーバーの疎通性/可用性: 指定したNTPサーバーが稼働しているか、ネットワーク的に到達可能か確認します。

    • ping <ntpサーバーのホスト名またはIP>: 基本的な疎通確認。
    • ntpdate -q <ntpサーバー> (ntpdateパッケージが必要): 指定したサーバーから一度だけ時刻を取得し、オフセットを表示します。同期には使用せず、確認用として便利です。(ただし、ntpdateは非推奨であり、chronyやntpsecの管理コマンドでの確認が推奨されます)
    • chronyc sources, chronyc tracking / ntpq -p コマンドの出力で、サーバーがリストされているか、状態が ?- になっていないか確認します。reach 列が 0 になっている場合は、サーバーへの到達に問題があります。
  3. 設定ファイルのエラー: 設定ファイルの記述に誤りがないか確認します。スペルミス、パスの誤り、オプションの指定間違いなどがないか、各クライアントのマニュアルを参照しながら確認します。

    • 設定変更後にサービスの再起動を忘れていないか確認します。
    • ntpsec の場合は、ntpd -c /etc/ntpsec/ntp.conf -d のようにデバッグモードで起動して設定ファイルのパースエラーなどを確認できる場合があります。
  4. サービスの状態: NTPサービスがそもそも起動しているか、エラーで停止していないか確認します。

    • sudo systemctl status <サービス名> (chrony, ntpsec, systemd-timesyncd)
    • サービスが停止している場合は、ログを確認します。sudo journalctl -u <サービス名>
  5. ログの確認: NTPデーモンのログは、問題解決の重要な手がかりとなります。

    • systemd-timesyncd: sudo journalctl -u systemd-timesyncd
    • chrony: sudo journalctl -u chrony または設定ファイルで指定したログファイル (logdir)
    • ntpsec: sudo journalctl -u ntpsec または設定ファイルで指定したログファイル (logfile)
      エラーメッセージや警告メッセージがないか詳細に確認します。
  6. 時刻のずれが非常に大きい場合: システム起動時の時刻がNTPサーバーに対して数分、数時間、あるいはそれ以上ずれている場合、多くのNTPクライアントは時刻を急激に変更する「ステップ」を行わず、ゆっくり調整しようとします。しかし、ずれが大きすぎると調整に非常に長い時間がかかるか、同期できない場合があります。

    • 起動時の初回同期で大きなずれを許容したい場合は、chrony の makestep オプションや ntpsec の pool / server オプションの iburst を利用し、起動時に素早く同期を試みるように設定します。
    • 一時的に手動で時刻を設定することもできますが、システムの整合性に影響を与える可能性があるため注意が必要です。
      • sudo date -s "YYYY-MM-DD HH:MM:SS" で手動設定。
      • sudo ntpdate <ntpサーバー> (推奨されませんが、一度だけ強制的に合わせたい場合)。
      • timedatectl set-time "YYYY-MM-DD HH:MM:SS".
      • chronyc makestep (chronyの場合)。
      • 時刻を手動で大きく変更した後は、NTPサービスを再起動して再度同期を開始させるのが一般的です。
  7. 仮想環境特有の問題: 仮想環境(VMware, VirtualBox, KVMなど)では、ハイパーバイザーが提供する時刻同期機能とゲストOSのNTP同期が競合する場合があります。通常はゲストOS側でNTP同期を行い、ハイパーバイザー側の時刻同期機能は無効にするか、ゲストOSのNTP同期が失敗した場合のフォールバックとしてのみ使用するように設定することが推奨されます。仮想化プラットフォームのドキュメントを参照してください。

    • VMware Tools の time sync 機能
    • VirtIO の balloon/timesync 機能

高度なトピック

NTPサーバーとして運用する場合

自宅や組織内の複数のシステムに時刻を提供するNTPサーバーとしてDebianシステムを運用する場合、クライアント設定に加えていくつかの設定が必要です。

  • chrony: 設定ファイルの allow ディレクティブで、時刻を提供したいクライアントのネットワークやIPアドレスを指定します。デフォルトでは誰もアクセスできません。
    ini
    # Allow clients from 192.168.1.0/24
    allow 192.168.1.0/24
    # Deny all others
    deny all

    また、local stratum ディレクティブでローカルクロックをフォールバックソースとして設定しておくことも有効です。

  • ntpsec: 設定ファイルの restrict ディレクティブでアクセス制御を行います。デフォルトの restrict default はほとんどのアクセスを拒否しているため、クライアントからの query (時刻問い合わせ) を許可する必要があります。
    “`ini
    # Default restrictions
    restrict default kod notrap nomodify nopeer noquery

    Allow NTP queries from 192.168.1.0/24

    restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
    ``
    ここでは
    nomodifynotrapは維持し、noquery` だけを除外した制限を適用しています。

NTPサーバーとして運用する場合も、自身は Stratum 1 または信頼できる Stratum 2 の公開NTPサーバーやGPS時刻源などと同期する必要があります。

ハードウェアクロック (RTC) との連携

ほとんどのコンピューターには、システムが停止している間も時刻を保持するバッテリーバックアップ式のハードウェアクロック (RTC) が搭載されています。しかし、RTCはシステムクロックほど精度が高くありません。

NTPクライアントは、システム起動時にRTCから初期時刻を取得し、その後NTPサーバーと同期してシステムクロックを正確に合わせます。一部のNTPクライアント(chronyの rtcsync、ntpsec/ntpd のカーネル連携機能)は、NTPで正確に同期されたシステムクロックの時刻を定期的にRTCに書き戻す機能を持っています。これにより、システム停止中もRTCの時刻が比較的正確に保たれ、次回起動時の時刻のずれが小さくなります。これは特に、長時間システムが停止する場合や、仮想マシンでスナップショットを使用する場合などに役立ちます。

仮想環境における時刻同期の注意点

仮想マシンでは、物理ハードウェアが存在しないか、ホストOSとリソースを共有するため、時刻同期に特有の課題があります。

  • クロックソースの不安定さ: 仮想マシン内のクロックソースは、ホストOSのスケジューリングや負荷の影響を受けやすく、ドリフトが大きくなったり、ジッターが発生しやすくなります。
  • ハイパーバイザーの時刻同期機能との競合: VMware Tools, VirtIO (KVM/QEMU), Hyper-V Integration Services など、多くの仮想化プラットフォームはゲストOSに時刻同期機能を提供しています。これらの機能とゲストOS内のNTPクライアント(chrony, ntpsec)が同時に有効になっていると、時刻が不安定になる「二重同期」の問題が発生することがあります。
  • スナップショット/一時停止: 仮想マシンを一時停止したり、スナップショットを作成・復元したりすると、システムクロックが大きくずれることがあります。

推奨されるアプローチ:
1. ゲストOS内でchronyまたはntpsecを使用する: より洗練されたアルゴリズムで時刻を同期・補正するため、精度が高く、特に仮想環境の不安定なクロックソースに対応しやすい chrony が推奨されることが多いです。
2. ハイパーバイザーの時刻同期機能を無効化する: ゲストOS内のNTPクライアントと競合しないように、VMware ToolsのTimeSync機能、VirtIOのtimesync機能などを無効にします。これにより、ゲストOSが時刻同期の主導権を握ります。ただし、ハイパーバイザーによっては、起動時の初期時刻設定や、NTP同期が長時間失敗した場合のフォールバックとしてハイパーバイザーの時刻を利用するように設定できる場合があります。
3. ホストOSは正確に時刻同期しておく: ゲストOSがホストOS経由でNTPサーバーにアクセスする場合や、ホストが時刻を提供する場合、ホスト自体の時刻が正確である必要があります。

まとめ

Debianシステムで正確な時刻を維持することは、システムの安定性、信頼性、セキュリティのために不可欠です。NTP (Network Time Protocol) は、この目的を達成するための標準的な方法を提供します。

Debianでは、用途に応じて systemd-timesyncd (軽量、クライアント専用)、chrony (高精度、仮想環境や断続ネットワークに強い)、ntpsec (機能豊富、セキュリティ強化版) という主要なNTPクライアントを選択できます。それぞれの特徴を理解し、システムの要件に合った適切なクライアントを選択することが重要です。

インターネット上の公開NTPプールサーバー (pool.ntp.org) は、多くのシステムで利用できる便利な時刻源です。設定ファイル (/etc/systemd/timesyncd.conf, /etc/chrony/chrony.conf, /etc/ntpsec/ntp.conf) で使用するNTPサーバーを指定し、必要に応じてハードウェアクロックとの連携 (rtcsync) や時刻の急激な調整 (makestep) などのオプションを設定します。

設定後は、各クライアント付属の管理コマンド (timedatectl, chronyc, ntpq) やログ (journalctl) を利用して、時刻同期が正常に行われているか、どのサーバーと同期しているか、時刻のずれはどの程度かなどを定期的に確認することが推奨されます。

ファイアウォール設定、NTPサーバーの可用性、設定ファイルの記述ミスなどは、時刻同期がうまくいかない場合の一般的な原因です。これらの点を確認し、適切に対処することで、Debianシステムは常に正確な時刻を維持し、安定した運用に貢献するでしょう。

特にサーバー環境や、複数のシステムが連携する環境では、単に時刻を合わせるだけでなく、その精度や安定性を継続的に監視することが、予期せぬトラブルを防ぐ上で非常に重要になります。この記事が、あなたのDebianシステムにおけるNTP活用の理解と実践に役立つことを願っています。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール