ntp.png

 

 

NTP(Network Time Protocol)


■ NTPサーバの構成

NTP(Network Time Protocol)はネットワークコンピュータの時刻を同期させるためのプロトコルで、RFC1305で定義されている。NTPサーバはネットワークを使って階層的に構築され、クライアントマシンに効率よく精度の高い時刻情報を提供する。またNTPは待ち受けポートとしてUDP 123 番を使用するので、ipchains や iptables によるファイアウォールが設定されている場合は、ポートを開けておく必要がある。

標準
時刻情報を提供するNTPサーバはネットワーク上に何台か用意され、それらをもとにクライアントはそれぞれの内蔵時計を同期させる。この手続きによって、ネットワーク上のすべてのノードが同じ時刻系列を得る。一般にNTPサーバは階層的に構築され、階層の最上位にあるNTPサーバをStratum 1(第一階層)のNTPサーバと呼ぶ。Stratum 1のサーバは、ほかのすべてのNTPサーバの基準となる重要なサーバであり、原子時計やGPS、無線電波などを使った標準時計と同期して動作する。Stratum 1のサーバから時刻情報を得て動作するNTPサーバをStratum 2のサーバと呼び、さらにそれを基準にして動作するNTPサーバをStratum 3のサーバと呼ぶ。以下、最大15階層(Stratum 15)までNTPサーバを構築することができるが、階層が下へ行くほど時刻の精度が低くなるため、運用上はあまりいくつもの階層を作っても意味がない。

実際の運用では、必ずしも上位階層サーバだけでなく同階層にあるNTPサーバからの情報も参照し、ネットワークが一時的に利用できなくなってもサービスが無効にならないようにする。通常、インターネットのプロバイダがルートとなるNTPサーバを用意し、各組織ではそれをもとにしてローカルのNTPサーバを用意する。そして組織内でも、地域ごとなどにさらにNTPサーバを複数用意し、NTPサーバ システムを階層的に構築する。

※ 国内の第一階層サーバ

国内で使われる第一階層の公開NTPサーバは次のものが有名である。

     clock.nc.fukuoka-u.ac.jp
     clock.tl.fukuoka-u.ac.jp

ntp サーバでは第一階層のサーバから順次階層番号を増やしていく。ちなみに clock.nc.fukuoka-u.ac.jp の階層番号は 1 なので、それを参照している ローカル ntp サーバの階層番号は 2 ということになる。なお、サーバの階層を知りたい場合は、ntptrace を実行すればよい。ntptraceは階層をたどって第一階層のサーバまでを表示する。

国内のNTPサーバについてさらに詳細が知りたい向きは
http://www.jst.mfeed.ad.jp/ を参照のこと。このページ(Experimental NTP Servers - Public Stratum 2)では公開NTPサーバを調べることができる。ただし、基本的に Stratum 1 のサーバを一般ユーザが参照することは控えるべきである。なぜなら、第一階層サーバは非常に多数の第二階層サーバからの参照を受けており、常に過負荷状態になっている。単に公開されているからといって一般ユーザが参照すると、ただでさえ負荷の高いサーバにさらに無理をかけることになるので、高度な時間同期の必要ない一般ユーザは第二階層以下の公開サーバを探すべきである。


■ NTPサーバの必要性

システム管理に携っていると、コンピュータのシステムクロックが案外いいかげんなものであることに気づく。これはサーバ側でもクライアントPC側でもそうで、同じシステム構成になっているはずのマシンでさえ、クロックは不規則に変動する。ntp サーバが必要になるのは常に厳密な時計合わせが必要になるシステムである。もう少し具体的に表現すれば、タイムスタンプつきのログを集積・分析するロギングサーバや、外部データベースとのやり取りでタイムスタンプの正確さが求められるデータベースサーバや、複数のディスクの同期をとらなければならないクラスタリングシステムなどである。特にオンラインデータベースではそれぞれのサーバのシステムクロックが正しく一致していないと、データベースの整合性自体に問題を引き起こす。この事実は、予約システムなどでシステムごとに違う時計を使った場合など、必然的に不整合が発生することで理解できると思う。この意味において、システム管理者はNTPが単に時計合わせのためのシステムではないことを正しく認識する必要がある。

