server-memo.net

NTP設定

      2016/01/22

ntpのインストール・設定

NTPとは?

NTP(Network Time Protocol)はネットワークを介して、コンピュータ同士の時間を同期させるためのプロトコルです。 UTC(協定世界時「グリニッジ標準時」に同期したコンピュータを元に、ツリー構造によって時刻同期を行っています。上位層から提供される情報を元に時刻を同期させ、下位の階層に時刻情報を提供させることも出来ます。 階層は「stratum」と呼ばれ最上位の階層が、stratum1と呼ばれその下位の階層がstratum2、さらに下位層がstratum3と分けられています。 色々と難しく説明してきましたが簡単にいうと、時刻合わせるための仕組みです。

なぜ、時刻合わせをするのか?

簡単に言ってしまうと、サーバの時刻が狂っていると当然ですがログに記録される時間も正確なものではなくなりますよね。 ということは、いつ何が起きたのか正確な情報が分からないということになってしまいます。

障害発生時にログの時間が正確ではない場合、障害解析時にものすごく苦労しますよ・・・

 

また、時刻の狂ったメールサーバからメールを送信した場合に未来や過去からの時間のメールを送ってしまい、受信者を混乱させてしまったりすることもありえます。 ですので、正確な時刻を保つということは管理者として基本中の基本なのです。

ntpインストール

実行環境

今回の作業は、CentOS4.4で行っています。
(FreeBSDでも設定したことがあるので、その際の情報もメモ程度にところどころ記述しています)

ダウンロード

CentOSにはntpがデフォルトでインストールされていと思うのですが、インストールされていない場合はyumもしくはパッケージからインストールするか、ソースをダウンロードしてきてインストールする必要があります。 ソースのダウンロードは

http://ntp.isc.org/bin/view/Main/SoftwareDownloads

よりntpソフトをダウンロードしてきます。最新バージョンは以下のとおりとなっています。(2007/01/10現在)

 

Stable     (安定版)   4.2.4 	2006/12/28 	 
Development(開発版)   4.2.5p2 	2007/01/08 
インストール

yumでのインストール

# yum -y install ntp

ソースからのインストール方法

$ tar xzfv ntp-4.2.0.tar.gz
$ cd ntp-4.2.0.tar.gz
$ ./configure
$ make
$ su
# make install

以上で、インストールは完了です。

ntpの設定

/etc/ntp.confの設定

ntpの設定は/etc/ntp.confというファイルで設定をします。

# cp -p /etc/ntp.conf /etc/ntp.conf_yyyymmdd
# vi /etc/ntp.conf

/etc/ntp.confの基本設定例

 

# アクセスコントロール
restrict default ignore 
restrict 127.0.0.1
restrict ntp1.jst.mfeed.ad.jp
restrict ntp2.jst.mfeed.ad.jp
restrict ntp3.jst.mfeed.ad.jp
restrict 192.168.0.0 mask 255.255.255.0 noquery nomodify nopeer notrust notrap

# 自サーバのハードウェアクロックと同期
# server  127.127.1.0     # local clock
# fudge   127.127.1.0 stratum 10

# 同期するNTPサーバ
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp

# 時刻情報記録ファイル
driftfile /var/lib/ntp/drift    # driftfileの場所は任意の場所でよいです。

# ブロードキャストでの遅延時間
broadcastdelay 0.008    

# 認証を使用するか
authenticate no

設定項目の説明

server 時刻を同期する上位NTPサーバーを指定
driftfile 時刻の変動を記録するためのファイルを指定
restrict NTP通信を許可するためのアクセスリスト
restrict(アクセスコントロール)の設定について

記述例を上記で記述したntp.confを例にして説明します。

restrict default ignore

すべての通信を拒否するという設定です。
restrictの設定は一番最後に当てはまった設定条件を適応するので、 一番初めに全てを拒否しておいてから、その後に接続を許可する設定をしていくという書式になります。
(記述の順番を間違えて一番最後の行に default ignoreなんて設定してしまったら何処とも同期出来なくなってしまいます。)

restrict 127.0.0.1
restrict ntp1.jst.mfeed.ad.jp
restrict ntp2.jst.mfeed.ad.jp
restrict ntp3.jst.mfeed.ad.jp

自分自身(ローカルホスト)と、時刻を問い合わせする上位サーバは制限なしで許可するという設定 最初に、全ての通信を拒否すると設定しているので時刻同期を行うサーバと通信できる設定をしておかないと、上位サーバから時刻情報の同期をすることができませんので注意してください。

restrict 192.168.0.0 mask 255.255.255.0 noquery nomodify nopeer notrap

192.168.0.0/24のネットワークからは時刻の問い合わせのみ許可する設定

ignore 	    全てのNTPパケットを無視する。
nomodify 	時刻問い合わせに応答するが、時刻の変更要求などは無視する。
notrust 	時刻問い合わせに応答するが、自身の時刻合わせには使用しない
nopeer 	    指定ホストとは同期を行わない。	
noquery 	NTPの実装に依存する時刻問い合わせを無視
driftfileファイルの作成

ntp.confで設定されている場所にdriftファイルが無い場合は、driftファイルを作成しなくてはいけません。 ファイルがある場合は特に作業は必要ありません。

# touch /var/lib/ntp/drift

ntpの起動

/etc/ntpd.confとdriftfileの作成が完了しましたら、ntpdを起動します。 ntpdは同期を取るサーバと時刻があまりにもかけ離れている場合などは同期を取ることが出来ない場合があります。 ですので、ntpを一番最初に起動させる前にntpdateコマンドにて強制的に時刻を同期することをお勧めします。

ただ注意する点は、ntpdateコマンドでの時刻合わせを行うとサーバの時間が一気に変更されしまい、 他のサービスに影響が出てしまう場合がありますので、実行する場合は影響の少ない時間帯に行ったほうが良いです。
(ntpデーモンは他のサービスに影響が出ないように、少しずつゆっくりと時刻を同期・修正していきます。)

ntpdateの実行

# ntpdate ntp1.jst.mfeed.ad.jp
11 Jan 18:22:58 ntpdate[18138]: step time server 210.173.160.27 offset 1228.896857 sec
# ntpdate ntp1.jst.mfeed.ad.jp
11 Jan 18:23:04 ntpdate[18139]: step time server 210.173.160.27 offset 2.266042 sec
# ntpdate ntp1.jst.mfeed.ad.jp
11 Jan 18:23:05 ntpdate[18140]: adjust time server 210.173.160.27 offset 0.342455 sec

上記の実行結果は、ntp1.jst.mfeed.ad.jp
※ntpデーモンが起動してい場合はntpdateで使用する123番ポートがすでにntpデーモンにより使用されているため実行できません。

追記 2007.04.02

ntpデーモンが起動していても、-u オプションをつければntpdateコマンドを実行できるようです。

-u オプションなしの場合

NTPソケットを使用しているといわれてntpdateが失敗します。

# ntpdate ntp1.jst.mfeed.ad.jp
 3 Apr 14:29:00 ntpdate[4584]: the NTP socket is in use, exiting
-u オプションありの場合

123番ポート以外を使用するのでntpdateコマンドが成功します。

# ntpdate -u ntp1.jst.mfeed.ad.jp
 3 Apr 14:44:04 ntpdate[4585]: step time server 210.173.160.27 offset 896.640277 sec
ntpdの起動

CentOSの場合

# /etc/init.d/ntpd start
ntpd を起動中:                    [  OK  ]

FreeBSDの場合

# /usr/sbin/ntpd
起動確認

ntpdの起動が完了しましたら、時刻情報の同期が取れているかの確認を行います。
※ntpdを起動しから時刻の同期が取れるまで、少々時間が掛かることがあります。

同期が取れているのかの確認を取るにはntpqコマンドを使用します。

# ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp1.jst.mfeed. fs-monntp2.mfee  2 u   38   64  177   40.809   14.309   6.404
+ntp2.jst.mfeed. fs-monntp2.mfee  2 u   33   64  177   40.751   17.307  10.327
+ntp3.jst.mfeed. fs-monntp2.mfee  2 u   35   64  177   40.406   17.057   8.111

サーバ名の頭に*が出ていれば、そのサーバと同期が取れている証拠ですので問題ないでしょう。

ntpq が出力する項目の説明

remote タイムサーバ名と、そのサーバステータスを表示
refid remote がどこから時刻を同期しているかを表示。不明の場合は 0.0.0.0 を示します。
st サーバの階層であるstratum 番号を表示
t 階層の種類( l: local, u: unicast, m: multicast, b:broadcast )
when remote から最後にパケットを受け取ってからの時間
poll ポーリングの間隔を表示
reach 到達可能レジスタデータを8進数で表示
delay 時間の遅延見積もりをミリ秒単位で表示
offset remote との時刻のずれをミリ秒単位で表示
jitter remote の分散 (ばらつき) をミリ秒単位で表示

remote 欄に表示されるサーバステータス

空欄 距離が遠いために使用されていない
x falseticker検査で使用されていない
. 参照しているサーバが多いため(混雑していて)使用されていない
- クラスタリング検査で捨てられたサーバ
+ いつでも使用可能なサーバ
# 同期距離は遠いが参照は可能なサーバ
* 同期中のサーバ
ntpの自動起動設定

CentOS 4.4の場合

Redhat系OSならばこれでいけると思います。

# chkconfig ntpd on
# chkconfig --list ntpd
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

FreeBSDの場合

FreeBSDでntpdの自動起動を設定する為には、/etc/rc.conf に以下の設定を記述します。

# vi /etc/rc.conf

rc.confに追加する設定

 

FreeBSD4.x系の場合

xntpd_enable="YES"
xntpd_flags="-p /var/run/ntpd.pid"

FreeBSD5.x系以降の場合

ntpd_enable="YES"
ntpd_flags="-p /var/run/ntpd.pid"

同期させるサーバの選択

ntp.confにて設定する時刻情報を取得するサーバの選択方法について記述します。

1. 契約しているISPが提供しているサーバを使う

同期させるNTPサーバを選択する上で重要な点、それはネットワーク的に近くて混雑していないサーバを選択するということです。

感覚的にはStratum 2よりStratum 1のほうがより正確に時刻同期できるような気がしますが、そうではありません。 ネットワーク的に遠かったり混雑しているStratum 1のサーバを選んでしまった場合は、ネットワーク遅延等の影響で時刻情報の精度が落ちてしまうからなのです。

なので、契約しているISP(プロバイダ)でNTPサーバを公開しているのだったら、そこに同期させるのがネットワーク的にも負荷的にも一番良いと思います。

2. ISPでNTPサーバを公開していなかった場合

ISPでNTPサーバを公開していないところもあると思います、そんなときはどうすればよいのでしょうか?

そんな場合「mfeed.ad.jp」 や「nict.jp」のNTPサーバを参照するのが良いらしいです。なぜならば「mfeed.ad.jp」は多くのISPからネットワーク的に近い場所にあるらしく、 「nict.jp」は毎秒100万リクエスト以上を処理できる性能を有しているということです。

NICT (独)情報通信研究機構

(Stratum 1)

ntpd.confでの指定方法

 server ntp.nict.jp
  server ntp.nict.jp
  server ntp.nict.jp

と同内容を3行続けて書くのが重要です。

※ホスト名での指定が推奨されています。上記ホスト名を指定すると、複数のNTPサーバをラウンドロビンで参照するそうです。

mfeed インターネットマルチフィード

(Stratum 2)

ntp.confでの指定方法

複数設定が可能な場合

   server ntp1.jst.mfeed.ad.jp 
   server ntp2.jst.mfeed.ad.jp 
   server ntp3.jst.mfeed.ad.jp 

1つのみ設定が可能な場合

   server ntp.jst.mfeed.ad.jp

※ntp.jst.mfeed.ad.jpで設定するとDNSでラウンドロビンされるそうです。

IPアドレスでの指定
   server 210.173.160.27
   server 210.173.160.57
   server 210.173.160.87

3. Stratumの値が違う上位サーバを混在させて指定しないこと

通信がStratum値の小さいサーバに集中してしまい精度が低下する恐れがあります。 (精度を保つためには、同じStratumのサーバを3つ程度指定するのが良いみたいですよ)

もっと知りたいNTP

もっとNTPのことを知りたい人は WikipediaのNTPこちらのサイトに色々と詳しく書いてありますので読んでみてください。

以上

 - ntp