NTPの設定

気付けば2008年になってしまいました。明けましておめでとうございます。本年もよろしくお願いいたします。
さて、数ヶ月振りの更新となってしまった*1のだが、今日は久々にゆっくりと過ごせる正月休みの中の一日であり、極めて気持ちが落ち着いているので、ずっと放り出していたNTPの設定をやり直してみた。今日、NTPを用いた時刻同期は広く使われているが、一昔前とある大学のNTPサーバーの過負荷が問題となったことから分かる通り、複数のクライアントをインターネットに接続しNTPを利用する場合には、LAN内にNTPサーバーを立て、それを利用することが推奨されている。そこで、僕はクライアント毎に外部のNTPサーバーを参照するのを止めようと思い立ったのである。以下の設定においては、セキュアなWebサーバーの構築と運用 4.2.3 ntpdのインストールと設定を参考にして設定した。
NTPを利用するためだけに新たに専用のサーバーを構築するのは面倒なので、既存のNFS/sambaサーバーを利用することにした。この文章中では以後単に「サーバー」と記述する。その仕様は以下の通りである。
サーバー: CentOS 5.1 / Intel Pentium 4 1.7GHz / RDRAM PC800 ECC 1024MB
また、使用するクライアントは、以後単に「クライアント」と記述する。その仕様は以下の通りである。
クライアント: Fedora 7 / Intel Pentium 4 3.06GHz / PC2100 DDR SDRAM ECC 2048MB
したがって、ここではサーバーとクライアントの双方がLinuxである場合を扱うことになる。
まず、サーバーとクライアントにntpパッケージをインストールする。サーバーとクライアントのntpのバージョンは、それぞれ、次のようになっている。

$ rpm -q ntp
ntp-4.2.2p1-7.el5

$ rpm -q ntp
ntp-4.2.4p2-3.fc7

その後、まず、クライアントの/etc/ntp.confを編集する。"restrict default ignore", "server 192.168.0.10" 及び "restrict 192.168.0.10 noquery nomodify"という行の追加が必要になる。なお、192.168.0.10はサーバーのIPアドレスである。

# Permit time synchronization with our time source, but do not
# permit the source to query or modify the service on this system.
#restrict default kod nomodify notrap nopeer noquery

# Ignore all access
restrict default ignore

# Permit all access over the loopback interface.  This could
# be tightened as well, but to do so would effect some of
# the administrative functions.
restrict 127.0.0.1

# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 192.168.0.10

# Do not permit public servers to query or modify the service on this system
restrict 192.168.0.10 noquery nomodify

# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available. 
#server	127.127.1.0	# local clock
#fudge	127.127.1.0 stratum 10	

# Drift file.  Put this in a directory which the daemon can write to.
# No symbolic links allowed, either, since the daemon updates the file
# by creating a temporary in the same directory and then rename()'ing
# it to the file.
driftfile /var/lib/ntp/drift

(以下省略)

クライアントのntp.confを最小限にまとめると、次のようになる。

restrict default ignore
restrict 127.0.0.1
server 192.168.0.10
restrict 192.168.0.10 noquery nomodify
driftfile /var/lib/ntp/drift

次にサーバーの/etc/ntp.confを編集する。ほとんどクライアントとほぼ同様だが、2つ異なる点がある。第一に、LAN内のクライアントからのアクセスを許可せねばならない。同じサブネット内の全てのクライアントからのアクセスを許可するには、"restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap"のような行を追加する。IPAの文書では、以下のように設定している。

#組織内ネットワークからの時刻問い合わせにのみ応答する
restrict 192.168.0.0 mask 255.255.255.0 noquery nomodify nopeer notrust notrap

しかしながら、この設定ではのちに使うことになるntpqコマンドを利用することが出来ない。すなわち、クライアントでntpqコマンドを実行すると次のような結果が得られる。

# ntpq -p localhost
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 192.168.0.10    .INIT.          16 u    -   64    0    0.000    0.000   0.000
 
# ntpq -p 192.168.0.10
192.168.0.10: timed out, nothing received
 ***Request timed out

僕はこれではまって試行錯誤に1時間を使ってしまった。*2ntp_acc(5)によれば、noqueryオプションは、

Deny ntpq and ntpdc queries.

