NTP/NTSを使用した時刻の同期
- 概要
この記事では、時刻同期の概要と、時刻同期を設定する方法について説明します。
- 目的
タスクやリソースを他のチームメンバーとネットワーク経由で共有する際には、システム時刻の同期を維持することが非常に重要です。
- 所要時間
この記事を理解して、コンピュータで時刻同期の基本的な設定を行うのに60分ほどを要します。
- 要件
Linuxシステム管理の基本的な知識があること。タスクに応じて
root特権があること。ソースタイムサーバにアクセスするための内部ネットワーク接続またはインターネットへのネットワーク接続が機能していること。
1 概要 #
コンピュータ上で同期された正確なシステム時間を維持することは、チームワークにとって不可欠です。計画アプリケーションやカレンダアプリケーションは、このようなシステム時刻を利用して時間を正確に追跡し、時間どおりにユーザに予定を通知します。クラスタ化されたアプリケーションでは、多くの場合、ホストマシンどうしが相互に通信するには同期したシステム時刻が必要です。
内蔵ハードウェアクロックは信頼できるタイムソースではありません。システム時刻を手動で修正すると、時刻が突然変化することにより、重要なアプリケーションが誤動作する原因となることがあります。したがって、ネットワークを介して外部の信頼できるタイムソースにシステム時刻が同期している必要があります。
1.1 NTPとは #
Network Time Protocol (NTP)は、ネットワークを通じてシステム時刻が同期するように設計されています。NTPの目標は、絶対時間を維持し、それを使用してネットワーク内のすべてのマシンのシステム時刻を同期することです。
1.2 NTSとは #
Network Time Security (NTS)は、NTPのセキュリティ拡張機能です。NTSは、NTPメッセージを認証して暗号化するメカニズムを提供し、受信した時刻データが安全で信頼性が高いことを保証します。NTSは、既存のNTPインフラストラクチャと下位互換性があるように設計されています。これにより、NTSをサポートしていない既存のNTPサーバに変更を加えることなく、段階的な展開が可能になります。
1.3 NTPの動作 #
NTPサービスが適切に設定されている場合、このサービスは信頼できるタイムサーバに継続的に問い合わせ、システム時刻を調整します。一般的に、インターネットに接続された家庭用コンピュータなどのデバイスは、インターネット上のパブリックタイムサーバに問い合わせるように設定されています。
逆に、企業のサブネット内に存在するデスクトップコンピュータやサーバは、ローカルネットワーク内の専用のタイムサーバに問い合わせるように設定されています。このタイムサーバ自体は、公開タイムサーバの時刻に同期しています。
1.3.1 実装 #
chronyは、SUSE Linux Enterprise ServerにおけるNTPのデフォルト実装です。chronyは次の2つの部分で構成されます。
chronyd: 起動時に開始できるsystemdサービスです。chronycは、chronydのパフォーマンスを監視し、実行時に特定の操作パラメータを変更するためのコマンドラインインタフェースプログラムです。
1.4 利点 #
NTPを使用して正確な時刻を維持することには、次の利点があります。
スケジュールに従って行動する場合に時計を利用できます。
スケジュール設定したデスクトップアクションやシステムアクションをアプリケーションで正確に開始できます。
クラスタノードは、データを同期させて最新の状態に保つことができます。
インターネットへのアクセスが制限されているネットワークでは、内部タイムサーバを使用して同期状態のシステム時刻を維持できます。
NTSを介してNTPにセキュリティ対策を統合することで、プロトコルの堅牢性を高め、安全でない時刻同期に関連する脆弱性に対処します。
2 /etc/chrony.confの調整によるNTPの設定 #
chronydを起動すると、/etc/chrony.confファイルから設定が読み込まれます。以下の各セクションでは、chronydの動作に影響すると考えられる重要なパラメータについて説明します。
2.1 タイムソースの指定 #
コンピュータの時計を同期状態で維持するには、どのタイムソースを使用するかをchronydに指示する必要があります。このためには、server、pool、およびpeerのディレクティブを使用します。それぞれを複数回使用できます。
serverディレクティブは、特定のホストの名前またはIPアドレスを指定して、それをタイムサーバとして使用することをchronydに指示します。
server 0.europe.pool.ntp.org offline1 server 1.europe.pool.ntp.org offline prefer2 server 192.168.2.254
| |
|
poolディレクティブを使用すると、時間の経過とともに切り替わる複数のIPアドレスに解決されるネットワーク名を指定できます。
pool pool.ntp.org iburst1 maxsources 32
| |
|
peerディレクティブは、タイムサーバの代わりにNTPピアホストを指定します。ピア間のシステム時刻の同期には、serverオプションとpoolオプションで呼び出すクライアント/サーバモードではなく、対称アーキテクチャを使用します。peerを複数回使用して複数のピアを指定できます。
peer 192.168.1.116 peer ntp.example.com
2.2 NTPサーバとしてのchronydの実行 #
デフォルトでは、指定したNTPサーバのクライアントとしてchronydが機能します。これをNTPサーバとしても使用するには、/etc/chrony.confファイルにallowディレクティブを追加します。NTPサーバポート(デフォルトでは123)を開き、クライアントの要求に応答します。
単一のNTPクライアントのIPを指定できるほか、複数のクライアントを含むサブネットを指定することもできます。allowディレクティブは複数回使用できます。
allow 1.2.3.4 allow 3.4.5.0/24
IPアドレスやサブネットを指定せずにallowディレクティブを単独で使用すると、すべてのIPv4およびIPv6アドレスからのアクセスを許可します。
記述したallowディレクティブによるアクセスを制限するには、その後にdenyディレクティブを記述します。
allow 1.2.3.4 deny 1.2.3.0/24 allow 1.2.0.0/16
前期の例では、3つのディレクティブの記述順序に関係なく同じ効果が得られます。サブネット1.2.0.0/16はアクセスを許可されますが、サブネット1.2.3.0/24はアクセスを拒否されます。ただし、ホスト1.2.3.4のアクセスは許可されます。
2.3 ローカル基準の時計の設定 #
chronydは、gpsdなどの他のプログラムを使用して、特定のドライバからタイミングデータにアクセスします。/etc/chrony.confのrefclockディレクティブを使用して、タイムソースとして使用するハードウェア基準時計を指定します。これには、2つの必須パラメータ(ドライバ名とドライバ固有のパラメータ)があります。2つのパラメータの後には、ゼロ以上のrefclockオプションが続きます。chronydには、次のドライバが含まれています。
- PPS
カーネルのPPS(Pulse Per Second)APIドライバ。次に例を示します。
refclock PPS /dev/pps0 lock NMEA refid GPS
- SHM
NTP共有メモリドライバ。次に例を示します。
refclock SHM 0 poll 3 refid GPS1 refclock SHM 1:perm=0644 refid GPS2
- SOCK
Unixドメインソケットドライバ。次に例を示します。
refclock SOCK /var/run/chrony.ttyS0.sock
- PHC
PTPハードウェア時計ドライバ。次に例を示します。
refclock PHC /dev/ptp0 poll 0 dpoll -2 offset -37 refclock PHC /dev/ptp1:nocrossts poll 3 pps
個々のドライバのオプションについて詳しくは、man 8
chrony.confを参照してください。
2.4 オフラインタイムソースの有効化 #
chronydは、ネットワークに接続されていない状態でブートするシステム上でも正常に起動しますが、/etc/chrony.confで指定されたタイムサーバにはアクセスできません。アクセスできないタイムサーバへのchronydによる問い合わせを防止するには、タイムソースディレクティブに続いてofflineオプションを記述します。次に例を示します。
server ntp.example.org offline
これにより、次のコマンドでサーバのポーリングを有効にしない限り、chronydではサーバがポーリングされません。
# chronyc online ntp.example.org
offlineオプションの代わりにauto_offlineオプションを設定すると、タイムサーバに2つの要求を送信しても応答がなかった場合、chronydではそのタイムサーバがオフラインになっていると見なされます。このオプションを使用することで、ネットワークリンクを切断するときにchronycからofflineコマンドを実行する必要がなくなります。
3 実行時のchronydの管理 #
3.1 chronycとは #
chronycは、chrony NTP実装のクライアント部分です。chronycコマンドを使用して、実行時にchronydサービスの動作を変更できます。chronydの操作に関するステータスレポートも生成します。
chronycを使用して行われた変更は、永続的ではありません。次回のchronydの再起動後に現在の変更内容は失われます。永続的な変更状態とするには、2項 「/etc/chrony.confの調整によるNTPの設定」の説明に従って/etc/chrony.confを変更します。
3.2 chronycの動作 #
chronycは、対話的モードと非対話的モードのどちらでも実行できます。chronycを対話形式で実行するには、コマンドラインで「chronyc」と入力し、Enterキーを押します。プロンプトを表示し、コマンド入力を待ちます。たとえば、オンラインまたはオフラインのNTPソースの数を確認するには、次のようにactivityコマンドを実行します。
#chronycchronyc> activity 200 OK 4 sources online 2 sources offline 1 sources doing burst (return to online) 1 sources doing burst (return to offline) 0 sources with unknown address
chronycのプロンプトを終了するには、quitまたはexitを入力します。
対話型プロンプトを使用する必要がない場合は、次のようにコマンドを直接入力します。
#chronycactivity
4 NTSの設定 #
NTPプロトコルでは、タイムサーバとクライアント間の通信を認証および暗号化するためのセキュリティメカニズムは導入されていません。ネットワークタイムセキュリティ(NTS)は、NTPのセキュリティを強化する拡張機能です。chronyはNTSをサポートし、時間ソースを認証して特定のネットワーク攻撃から保護することができます。
以下の手順では、安全な時刻同期のためにタイムサーバとクライアントマシンを設定する方法について説明します。
(オプション) NTS経由で時刻を更新するようにタイムサーバを設定することをお勧めします。これにより、同期チェーンの最初から安全な時刻同期が保証されます。
/etc/chrony.conf内のNTSをサポートしていない既存の時間ソースをコメントアウトし、NTSをサポートする時間ソースを少なくとも1つ追加します。次に例を示します。server time.cloudflare.com iburst nts
ヒントntsオプションは、NTS接続が利用可能な場合はそれを要求し、NTSが利用できない場合はNTPにフォールバックします。chronydサービスを再起動します。>sudosystemctl restart chronyd.service設定された時間ソースを確認します。
>chronyc sources -vMS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^? time.cloudflare.com 3 6 1 2 -947ms[ -947ms] +/- 12ms ^? pyrrha.fi.muni.cz 2 6 1 1 -948ms[ -948ms] +/- 39ms ^* whitesoft-intex16.c.cbsn> 1 6 1 2 -948ms[ -948ms] +/- 5444us ^? mail.combatostrich.dev 2 6 1 1 -948ms[ -948ms] +/- 28ms注記^*で始まる行には、最適として選択された時間ソースが含まれます。設定された時間ソースがNTSモードを使用していることを確認します。
>chronyc -N authdataName/IP address Mode KeyID Type KLen Last Atmp NAK Cook CLen ========================================================================= [...] time.cloudflare.com NTS 1 15 256 3 0 0 8 96サーバ設定に、どのクライアントがタイムサーバと時刻を同期できるかを指定する、
allowオプションが含まれていることを確認します。次に例を示します。allow 192.168.1.0/24
(オプション) タイムサーバがファイアウォールの背後で実行されている場合は、NTPとNTSの両方のポートでの通信を許可します。デフォルトでは123と4460です。
TLS証明書と対応する秘密鍵を取得し、
/var/lib/chrony/にコピーします。chronyで読み取り可能であることを確認します。次に例を示します。>sudoinstall -m 0440 -o chrony -g chrony nts.key /var/lib/chrony/>sudoinstall -m 0440 -o chrony -g chrony nts.crt /var/lib/chrony//etc/chrony.confを編集し、ntsdumpdir /var/lib/chronyオプションがアクティブであることを確認します。次に、TLSキーと証明書へのパスを追加します。ntsdumpdir /var/lib/chrony ntsserverkey /var/lib/chrony/nts.key ntsservercert /var/lib/chrony/nts.crt
chronydサービスを再起動します。>sudosystemctl restart chronyd.service
既存のNTPソースを無効にします。次に例を示します。
#server 192.168.1.1 iburst
ソース設定は、
/etc/chrony.confまたは/etc/chrony.d/の下のファイルに含まれています。クライアントホストは、TLS証明書に署名したルートCAを信頼する必要があります。CA証明書ストアを管理する方法の詳細については、専用の記事をご覧ください。
手順1「NTSタイムサーバの設定」で設定したNTSタイムサーバソースを、
/etc/chrony.confのクライアントchrony設定に追加します。次に例を示します。server nts1.example.com iburst nts
chronydサービスを再起動します。>sudosystemctl restart chronyd.serviceクライアントで設定されたタイムソースを確認し、接続が認証されていることを確認します。
>sudochronyc sources -v>sudochronyc -N authdataNTSタイムサーバで、NTS接続に関するクライアントごとの統計情報を確認します。
>sudochronyc -N clients -k
5 chronydsystemdサービス #
chronyの主要部分は、バックグラウンドで動作して、選択したタイムサーバとシステム時刻を同期するchronydsystemdサービスです。次のsystemdコマンドを使用してchronydサービスを操作できます。
-
systemctl status chronyd.service chronydサービスの現在のステータスに関する詳しい情報を出力します。-
systemctl is-enabled chronyd.service システムをブートするときに
chronydサービスが自動的に開始される機能が有効になっているかどうかを確認します。-
systemctl enabled chronyd.service システムをブートするときに
chronydサービスが自動的に開始される機能を有効にします。-
systemctl disable chronyd.service システムをブートするときに
chronydサービスが自動的に開始される機能を無効にします。-
systemctl is-active chronyd.service chronydサービスが開始されていて実行中かどうかを確認します。-
systemctl start chronyd.service chronydサービスを開始します。-
systemctl stop chronyd.service chronydサービスを停止します。-
systemctl restart chronyd.service chronydサービスを再起動し、/etc/chronyd.confを再ロードします。
6 トラブルシューティング #
エラーが発生した場合は以下を確認します。
コンピュータがネットワークに接続されていること、およびネットワークが正しく設定されていることを確認します。
>sudosystemctl status network.service ● NetworkManager.service - Network Manager Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2021-08-07 20:09:44 CEST; 4 days ago [...]タイムソースとして入力したタイムサーバが存在していて、ネットワーク経由でアクセスできることを確認します。次に例を示します。
>ping pool.ntp.org PING pool.ntp.org (85.199.214.101) 56(84) bytes of data. 64 bytes from 85.199.214.101 (85.199.214.101): icmp_seq=1 ttl=37 time=29.9 ms [...]使用しているコンピュータ上で
firewalldサービスがアクティブになっている場合は、NTPサービスが許可されていることを確認します。次のように、
chronydサービスが実行されていることを確認します。>sudosystemctl status chronyd.service ● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2021-08-07 20:09:44 CEST; 4 days ago [...]仮想化ゲストのシステム時刻が正確な時刻と異なる場合は、VMホストサーバのシステム時刻が有効なタイムサーバと同期されていること、およびゲストがホストと同じタイムソースと同期されていることを確認します。
システムのブートでNTPサービスが正しく起動しない場合は、
PortfastではなくEdge Portsとしてポートを設定した状態で、Spanning Tree Protocolを使用するようにネットワークスイッチを設定していることが原因として考えられます。この場合は、ネットワーク接続が確立されるまでに最長で1分程度を要することがあります。NetworkManagerの使用時に、システムブート中にNTPサービスが開始しない場合は、
/etc/sysconfig/network/configファイルを編集して、NM_ONLINE_TIMEOUTの値を30に変更します。問題が解決しない場合は、タイムアウトの値を15増やして再試行します。NTPソースにアクセスできない場合は、次のコマンドでソースを特定します。
>chronyc sources -v [...] MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* time.mydomain.com 3 10 377 81 -5354us[-8257us] +/- 191ms ^? ntp1.example.com 0 10 0 - +0ns[ +0ns] +/- 0ns ^? 77.177.77.177 0 10 0 - +0ns[ +0ns] +/- 0ns ^? ntp3.example.com 0 10 0 - +0ns[ +0ns] +/- 0ns ^? ntp4.example.net 0 10 0 - +0ns[ +0ns] +/- 0ns ^? 2a02:3d8:1::1:1 0 6 0 - +0ns[ +0ns] +/- 0ns ^? ntp2.example.org 0 10 0 - +0ns[ +0ns] +/- 0nsこの場合、実際に時刻を提供しているサーバは
time.mydomain.comのみです。障害が発生したリモートNTPタイムソースへのネットワーク接続について、一般的なトラブルシューティングも必要です。
7 詳細情報 #
firewalldを使用してコンピュータをセキュリティで保護する方法についてはhttps://documentation.suse.com/sles/html/SLES-all/cha-security-firewall.html#sec-security-firewall-firewalldを参照してください。systemdサービスを操作するすべてのコマンドについてはhttps://susedoc.github.io/doc-modular/main/html/reference-systemctl-enable-disable-services/に説明があります。詳しい情報については、次の関連するマニュアルの該当ページを参照してください。
すべての設定ディレクティブについては
man 1 chrony.confを実行してください。すべての
chronycコマンドについてはman 1 chronycを実行してください。すべての
chronydコマンドラインオプションについてはman 8 chronydを実行してください。
8 法的事項 #
Copyright© 2006–2025 SUSE LLC and contributors. All rights reserved.
この文書は、GNU Free Documentation Licenseのバージョン1.2または(オプションとして)バージョン1.3の条項に従って、複製、頒布、および/または改変が許可されています。ただし、この著作権表示およびライセンスは変更せずに記載すること。ライセンスバージョン1.2のコピーは、「GNU Free Documentation License」セクションに含まれています。
SUSEの商標については、https://www.suse.com/company/legal/を参照してください。その他の第三者のすべての商標は、各社の所有に帰属します。商標記号(®、™など)は、SUSEおよび関連会社の商標を示します。アスタリスク(*)は、第三者の商標を示します。
本書のすべての情報は、細心の注意を払って編集されています。しかし、このことは正確性を完全に保証するものではありません。SUSE LLC、その関係者、著者、翻訳者のいずれも誤りまたはその結果に対して一切責任を負いかねます。