# Network Time Protocol daemon (日本語)

Network Time Protocol は GNU/Linux のソフトウェアクロックをインターネット上の時刻サーバーと同期するのに使われる最も一般的な方法です。変動的なネットワークの遅延を軽減し、インターネットを使って数十ミリ秒の範囲で時刻を維持できるように設計されています。ローカルエリアネットワークの場合、一ミリ秒まで正確性を保てます。

NTP プロジェクト は NTP という名前のプロトコルのリファレンス実装を提供しています。NTP の代わりになるものとして、ダイアルアップフレンドリで常時オンラインではない環境用に設計されている Chrony と、OpenBSD プロジェクトの一部で現在は Linux 用のメンテナンスがされていない OpenNTPD があります。

この記事ではクライアント・サーバー両方で NTP デーモンを設定・起動する方法を説明しています。

## インストール

公式リポジトリにある ntp をインストールしてください。

## 設定

メインのデーモンは ntpd で、`/etc/ntp.conf` から設定を行います。

ntp パッケージのデフォルトの設定ファイルでは、設定のカスタマイズを行わなくてもクライアントモードで ntpd が動作するようになっています。

### NTP サーバーへの接続の設定

`/etc/ntp.conf` を手動で設定したい場合は、まずマシンが同期するサーバを設定してください。

NTP サーバは階層的なシステムによって strata と呼ばれるたくさんのレベルにクラス分けされています。その定義は、独立したタイムソースとされるデバイスは stratum 0 ソース、stratum 0 のデバイスに直接接続しているサーバーを stratum 1 ソース、stratum 1 ソースに接続しているサーバーを stratum 2 ソース、と続きます。

サーバーの stratum は正確性や信頼性を表しているわけではないことを理解する必要があります。一般的に、stratum 2 のサーバーが時刻同期に使われます: どのサーバーに接続するのかまだ決めてない場合、pool.ntp.org サーバー (alternative link) を使って一番地理的に近いサーバープールを選んで下さい。

サンプル::

    /etc/ntp.conf

    server 0.jp.pool.ntp.org iburst
    server 1.jp.pool.ntp.org iburst
    server 2.jp.pool.ntp.org iburst
    server 3.jp.pool.ntp.org iburst

`iburst` オプションは推奨です。最初に試行した時に接続できなかったときだけパケットのバーストを送信するようになります。`burst` オプションは常時バーストを送信するので、許可を得ているときにだけ使って下さい。さもないとブラックリストに入れられてしまう可能性があります。

### あなた自身の NTP サーバーの設定

NTP サーバーを設定する場合、サーバーとして local clock を追加する必要があります。これによりインターネットアクセスを失った時でも、ネットワークへの時刻の提供を続行することができます。(fudge コマンドを使って) stratum 10 サーバーとして local clock を追加すればインターネットアクセスが失われない限り使用されません:

    server 127.127.1.0
    fudge  127.127.1.0 stratum 10

次に、restrict コマンドを使ってあなたのサービスに接続できるクライアント (localhost もクライアントとして見なされます) を制限するルールを定義します。あなたのファイルには次のような行がすでに存在するはずです:

    restrict default nomodify nopeer noquery

これで誰も何も変更できなくなり時刻サーバーの状態の問い合わせも制止されます: `nomodify` は ntpd (と ntpq または ntpdc) の再設定を無視し、`noquery` は ntpd (と ntpq または ntpdc) の状態データのダンプを防ぎます。

また、他のオプションを加えることも可能です:

    restrict default kod nomodify notrap nopeer noquery

Note: これは他の人々があなたの時刻サーバーに問い合わせるのを許可します。`noserve` を追加して時刻の提供を止めて下さい。また ntpq と ntpdc クエリ以外の全てのパケットをブロックするので時刻同期もブロックされます。

"restrict" オプションの完全なドキュメントは `man ntp_acc` にあります。詳しい説明は https://support.ntp.org/bin/view/Support/AccessRestrictions を参照してください。

次の行のように、サーバーへの接続を許可する IP を ntpd に伝える必要があります; NTP サーバーを設定しない場合はこのままで問題ありません:

    restrict 127.0.0.1

DNS 解決を IPv6 ネームスペースに強制したい時は、IP アドレスやホストネームの前に `-6` を書いて下さい (`-4` は IPv4 を強制します)。例:

    restrict -6 default kod nomodify notrap nopeer noquery
    restrict -6 ::1    # ::1 is the IPv6 equivalent for 127.0.0.1

最後に、ドリフトファイル (時計の時刻のズレを記録します) と任意でログファイルの場所を指定してください:

    driftfile /var/lib/ntp/ntp.drift
    logfile /var/log/ntp.log

基本的な設定ファイルは以下のようになります:

    /etc/ntp.conf

    server 0.pool.ntp.org iburst
    server 1.pool.ntp.org iburst
    server 2.pool.ntp.org iburst
    server 3.pool.ntp.org iburst

    restrict default kod nomodify notrap nopeer noquery
    restrict -6 default kod nomodify notrap nopeer noquery

    restrict 127.0.0.1
    restrict -6 ::1

    driftfile /var/lib/ntp/ntp.drift
    logfile /var/log/ntp.log

Note: ログファイルの定義は必須ではありませんが、ntpd の操作のフィードバックを得るのはどんなときでも良い考えです。

### NTP の設定資料

結論を言うと、man ページを忘れないで下さい: `man ntp.conf` であなたの疑問の全ては解決するでしょう (関連する man ページも参照してください: `man {ntpd|ntp_auth|ntp_mon|ntp_acc|ntp_clock|ntp_misc}`)。

