NTPサーバーをLinuxで構築する方法|chronyでの時刻同期サーバー設定と動作確認の手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > NTPサーバーをLinuxで構築する方法|chronyでの時刻同期サーバー設定と動作確認の手順
「自社のLinuxサーバーで時刻がズレる」「社内の複数サーバーの時刻を統一したい」
こう思ったとき、真っ先に浮かぶのが「NTPサーバーを自前で立てる」という選択肢です。

時刻がズレたままのサーバーは、ログの前後関係がわからなくなったり、SSLの証明書エラーを引き起こしたり、cronの実行タイミングがずれたりと、地味ですが深刻な問題の温床になります。

この記事では、RHEL 9.4 / Rocky Linux 9 / AlmaLinux 9で動作確認した、chronydを使った自前NTPサーバーの構築手順をゼロから解説します。クライアント設定・ファイアウォール開放・chroncyコマンドでの動作確認まで、一通りカバーしています。

この記事のポイント

・chronyd(chrony)はRHEL9/Rocky/AlmaLinux系の現行NTP標準デーモン
・allowディレクティブでサブネットを許可するとNTPサーバーとして機能する
・firewalld で 123/udp を開放しないとクライアントから到達しない
・chronyc sources -v でクライアント側の同期状況を確認できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

時刻同期の重要性とNTPの仕組み

「時刻なんて少しくらいズレていても大丈夫でしょ」と思っているエンジニアほど、後で痛い目を見ます。

複数のサーバーで時刻がバラバラになると、以下のような問題が起きます。

ログの前後関係が追えない:アクセスログとアプリログを突き合わせる際に、サーバー間で時刻がズレていると原因特定に時間がかかります
SSLの証明書エラー:クライアントとサーバーの時刻差が大きいと「証明書の有効期限が切れています」のようなエラーが出ることがあります
cronの実行タイミングがずれる:バッチ処理の順序が保証されなくなります
Kerberosなどの認証が失敗する:時刻差が5分を超えると認証チケットが無効扱いになります

NTP(Network Time Protocol)は、ネットワーク越しにサーバーの時刻を正確に合わせるためのプロトコルです。
NTPは階層構造(Stratum)を持ち、原子時計などの基準時刻源をStratum 0として、Stratum 1、Stratum 2と接続が下がるたびに精度が低くなります。

社内で自前のNTPサーバーを立てると、「社内全体をStratum 3相当の同一の時刻源で同期する」構成になります。インターネットのNTPサーバーへの直接アクセスをサーバーごとに分散させずに済む、というメリットもあります。

chronydとntpdの現状(RHEL9/Rocky/AlmaLinuxの標準)

RHEL 7以降では、従来のntpdに代わってchronyd(chronyプロジェクト)が標準NTPデーモンになっています。

ntpd:古典的なNTPデーモン。RHEL 6以前の標準。現行RHELでは非推奨
chronyd:RHEL 7以降の標準。ネットワーク遅延の変動に強く、仮想環境でも安定して動作する。精度が高く、スリープ復帰後の同期も速い

本記事ではchrony(chronyd)を使います。ntpdを使っていた環境の方は、 ntpd 時刻同期設定の解説 も参考にしてください。

# 現在インストール済みのパッケージを確認する rpm -q chrony # 例: chrony-4.5-1.el9.x86_64 のように表示されればOK # インストールされていない場合はこちら dnf install -y chrony

chronydのインストールとクライアント設定

1. chronydをインストールして有効化する

RHEL 9系では通常デフォルトでchronyがインストールされています。念のため確認してから進めましょう。

# インストール確認 rpm -q chrony # インストールされていない場合 dnf install -y chrony # サービスを有効化・起動 systemctl enable --now chronyd # 起動確認 systemctl status chronyd

実機での出力例:

[root@ntp-server ~]# systemctl status chronyd * chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; preset: enabled) Active: active (running) since Sun 2026-06-14 09:13:24 JST; 2min ago Docs: man:chronyd(8) man:chrony.conf(5) Main PID: 1234 (chronyd) Tasks: 1 (limit: 23220) Memory: 1.2M CPU: 12ms CGroup: /system.slice/chronyd.service └─1234 /usr/sbin/chronyd -F 2 Jun 14 09:13:24 ntp-server.example.local chronyd[1234]: chronyd version 4.5 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 -DEBUG) Jun 14 09:13:24 ntp-server.example.local chronyd[1234]: Frequency 0.000 +/- 1000000.000 ppm read from /var/lib/chrony/drift Jun 14 09:13:24 ntp-server.example.local systemd[1]: Started NTP client/server.