単に時計合わせがしたいだけならば、ntpdate のようなコマンドをスクリプトに書き、 crontab に登録しておけばよい。Windowsならば桜時計のような標準時間取得ツールがあるので、こうしたフリーソフトを利用するのもいいだろう。時計合わせだけの目的でNTPサーバを導入するとネットワーク上のトラフィックを無用に増やしてしまうため、このような目的での導入はなるべく避けるべきである。



SNTP(Simple Network Time Protocol)

■ NTPとSNTP

SNTP(Simple Network Time Protocol)は、クライアントの時刻合わせ専用にNTPを簡略化したプロトコルである。NTPは階層的な時刻同期サーバ システムを構築するためのプロトコルであるが、先に述べたとおり単にクライアントの時刻を合わせるだけが目的ならば、NTPのような高度なプロトコルは必要ない。この点SNTPでは、SNTPクライアントからNTPサーバに対する時刻情報の要求と応答だけを使うようにプロトコル自体が簡略化されている。

SNTPはNTPサーバのような長時間にわたる統計的な誤差の処理機能などを持たず、単発的な時刻合わせ機能しかないので、ネットワークトラフィックが大きくなると一時的に精度が下がることがある。しかし、このような現象が発生する場合でも、複数回のSNTPパケットのやり取りで誤差を減らすなどの工夫をすれば、同一LAN上にあるNTPサーバとの通信ならば1msec以下の誤差で時刻を合わせることができる。ちなみにSNTPはRFC2030で定義されているので、仕様についてはRFCを参照のこと。

SNTP による時計合わせだけがしたい場合は、あえて Linux でサーバを立てるよりも適当な Windows マシンを選んで
桜時計のようなSNTPソフト(フリー)をインストールし、サーバモードで動かした方がいい。他のローカルマシンは桜時計をインストールしたマシンをサーバとして参照する。クラスタリングのようなシビアな時間合わせが必要なシステムは別として、通常の使用ではこれで十分なことが多い。

ntpd のインストールと起動


■ インストール

ntpd は xntpd と名乗ったり、またもとの ntpd に戻ったりで忙しいが、ここでは ntpd として統一する。事実上、両者はバージョンの違いとして受け止めてよく、設定ファイル等にも変わりがない。
RedHatではRPMでインストールするのが簡単である。ダウンロードしたパッケージを適当なディレクトリに置き、以下のコマンドでインストールする。

     rpm -ivh
ntp-4.1.0-4.i386.rpm

ソースからコンパイルしてインストールする場合は以下の通り。適切なディレクトリで tarball を展開し、make するのは他のアプリケーションと変わらない。

     #tar xvf ntp-4.1.0-4.i386.tar
     #cd ntp-4.1.0-4
     #./configure
     #make
     #make install


インストールが完了したら、ntp.conf と drift ファイルを作成する。前者は設定ファイルとして実体がある(後述)が、後者は touch コマンドで空ファイルを作るだけで済む。

     touch /etc/ntp/drift

注意:rpmパッケージでインストールした場合、設定ファイルは/etc/ntp以下に自動的に作られる。touchする必要があるのはソースからインストールした場合である。


■ NTPの起動

ntpd をRPMパッケージからインストールした場合、次のような指定でデーモンとして起動することができる。

     #/etc/rc.d/init.d/ntpd start

また、ランレベルを指定して起動したい場合は chkconfig で設定する。たとえば3と5で起動したい場合は次のようにする。

     
#chkconfig --level 35 ntpd on

ntp の起動にあたっては設定ファイルntp.conf内にNTPサーバを指定しておく。server 行を複数指定すれば指定したNTPサーバのどれかがダウンしていても他が参照されるので、信頼性を向上させることができる。

ntp.confの例)

     server133.100.9.2          #clock.nc.fukuoka-u.ac.jp
     server133.100.11.8         #clock.tl.fukuoka-u.ac.jp

     driftfile/etc/ntp/drift
     logfile/var/log/ntpd.log
     disableauth