## デーモンを使わない

システム時刻を一度だけ同期するには、ntpd を起動する代わりに、次を実行してください:

    # ntpd -q

`-q` フラグは ntpd で時刻を一度だけ設定して終了します。つまりデーモンは起動しません。この操作が失敗した場合、システムクロックは同期されません。

Note: 上のコマンドは現在は廃止されている `ntpdate` コマンドと同じ効果があります。

システム時刻を更新した後、再起動した時も時刻が反映されるようにハードウェアクロックに時刻を保存してください:

    # hwclock -w

### 起動毎に同期する

Warning: サーバーや、数日間電源を落とさないようなマシンではこの方法は非推奨です。

oneshot の systemd ユニットを記述します:

    /etc/systemd/system/ntp-once.service

    [Unit]
    Description=Network Time Service (once)
    After=network.target nss-lookup.target

    [Service]
    Type=oneshot
    ExecStart=/usr/bin/ntpd -g -u ntp:ntp ; /usr/bin/hwclock -w

    [Install]
    WantedBy=multi-user.target

そしてユニットを有効にしてください:

    # systemctl enable ntp-once

Note: oneshot タイプの systemd ユニットは一度しか実行されません。従って `ntpd -q` オプションを使うのはこの場合ふさわしくありません。

### Netctl

Netctl によるネットワーク接続にあわせてシステム時刻を同期するには、次の行をあなたの netctl プロファイルに追加してください:

    ExecUpPost='/usr/bin/ntpd -gq || true'

### Wicd

Wicd の接続が確立した後に ntpd を一度実行するには `postconnect` ディレクトリにスクリプトを作成します:

    /etc/wicd/scripts/postconnect/ntpd

     #!/bin/bash

     /usr/bin/ntpd -gq

## デーモンとして実行する

Warning: 2014年2月現在、設定によってはデーモンとして使われている ntpd が DDoS 攻撃に脆弱になることがあります。Arch の ntpd のデフォルト設定には CVE-2013-5211 の脆弱性はありません。`noquery` が `monlist` コマンドのレスポンスを無効にするからです。設定から `noquery` を取り除き、`disable monlist` を追加しなかった場合、悪用される可能性があります。詳しくは arch-dev メーリングリストの投稿と上記の CVE リポートを読んで下さい。

`ntpd.service` を起動してください。ブート時に起動するには、サービスを有効にするか、次のコマンドを使って下さい:

    # timedatectl set-ntp 1

### デーモンが正しく同期を実行しているか確認する

ntpq を使って設定されたピアの一覧を見て下さい:

    $ ntpq -np

delay, offset, jitter のカラムがゼロではないはずです。ntpd が同期しているサーバーにはアスタリスクが前に付けられます。ntpd が同期するサーバーを選ぶまで数分間かかることがあります。17分 (1024秒) 後に確認してみてください。

### NetworkManager

Note: ネットワークが繋がっていない時も ntpd は動き続けます。そのため hwclock デーモンを無効にしている場合、この方法は使わないで下さい。

NetworkManager の dispatcher スクリプトを使ってネットワーク接続にあわせて ntpd デーモンを立ち上げたり終了することができます。公式リポジトリ から networkmanager-dispatcher-ntpd をインストールしてください。

### chroot で実行する

Note: ntpd should be run as non-root before attempting to jail it in a chroot (default in the vanilla Arch Linux package), since chroots are relatively useless at securing processes running as root.

`/etc/conf.d/ntpd.conf` を編集して

    NTPD_ARGS="-g -u ntp:ntp"

を

    NTPD_ARGS="-g -i /var/lib/ntp -u ntp:ntp"

に変更してください。そして、`/etc/ntp.conf` を編集して driftfile のパスを実際の root ではなく chroot ディレクトリの相対パスに変えて下さい:

    driftfile       /var/lib/ntp/ntp.drift

を

    driftfile       /ntp.drift

に変えて下さい。適切な chroot 環境を作成してください。getaddrinfo() を動作させるために適切なディレクトリとファイルを (root で) 作成し:

    # mkdir /var/lib/ntp/etc /var/lib/ntp/lib /var/lib/ntp/proc
    # touch /var/lib/ntp/etc/resolv.conf /var/lib/ntp/etc/services

そして上記のファイルをバインドマウントしてください:

    /etc/fstab

    ...
    #ntpd chroot mounts
    /etc/resolv.conf  /var/lib/ntp/etc/resolv.conf none bind 0 0
    /etc/services	  /var/lib/ntp/etc/services none bind 0 0
    /lib		  /var/lib/ntp/lib none bind 0 0
    /proc		  /var/lib/ntp/proc none bind 0 0

    # mount -a

最後に、デーモンを再起動してください:

    # systemctl restart ntpd

It is relatively difficult to be sure that your driftfile configuration is actually working without waiting a while, as ntpd does not read or write it very often. If you get it wrong, it will log an error; if you get it right, it will update the timestamp. If you do not see any errors about it after a full day of running, and the timestamp is updated, you should be confident of success.

## 参照

- Time (日本語) (コンピュータの時間管理の詳細)
- http://www.ntp.org/
- https://support.ntp.org/
- http://www.pool.ntp.org/
- https://www.eecis.udel.edu/~mills/ntp/html/index.html
- http://www.akadia.com/services/ntp_synchronize.html

Category:

- Networking (日本語)