2. 上流NTPサーバーを確認する(/etc/chrony.conf)

設定ファイルは/etc/chrony.confです。デフォルトでは以下のようにCentOS/RHEL系の公開NTPプールが設定されています。

# /etc/chrony.conf の確認 cat /etc/chrony.conf # デフォルトの上流サーバー設定例(Rocky Linux 9) pool 2.rocky.pool.ntp.org iburst

「iburst」オプションを付けると、起動直後に複数パケットを一気に送って素早く同期を完了させます。

自前NTPサーバー化(allowディレクティブの設定)

3. /etc/chrony.confにallowを追加してサーバーモードにする

デフォルトのchronydはNTPクライアント(外部から時刻をもらう)として動作します。社内の他サーバーへNTPを提供するには、allowディレクティブで許可するサブネットを指定します。

# /etc/chrony.conf を編集する vi /etc/chrony.conf

以下の行を追加します(例: 192.168.1.0/24のサブネットを許可):

# 追加する設定例(ファイル末尾に追記) # 社内サブネット全体に時刻を提供する allow 192.168.1.0/24 # 複数サブネットを許可する場合は行を並べる # allow 10.0.0.0/8 # allow 172.16.0.0/12 # インターネット接続がない環境で自分自身を時刻源とする場合(参考) # local stratum 10

設定を保存したら、chronydを再起動します。

# chronydを再起動して設定を反映する systemctl restart chronyd # 反映を確認する systemctl status chronyd

4. NTPポート(123/udp)をfirewalldで開放する

chronydがNTPサービスとしてリクエストを受け付けるには、ファイアウォールでUDP 123番ポートを開放する必要があります。
firewalldを使っている場合は以下の手順で設定します。

# ntpサービス(123/udp)を永続的に開放する firewall-cmd --permanent --add-service=ntp # 設定を反映する firewall-cmd --reload # 開放されたか確認する firewall-cmd --list-services

実機での確認例:

[root@ntp-server ~]# firewall-cmd --list-services cockpit dhcpv6-client ntp ssh

ntpが表示されていれば開放完了です。firewall-cmdの詳細な使い方は firewall-cmdコマンドでポートを開放・管理する方法 を参照してください。

クライアント側のchrony設定(社内サーバーから接続する)

5. クライアント側の/etc/chrony.confを修正する

時刻を受け取る側のサーバー(クライアント)では、上流のNTPサーバーを自前のNTPサーバーに向け直します。

# クライアントサーバーの /etc/chrony.conf を編集する vi /etc/chrony.conf

既存のpool/serverディレクティブをコメントアウトし、自前NTPサーバーのIPを指定します:

# 既存のpool行をコメントアウトする # pool 2.rocky.pool.ntp.org iburst # 自前NTPサーバーを指定する(192.168.1.10はNTPサーバーのIPアドレスに変更する) server 192.168.1.10 iburst

設定を保存して反映させます:

# クライアント側のchronydを再起動する systemctl restart chronyd # 即時同期を試みる(--waitで完了まで待機) chronyc makestep

chronyc sources/trackingで動作確認する

6. NTPサーバー側の同期状況を確認する

chronyc sources -vで、NTPサーバーがどの上流サーバーから時刻を受け取っているかを確認できます。

# NTPサーバー側で実行 chronyc sources -v

実機での出力例:

[root@ntp-server ~]# chronyc sources -v .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current best, '+' = combined, '-' = not combined, | / 'x' = may be in error, '~' = too variable, '?' = unusable. || .- xxxx [ yyyy ] +/- zzzz || Reachability register (octal) -. | xxxx = adjusted offset, || Log2(Polling interval) --. | | yyyy = measured offset, || \ | | zzzz = estimated error. || | | \ MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* 133.243.238.163 1 6 377 45 -1234ns[ -567ns] +/- 456us ^+ ntp.ring.gr.jp 1 6 377 108 -345ns[ 123ns] +/- 678us

*が付いているのが現在使用中の上流サーバーです。Stratum 1の原子時計系サーバーから時刻をもらえていれば問題ありません。
chronyコマンドのより詳しい使い方はchronyc・chronyコマンドでLinuxの時刻同期を管理する方法を参照してください。

7. クライアント側からNTPサーバーへの接続を確認する

クライアントサーバーでchronyc sources -vを実行すると、自前NTPサーバー(192.168.1.10)から時刻が届いているかどうか確認できます。

# クライアントサーバーで実行 chronyc sources -v

実機での出力例(自前NTPサーバーを使用している場合):