ここで server 行を直接IPアドレスで指定するのは、DNS参照によるタイムロスを避けたいからである。公開NTPサーバを選定するに当たっては、ネットワーク的に距離の近いサーバを「 traceroute サーバアドレス」の形式で調べてみるとよい。あくまで一般論だが、ホップカウントが少ないものほど誤差が少なくなる。

なお、DRIFTファイルとは周波数補正用にntpが使うファイルである。ソースインストールの場合、このファイルはtouchコマンドで作っておくが、これを怠ると時間誤差が収束するのに最大で数時間かかることがある。また、logファイルは任意の名前とディレクトリに指定できる。これもDRIFTファイル同様最初にtouchしておく必要がある。ちなみにntpにはしばしばセキュリティホールが報告されるので、ログ管理はしっかりやった方がいいだろう。




NTP の実用的な設定例


基本的に ntp の設定ファイルは以下の4種類である。(認証を必要とする場合のみ keys ファイルが使われる。)

     /etc/ntp.conf
           /etc/ntp/step-tickers
           /etc/ntp/drift
           /etc/ntp/keys

なお、RedHatにはこの他に ntpservers というファイルがあるが、これは初期設定用として RedHat が用意したタイムサーバを定義したファイルである。

■ /etc/ntp.conf

ntp を設定する基本ファイルで、通常 /etc 以下に置く。このファイルではアクセス許可や上位階層サーバの指定、DRIFTファイルのパスの設定等を行う。後半部に認証を指定するルールがあり、key をファイルで指定することができる。
なお、ntp.conf では赤字部分の restrict 行にルールを記述し、#以下はコメントである。またグレー部分は解説なので設定ファイルには残さないこと。


# Prohibit general access to this service.
restrict default ignore ・・・接続のポリシーとして不可 ignore:指定したホストからのパケットを無視する noquery:NTPのモード6と7のパケットを無視する nomodify:設定を変更するNTPのモード6と7のパケットを無視する。情報請求は許可 notrust:通常の利用は許可する。時刻同期の情報源としては使用しない restrict 127.0.0.1 ・・・接続許可アドレス restrict 133.100.9.2  ( 福岡大タイムサーバ clock.nc.fukuoka-u.ac.jp ) # -- CLIENT NETWORK ------- # クライアントからの接続許可範囲を指定 (ローカル192.168.1.0/24) restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap # --- OUR TIMESERVERS ----- # このマシンが時間を確認しに行くサーバー (複数指定する)
server 130.69.251.23    (東大タイムサーバ) server 133.100.9.2      福岡大タイムサーバ) # --- NTP MULTICASTCLIENT --- # multicastclient # listen on default 224.0.1.1 # restrict 224.0.1.1 mask 255.255.255.255 notrust nomodify notrap # restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap # --- GENERAL CONFIGURATION --- # ローカルの設定 (指定する数値はIPアドレスではないので念のため。
127.127.1.0は、時間を取得するデバイス<=内蔵時計>を指定するためのNTP独自の表現である。)

server 127.127.1.0 # local clock # 時刻同期の優先度 fudge 127.127.1.0 stratum 10 # 時刻のずれを修正するファイルとずれ幅の設定 driftfile /etc/ntp/drift broadcastdelay 0.008 # 認証を必要とするか (ここでは yes とする) authenticate yes # 認証キーの指定 (keys ファイルのパスを指定) keys /etc/ntp/keys
 
 
■ /etc/ntp/step-tickers

NTPサーバは起動前に ntpdate コマンドで時刻合わせをしておくことが望ましい。これは時刻のずれが大きいとサーバが同期するまで時間がかかる(実は1000秒以上ずれていると、NTPDはハードウェア上のトラブルが生じたと判断して停止してしまう)ためであるが、NTPサーバを起動後は ntpdate は実行できないという矛盾がある。このため ntpd の起動スクリプトにはサーバ起動時にまず ntpdate を使って時刻合わせをする設定が書いてある。この初期時刻合わせのためのサーバを指定するのが step-tickers ファイルの役目である。

