今回は、Ubuntu 22.04を使用して、NTPサーバを構築する手順を記事にします。
NTPサーバとして使用するNTPアプリケーションはchronyを使用しています。
期待する目標
本手順で期待する目標は以下の通りです。
- Ubuntu 22.04にchronyをインストールすることができる
- Ubuntu 22.04でNTPサーバを構築できる
- WindowsクライアントからNTPサーバの参照先として設定できる
chronyとは
chronyは、Network Time Protocol (NTP) の実装である。NTPのリファレンス実装であるntpdを置き換えるものである。Unix系オペレーティングシステム (LinuxとmacOSを含む) で動作し、GNU GPL v2の下で公開されている[3]。Red Hat Enterprise Linux 8とSUSE Linux Enterprise Server 15ではデフォルトのNTPクライアント及びサーバーであり[4][5]、多くのLinuxディストリビューションで利用可能である[6][7][8]。
wikiより引用
chrony(クローニー)は、オープンソースで公開されているNTPソフトウェアです。
Linuxなどでは、比較的新し目のOSだと入っていることが多いソフトウェアです。
chronyの他にもUbuntuだとntpdなどがあります。
Ubuntu 22.04だと標準でインストールされていないので、APTでインストールする必要があります。
前提条件
本手順で使用する環境は以下の通りです。
NTPサーバ(Ubuntu)
- OS : Ubuntu 22.04 (Server)
- CPU : 2vCPU
- MEM : 4GB
- DISK : 60GB
- IP : 192.168.100.173
NTPクライアント(Windows Server 2022)
- OS : Windows Server 2022
- CPU : 2vCPU
- MEM : 4GB
- DISK : 60GB
- ドメイン : 非参加
NTPサーバ単体であれば、規模によりますが、ここまで大きなサーバを立てる必要はないと思います。
また、NTPサーバを構築する際には、IPアドレスでのアクセスではなく、ホスト名でアクセスさせることをお勧めします。(NTPサーバは比較的参照される率が高く、IPアドレスが変更になった場合に参照できないクライアントが増えてしまうため。)
NTPクライアントにはWindows Server を採用しました。
Windowsの場合、ドメインに参加しているコンピュータについては、ADを参照します。
また、非ドメイン環境については、MicrosoftのNTPサーバをデフォルトで参照しているため、特に変更しなくても問題ないです。
ただ、それでも正確な時刻を刻む場合がある場合などは、NTPサーバを直接指定することが多いです。
chronyインストール
早速NTPサーバの構築を行っていきます。
設定自体はSSH接続してCLIで設定していきます。
以下のコマンドを実行してUbuntuのアップデートを行います。
willserver@dev-ntp:~$ sudo apt update
willserver@dev-ntp:~$ sudo apt upgrade
以下のコマンドを実行し、chronyをインストールします。
willserver@dev-ntp:~$ sudo apt install chrony
インストールが完了したら、chronyのステータスを確認しておきます。
willserver@dev-ntp:~$ systemctl status chrony
● chrony.service - chrony, an NTP client/server
Loaded: loaded (/lib/systemd/system/chrony.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-12-22 15:32:57 UTC; 22s ago
Docs: man:chronyd(8)
man:chronyc(1)
man:chrony.conf(5)
Process: 16868 ExecStart=/usr/lib/systemd/scripts/chronyd-starter.sh $DAEMON_OPTS (code=exited, status=0/SUCCESS)
Main PID: 16877 (chronyd)
Tasks: 2 (limit: 4534)
Memory: 1.6M
CPU: 37ms
CGroup: /system.slice/chrony.service
tq16877 /usr/sbin/chronyd -F 1
mq16878 /usr/sbin/chronyd -F 1
Dec 22 15:32:57 dev-ntp systemd[1]: Starting chrony, an NTP client/server...
Dec 22 15:32:57 dev-ntp chronyd[16877]: chronyd version 4.2 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 -DEBUG)
Dec 22 15:32:57 dev-ntp chronyd[16877]: Initial frequency 98.228 ppm
Dec 22 15:32:57 dev-ntp chronyd[16877]: Using right/UTC timezone to obtain leap second data
Dec 22 15:32:57 dev-ntp chronyd[16877]: Loaded seccomp filter (level 1)
Dec 22 15:32:57 dev-ntp systemd[1]: Started chrony, an NTP client/server.
Dec 22 15:33:05 dev-ntp chronyd[16877]: Selected source 216.232.132.95 (1.ubuntu.pool.ntp.org)
Dec 22 15:33:05 dev-ntp chronyd[16877]: System clock TAI offset set to 37 seconds
Dec 22 15:33:07 dev-ntp chronyd[16877]: Source 108.61.164.200 replaced with 197.224.66.40 (2.ubuntu.pool.ntp.org)
インストール後にchronyが起動しているので、Active : active (running)となっています。
もし、起動していない場合は以下のコマンドを実行してchronyを起動します。
willserver@dev-ntp:~$ sudo systemctl start chrony
willserver@dev-ntp:~$ systemctl status chrony
起動が完了したら、以下のコマンドを実行して自動起動の設定を確認します。
willserver@dev-ntp:~$ systemctl is-enabled chrony
enabled
もし[disabled]になっていた場合、以下のコマンドを実行して自動起動をオンにしておきます。
willserver@dev-ntp:~$ systemctl enable chrony
Synchronizing state of chrony.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable chrony
Created symlink /etc/systemd/system/chronyd.service → /lib/systemd/system/chrony.service.
Created symlink /etc/systemd/system/multi-user.target.wants/chrony.service → /lib/systemd/system/chrony.service.
willserver@dev-ntp:~$ systemctl is-enabled chrony
enabled
以上でchronyのインストールは完了です。
NTPサーバの設定
chronyのインストールが完了したら、chronyの設定を行っていきます。
NTPサーバとはいえ、上位のNTPサーバを設定してNTPサーバ自体も時刻を同期させたいので、今回は以下の上位NTPサーバを設定します。
- ntp.nict.jp : NICTのNTPサーバ
- 0.jp.pool.ntp.org : NTP POOL PROJECTのNTPサーバ
- 1.jp.pool.ntp.org : NTP POOL PROJECTのNTPサーバ
- 2.jp.pool.ntp.org : NTP POOL PROJECTのNTPサーバ
NTPサーバについては、1台でも良いのですが、冗長化の観点から複数台(3台以上)の指定が推奨されます。
以下のコマンドを実行して、chronyのコンフィグをバックアップします。
willserver@dev-ntp:~$ sudo cp -a /etc/chrony/chrony.conf /etc/chrony/chrony.conf.org
バックアップが完了したら、エディタでコンフィグを設定していきます。
chronyのコンフィグは以下のパスに存在します。
chrony config : /etc/chrony/chrony.conf
willserver@dev-ntp:~$ sudo vi /etc/chrony/chrony.conf
# Welcome to the chrony configuration file. See chrony.conf(5) for more
# information about usable directives.
# Include configuration files found in /etc/chrony/conf.d.
confdir /etc/chrony/conf.d
# This will use (up to):
# - 4 sources from ntp.ubuntu.com which some are ipv6 enabled
# - 2 sources from 2.ubuntu.pool.ntp.org which is ipv6 enabled as well
# - 1 source from [01].ubuntu.pool.ntp.org each (ipv4 only atm)
# This means by default, up to 6 dual-stack and up to 2 additional IPv4-only
# sources will be used.
# At the same time it retains some protection against one of the entries being
# down (compare to just using one of the lines). See (LP: #1754358) for the
# discussion.
#
# About using servers from the NTP Pool Project in general see (LP: #104525).
# Approved by Ubuntu Technical Board on 2011-02-08.
# See http://www.pool.ntp.org/join.html for more information.
#デフォルトのNTPサーバの設定はコメントアウト
#pool ntp.ubuntu.com iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
#今回指定するNTPサーバを追記
server ntp.nict.jp minpoll 6 maxpoll 8
server 0.jp.pool.ntp.org minpoll 6 maxpoll 8
server 1.jp.pool.ntp.org minpoll 6 maxpoll 8
server 2.jp.pool.ntp.org minpoll 6 maxpoll 8
# Use time sources from DHCP.
sourcedir /run/chrony-dhcp
# Use NTP sources found in /etc/chrony/sources.d.
sourcedir /etc/chrony/sources.d
# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys
# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift
# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony
# Uncomment the following line to turn logging on.
#log tracking measurements statistics
# Log files location.
logdir /var/log/chrony
# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0
# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
rtcsync
# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3
# Get TAI-UTC offset and leap seconds from the system tz database.
# This directive must be commented out when using time sources serving
# leap-smeared time.
leapsectz right/UTC
NTPサーバで参照可能なIPアドレスレンジを指定
#Allow IPs
deny all
allow 192.168.100
設定の1つ目は、NTPサーバ自身が時刻同期を行う上位のNTPサーバを設定します。<server / poll> <NTPサーバのホスト名>
と記載することで、上位のNTPサーバを設定できます。
オプションで記載しているminpoll
とmaxpoll
は上位のNTPサーバに問い合わせを行う間隔です。
2の階乗秒の間隔で取得しに行きます。(minpoll 6であれば最小64秒間隔、maxpoll 10であれば最大1024秒間隔)
これについては、内部のNTPサーバを参照するのであれば特に気にする必要はありませんが、外部のNTPサーバに問い合わせを行う場合、マナーとして設定しておきましょう。
デフォルトだとiburstの設定が入っていますが、これはchronyの起動時に短い間隔でポーリングを行うという設定です。
設定するメリットは、起動直後にNTPサーバと同期を取りやすくなります。
最終行にNTPサーバから問い合わせを行うIPアドレスのレンジを設定します。
allow 192.168.100.0/24と記載しても問題ありません。
省略すると、その部分が.0となります。
設定が完了したら、コンフィグファイルを保存し、念のためサービスの再起動を行っておきます。
willserver@dev-ntp:~$ sudo systemctl restart chrony
willserver@dev-ntp:~$ systemctl status chrony
● chrony.service - chrony, an NTP client/server
Loaded: loaded (/lib/systemd/system/chrony.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-12-22 15:32:57 UTC; 22s ago
Docs: man:chronyd(8)
man:chronyc(1)
man:chrony.conf(5)
Process: 16868 ExecStart=/usr/lib/systemd/scripts/chronyd-starter.sh $DAEMON_OPTS (code=exited, status=0/SUCCESS)
Main PID: 16877 (chronyd)
Tasks: 2 (limit: 4534)
Memory: 1.6M
CPU: 37ms
CGroup: /system.slice/chrony.service
tq16877 /usr/sbin/chronyd -F 1
mq16878 /usr/sbin/chronyd -F 1
サービスの再起動が完了したら、実際に上位のNTPサーバから時刻同期ができているか確認します。
willserver@dev-ntp:~$ chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp-k1.nict.jp 1 6 77 8 -1304us[-1164us] +/- 8843us
^+ 133.100.9.2 1 6 77 8 -303us[ -163us] +/- 14ms
^- sv1.localdomain1.com 2 6 77 9 +457us[ +597us] +/- 29ms
^+ 126.99.178.217.static.us> 1 6 77 10 +375us[ +515us] +/- 12ms
[*]がついているものが同期を行っている上位のNTPサーバとなります。
以上でchronyの設定は完了です。
NTPクライアントの同期確認
NTPサーバの設定が完了したら、NTPクライアントから時刻同期が正常にできるか確認します。
今回は確認するクライアントがWindowsなので、Windowsのコマンドプロンプトを起動します。
Windowsのデフォルトで設定されているNTPクライアント設定を確認します。
> w32tm /query /status
今回はHyper-Vの環境でNTPクライアントを動作させている環境上、ソースが[VM IC Synchronization Probider]となっていますが、一応外部のNTPサーバとも同期しています。
以下のコマンドを実行し、NTPサーバの設定を行います。
> w32tm /config /manualpeerlist:<NTPサーバのアドレス>,0x8 /syncfromflags:manual /update
コマンド実行後、[コマンドは正しく完了しました。]と表示されれば、設定は完了です。
WindowsにNTPサーバの設定を確認したら、NTPサーバの同期情報を表示します。
> w32tm /query /status
ソースがNTPサーバの値になっていれば、同期設定はされています。
以上でNTPクライアントのNTPサーバ設定は完了です。
余談 : 本当にNTPサーバと同期ができているか確認
余談ですが、コマンドだけでは時刻同期ができているかわからないので、本当に時刻同期ができているか確認してみたいと思います。
なお、本番環境やそれに類する環境では絶対に行わないでください。
場合によってはログが上書きされ、監査等で必要なログが上書きされる可能性があります!
Windowsの設定より、[時刻と言語]を押下します。
[時刻と言語]-[日付と時刻]より、[時刻を自動的に設定する]を[オフ]にします。
[日付と時刻を手動で設定する]より、[変更]を押下し、Windiws Serverの時刻を巻き戻します。
今回は、5分程度時刻を巻き戻しました。
時刻を巻き戻したら、[時刻を自動的に設定する]を押下し、NTPサーバと再度時刻同期を行います。
[時刻を自動的に設定する]を[オン]にしたら、時刻が一瞬で同期されました。
NTPの挙動として、1分未満の少ない時刻連れの場合、少しずづ時刻を同期しますが大きくずれている場合、一気に同期を行います。
基本的にNTPについては、時刻を進む方向に同期させる場合には大きな影響はありませんが、時刻を戻す方向に調整する場合、ログの出力などに影響があるため、大きく時刻を戻す場合には注意が必要となります。
まとめ
今回はUbuntu 22.04を使用し、NTPサーバの構築を行いました。
chronyでNTPサーバを構築しましたが、比較的簡単にNTPサーバの構築と設定を行うことができました。
基本的にはWindowsの場合はNTPサーバはADを参照していることが多いので、Windowsで直接NTPサーバを参照させることが少ないですが・・・
あとは、GPSを使ったNTPサーバでも構築できればちょっと面白くなると思います。
おまけ
本ブログではVMwareやWindows、Linuxのインストール手順等も公開しております。
インフラエンジニアとして有益な記事や無益なコンテンツも作成しておりますので、通勤時間や休憩時間、休日のスキマ時間等に合わせて読んでいただけると幸いです。
また、Youtubeで解説動画も鋭意作成中です。本ブログで記事にしているものも動画にしようと思っておりますので、よろしくお願いいたします。
willserverのnoteも開設したのでフォローお願いします。
コメント