であり、ntpqコマンドのクエリを拒否してしまうのである。参考にした文書がいかにセキュアな環境を構築するかに重点を置いたものであることを考えれば、指定するのが望ましいのだろうが、ここではntpqコマンドを利用するためにまだ指定せずにおく。第二に、外部のNTPサーバーを複数指定しなければならない。サーバーの選定に当たっては、ISPのNTPサーバーを選択するのが常識的であろうが、あいにくau one net(旧称DION)は公式にはNTPサーバーを顧客に提供していないようなので、wiki@nothing内のNTP/プロバイダ・機関別及びNTP/推奨公開サーバを参考に慶應義塾大学SFC、WIDE Projectとmfeedのサーバーを指定した。

# Permit time synchronization with our time source, but do not
# permit the source to query or modify the service on this system.
#restrict default kod nomodify notrap nopeer noquery

# Ignore all access
restrict default ignore

# Permit all access over the loopback interface.  This could
# be tightened as well, but to do so would effect some of
# the administrative functions.
restrict 127.0.0.1

# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 133.27.4.121		# ntp.sfc.keio.ac.jp, a stratum 2 server
server 203.178.138.38		# clk.notemachi.wide.ad.jp , a stratum 2 server
server 210.173.160.27		# ntp.jst.mfeed.ad.jp, a stratum 2 server
server 210.173.160.57           # ntp.jst.mfeed.ad.jp, a stratum 2 server
server 210.173.160.87           # ntp.jst.mfeed.ad.jp, a stratum 2 server

# Do not permit public servers to query or modify the service on this system
restrict 133.27.4.121 noquery nomodify
restrict 203.178.138.38 noquery nomodify
restrict 210.173.160.27 noquery nomodify
restrict 210.173.160.57 noquery nomodify
restrict 210.173.160.87 noquery nomodify

# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available. 
#server	127.127.1.0	# local clock
#fudge	127.127.1.0 stratum 10	

# Drift file.  Put this in a directory which the daemon can write to.
# No symbolic links allowed, either, since the daemon updates the file
# by creating a temporary in the same directory and then rename()'ing
# it to the file.
driftfile /var/lib/ntp/drift

(以下省略)

サーバーのntp.confを最小限にまとめると、次のようになる。

restrict default ignore
restrict 127.0.0.1
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
server 133.27.4.121
server 203.178.138.38
server 210.173.160.27
server 210.173.160.57
server 210.173.160.87
restrict 133.27.4.121 noquery nomodify
restrict 203.178.138.38 noquery nomodify
restrict 210.173.160.27 noquery nomodify
restrict 210.173.160.57 noquery nomodify
restrict 210.173.160.87 noquery nomodify
driftfile /var/lib/ntp/drift

ファイルの設定が済んだら、サーバー・クライアントそれぞれにおいてntpdを(再)起動する。

# /etc/init.d/ntpd restart

そして、数分間コーヒーブレイクを楽しんだ後、サーバー・クライアントそれぞれにおいてntpqコマンドにオプションをつけて実行する。実行結果は、それぞれ次のようになる。

# ntpq -p localhost
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 +ns0.sfc.keio.ac 131.113.192.40   2 u  147  256  375   14.400    0.478   0.661
 +clk.notemachi.w 130.69.251.23    2 u  207  256  377   30.834    0.355   0.638
 +ntp1.jst.mfeed. 210.173.160.86   2 u  193  256  377   13.525    0.777   0.635
 *ntp2.jst.mfeed. 210.173.160.86   2 u   10  256  377   13.185    0.563   1.278
 -ntp3.jst.mfeed. 210.173.160.86   2 u  196  256  377   13.313    1.134   0.386

# ntpq -p localhost
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 *192.168.0.10    210.173.160.57   3 u   97  128  377    0.172  -19.780   1.696

本来はLAN内に複数のNTPサーバーが存在した方が、当然ながら精度が高まるようであるが、それだけでのリソースを割く気にはなれないので、このまま運用するつもりである。

*1:更新しなかった理由をあれこれと述べるのは誠に言い訳がましいのだが、三田祭などもろもろの事柄により精神面の安寧が保てずにいたとだけ述べておく。

*2:やはり「まずmanに当たれ」という言葉は正しいと改めて思った。