Slackware 10.2 で NTP サーバを構築する
SERVER
NTP (Network Time Protocol)
NTP とは、コンピュータ間で時刻の同期を行うための仕組みです。
パソコンの時刻は意外とけっこう狂うもので、運用しているとあっという間に 1 時間とかずれてきてしまいます。昔のように 1 台だけで全てが済んでいた頃には気になった頃合にてきとうに直しておけばよかったのですけど、インターネットが普及した今日では意識しなくても複数のコンピュータとやり取りする機会があり、その正確さがさりげなく重要なところになってきます。
特に Web サーバなどの情報を提供するサーバや、ドメインコントローラなどの認証サーバなどの場合は、時刻情報を利用して情報の整合性を判断したり、アクセスログなどを残したりといった場面で、時刻が統一されていることが非常に重要になってきます。
各コンピュータの時刻を正しく保つためには NTP を利用します。
仕組みとしては NTP クライアントから NTP サーバへ時刻を問い合わせて、そこで示された時刻に自動的にあわせるという感じです。基本的に時刻は NTP サーバの時刻と同期することになりますので、当然ながら NTP サーバの時刻が狂っていたら NTP クライアントの時刻も狂ってしまいますので、NTP サーバ選びも大切なところではありますけど。
Windows XP や Mac OS X などは最初からそれぞれ "time.windows.com" と "time.apple.com" を NTP サーバとして時刻を調整するように設定されているので、インターネットに常時接続するような環境下では自動的に調整されるので便利です。他の OS でも NTP クライアントを用意して NTP サーバへ問い合わせることで時刻調整を行うことが出来ます。
また Windows ドメインに参加している PC の場合には、NTP を用いてドメインコントローラと時刻が同期されるようになっています。このときはドメインコントローラの時刻が重要になってきますが、もちろんドメインコントローラの時刻が正確であるに越したことはないにせよ、ドメインコントローラと時刻が同期取れていることがとても重要になってきますので、それによる利点はとても大きいです。あとはドメインコントローラの方で時刻を注意しさえすれば、良い感じで運用を行うことが出来ます。
これらに関連するお話は EZ-NET 特集: NTP 環境を構築する や EZ-NET レポート: ntpd ばたばた日記、それと EZ-NET: Windows ドメイン環境で時刻の同期を調整してみる といったものがありますので、そちらももしかすると参考になるかもしれません。
今回は Slackware 10.2 上に NTP サーバを用意してみようと思います。
作業内容としては NTP サーバソフトのインストールから始まって、それを D.J.Bernstein さまより提供されている daemontools を用いて起動させるという感じです。なお、daemontools については、EZ-NET: Slackware 10.0 へ daemontools を組み込んでみる あたりを参考にしてみてください。
NTP 4.2.0 を起動する
NTP 4.2.0 のインストール
まずは Slackware 10.2 に NTP サーバをインストールします。
NTP サーバは http://www.ntp.org/ にて公開されていますので、そこから今回は最新のバージョンと思われる NTP 4.2.0 ( ntp-4.2.0.tar.gz ) をダウンロードしました。それを次のようにして、展開およびインストールを行います。
tar xvzf ntp-4.2.0.tar.gz
cd ntp-4.2.0/
./configure
make
make install
こうすることで "/usr/local/bin" ディレクトリに NTP サーバのプログラム "ntpd" がインストールされます。
daemontools で起動するための準備
今回は daemontools を用いて ntpd を起動するので、それに必要な準備を行います。
そのためにまず、次のようにして "/var/ntpd" ディレクトリを作成し、そこへスティッキービットをつけた後でさらに "log/" ディレクトリを作成します。
mkdir /var/nptd
chmod +t /var/ntpd
mkdir /var/ntpd/log
続いて起動スクリプトを用意します。
まず "/var/ntpd" に配置する ntpd プロセスを起動するためのスクリプトは次のような感じです。オプションに "-d" をつけることでフォアグラウンドで起動して、また時間に 1000 秒以上の誤差があってもプロセスを停止しないために "-g" オプションをつけています。
#!/bin/sh
EXEC_PATH=/usr/local/bin
EXEC_BIN=ntpd
EXEC_OPTION="-g"
exec ${EXEC_PATH}/${EXEC_BIN} -d ${EXEC_OPTION} 2>&1
そして "/var/ntpd/log" に配置する ntpd のログを収集するためのスクリプトは、次のような感じで大丈夫だと思います。
#!/bin/sh
exec /usr/local/bin/multilog t ./main =status
あとは次のようにして、これらのファイルに実行可能権限を与えておきます。
chmod +x /var/ntpd/run
chmod +x /var/ntpd/log/run
NTP の設定ファイルを調整する
ntpd を起動する上で "/etc/ntp.conf" というファイルが必要になります。これにはどのサーバと時刻の同期を行うか、またその際に使用する driftfile の保存場所などを記載してあげます。
同期を取るサーバは "server" にて指定してあげればいいようです。指定するサーバは NTP サーバとして構築されているサーバで、複数のサーバを指定することもできます。NTP サーバを利用しない場合には、ここに "127.127.1.0" を指定することで、そのサーバ自身の時刻がそのまま利用することができるそうです。
他の NTP サーバから正確な時刻を入手したくて、でもそのような NTP サーバを所有していない場合には、http://www.ntp.org/ の "Public Time Server Lists" に公に公開されていて利用できるタイムサーバがいくつか記載されているようですので、それを利用してみるのも良いかもしれません。
とりあえず今回は "192.168.0.1" と "192.168.0.2" という二つの NTP サーバが存在しているものとして、同期するサーバはそれらを利用し、またそのときに使用する driftfile を "/var/ntpd/ntp.drift" となるように設定してみることにします。
server 192.168.0.1
server 192.168.0.2
driftfile /var/ntpd/ntp.drift
このような内容で "/etc/ntp.conf" ファイルを用意しておけば、ntpd 起動時にこの設定が有効となります。
ntpd を起動する
今回は既に daemontools がシステムに組み込まれた状態ですので、ここまで準備すれば後は簡単です。
ln -s /var/ntpd /service
このようにして "/var/ntpd" へのシンボリックリンクを "/service" ディレクトリへ作成してあげることで、数秒のうちに ntpd が起動します。そして後は数分ほどすれば、server で指定した NTP サーバとの時刻同期が行われ、システムの時刻が自動的に調整されます。
NTP が使用するポート
NTP サービスは 123/UDP ポートを利用して時刻同期を行うようです。
これは、NTP クライアントも NTP サーバーもどちらともこのポートを利用するようですので、パケットフィルタを設定するような場合には、送信元と送信先がどちらとも 123/UDP のパケットを通過させてやる感じになるみたいでした。