全面的にredhatのガイドを参考にしている。
!!!PTPの記述もいつか別ギストにまとめるべし
マザーボードにはハードウェアクロックが搭載されている
しかし、これはあまり正確ではない。(年10分ずれるという話も、月5分ずれるという話も。)
したがって、時刻を正確にチューニングしてやる必要がある
これをしなければ、タイムスタンプ等の情報もずれてしまい、障害調査の手がかりがつかめなくなる
正確な時刻の確保はサーバ管理の基本
PCの時刻は、ハードウェアクロックとシステムクロックの二種類がある
システム起動時には、システムクロックが読まれるが、これは電源を切ると止まる
ハードウェアクロックはシステム停止時にも動き続ける
システム起動時にはハードウェアクロックを読み込んでシステムクロックに書き込まれる
システム終了時にはシステムクロックを読み込んでハードウェアクロックに書き込まれる
ネットワークから現在時刻を提供するサービスがNTP(Network Time Protcol)。
世界中の多くの標準機間には原子時計があり、これが参照先として利用可能になっている場合がある
日本だと福岡大学、、、だったかな(?)
このサービスを使用することで時刻合わせをする
(PTPというものもあるっぽい)
時刻を合わせるとき、特に時刻を遅らせる場合、急に遅らせる操作はしない
時刻が後ろへ飛ぶことによってログの時刻の前後関係がひっくり返る可能性があるため
システムクロックのテンポを少しだけ落とすことでゆっくりと時計を遅らせる操作をSLEWモードの時刻設定 という
稼働中であれば、
定期的にntpサーバを参照してシステムクロックをSLEWモードで正確に保ち、定期的にシステムクロックをハードウェアクロックへ反映することにより正確な時刻を保つことができる
カーネルが自動的にハードウェアクロックを同期するモードがある(11分モードといわれてたりする)
ntpを設定し、そのモードにすると、11分ごとにシステムクロックをハードウェアクロックに書き込むことで時刻合わせを自動的に行う
NTPサーバは、時間信号のソースとなる原子時計からの同期距離によって分類される
サーバは、1から15までのstratum(階層)に分類される
原子時計はソースであることからStratum 0と呼ばれる
ただし、Stratum 0 パケットがインターネット上で送信されることはなく、stratum 0原子時計のすべてはstratum1と呼ばれるサーバに接続されている
Stratum n がついているパケットで同期されるサーバは、その次に回のstratumに所属し、パケットをstratum n+1とマークする
同一stratumのサーバは相互にパケットを交換できる
stratum16という名称は、サーバが現在信頼できるタイムソースと同期していないことを意味する
デフォルトでは、NTPクライアントはそれよりも下位のstratumにあるシステムのサーバとして機能する
NTPが示すのは、1900年1月1日からの積算秒数。
NTPは、4つのタイムスタンプを使って往復時間とサーバー応答時間の計算を可能にしている
具体的には、送信元タイムスタンプのついたパケットが送信され、受け取った側は、受信先タイムスタンプを追加する。
日時情報の要求を受理した後、パケットの返信前に転送先タイムスタンプを追加する。
返信パケットがNTPクライアントに届くと、受信先タイムスタンプが生成される
これを用いて、往復時間を英山市、処理時間を差し引くことで実際の移動時間を導き出す
時間情報を含むパケットは、受信後に直ちに処理されるのではなく、最初に検証され、その後にいくつかの他の時間サンプルと一緒に処理されて、時間を予想する
これをシステムクロックと比較し、タイムオフセット(システムクロックとntpdが判断した時間の差)を判断する。
このタイムオフセットが1000秒を超える場合、ユーザが手動で調整を行う必要がある(インストールスクリプトを利用)
誤差ファイルは、通常の周波数で稼働しているシステムクロックと、UTCよ同期し続けるために必要な周波数との間の周波数オフセットを保存する
このファイルに値があれば、システム起動時に読み取られ、クロックソースの修正につかわれる
この値は1時間ごとにntpdが計算して、ファイルを置換する。更新ではなく置き換えなので、誤差ファイルにはntpdの書き込みパーミッションが無いといけない
ネットワーク上の攻撃者は、不正確な時間情報のあるNTPパケットを送信することで、サービス妨害を試みることがある。
NTPサーバのパブリックプールを使用しているシステムでは、/etc/ntp.confのパブリックNTP一覧内に4つ以上のNTPサーバを記載することでこのリスクを軽減できる
内部のタイムソースがある場合、NTPパケットが配布されるネットワークを保護することが必要
ブロードキャストとマルチキャストの各モードでは、デフォルトで認証が必要になる
ネットワークが信頼できると判断した場合、ntp.confファイル内のdisable auth指示文を使って認証を無効にできる
DHCPクライアントであるdhclientは、DHCPサーバからNTPサーバのリストを受信すると、これをntp.confに追加してサービスを再起動する
この機能を無効にするには、PEERNTP=noを/etc/sysconfig/networkに追加する
**仮想マシンは実際のハードウェアクロックにアクセスできず、**仮想クロックの安定性はホストシステムの作業量に依存することから、十分な安定性が無い
このため、使用する仮想化アプリケーションが準仮想化クロックを提供する必要がある
KVMのあるRHELでは、デフォルトのクロックソースはkvm-clockになる
実はNTPはうるう秒に対応する。
Stratum 1サーバが対応するので、ユーザにはあまり関係ないけど、、、。
ntpの設定ファイルは、/etc/ntp.conf
このファイルは、ntpdとともにインストールされる。
RHELなら、デフォルトでは、RedHatプールからのタイムサーバを使用する設定になっている
下は自分の環境(centos)でのntp.conf(いじっていないのでデフォルト)
[@centos ~]$ cat /etc/ntp.conf
# For more information about this file, see the man pages
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).
driftfile /var/lib/ntp/drift
# Permit time synchronization with our time source, but do not
# permit the source to query or modify the service on this system.
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
# Permit all access over the loopback interface. This could
# be tightened as well, but to do so would effect some of
# the administrative functions.
restrict 127.0.0.1
restrict -6 ::1
# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
#broadcast 192.168.1.255 autokey # broadcast server
#broadcastclient # broadcast client
#broadcast 224.0.1.1 autokey # multicast server
#multicastclient 224.0.1.1 # multicast client
#manycastserver 239.255.254.254 # manycast server
#manycastclient 239.255.254.254 autokey # manycast client
# Enable public key cryptography.
#crypto
includefile /etc/ntp/crypto/pw
# Key file containing the keys and key identifiers used when operating
# with symmetric key cryptography.
keys /etc/ntp/keys
# Specify the key identifiers which are trusted.
#trustedkey 4 8 42
# Specify the key identifier to use with the ntpdc utility.
#requestkey 8
# Specify the key identifier to use with the ntpq utility.
#controlkey 8
# Enable writing of statistics records.
#statistics clockstats cryptostats loopstats peerstats
[@centos ~]$
少し詳しく見ていく
項目
説明
driftfile
誤差ファイルへのパス(ディレクトリがntpdで書き込み可能である必要がある)。ファイルにはシステム起動時に毎回システムクロックの周波数を調整する値が含まれる。
以下、レート制限アクセス(discard)
---
average
許可される最小限の平均パケット間隔を指定するlog₂秒の引数を取る。デフォルトでは3
minimum
許可される最小限のパケット間隔を指定し、log₂秒の引数を取る。デフォルトでは1
monitor
許可されるレート制限を超えた場合のパケットのdiscardの確立を指定する。デフォルトは3000秒。このオプションは1000個/秒のリクエストを受信するサーバに用意される
peer アドレス
ピアのアドレス(同一StratumのNTPサービスを実行しているサーバのアドレス)を追加する
server アドレス
サーバのアドレス(1つ上の階層のNTPサービスを実行しているサーバのアドレス)を追加する
broadcat アドレス
送信用のブロードキャストまたはマルチキャストアドレス(NTPパケットをブロードキャストまたはマルチキャストする宛先のアドレス)を追加する。ここでのアドレスはパケットの送信先となるIPブロードキャストまたはマルチキャストアドレス。※
manycast アドレス
manycastクライアントアドレス(NTPサーバの発見に使用するマルチキャストアドレス)を設定する※2
broadcastclient
ブロードキャストメッセージを受信可能にする。このコマンドは、システムがNTPクライアントのように動作するように設定する。クライアントとサーバの両立は可能
manycastserver アドレス
manycastサーバのアドレス(NTPパケットをマルチキャストすることでクライアントがサーバを発見できるようにするアドレス)を追加する。システムがNTPサーバのように動作するように設定する。サーバとクライアントの両立は可能
multicastclient アドレス
マルチキャストクライアントアドレス(マルチキャストNTPパケットようにマルチキャストアドレスを監視する様な)設定。※3
以下、オプション
---
burstオプション
時間オフセットの統計情報の平均的な品質を向上させる。ただし、公開NTPサーバに設定すると汎用とみなされるので設定しないように。組織内のアプリケーションにのみ使用するようにする
iburstオプション
初回同期にかかる時間を改善する。デフォルトのオプション
keyオプション
サーバーまたはピアコマンドの最後に付けるオプション。鍵を使った対称認証を設定する。書式はkey 数字(1から65535まで)
minpollオプション
デフォルトのポーリング間隔を変更する。書式はminpoll 値 and maxpoll 値。maxpollを低く設定すると、クロックの精度が高まる
preferオプション
特定のサーバが他の同様の統計情報のサーバよりも優先されるように指定する。サーバ又はピアコマンドの最後につける
ttlオプション
デフォルトで使用される特定のTime-to-live(TTL:有効期限)の値を指定する。サーバ又はピアコマンドの最後につける
version 値
デフォルトで使用される特定バージョンのNTPを指定する。サーバ又はピアコマンドの最後につける
以下、アクセス制御エントリ(restrict)
---
nomdifyオプション
設定に変更が加えられないようにする
notrapオプション
nptdc制御メッセージプロトコルトラップを防ぐ
nopeerオプション
ピア関連付けが形成されないようにする
noqueryオプション
nptqおよびnptdcクエリーへの応答を防ぐが、タイムクエリーは除外され(このオプションは重要!外さないことが推奨)
restrict default
明示的に許可されていないすべての物へのアクセスを妨害する(ループバックアドレス含む)
ignore
ntpqおよびntpdcクエリーを含むすべてのパケットが無視される
kod
Kiss-o'-deathパケットが送信され、不要なクエリーが減る
limited
パケットがレート制限のデフォルト値またはdiscardコマンドで指定された値に違反する場合、タイムサーバ要求に応答しない。nptqおよびntpdcクエリーには影響が無い
lowpriotrip
一致するホストがトラップを低い優先度に設定する
noserve
ntpqおよびntpdcクエリーを除くすべてのパケットを拒否する
notrust
暗号法で認証されないパケットを拒否する
ntpport
発信元ポートが標準のNTP UDPポート123の場合、一致アルゴリズムが制限のみを適用するように修正する
version
現在のNTPバージョンに一致しないパケットを拒否する
※ブロードキャストおよびマルチキャストのモードは、デフォルトで認証を必要とする。このコマンドは、システムがNTPブロードキャストサーバとして作動するように設定する。使用するアドレスっは、ブロードキャストかマルチキャストアドレスである必要がある。
※2 ここでのアドレスはIPマルチキャストアドレスで、ここからパケットが受信される。クライアントはこのアドレスにリクエストを送信し、嘔吐から最善のサーバを選んで他を無視する。このコマンドは、システムがNTPクライアントのように動作するように設定する。システムは、同時にクライアントとサーバの両方になることができる
※3 マルチキャストメッセージの受信がd系るようになる。ここでのアドレスは、サブすくライブするアドレスになる。これは認証と合わせて使用して、サービスの中断を防ぐ。このコマンドは、システムがNTPクライアントのように動作するように設定する。両立可能
NTPD SYSCONFIGファイルとredhatには書かれているけど、これがどこにあるなんという名前のファイルなのか不明。
ただ、
# Command line options for ntpd
OPTIONS="-g"
のようになっているらしく、このファイルはサービス起動時にntpd initスクリプトが読み込むそう
-gオプションは、ntpdがオフセットの制限である1000秒を超えても時間の同期を試みるようにするオプション
ただしこれはシステム起動時のみ。
このオプションが無いと、タイムオフセットが1000秒を超える場合、ntpdは終了する。
また、-gオプションを使用した場合でも、サービスが再起動してオフセットが1000秒を超える場合は、システム起動後に終了する。
ntpdを使用するには、デフォルトのユーザースペースデーモンであるchronydを停止知って無効にする必要がある
これにはroot権限でコマンドを実行する必要がある
systemctl stop chronyd
着信NTPパケットを許可するファイアウォールの設定
NTPトラフィックは、ポート番号123上のUDPパケットで構成されているので、ファイアウォール設定でこのポート・UDPを開けなきゃダメ
ntpdateサービスの目的は、システム起動時にクロックを設定すること。
このサービスはこれまで、ntpdateが正確な時間を確保して、クロックでジャンプが生じないようにしてからサービスが開始するために使われていた。
ntpdateおよびstep-tickersリストの仕様は非推奨とみなされているため、RHEL7 では、-gオプションをつけたntpdコマンドをデフォルトで使用し、ntpdateは使用しない
RHEL7 のntpdateサービスが役に立つのは、ntpdを使わずに単独で使用する場合のみ
サービスを並行して起動するsystemdでは、ntpdateサービスが提供するtime-sync.targetへの並び順依存関係を指定しない限り、ntpdateサービスを有効にしても正確な時間を確保した後に他のサービスが起動することはない
あるサービスが正確な時間を伴って起動されるようにするには、そのサービスにAfter=time-sync.targetをついあk氏、ターゲットを提供するサービスの1つを有効にする
RHEL7 のサービスにはデフォルトでこの依存関係が含まれているものもある(例えばdhcpd,dhcpd6,crond)
システムで利用可能なクロックソースを一覧表示するには、以下のコマンドを実行する
~]$ cd /sys/devices/system/clocksource/clocksource0/
clocksource0]$ cat available_clocksource
kvm-clock tsc hpet acpi_pm
clocksource0]$ cat current_clocksource
kvm-clock
上記の例では、カーネルはkvm-clockを使用している
これは仮想マシンなので、起動時にこのクロックソースが選択されている
利用可能なクロックソースはアーキテクチャに依存する
デフォルトのクロックソースを上書きするには、clocksource指示文をカーネルのGRUBメニューエントリの末尾に追加する。grubbyツールを使用して変更する。
例えば、システムのデフォルトのカーネルがtscクロックソースを使用するように強制するには、以下のコマンドを実行する
~]# grubby --args=clocksource=tsc --update-kernel=DEFAULT
--update-kernelパラメータはキーワードALL、またはカーネルインデックス番号のコンマ区切の一覧も受け入れる