[root@client-server ~]# chronyc sources -v ... MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* 192.168.1.10 2 6 377 32 -234ns[ 123ns] +/- 345us

Stratum 2(NTPサーバーより1つ下)になっていること、*が付いていることが確認できればOKです。

chronyc trackingでも詳細な同期情報を確認できます:

[root@client-server ~]# chronyc tracking Reference ID : C0A8010A (192.168.1.10) Stratum : 2 Ref time (UTC) : Sun Jun 14 00:23:45 2026 System time : 0.000000234 seconds slow of NTP time Last offset : -0.000000234 seconds RMS offset : 0.000000456 seconds Frequency : 3.789 ppm slow Residual freq : +0.001 ppm Skew : 0.456 ppm Root delay : 0.004567 seconds Root dispersion : 0.000123 seconds Update interval : 64.2 seconds Leap status : Normal

Reference IDに自前NTPサーバーのIPが表示されていれば、正常に同期できています。

timedatectlでも同期状態を素早く確認できます:

[root@client-server ~]# timedatectl Local time: Sun 2026-06-14 09:23:45 JST Universal time: Sun 2026-06-14 00:23:45 UTC RTC time: Sun 2026-06-14 00:23:45 Time zone: Asia/Tokyo (JST, +0900) System clock synchronized: yes NTP service: active RTC in local TZ: no

System clock synchronized: yesNTP service: activeの両方が表示されていれば同期完了です。
timedatectlのNTP設定詳細はtimedatectlコマンドでLinuxのタイムゾーンと時刻を設定する方法も参照してください。

ズレが直らない時のトラブルシュート

【トラブル1】クライアントがNTPサーバーに到達できない

NTPサーバー側でfirewalldの設定を確認してください。

# NTPサーバー側で確認 firewall-cmd --list-services # ntp が含まれていなければ開放する firewall-cmd --permanent --add-service=ntp firewall-cmd --reload

allowディレクティブに正しいサブネットが記載されているかも確認してください:

grep allow /etc/chrony.conf # allow 192.168.1.0/24 のように正しいサブネットが表示されるか確認

【トラブル2】chronyc sourcesに?マークが表示される

?は「時刻源として使用不能」を意味します。原因として考えられること:

ネットワーク疎通の問題:ping 192.168.1.10で到達確認
NTPポートの不通:nc -u -v 192.168.1.10 123で123/udpの疎通テスト
chrony.confのserver行の記述ミス:IPアドレスまたはホスト名の誤りを確認

# NTPポートの疎通テスト(NTPサーバーのIP宛に実行) nc -u -v 192.168.1.10 123 # chronydのログを確認する journalctl -u chronyd -n 50

【トラブル3】時刻ズレが大きくてchronydが自動補正しない

chronydは時刻ズレが大きすぎると(デフォルト1000秒以上)、安全のために自動ステップ補正を行いません。
初期設定時や久しぶりの同期時はchronyc makestepで強制的に時刻を合わせます:

# 強制的に時刻を現在のNTPサーバー値に合わせる chronyc makestep # makestep後にtrackingで確認する chronyc tracking

本記事のまとめ

自前NTPサーバーの構築手順をまとめます。

やりたいこと コマンドまたは設定
chronyをインストールして起動する dnf install -y chrony && systemctl enable --now chronyd
NTPサーバーとして許可するサブネットを設定する /etc/chrony.conf に allow 192.168.1.0/24 を追加
NTPポートをfirewalldで開放する firewall-cmd --permanent --add-service=ntp && firewall-cmd --reload
クライアントから自前NTPサーバーを参照する /etc/chrony.conf に server 192.168.1.10 iburst を追加
NTPサーバーへの同期状況を確認する chronyc sources -v
時刻同期の詳細情報を確認する chronyc tracking
NTP同期のステータスを素早く確認する timedatectl
大幅なズレを強制補正する chronyc makestep

クライアント側でchronyc sourcesの*が自前NTPサーバーのIPを指していれば、構築完了です。

時刻同期はLinuxサーバー運用の基礎中の基礎ですが、意外と後回しにされがちです。
新規サーバーを構築したら、ファイアウォール設定やSSH設定と同じタイミングで時刻同期の構成も必ず確認する習慣をつけてください。

既存のntpd環境からchronyへ移行する場合の詳細はntpd 時刻同期設定の解説を参考にしてください。

NTPの設定、本当に理解できていますか?

時刻同期はサーバー運用の基礎でありながら、設定ミスが深夜の障害対応に直結することがあります。allowの書き方一つで社内全体のサーバーが時刻源を失うこともあります。個別の設定コマンドを覚えるだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。