書式は対象サーバを列記するだけで、複数記述することができる。


  
server 130.69.251.23    (東大タイムサーバ)   server 133.100.9.2      福岡大タイムサーバ)




テスト起動と動作検証

■ 動作検証とntpq

設定が終わったら、先に述べたとおりのコマンドで起動する。

     #/etc/rc.d/init.d/ntpd start   または   #service ntpd start

ps aux | grep ntpd でプロセスの起動を確認したら、ntpq コマンドに -p オプションをつけて動作を検証する。

           #ntpq -p


remote refid st t when poll reach delay offset jitter ============================================================================== *ntp.nc.u-tokyo. .GPS. 1 u 46 64 17 15.685 10.384 0.290 clock.nc.fukuok .GPS. 1 u 51 64 17 261.152 118.519 20.330 LOCAL(0) LOCAL(0) 10 l 52 64 17 0.000 0.000 0.015

以上のように表示されれば動作検証が完了である。ここでアスタリスクがついているのが同期しているサーバであるが、同期される
まで5分程度かかるので気長に待つこと。以下に ntpq のメッセージの意味を一覧する。

メッセージ

内  容

remote

接続先ホスト

refid

タイムサーバーが参照しているホスト

st

「Statum」1は基準サーバを直接参照していることを示している

t

タイムサーバーのタイプ

when

最後にパケットを受け取った時間(秒)

poll

ポーリング間隔

reach

到達可能性を表すレジスタデータ(8進数)

delay

通信による遅延(ミリ秒)

offset

タイムサーバーとのずれ(ミリ秒)

jitter

時刻のばらつき(ミリ秒)

運用上は delay や offset 値がなるべく少なくなるサーバを探すとよい。関東地方での公開サーバは東京大学や東京理科大学にあるが、ネットワーク的に近いとは限らないので、traceroute でホップカウントを確認すること。



クライアントの時刻合わせ


NTPサーバを設置すると通信回線のトラフィックが増えるため、細い回線や処理能力の低いルータを使用している場合は回線障害が発生する恐れがある。トラフィックが極端に増大する場合はNTPの使用をあきらめるか、回線を変更して帯域を確保するしかないが、回線に余裕がある場合は次のような2つの方法で時計合わせをすることができる。

1.ntpd を使う方法

クライアント側でもntpdを起動させて複数のntpサーバに同期させる。もっとも当たり前でntpらしい手法である。この方法を使えば、あるサーバがダウンしても他のサーバから同期することができ、システムの信頼性を確保できる。こうした点がデーモン起動のメリットだが、反面、ネットワークのトラフィックは単調に増加するのでそれなりの手当てが必要である。
以下にローカルのタイムサーバアドレスを 192.168.0.1 とした場合のクライアント用 ntpd.conf を示す。


# Prohibit general access to this service.
restrict default ignore ・・・接続のポリシーとして不可 ignore:指定したホストからのパケットを無視する noquery:NTPのモード6と7のパケットを無視する nomodify:設定を変更するNTPのモード6と7のパケットを無視する。情報請求は許可 notrust:通常の利用は許可する。時刻同期の情報源としては使用しない restrict 127.0.0.1 ・・・接続許可アドレス # -- CLIENT NETWORK ------- # クライアントからの接続許可範囲を指定 (ローカル192.168.1.0/24) restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap # --- OUR TIMESERVERS ----- # このマシンが時間を確認しに行くサーバー (複数指定する)
server 192.168.0.1   (ローカルタイムサーバ) # --- NTP MULTICASTCLIENT --- # multicastclient # listen on default 224.0.1.1 # restrict 224.0.1.1 mask 255.255.255.255 notrust nomodify notrap # restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap # --- GENERAL CONFIGURATION --- # 時刻のずれを修正するファイルとずれ幅の設定
driftfile /etc/ntp/drift broadcastdelay 0.008 # 認証を必要とするか (ここでは yes とする) authenticate yes # 認証キーの指定 (keys ファイルのパスを指定) keys /etc/ntp/keys
 

