こう思ったとき、真っ先に浮かぶのが「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 でクライアント側の同期状況を確認できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
時刻同期の重要性と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
自前NTPサーバー化(allowディレクティブの設定)
3. /etc/chrony.confにallowを追加してサーバーモードにする
デフォルトのchronydはNTPクライアント(外部から時刻をもらう)として動作します。社内の他サーバーへNTPを提供するには、allowディレクティブで許可するサブネットを指定します。# /etc/chrony.conf を編集する vi /etc/chrony.conf
# 追加する設定例(ファイル末尾に追記) # 社内サブネット全体に時刻を提供する allow 192.168.1.0/24 # 複数サブネットを許可する場合は行を並べる # allow 10.0.0.0/8 # allow 172.16.0.0/12 # インターネット接続がない環境で自分自身を時刻源とする場合(参考) # local stratum 10
# 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行をコメントアウトする # 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
[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: yesとNTP 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
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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:Linuxでディスクが容量不足になった時の対処手順|原因ファイルの特定から安全な削除まで
- 前のページへ:Linuxの/dev/null 2>&1 とリダイレクトの意味|標準出力・標準エラーを捨てる仕組みを徹底解説
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます