こんにちは、フルスタックエンジニアのryuです。
今回の記事では、LinuxへNTPサーバーを構築し、ネットワーク内のクライアントへ正しい時刻を配信する方法を解説します。
元記事ではntpdを利用していましたが、現在のUbuntuやRed Hat系Linuxでは、chronyを使う構成が一般的です。
時刻がずれると、ログの調査、証明書の検証、認証、バックアップ、監視などへ影響します。数分程度のずれでも、障害発生時刻を正しく追えないことがあります。
この記事では、chronyのインストール、上位NTPサーバーの設定、クライアントからのアクセス許可、ファイアウォール、同期確認まで順番に解説します。
NTPサーバーの設定方法解説¶
今回の記事では、NTPサーバーの設定方法について解説します。Linuxにchronyをインストールして、NTPサーバーとして動作させます。
手順は次のとおりです。
| 手順 | 作業内容 |
|---|---|
| 1 | chronyをインストールする |
| 2 | 上位NTPサーバーを設定する |
| 3 | クライアントからのアクセスを許可する |
| 4 | UDP 123番ポートを許可する |
| 5 | chronycで同期状態を確認する |
すでに別の時刻同期サービスが動いている場合は、複数のデーモンを同時に動かさないようにします。
NTPとchronyの基本¶
NTPは、Network Time Protocolの略で、ネットワークを通じてコンピューターの時刻を同期するためのプロトコルです。
chronyはNTPを実装したソフトウェアで、chronydというデーモンと、確認・操作に使うchronycコマンドで構成されています。
NTPサーバーを社内に置く理由¶
今回構築するLinuxサーバーは、上位のNTPサーバーから時刻を受け取り、社内のLinuxやネットワーク機器へ配信します。
上位NTPサーバー
↓
社内NTPサーバー(chronyd)
↓
Linux・ルーター・スイッチ
問い合わせ先を社内NTPサーバーへ集約すると、外部への通信経路や参照先を管理しやすくなります。
ログの時系列や認証、監視を正しく動かすためにも、時刻同期が必要です。
chronyをインストールする¶
timedatectl status
System clock synchronizedやNTP serviceの項目を確認してください。
Ubuntu・Debian系の場合¶
次のコマンドを実行します。
sudo apt update
sudo apt install chrony
インストールコマンドを入力するとこちらのようになります。
特にエラーが出なければ問題ありません。
画像は旧記事でntpパッケージをインストールしていた画面です。現在はchronyパッケージを使用してください。
主な設定ファイルは次の場所です。
/etc/chrony/chrony.conf
Rocky Linux・AlmaLinux・RHEL系の場合¶
Red Hat系では、次のコマンドです。
sudo dnf install chrony
sudo systemctl enable --now chronyd
主な設定ファイルは/etc/chrony.confです。
Linuxによってサービス名と設定ファイルが異なるため、OSが不明な場合は次のコマンドで確認します。
cat /etc/os-release
上位NTPサーバーを設定する¶
chronyをインストールしたら、時刻の取得元を設定します。
ディストリビューション標準のNTPプールを利用できる場合は、無理に変更する必要はありません。
設定ファイルをバックアップする¶
Ubuntu・Debian系の例です。
sudo cp /etc/chrony/chrony.conf /etc/chrony/chrony.conf.bak
sudo vi /etc/chrony/chrony.conf
Red Hat系では、パスを/etc/chrony.confへ変更します。
NICTの公開NTPを指定する¶
NICTの公開NTPサービスを利用する例は次のとおりです。
server ntp.nict.jp iburst
iburstは、起動直後などに複数回問い合わせを行い、初回同期を早めるためのオプションです。
本番環境では、会社やクラウド事業者が提供するNTP、ディストリビューション標準のプールを優先する場合もあります。
単一の時刻源だけに依存せず、運用方針に合った複数の信頼できる時刻源を利用しましょう。
serverとpoolの違い¶
serverは指定したホストを時刻源として使い、poolは名前解決で得られた複数のサーバーを入れ替えながら利用します。
pool pool.ntp.org iburst
既存のpoolやserver行を残したまま追加すると、複数の時刻源が使われます。
クライアントからのアクセスを許可する¶
chronydは、インストールしただけでは通常、ネットワーク上のクライアントへNTPサーバーとして応答しません。
allowディレクティブで、利用を許可するネットワークを指定します。
allowで接続元を制限する¶
クライアントのネットワークが192.168.10.0/24の場合は、次の行を追加します。
allow 192.168.10.0/24
元記事では、次のntpd用設定を紹介していました。
restrict 192.168.10.1 mask 255.255.255.0 notrust
この例はネットワークアドレスではなくホストアドレスを指定しており、現在のchrony設定としても使いません。
最小構成は次のようになります。
server ntp.nict.jp iburst
allow 192.168.10.0/24
allow allは設定しない¶
次の設定は、すべてのIPv4・IPv6アドレスからの問い合わせを許可します。
allow all
社内NTPサーバーでは、実際に利用するサブネットだけを許可してください。
インターネットへ無制限に公開すると、不要な問い合わせや攻撃に悪用される可能性があります。
chronyの設定を反映する¶
設定後は、再起動する前に内容を確認します。
設定内容とログを確認する¶
chronyが読み込む設定は、次のコマンドで確認できます。
sudo chronyd -p
サービスのエラーはログでも確認します。
sudo journalctl -u chrony -n 50
Red Hat系では、サービス名をchronydへ変更します。
サービスを再起動する¶
Ubuntu・Debian系では、次のコマンドです。
sudo systemctl restart chrony
sudo systemctl status chrony
Red Hat系では、次のコマンドを使います。
sudo systemctl restart chronyd
sudo systemctl status chronyd
正常に再起動できたら完了です!

クライアントからNTPサーバーへ同期する¶
画像は旧ntpdの実行例です。現在はsystemctl statusとchronycを使って確認しましょう。
クライアントを同期する前に、サーバー側でUDP 123番を許可します。
ファイアウォールでUDP 123番を許可する¶
別のコンピューターから利用する場合は、NTPが使うUDP 123番ポートを許可します。
firewalldの場合¶
sudo firewall-cmd --permanent --add-service=ntp
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
可能であれば、ゾーンやリッチルールで接続元ネットワークも制限します。
UFWの場合¶
UbuntuでUFWが有効な場合は、社内ネットワークからだけ許可します。
sudo ufw allow from 192.168.10.0/24 to any port 123 proto udp
sudo ufw status
chrony.confのallowとファイアウォールの両方で範囲を絞ると、不要な公開を防ぎやすくなります。
chronycで同期状態を確認する¶
サービスが起動しているだけでは、上位NTPサーバーと同期できているとは限りません。
sourcesで時刻源を確認する¶
chronyc sources -v
表示例は次のとおりです。
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp-a3.nict.go.jp 1 6 377 30 -120us[-150us] +/- 10ms
主な記号は次のように読みます。
| 記号 | 意味 |
|---|---|
^* |
現在同期に選ばれている時刻源 |
^+ |
組み合わせて利用可能な時刻源 |
^? |
到達できない、または測定値が不足 |
^x |
不正確と判断された時刻源 |
trackingで時刻のずれを確認する¶
chronyc tracking
Reference ID、System time、Last offset、Leap statusなどを確認します。
Leap status : Normalで、利用中の時刻源が表示されていれば、同期できている可能性が高いです。
OS全体の状態はtimedatectl statusでも確認できますが、詳細な同期状態はchronycを使用しましょう。
クライアント側へNTPサーバーを設定する¶
NTPサーバーのIPアドレスを192.168.10.10とします。
クライアント側のchrony.confへ、次の行を追加します。
server 192.168.10.10 iburst
会社の方針で社内NTPだけを使う場合は、既存の外部poolやserver行をコメントアウトします。
設定を反映したら、同期先を確認します。
sudo systemctl restart chrony
chronyc sources -v
Red Hat系ではサービス名をchronydへ変更します。
NTPサーバー側では、接続してきたクライアントを確認できます。
sudo chronyc clients
問い合わせが届かない場合は、allow、UDP 123番、ルーティング、クライアントの参照先を確認してください。
【関連記事】NTPとは?時刻同期の仕組みを解説
NTPサーバーと同期できない場合¶
問題が起きたときは、設定を何度も書き換える前に原因を分けて確認します。
chronydが起動しているか¶
systemctl status chrony
Red Hat系では次のとおりです。
systemctl status chronyd
journalctl -u chronyd --since today
上位NTPサーバーを名前解決できるか¶
getent hosts ntp.nict.jp
名前解決できなければ、chronyより先にDNS設定を確認します。
時刻が大きくずれている場合¶
設定に次の行があれば、起動直後の大きなずれを即時補正できます。
makestep 1.0 3
これは最初の3回の更新中に1秒を超えるずれがある場合、時計をステップ補正する設定です。
手動で即時補正する場合は、次のコマンドがあります。
sudo chronyc makestep
稼働中のデータベースなどでは、時計が急に変わる影響を確認してから実行してください。
AWS EC2で時刻同期する場合¶
EC2では、VPC内から利用できるAmazon Time Sync Serviceがあります。
IPv4のリンクローカルアドレスは次のとおりです。
server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4
AMIによっては最初から設定されているため、既存設定を削除する前にchronyc sources -vを確認してください。
NTPサーバー設定方法まとめ¶
今回の記事では、Linuxへchronyをインストールし、NTPサーバーとして時刻を配信する方法を解説しました。
基本設定は次のようになります。
server ntp.nict.jp iburst
allow 192.168.10.0/24
設定後は、サービスが起動しただけで終わらせず、次のコマンドで同期状態を確認します。
chronyc sources -v
chronyc tracking
chronyc clients
クライアントから利用する場合は、chronyのallowとファイアウォールの両方で、UDP 123番を必要なネットワークだけに許可してください。
NTPサーバーを自分で構築する機会は多くないかもしれませんが、ログ・認証・証明書などを支える重要な仕組みです。
このようなインフラに関連する技術を当ブログで紹介しているので興味のある方は是非ご覧ください。