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サーバーが存在した方が、当然ながら精度が高まるようであるが、それだけでのリソースを割く気にはなれないので、このまま運用するつもりである。