ntpd の認証機構は、対称鍵認証 (Symmetric Key Cryptography) と、公開鍵認証(非対称鍵認証) (Public Key Cryptography) とがある。
対称鍵方式は、通信ピア双方があらかじめ同じキーを用意しておく方法。キーは、合い言葉つまりパスワードであり、且つ、交わされる NTP メッセージの捏造を検査するためのチェックサムの生成にも使用される。対称鍵方式では通信の暗号化は行われない。この方式はシンメトリックピアどうしの認証に使用することができる。また、ntpq, ntpdc ユーティリティの認証は、こちらの方法だけをサポートしている。Red Hat系のディストリビューションでは、ntp パッケージをインストールすると既定でひとつだけキーの書かれた対称鍵ファイルが置かれるが、安全性を高めるため、対称鍵ファイルはきちんと生成しなおしておいたほうがいい(特に使うあてがなくても)。
公開称鍵認証では、秘密鍵と公開鍵のペアをピアそれぞれが持ち、認証だけでなく通信の暗号化も行われる、安全な方法だ。ただし、ntpd の公開鍵認証は autokey とかという特殊なもので、トライしてはみたがうまく機能させることができなかった。うまくいくまでこちらの解説はお預けだ。
いずれの方式も、キーは ntpd 付属の ntp-keygen プログラムを使って生成することになる。
ntp-keygen は ntpd のためのキーファイル操作ユーティリティ。同ユーティリティの名前は NTP パッケージ Ver.4.1.x で一度 ntp-genkeys となったが、 4.2.x で再び ntp-keygen に戻った。しかし、4.0.x の頃の ntp-keygen とは仕様がかなり異なり、コマンドラインオプションもがらりと変化しているので、最新の情報は man や ntp-genkeys - generate public and private keys で確認したほうがいいだろう。このプログラムが動作するためにはシステムに OpenSSL がインストールされていることが必要だが、日本で入手可能な Linux ディストリビューションで、OpenSSL がインストールされていないないものはまずありえないだろう。
ここでは、対称鍵の作成に的を絞って説明する。
-c enc_type | RSA-MD5, RSA-SHA1, DSA-SHA1 などを指定。keys の生成では使わない |
-d | デバグメッセージを出力 |
-M | これが今回の本命。 MD5 の対称鍵ファイルを生成する |
-p pwd | ホストキーなどを暗号化する。その時のハッシュパスワード。暗号化した場合には、/etc/ntp/crypto/pw ファイルに `crypto pw pwd ' を書いておく必要がある |
-q pwd | ホストキーなどが暗号化してある場合に、それを読み取るためのパスワードを指定する |
-c conf_file | ntp.conf ファイルのパスを指定。通常は指定の必要なし |
-d | デバグメッセージを出力 |
引数 d を指定すると Diffie-Hellman パラメータファイル ntp_dh を作成。 m は MD5 キーファイル ntp.keys.num を作成。 r は RSA のプライベートキーファイル ntpkey と パブリックキーファイル ntp_host を作成する。 rsaref20 がコンパイルされていない場合 d と r は無意味で、m は指定しなくてもキーファイルは MD5 で作られるので、結局このオプションは不必要 |
|
-k k_file | 吐き出すキーファイルのパスや名称を指定。デフォルトは ntp.keys.num となる。num は勝手に付く10ケタのタイムスタンプ |
-l | ntp-genkeys は、特に何も指定しない通常動作では、ntp.keys.num と、それを指すシンボリックリンク ntp.keys を自動的に作る。しかし -l オプションを付けるとシンボリックリンクは作られない |
-t | 上記で説明した通常動作の際に、既存の古いキーファイルやリンクを削除する |
-h | "here" の意。今いるディレクトリにキーファイルを吐き出す。シンボリックリンクは作られない |
-n | テストモード。実際にファイルは作らず、何が行われるかのメッセージだけを stdout に出力 |
ところが、実際は、ほとんどのオプションがうまく働かない。以下に、最も確実な方法を示す。
ファイル名 | 説明 | 推奨属性 |
ntpkey_RSAkey_hostname.timestamp | ホスト秘密鍵ファイル | root:root 600 |
ntpkey_host_hostname | ホスト秘密鍵ファイルへのシンボリックリンク | |
ntpkey_RSA-MD5cert_hostname.timestamp | ホスト公開鍵(MD5ダイジェスト)ファイル。今回は使用しない | root:root 644 |
ntpkey_cert_hostname | ホスト公開鍵へのシンボリックリンク。今回は使用しない | |
ntpkey_MD5key_hostname.timestamp | 対称鍵ファイル | root:root 600 |
ntpkey_MD5_hostname | 対称鍵ファイルへのシンボリックリンク |
ファイル名 | 説明 | 推奨属性 |
ntpkey_MD5key_hostname.timestamp | 対称鍵ファイル | root:root 600 |
ntpkey_md5_hostname | 対称鍵ファイルへのシンボリックリンク |
※ 4.2.x より前の特定のバージョンの NTP パッケージで、ntp.keys.num がルートディレクトリにできてまうことがあった。しかも、 シンボリックリンク /etc/ntp/ntp.keys のリンク先は相対指定で "ntp.keys.num" となっているという破滅的状態。その場合は、ntp.keys.num を /etc/ntp に移動:
mv /ntp.keys.* ./
ntpkey_MD5key_hostname.timestamp ファイルはこういった内容になっている:
※ キー文字列の文字数やデフォルトで生成されるキーの個数は NTP スィートのバージョンによって何度か変わってきている。いちいち追従してドキュメントするのも疲れるので、テキトーに読み替えていただきたい。
# ntpkey_MD5key_hoge.cxm.3299580246 # Mon Dec 24 02:31:11 2012 1 MD5 E}_QO~<(wV"<w_U # MD5 key 2 MD5 AD2SY"%?SaKF6!] # MD5 key 3 MD5 /;QyS=2Pr/ku?W8 # MD5 key 4 MD5 ~t)d@nJ>fdI\@DB # MD5 key 5 MD5 WB2{RU/6qT3ww~x # MD5 key 6 MD5 Q!7(&5[5ooTv)qY # MD5 key 7 MD5 ]j~]sZRFnYp>'rv # MD5 key 8 MD5 ~suDb8-)}]e:<M5 # MD5 key 9 MD5 n%6"o^vOy"eq'QX # MD5 key 10 MD5 e5rUiB8eny~djzF # MD5 key 11 MD5 CAVLiS4Vi@5N"F$ # MD5 key 12 MD5 w4IkEk]*Lu+C@{J # MD5 key 13 MD5 O$V}L+2v@Pt&XjL # MD5 key 14 MD5 `U0TK;c:2Z[>_{7 # MD5 key 15 MD5 =!RjkWsgtR;]??^ # MD5 key 16 MD5 G4HwD[rK,0.U@3I # MD5 key
1 から 16 の数字で始まる行それぞれがキーで、16 個のキーができている。各行のフォーマットは:
KEYID TYPE KEY_STRING # COMMENT
KEYID は 32 bit で管理されており、1 ~ 65534 まで数字。TYPE の部分の MD5 (古いNTPでは M) は、キー文字列が MD5 ハッシュであることを示すキーワード。それに続くランダムな文字列が、キーそのものだ。MD5 の場合、16文字以内と決められており、デフォルトでは 15文字から成るキーが生成される (以前は 16文字だった)。
ピア認証を使う予定がなく、なお且つ、ntpq や ntpdc ツールをローカルでもリモートでもまったく使うつもりがないか使うとしてもステータスの確認だけの場合は、ここまででやっておけばいい。
ntpq や ntpdc の認証に使う場合、認証の際にキーを人間が打ち込む必要があるので、デフォルトで生成されるランダムな文字列のままでは扱いにくい。そのため、対称鍵ファイルを編集し、いずれかのキーを書き換えるか、末尾に新たなキーを加えてやる必要がある。下記のような塩梅だ:
998 MD5 PaSSwOrd
ここではキーIDを 998 としたが、 ファイル内で重複しない 65534 までの数字であれば何でもいい。キー文字列のタイプは、ntpq と ntpdc が要求してくるのは必ず MD5 であることから、必ず MD5 (古~い ntpd では M) を指定。かつて、キー文字列が 16文字に満たない場合には右側を 0 で埋めて16文字きっかりにする必要があったが、最近の ntp ではツールどうしが裏で自動的にゼロパディングして遣り取りしているらしく、その必要はなくなった。なお、ntpq や ntpdc の場合、実際の認証時にはコンソール上でキーIDとパスワードを直接タイプすることとなり、それがサーバ上でキーファイルと比較されるだけなので、操作端末にこのファイルをコピーしておく必要はない。
それに加えて、前出 ntp.conf の最後の 3行のコメント記号 (#) を外して下記の設定を生かす。
trustedkey 1 998 requestkey 998 controlkey 998
trustedkey ステートメントで ID 1 のキーも含めているが、複数指定できるということを示すために書いてみただけで、特に必要というわけではない。また、ここでは ntpdc 用キーの指定である requestkey と、 ntpq 用キーの指定である controlkey に同一のキーID を指定しているが、別々にすることも可能だ。
感覚的には ntpq が reQuest、ntpdc が Controlkey に対応するのが自然なのだが、実際は逆なので注意。
ntpq や ntpdc で設定に影響を及ぼす操作を行うには、ツール起動側のアドレスに対するサーバのアクセス制限 (restrict) は開放しておかなくてはならない。たいていはループバックアドレスと自分の実アドレスには規制を掛けないのが通例なので、ローカル上でツールを起動して自機の ntpd を操作するなら邪魔はされない (キーとパスワードの入力は必要)。しかし、リモートから行う場合には、ntp.conf のアクセス規制セクションに注意が必要だ。例えば、リモートコンソールとして使うマシンのアドレスが 192.168.0.200 だとしよう。例の ntp.conf では、このアドレスは 192.168.0.0 mask 255.255.255.0 に内包され、その restrict には noquery が含まれているので、設定変更どころか、これらツールの使用するモード 6 およびモード 7 の問い合わせそのものを完全に無視してしまう。設定やステータスを変更するような操作を行いたい場合は:
restrict 192.168.0.200
を書き加えればいい。設定内容や状態を見るだけだとしても、例えば、
restrict 192.168.0.200 nomodify
のように、noquery は書いてはいけない。
こちらの用途に使うためには、NTP通信をするピア双方の対称鍵ファイルには、同じキーID に同じキーフレーズが書かれていなければならない。ファイルを丸ごとコピーしてもいいのだが、使用するキー (つまり行) だけコピーしておいたほうが、セキュリティ的にはより安全だろう。ピア認証では、キーフレーズの遣り取りは ntpd が自動的に行うので、ntpdc/ntpq 用の時のように人間の覚えやすい文字列に変える必要はない。
ntp.conf は、修正ポイントが 2箇所ある。まず、ピア認証に使うキーのキーID を trustedkey に加えておくこと。ntpq/ntpdc でのランタイム変更機能を使わないのであれば requestkey と controlkey はコメントアウトして構わない。下記は、ピア認証にはキーID 8番のキーを使い、ntpq や ntpdc も使う場合の記載例:
trustedkey 8 998 requestkey 998 controlkey 998
ntp.conf のもう 1点の変更は、シンメトリックピアを指定した peer 行への `key 8' パラメータの追加だが、詳しくは peerディレクティブ の項を参照されたし。
これにて準備は整ったので ntpd デーモンを起動する。`/etc/init.d/ntpd start' でも `service ntpd start' でもお好きなように。起動してすぐにクロックが合うわけではなく、ntpd はまず、指定したタイムサーバのうちどれが信頼に値するかを数分掛けて比較検討し、それから徐々に、ローカルのクロックをタイムサーバの正しい時間に近づけていく。
うまく起動せず、ntpd がすぐに exit してしまう場合は、カーネルクロックが 1000 秒以上狂っていることが原因かもしれない。その場合は:
root# ntpdate -b -v server root# hwclock --systohc
で、一旦、参照予定のタイムサーバにカーネルクロックを強制的に合わせ(※)、ハードウェアクロックもカーネルクロックの時間にシンクロさせておく。それから改めて ntpd を起動すれば、今度はうまくいくはずだ。きちんと作動しているかどうかは、数分後に ntpq ユーティリティを使えば分かる。 ntpdate については、捕捉程度だが別項にまとめた。
安全性をより高めるため、ntpd を chroot 環境で動かすのもいい考えだ。これは Xen ホストOS上で時間合わせを行う時に思いついたことだ。
NTP 4.2 から (?) は ntpd で -i オプションが使えるようになった。このオプションを `-i /dir/to/chroot' といった具合に付けると、ntpd は自らをそこへ jail して動く。もう数年前にリリースされた Fedora Core 5 でさえ NTP 4.2.0 が乗っていて、やってみると実際にこれが通用した。 -i オプションは -u オプションと併用しないと意味がない。root権限で動いているプログラムを chroot してもほとんど無意味だからだ。以下に、jail ディレクトリを /var/chroot/ntpd/ だとして構築法をまとめる。
/var/chroot/ntpd/ <- [root:root 755] chroot後の ntpd にとって / となる \_ etc/ <- [root:root 755] \_ ntp.conf <- [root:root 644] localtime <- [/etc/localtime と同じ] `cp -p' でコピーしてくる ntp/ <- [root:root 755] \_ keys <- ntpkey_MD5_HOSTNAME への symlink ntpkey_MD5_HOSTNAME <- 下記への symlink ntpkey_MD5key_HOSTNAME.num <- [root:root 600] \_ crypto/ <- [root:ntp 750] ntpd-4.2.4の場合のみ \_ pw <- [ntp:ntp 600] ntpd-4.2.4の場合のみ \_ var/ <- [root:root 755] \_ lib/ <- [root:root 755] \_ ntp/ <- [ntp:ntp 755] \_ drift <- 必要時に自動的に作られる \_ run/ <- [root:root 755] \_ ntpd.pid <- 実際には作られない \_ dev/ <- [root:root 755] \_ log <- syslogソケット /etc/ \_ ntp.conf <- /var/chroot/ntpd/etc/ntp.conf への symlink ntp/ \_ keys <- /var/chroot/ntpd/etc/ntp/keys への symlink ntpkey_MD5_HOSTNAME <- /var/chroot/ntpd/etc/ntp/ntpkey_MD5_HOSTNAME への symlink ntpkey_cert_HOSTNAME <- 上同様 ntpkey_host_HOSTNAME <- 上同様 step-tickers <- jail へのコピー不要 \_ crypto/ <- [root:ntp 750] ntpd-4.2.4の場合のみ \_ pw <- /var/chroot/ntpd/etc/ntp/crypto/pw への symlink (ntpd-4.2.4のみ) /var/run/ \_ ntpd.pid <- PIDファイルは実際にはこちらにできる
chroot階層構築のポイント;
OPTIONS="-i /var/chroot/ntpd -u ntp:ntp -p /var/run/ntpd.pid"
何度もやっていたら面倒くさくなったので、ここでやるべきことをシェルスクリプトにしてみた -> ntpchroot.sh。ただし sysconfig/ntpd 及び syslog の設定まではカバーしていない。利用する前にファイル冒頭の設定変数を確認/変更するのを忘れずに。また、このスクリプトは /etc/ntp/(crypto/) 下のキーファイル類を一旦削除して jail 下に改めて生成し、強制的にリンクを張り戻すようになっているので、必要に応じてバックアップを採ってから行うこと。
ntpq は、NTP デーモン一般 (ntpd とは限らない) の稼働状態を確認するためのプログラム。通信には UDP プロトコルの NTP mode 6 パケットが使われる。
ntpq [host]
という風に起動すれば、対話モードの ntpq> プロンプト状態に入る。host は、IPアドレスでも、DNS名や /etc/hosts ファイルに書いてある名前でも構わない。host を指定すれば指定したリモートの NTP サーバへつなごうとするし、指定しない場合には、localhost つまり自分自身の中の NTP サーバに接続しようとする。プロンプトに入ってしまえば、help と打てば使用可能なコマンドの一覧、"? command " と打てばそのコマンドに関する簡略なヘルプが表示される。 ntpq の解説は ntpq - standard NTP query program で読める。
また、ntpq の起動時にしかるべきオプションを付けて、コマンドラインモード、つまりコマンドの終了とともに即 exit させることもできる。よく使うのは、稼働確認や、参照している NTP サーバのどれが優先参照先 (system peer) になっているかといった情報を得たい時だ;
ntpq -p
オプションを -pn に変えれば、サーバの名前が名前解決されず数字のままとなる。ちなみに、ntpq にはコマンドラインオプションのヘルプを出すためのオプションはないので、どんなオプションがあるかを知るには、存在しないオプション (-h や -v) を付けてコールすればいい。 ntpq -p の出力は下記のようなものになる (いろいろな例を示すため、設定例の ntp.conf とは異なるコンフィグを使っている);
remote refid st t when poll reach delay offset jitter ============================================================================== +ntp2.jst.mfeed. mf-isdn4.mfeed. 2 u 15 64 377 23.887 -0.824 0.551 *orion.asahi-net p011.gate.atson 2 u 19 64 377 22.809 -0.672 0.757 LOCAL(0) LOCAL(0) 10 l 17 64 377 0.000 0.000 0.015 +ns.wakayama-u.a clock.nc.fukuok 2 u 20 64 377 48.459 2.210 44.989 xthink.itsc.cuhk bill.itsc.cuhk. 2 u 31 64 377 202.293 62.274 1.787 time.nonex.net 0.0.0.0 16 u - 64 0 0.000 0.000 4000.00
列系統 | |
---|---|
remote | 参照しているサーバの DNS 名。 -n オプションを付けたときはアドレス |
refid | 各タイムサーバが基準にしているさらにひとつ上位のサーバ名かアドレス。探知できない場合は 0.0.0.0 |
st | ストレータム (stratum) つまり、そのタイムサーバの階級 |
t | そのサーバとの通信タイプ。u = ユニキャスト, m = マルチキャスト, b = ブロードキャスト, l = ローカル |
when | 直近の通信が何秒前に行われたか |
poll | 現段階でのポールインターバル |
reach | Reachability。過去 8回のポーリングの成功/失敗履歴。1 Poll 毎に上位(左) へシフトする 8 bit長の 0(失敗)/1(成功) の並びを、8進数にして表している...これだけでは分かるまい。とても数行では説明できないので別項にて解説する |
delay | そのサーバとの通信に要する時間。ミリ秒単位 |
offset | 現在のカーネルクロックとのずれ。ミリ秒単位 |
jitter | 時間の刻みの揺らぎ。分散 (dispersion) と呼ばれることもある。ミリ秒単位。値が小さいほど、そのクロックは安定している |
行の先頭に付く記号 | |
* | 優先参照先 (system peer) に選択されているタイムソース |
+ | system peer に昇格する可能性のある補欠ソース |
- | ntpdのクラスターアルゴリズムに基づいて落選となったソース |
x | クロックが不正確 (経路的要因を含む) なので無効とされたソース |
# | タイムソース候補数制限 (tosの項を参照) に基づいて除外されたソース |
行頭がスペースのものは、通信できないか、時間合わせにこのサーバ自体を使っている (ループ)、シンクロ先としては遠すぎる、のいずれかの理由で無効とされた (ただし、通信タイプが local であるものを除く) |
通信できていない場合は、refid, reach など、ほとんどの列が 0 になっていて、 jitter は 4000.00 などになる。どれもこれもがそうなるのなら、ファイヤーウォールかルータで UDP 123 番ポートのパケットがブロックされているのかもしれない。また、いつまで経ってもどれにも * が付かないのも異常だ。
reach の値は非常に意味が掴みづらく、筆者も長いこと鼻をつまんで見て見ぬ振りをしてきたのだが、LINUX JOURNAL のこの記事のおかげでやっとスッキリすることができた。この値は、単純に数字の大小で現れるいわゆる「成功率」ではない。表示上は 8進数なのだが、実は、過去 8回のポーリングの成功/失敗を示すビット循環式の「ログ」そのものなのだ。
前出の `ntpq -p' コマンド出力例に見られる 377 (8進) は 2進表記に戻すと 11111111 となる。"1" は成功、"0" は失敗を意味する。もし次のポーリングが何らかの理由で失敗したとすると、ログは、新幹線の車内にある電光ニュース掲示板のように、左に 1コマ押し出されて 11111110 になる。8進数に変換、つまり表示上では 376 だ。仮に、その後 8回ずっとポーリングが成功したとしよう。すると、循環式ビットログは下記のように推移することになる。
376 11111110 375 11111101 373 11111011 367 11110111 357 11101111 337 11011111 277 10111111 177 01111111 377 11111111
これを実地検証するために、`ntpq -pn' の出力から reach を分かりやすく表示する perl スクリプトを作ってみた。ntpd の動いているサーバ上で下記のスクリプトを root 権限で実行すると、下のような出力が得られる。遊んでいただきたい。
出力例:
remote refid st t when poll reach delay offset jitter ============================================================================== *192.168.1.1 202.224.32.4 3 u 64 64 57 0.389 3.570 2.693 reachability log: xxoxoooo (00101111)
ntpdc は、ntpd 専用のクエリツールで、ローカル及びリモートにある ntpd の状態の確認や設定変更ができる。通信には、UDP プロトコルの NTP mode 7 パケットが使われる。詳細は ntpdc - special NTP query program。 ntpq 同様に;
ntpdc [host]
とだけすれば対話モードに入り、 ntpdc> のプロンプト表示になる。様々なステータスや変数を表示させることはもちろん、認証関係の設定も含め、ntpd のすべての設定項目がリアルタイムに変更できる。これは、生半可なことでは ntpd の再起動や停止ができない重要な位置を占めるタイムサーバで、緊急的な設定変更に迫られた場合に非常に便利だ。 ntpd を再起動すれば、システムピアが決定されるまでの数分間は、他ホストからのリクエストにも応えることができない。一方、ntpdc での書き換えはメモリ上の ntpd に対して直接行われるので、サービスが途絶えない (設定ファイルが書き換わるわけではない)。その反面、悪用されれば恐ろしいツールでもある。使えるコマンドは help で調べることができ、`? command ' のようにコマンドまで指定すれば当該コマンドの簡単な使い方が表示される。
また、しかるべきオプション付きでコールすると、コマンドラインモードで走ってすぐに終了する。コマンドラインオプションは:
-c command | 対話モードで使用するコマンドを引数に付けて実行する |
-i | 強制的明示的に対話モードに入る |
-l | 参照先として認識しているタイムサーバをリストアップ |
-p | 参照先サーバのリストを各々の状態とともに表示。`ntpq -p' の出力とは少々異なる |
-s | 上記と同じだが、こちらのほうがやや `ntpq -p' に近い。`ntpdc -c dmpeers' と同義 |
-n | ホスト名を DNS 名前解決しないで表示。-l, -p, -s と組み合わせて使用 |
設定に変更を加えるようなコマンドをそのセッションで初めて発行した際には、キーID とパスワードを求めるプロンプトが行われる。キーID には、サーバ側の ntp.conf の requestkey キーワードで設定しておいたキーID を入力。パスワードプロンプトでは、サーバ側の keys ファイルの当該のキーID に書いておいたキーフレーズを入力する。昔の ntpパッケージでは、キーフレーズが 16文字に満たない時には後ろを 0 で埋めて 16文字きっかりにしないと通らなかったことを付け加えておく。
なお、ntpdc プログラムは、遠く (ネットワーク的に) 離れた ntpd サーバの保守には使えないようにできている。 ntpd が、リモートによるハッキングを困難にするために、パケットのタイムスタンプをチェックしているのだ。 ntpdc は、同一LAN内や、近くのネットワークセグメントでしか使えないと思ったほうがいい。
デーモンとしてではなく随時起動のプログラムとしてカーネルクロックを調整するユーティリティ。しかし困ったことに ディストリビューション添付の man ファイルのアップデートが間に合っていないようで、オプションなど詳しい使い方を知るにはオフィシャルサイトの WEB ドキュメントを読まなければならない。そのドキュメントによると、このプログラムは「じきに廃止されるだろう」と書いてあり、使用は、時間のズレが非常に大きくて (1000秒以上) ntpd が起動できない時か、Linux を Windows Server に対して時刻合わせしなければならない時くらいに限定した方がいいようだ。基本的なコマンドフォーマットは;
root# ntpdate [options] server [server ...]
重要: ntpdate は ntpd が稼働していると "NTP socket in use" というエラーを吐くばかりで動作を拒絶する。 ntpdate を使うには一旦 ntpd デーモンを終了しなければならない。
ntpdate も ntpd と同様に slew モードと step モード (ntpd 起動オプションの -x オプション参照) を自動的に使い分ける。デフォルトでは、参照サーバとの時間のズレが +-128ms (?? 0.5秒という記述もありどちらか不明) 以内の場合は slew モードで働き、それ以上のズレがある場合には step モードで動作する。 ntpd を即時終了モード (-q オプション -- 次項参照) で使用した時との違いは、 ntpd がじっくりと腰を据えて参照先を選別してから exit するのに対し、 ntpdate は step モードにしろ slew モードにしろ複数の参照サーバを指定したにしろ (おそらく簡易的な選定アルゴリズムを使って) 即刻 exit するという点だ。オプションはかなりたくさんあるが、主なものだけを以下に列挙する。
ntpdateオプション
オプション | 説明 |
---|---|
-B | 参照サーバとの時間のズレの大小にかかわらず常に slew モードで動作。 ntpd の -x オプションに当たる |
-b | 参照サーバとの時間のズレの大小にかかわらず常に step モードで動作。 ntpd にはない機能 |
-d | デバグモード。サーバ参照や様々な判断の過程を表示する。実際の時間合わせは行わない |
-U user | (U は大文字) 指定したユーザとして実行する |
-v | 冗長モード。よりたくさんのメッセージを表示する |
-4 | 参照先サーバを IP でなくホスト名で書いた場合に、 IPv4 として解決を試みる。 IPv6 なら -6 |
-s | STDOUT(標準出力) の出力を syslog へ送る。ファシリティやログレベルは不明だが、実験したところ messages に記録された |
設定のいい加減なしかも管轄外の Windows 2003 Server の Windows Time を参照して時刻合わせをしなければならないなど悲しい事情のある場合には、`ntpd -q' をあきらめてこれをやらなければならない。少しでも美しく行うには、まず、下記のようなシェルスクリプトを用意する。仮にこのスクリプトを /etc/cron.misc/timecheck.sh としよう;
#!/bin/sh -
/usr/sbin/ntpdate -b -4 -s -U ntp server &>/dev/null || :
このように -s で時刻合わせ記録を syslog へ送り、その代わりこのスクリプトはいかなるメッセージも奈落 (/dev/null) へ送り、なお且つ、エラーが起きても常に TRUE で exit する (エラー発生時の crond から root へ宛てた告知メールを抑止するため)。参照先サーバをホスト名で書く場合は、最近の Linux ディストリビューションは IPv6 が有効になっているが実際には IPv4 しか利用していない場合が多いので、無駄な DNSクエリをなくすために -4 を指定した方がいい。もちろん timecheck.sh には実行ビットを立てておく (755など)。これをドライブする crontab エントリは下のような塩梅。 0:31, 2:31, 4:31 ... という具合に 2時間毎に実行されるよう /etc/crontab ファイルに定義を書く場合の例を挙げる;
31 */2 * * * root /etc/cron.misc/timecheck.sh
仕上げに `service crond reload' して完了。