Fedora ServerでChronyを設定する手順:社内LAN向けの正確な時刻同期NTPサーバー構築ガイド

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

サーバークラスターやデータベースクラスター、あるいは社内の経理用ワークステーションを運用する際、たった1台の時刻が数秒ズレるだけで、ログの順序が乱れたり、TLS/SSL証明書の期限切れエラーが発生したり、Active Directory/Kerberos認証が突如失敗したりします。社内の多数の機器が個別にインターネットへ接続して時刻を取得する代わりに、ローカル環境にNTPサーバーを構築することは、帯域幅の節約とセキュリティ向上の両面で極めて有効な解決策です。

筆者はメインの開発機としてFedoraを2年間愛用しており、パッケージ更新の早さに満足しています。Fedora Serverにおいても、従来の古いntpdに代わり、同期速度が極めて高速でリソース消費も非常に軽量なChronyがデフォルトのNTPサービスとして採用されています。

クイックスタート:ChronyによるNTPサーバー構築(5分で完了)

検証環境や社内システムへ迅速に導入したい場合、手順は非常にシンプルです:

ステップ1:chronydの確認と有効化

Fedora Serverには標準でchronyパッケージがインストールされています。まずはサービスの状態を確認します:

systemctl status chronyd
# 起動していない場合は、有効化して即時起動する:
sudo systemctl enable --now chronyd

ステップ2:LANからの時刻同期を許可

デフォルト設定のChronyは、外部から自身の時刻を取得するクライアントとしてのみ動作します。他の端末向けのNTPサーバーとして機能させるため、設定ファイルを開きます:

sudo nano /etc/chrony.conf

allowディレクティブを探してコメントアウトを解除(またはファイルの末尾に追加)し、社内ネットワークのアドレス帯を指定します:

# LANサブネット192.168.1.0/24からの時刻問い合わせを許可
allow 192.168.1.0/24

# インターネット切断時でもサーバーを稼働させ続ける設定
local stratum 10

ステップ3:サービスの再起動とファイアウォールの開放

Fedoraではデフォルトでfirewalldが有効になっています。NTPプロトコルはUDPポート123を使用するため、ポートを開放する必要があります:

sudo systemctl restart chronyd
sudo firewall-cmd --add-service=ntp --permanent
sudo firewall-cmd --reload

ステップ4:クライアント端末からのクイック確認

同一LAN内の別のLinuxマシンから、ツールをインストールしてFedora ServerのIP(例:192.168.1.10)へ問い合わせを試行します:

chronyc -h 192.168.1.10 tracking

Reference IDやStratumなどのパラメータが正常に返ってくれば、NTPサーバーの準備は完了です。

設定ファイル chrony.conf の詳細解説

Fedoraの/etc/chrony.confには多くのパラメータが存在します。環境に合わせてカスタマイズする上で把握しておくべき重要なディレクティブは以下のとおりです:

1. 上位NTPサーバーの参照設定(pool / server)

pool 2.fedora.pool.ntp.org iburst
  • pool: パブリックNTPサーバー群(プール)を指定します。インフラが日本やアジア圏にある場合は、遅延(レイテンシ)を抑えるために地理的に近いプールへ変更することをおすすめします:
server 0.asia.pool.ntp.org iburst
server 1.asia.pool.ntp.org iburst
server time.google.com iburst

iburst(initial burst)パラメータは、起動直後に4〜8個のパケットを連続送信してクロックのドリフト(周波数偏差)を素早く計算し、わずか数秒で正確な時刻を取得できるようにする設定です。

2. makestep パラメータ

makestep 1.0 3

従来のNTPでは、データベースのタイムスタンプが急激に飛ぶのを防ぐため、時計の進み具合を徐々に早めたり遅くしたりして調整(slew)するのが一般的でした。しかし、ズレが1秒を超えている場合、徐々に修正する方法では同期に何時間もかかってしまいます。makestep 1.0 3ディレクティブは、起動後の最初の3回の更新において、時刻のズレが1.0秒を超えている場合に即座に時刻をジャンプ(step)させて修正することを許可します。

3. driftfile パラメータ

driftfile /var/lib/chrony/drift