一読しておわかりいただけると思うが、クライアントとして利用するNTPDには fudge ファイルに関する記述がない。これはローカルネット内で使用する時刻を代表NTPサーバに任せるためである。
仮に fudge に 127.127.1.0 を書くと、ネットワーク障害時などに上位NTPサーバとの通信が切れると、クライアント上のNTPDはそれぞれの内蔵時計に時刻を合わせる。クライアントがサーバでなく自分自身の内蔵時計に同期するということは、それ以降ネットワーク内部の時刻がホストごとにばらばらになってしまうことを意味する。これではタイムサーバを動かす意味がないばかりか、エラーも出さないままネットワーク内部の時系列が狂っていくという怪現象(?)に悩まされることになりかねないので、クライアントとしてNTPDを動かす場合は fudge の対象を内蔵時計にしないよう注意すること。

2.cron に ntpdate を仕掛ける方法

ntp.rpmパッケージには、時刻合わせ用のツールとして ntpdate が付属している。ntpdate の書式は次の通り。

     
# ntpdate -b clock.nc.fukuoka-u.ac.jp

clock.nc.fukuoka-u.ac.jp は前述のとおり福岡大学のタイムサーバである。ntpdate では自分の使いたいタイムサーバを指定して時刻情報を取得し、ローカルのシステムクロックを同期することができる。さらにシステムクロックとハードウェアクロックを一致させたい場合は次のコマンドを使用する。

    
 # /sbin/hwclock --systohc

これによってハードウェアの時刻も一致させることができる。ただし、この2つのツールは ntpd が起動していると実行できないので注意が必要である。サーバとクライアントを同時に動作させることはできないため、ntpd が動いているホストで実行するときは最初に ntpd を止めること。
運用上はこれらを crontab に記載して定期的に調整するとよい。以下に午前4時に時刻合わせを実施し、標準出力と標準エラー出力をNULLに掃き出す(画面には出力しない)設定を紹介する。

     
午前2時に時刻合わせをする例:
     
0 2 * * * /usr/sbin/ntpdate -s clock.nc.fukuoka-u.ac.jp > /dev/null 2>&1

この方法のメリットはntpdで問題となるセキュリティホールを気にせずに済む点である。サーバの運用指針として必要のないデーモンを極力常駐させないポリシーを立てている場合、こちらの方が第一選択となるだろう。ただし、この場合はcronで1つのNTPサーバのみを指定することがほとんどのため、対象サーバがダウンしている場合はサービスが停止してしまうという問題がある。(複数のサーバを対象にスクリプトを書いておく手もあるが、時系列の偏差をどうするかという問題が残る。いずれにせよ、この手法は厳密でクリティカルな使用目的にそぐわない。)

3.Windowsクライアントの時刻合わせ

Windowsクライアントでは windows time サービスがデフォルトで起動しているはずなので net time コマンドによって時計を合わせることができる。ただしこれにあたっては、まずタイムサーバの名前解決ができなくてはならないという困った Windows のお約束があるので、内部DNSを立てておくか
C:\WINNT\system32\drivers\etc\hosts にタイムサーバ名を記述しておく。
net time コマンドの基本的な使い方は以下のとおり。

    net time /setsntp:ntpserver

この書式でまずシンクロさせたいNTPサーバを記述する。これは再起動しても消えることはなく、一度やっておけば変更の必要が生じたときまで変わらない。現在の参照先を確認したい場合は次のコマンドを使用する。

    net tim /querysntp

※注意:Windowsでドメインを立てていると、クライアント機で実行する net time コマンドは、まずドメインコントローラを参照に行くという問題がある。この場合はドメインコントローラを Linux 側 NTPサーバに同期させておく。こうしておけばクライアントの windows time service は自動的にドメインコントローラの時刻と同期する。これでうまくいかない場合は、先述の桜時計などを常駐させておく方法も簡単である。

なおマイクロソフトのNTPに関するテクニカルサポートのURLは以下のとおり。Windows の時刻取得回数等の設定が必要になった場合はこちらを参照されたい。

http://support.microsoft.com/default.aspx?scid=kb;ja;223184
 


 

 

Copyright(c) 2003 My Company. All rights reserved. www.suzu841.com / mrs.suzu841.com