たった3行編集!ChronyでシンプルNTPサーバー構築
NTPサーバーの仕組みと作り方をCentOSの Chrony を使ってお伝えします。
この記事は アイソルート Advent Calendar 2020 1日目の記事です。
こんにちは。日々検証環境を構築しているプラットフォームソリューショングループのsuzuki.koです。
ローカルな検証環境を構築するために必ず必要になってくるNTPサーバー。
簡単に設定できるでしょ!と思いきや、 意外な落とし穴 があったりします。
今回はChronyのハマりポイントを解説しながら、シンプルなNTPサーバーを構築する方法をお伝えします。
目次
NTPサーバーとは
NTPとは Network Time Protocol の略で 時刻を同期 するために使われるサーバーです。
ネットワーク内の機器の時刻をNTPサーバーで同期しておくことで、ログの時間を突き合わせることができるようになり、
スムーズなトラブルシューティングが可能になります。
また、一部の製品では時刻同期が冗長構成やライセンスの有効化のために必要な条件になっていたりします。
NTPの仕組み
最初にNTPの仕組みと重要な用語について簡単に解説しておきます。
NTPサーバーは常に自分より正確で信頼できる上位NTPサーバーを参照することで、時刻の正確さを担保しています。
この参照のつながりは階層構造となっており、各層のことを Stratum と呼び、0~16の数字で表されます。
原子時計やGPSなどの高信頼性の時計を Stratum 0 と定義し、階層を下っていくにつれて数字が大きくなっていきます。
Stratum 1 のサーバーをPrimaryサーバーと呼び、Stratum 2~15 のサーバーをSecondaryサーバと呼びます。
Stratum 16 は信頼できない時刻ソースとされ利用できません 。
例えば、 上位との接続が切断された NTPサーバーのStratumは自動で16へと落とされ、 参照先としては利用できなくなります 。
Chronyとは
冒頭で名前を出した Chrony とは、CentOSに標準でインストールされているNTPサーバーです。
使い勝手も悪くなく、きちんと動いてくれるのでよく利用しています。
ただし、完全にLocalな検証環境など、 上位に接続できない状態 で構築する場合は、少しコツが要ります。
そこの部分も含めて次の章で構築方法を解説していきます。
NTPサーバー構築
私がいつも行っているNTPサーバー構築の手順を解説します。
前提としてVMの立ち上げ、IP設定などは完了し、pingによる疎通は確立していることとします。
動作環境
検証環境の作成にはESXi、OSはCentOSを利用します。各種バージョンは以下の通りです。
- ハイパーバイザ
- VMware ESXi 6.7.0 Update 2 (build-13006603)
- NTPサーバー
- CentOS Linux release 8.2.2004 (Core)
- chrony-3.5-1.el8.x86_64
- Client (Clientでも動作確認でChronyを利用します)
- CentOS Linux release 8.2.2004 (Core)
- chrony-3.5-1.el8.x86_64
ただ、上記以外の環境でも大抵の場合は問題なく動くと思います。
ネットワーク構成
今回のネットワーク構成は以下のようなシンプルなものにしておきます。
Client (192.168.10.10) からNTPサーバー (192.168.10.200) に対して時刻同期ができれば成功です。
Firewalldの設定
少し話は逸れますが、ハマったことがあるのでFirewalldについて触れておきます。
FirewalldとはCentOSの標準ファイアウォール機能で、systemctl (システムコントロール) コマンドで操作することができます。
これが 初期状態で有効 であるため、そのままにしておくとフィルタリングが働いてNTPでの通信が弾かれてしまいます。
設定を無効にするか、
$ systemctl stop firewalld
NTPの通信を許可してあげましょう。
$ firewall-cmd --add-service=ntp $ firewall-cmd --add-service=ntp --permanent
Chronyのステータス確認
まずはChronyを起動させ、ステータスを確認してみます。
Chronyもsystemctlコマンドで操作を行います。
$ systemctl start chronyd $ systemctl status chronyd ● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2222-11-11 11:11:11 EST; 1s ago Docs: man:chronyd(8) man:chrony.conf(5) Process: 1056693 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0> Process: 1056689 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 1056692 (chronyd) Tasks: 1 (limit: 11129) Memory: 684.0K CGroup: /system.slice/chronyd.service mq1056692 /usr/sbin/chronyd Nov 24 13:49:12 ntp systemd[1]: Stopped NTP client/server. Nov 24 13:49:12 ntp systemd[1]: Starting NTP client/server... Nov 24 13:49:12 ntp chronyd[1056692]: chronyd version 3.5 starting (+CMDMON +NTP +REFCLOCK +RT> Nov 24 13:49:12 ntp chronyd[1056692]: Frequency -2.294 +/- 0.179 ppm read from /var/lib/chrony> Nov 24 13:49:12 ntp chronyd[1056692]: Using right/UTC timezone to obtain leap second data Nov 24 13:49:12 ntp systemd[1]: Started NTP client/server.
誤った設定を入れたりするとここにエラーが吐き出されます。
Chronyの構築
前置きが長くなりましたが、構築を行っていきます。
構築と言っても/etc/chrony.conf の内容を書き換えるだけです。
まずはデフォルトの設定を確認してみます。(※ダブルクリックすると全文が確認できます。)
# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). pool 2.centos.pool.ntp.org iburst # Record the rate at which the system clock gains/losses time. driftfile /var/lib/chrony/drift # Allow the system clock to be stepped in the first three updates # if its offset is larger than 1 second. makestep 1.0 3 # Enable kernel synchronization of the real-time clock (RTC). rtcsync # Enable hardware timestamping on all interfaces that support it. #hwtimestamp * # Increase the minimum number of selectable sources required to adjust # the system clock. #minsources 2 # Allow NTP client access from local network. #allow 192.168.0.0/16 # Serve time even if not synchronized to a time source. #local stratum 10 # Specify file containing keys for NTP authentication. keyfile /etc/chrony.keys # Get TAI-UTC offset and leap seconds from the system tz database. leapsectz right/UTC # Specify directory for log files. logdir /var/log/chrony # Select which information is logged. #log measurements statistics tracking
このうち必要最低限の設定のみ変更していきます。
参照サーバー設定
参照先に設定しているNTPサーバーをコメントアウトします。
# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). # pool 2.centos.pool.ntp.org iburst
ここでpoolやhostに何も設定しないのがChrony構築のコツになります。
直感的には「server localhost iburst」と書いて、自分自身を参照するようにしたくなりますが、
このように書いてしまうと、NTPサーバーが自身を繰り返し参照し、Stratumが16になるまでインクリメントし続けてしまいます。
Stratumが16になった段階でNTPサーバーの参照が不可能になり、時刻同期ができなくなります。
時間差で障害が発生するうえ、古い記事には「server localhost iburst」を設定するよう書いてあったりと、
ハマりやすいポイントになっていると思います。
アクセス許可
アクセスを許可するセグメント帯を指定します。
今回はネットワーク図で示したセグメントのみに絞ってアクセス許可を設定します。
# Allow NTP client access from local network. # allow 192.168.0.0/16 allow 192.168.10.0/24
全てのセグメントからの通信を許可したい場合は「allow」とだけ書くことで設定できます。
ローカル用サーバへ設定
上位NTPサーバー
を参照していなくても、時刻同期を行えるように設定します。
適当なStratumを設定すればよいので、デフォルトで用意されていたもののコメントアウトを外します。
# Serve time even if not synchronized to a time source. local stratum 10
以上で設定は終了です。
再起動
設定を反映させるためにChronyを再起動します。
$ systemctl restart chronyd
動作確認
では、動作確認を行いましょう。
Client側で用意したChrony の 上位NTPサーバーとして構築したNTPサーバーを指定 して、無事に同期されれば成功です。
Client側の/etc/chrony.confの参照サーバーに構築したNTPサーバーのipアドレスを入力します。
# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). # pool 2.centos.pool.ntp.org iburst server 192.168.10.200 iburst
Chronyを再起動します。
$ systemctl restart chronyd
時刻同期のステータスを確認します。
$ chronyc sources 210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* 192.168.10.200 10 6 17 30 -10us[ -16us] +/- 92us
ipアドレスの横に「*」があれば同期が完了しています。
Stratumもきちんと10と出ていますね。
設定後Config
最後に設定後のConfig全文を展開しておきます。
参考にしてください。(※ダブルクリックすると全文が確認できます。)
# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). # pool 2.centos.pool.ntp.org iburst # Record the rate at which the system clock gains/losses time. driftfile /var/lib/chrony/drift # Allow the system clock to be stepped in the first three updates # if its offset is larger than 1 second. makestep 1.0 3 # Enable kernel synchronization of the real-time clock (RTC). rtcsync # Enable hardware timestamping on all interfaces that support it. #hwtimestamp * # Increase the minimum number of selectable sources required to adjust # the system clock. #minsources 2 # Allow NTP client access from local network. #allow 192.168.0.0/16 allow 192.168.10.0/24 # Serve time even if not synchronized to a time source. local stratum 10 # Specify file containing keys for NTP authentication. keyfile /etc/chrony.keys # Get TAI-UTC offset and leap seconds from the system tz database. leapsectz right/UTC # Specify directory for log files. logdir /var/log/chrony # Select which information is logged. #log measurements statistics tracking
さいごに
今回はNTPの仕組みとChronyの構築についてお伝えしました。
NTPのような普段何気なく使っているプロトコルでも、きちんと仕組みを調べてみると面白いですね。
詳しく知らないまま雰囲気で設定していたりすると、思わぬところで躓いたりします。
動作原理をしっかり理解して、根拠を持った設計構築ができるエンジニアになっていきたいですね!
明日の記事は watanabe.t さんによる 【まだEC2のSSHで消耗してるの?】AWS Systems Manager Session Managerのススメです、お楽しみに!