Chronyはサーバーのハードウェアクロック(水晶発振子)の進み・遅れの傾向をこのファイルに記録します。これにより、マシンが再起動した場合や一時的にネットワークが切断された場合でも、極めて現実に近い精度で誤差を補正し続けることができます。

応用編:インターネット切断時の時刻維持とStratum階層設定

フォールバック用のLocal Stratum設定

国際インターネット回線や上流ネットワークに障害が発生すると、外部の上位NTPサーバーと通信できなくなります。予備の設定がない場合、Chronyはクライアントからの問い合わせへの応答を停止してしまい、社内の全端末が参照基準を見失ってしまいます。

以下の記述を追加することでこの問題を解決できます:

local stratum 10

この行はChronyに対して「外部の正確な時刻ソースとの接続が切れた場合、自身のハードウェアクロックを使用してStratum 10としてLAN内に時刻を提供する」よう指示します。Stratum 10という階層は十分に低いため、インターネット接続が回復した際には自動的にこのフラグが解除され、サービスの停止なしにより正確なタイムソース(Stratum 1や2)へとシームレスに切り替わります。

chronycによる状態監視とデバッグ

chronycコマンドは非常に強力なCLIツールです。トラブルシューティングのために、以下の2つのコマンドを覚えておくと便利です:

# 時刻ソースの一覧とオフセット状況を確認
chronyc sources -v

# 時刻誤差の詳細な統計情報を確認
chronyc sourcestats -v

chronyc sourcesの出力結果におけるM(Mode)列の重要シンボルの意味:

  • ^*: 現在同期対象として選択されているタイムソース。
  • ^+: 良好なバックアップソース。メインソースに問題が生じた際に即座に昇格可能。
  • ^?: 接続不可、または誤差が大きすぎて除外されたソース。

社内システムでChronyを運用する際の実践Tips

Tip 1:仮想マシン環境ではハイパーバイザー側の時刻同期を無効化する

VMware ESXi、Proxmox、KVMなどの仮想マシン上でFedora Serverを稼働させる場合、VMware ToolsやQEMU Guest Agentなどのツールが物理ホストとの時刻同期を頻繁に行おうとします。その結果、ChronyがインターネットのNTP基準に合わせて調整しようとする一方でGuest Agentがホスト側の時刻を強制同期しようとする「時刻の奪い合い(clock fight)」が発生します。

そのため、Guest Agent側の時刻同期機能をオフにするか、参照元を1つに絞る必要があります:

# Linux上のVMware Toolsで時刻同期を無効化する場合:
vmware-toolbox-cmd timesync disable

Tip 2:クライアントがFedora Serverから時刻を受信できない場合のクイック対処法

クライアント側でタイムアウトが発生したり同期できなかったりする場合は、よくある以下の3つのボトルネックを順に確認してください:

  1. ファイアウォールルールの未反映: Fedora Server上でsudo firewall-cmd --list-servicesを実行し、ntpが含まれているか確認します。
  2. IPサブネットの未定義: allow行のサブネットマスクを再確認します。ネットワークが10.0.0.0/8であったり、VLANで192.168.10.0/24のように分割されている場合は、対象のサブネットを/etc/chrony.confに正しく定義する必要があります。
  3. SELinuxによるファイル/ポートの制限: FedoraはデフォルトでSELinuxがEnforcingモードで動作しています。NTPポートの変更やlog/driftディレクトリを別パーティションに移動した場合は、semanage fcontextコマンドでSELinuxコンテキストを更新する必要があります。

Tip 3:複数クライアントの時刻ズレを一括チェックするワンライナー

NTPサーバーの構築完了後、社内の全サーバーがFedora Serverの時刻に正確に追従しているかをSSH経由で一括確認できるスクリプトです:

for ip in 192.168.1.{20..30}; do
  echo "=== Checking $ip ==="
  ssh -o ConnectTimeout=2 user@$ip "chronyc tracking | grep 'System time'"
done

ローカルネットワーク内の各ノード間の時刻誤差は、理想的には0.0005秒(0.5ミリ秒)未満に抑えるのが望ましいとされています。Fedora上のChronyを活用すれば、専用のハードウェアを用意することなく、この高精度な同期を十分に実現可能です。

Share: