【NTPサーバ】Chrony ver. 4.6 の設定について

# はじめに
NTPサーバーのリプレイスに際し、chronyについて調べる機会があったため、その情報をここに残しておこうと思います。一から調べるのは大変なので、誰かの役に立てれば嬉しいです。

# chrony(クローニィ)とは
**chrony** は、NTPの多機能な実装で、システム時計を正確に同期するためのツールです。断続的な接続や過酷な環境（ネットワークの混雑、非連続稼働、仮想マシンなど）でも高い精度を発揮します。また、インターネット上で同期された2台のマシン間の精度は一般的に数ミリ秒以内であり、LAN上では数十マイクロ秒程度とされています。

<font color="Red">※ デフォルト設定では、chrony は時刻を徐々に調整する「slewモード」で時計を遅らせたり早めたりして同期を行います。このモードでは、過去に時刻が戻ることはありません。</font>


# chronyd・chronyc とは
**chronyd** は、Chronyのデーモンプログラムであり、システム起動時に自動的に開始され、継続的に時刻同期を実行します。

**chronyc** は、Chronyのコマンドラインインターフェイスで、ユーザーが chronyd の動作状態を監視したり、動作パラメータを変更したりするために使用します。

　**chronyc** の使い方は、以下が参考になります。
　　・[*chronyc sources コマンドの出力結果の見方*](https://rurukblog.com/post/chronycsources/)
　　・[*chronyc tracking コマンドの出力結果の見方*](https://rurukblog.com/post/chronyc-tracking/)

# chrony.conf（設定ファイル）
chronyd の設定ファイル **chrony.conf** は、デフォルトで以下の設定が記述されています。特別な要件がない場合、このデフォルト設定をそのまま使用するだけで、NTPクライアントとして外部の NTP サーバー群（2.pool.ntp.org）と同期できます。

:::note info
【NTP サーバー群（X.pool.ntp.org）】
NTP を利用して時刻同期を行う際に使用される複数の NTP サーバーで構成されたサーバープールのこと。この「サーバー群（プール）」は、世界中のボランティアによって運用される NTP サーバーを効率的に活用するために構築されており、DNS ラウンドロビン方式を使用してクライアントに最適なサーバーを自動的に割り当てる。

【こんな感じ！】
[root@server1 ~]# nslookup 2.pool.ntp.org
Server:         192.168.10.2
Address:        192.168.10.2#53

Non-authoritative answer:
Name:   2.pool.ntp.org
Address: 45.76.211.39
Name:   2.pool.ntp.org
Address: 160.16.113.133
Name:   2.pool.ntp.org
Address: 162.159.200.1
Name:   2.pool.ntp.org
Address: 133.243.238.163
:::

```terminal:/etc/chrony.conf（ver. 4.5：デフォルト設定）
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.pool.ntp.org iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Serve time even if not synchronized to a time source.
#local stratum 10

# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys

# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking
```

ここからは、私が調査したパラメータについて解説していきます。

:::note warn
・パラメータは大文字と小文字を区別しない。
・パラメータは設定ファイル内で任意の順序で記述可能。
・同じパラメータが複数指定された場合、最後に記述されたものが有効になる。
・コメント行は先頭に「!、;、#、%」のいずれかを付ける。
:::

## 設定項目（ディレクティブ）ついて
### 【server】
時刻同期先のNTPサーバーを指定する設定項目です。「IPアドレス」または「ホスト名」<font color="Red">*1</font>で時刻同期先サーバーを指定します。通常、時刻の信頼性を高めるために、最低でも3～4台のサーバーを指定することが推奨されています。（複数の時刻同期先から得られる時刻を比較することで、誤った時刻を提供しているサーバーを検出・除外するため）

また、この設定項目には、様々なオプションがあります。これにより、特定の条件に基づいた動作や追加の挙動を指定することが可能になります。ここでは一部のオプションを紹介します。

#### 【オプション】
<dl>
<dt>minpoll</dt>
<dd>時刻同期先にリクエストする送信間隔の最小値を指定するオプションです。（２の累乗で秒単位指定：デフォルト ６「2^6＝64秒」）</dd>

<dt>maxpoll</dt>
<dd>時刻同期先にリクエストする送信間隔の最大値を指定するオプションです。（２の累乗で秒単位指定：デフォルト １０「2^10＝1024秒」）</dd>

<dt>polltarget</dt>
<dd>時刻同期に使用する測定値の目標数を指定するオプションです。この目標数に基づいて、minpoll と maxpoll で設定された範囲内でポーリング間隔が調整されます。目標数を増やすと、より多くの測定値を収集するためにポーリング間隔を短くし、これにより時刻同期の精度が向上しますが、NTP サーバーへの負荷が増加します。逆に、目標数を減らすと、ポーリング間隔が長くなり、サーバーへの負荷は軽減されますが、時刻同期の精度が低下する可能性があります。（デフォルト ８）</dd>

<dt>iburst</dt>
<dd>chronyd の起動直後や NTP サーバーがオフラインからオンラインに復帰した際に短い間隔で４～８回連続して NTP サーバーに問い合わせを行うオプションです。これにより、通常よりも早く時刻同期が完了します。（１回の問い合わせだけでは時刻の精度が低いため、複数回問い合わせをするのだが、それを早くするためのオプション）</dd>

<dt>offset </dt>
<dd>NTP サーバーから取得した時刻に対して補正を適用するためのオプションです。この補正値は秒単位で指定し、ネットワーク遅延の非対称性<font color="Red">*2</font>やタイムスタンプの誤差を補正する際に使用します。（秒単位指定：デフォルト ０．０「負[-]、正[ ]）</dd>

<dt>port  </dt>
<dd>
このオプションは、chronyd が特定のNTPサーバーにNTPリクエストを送信する際に使用するUDPポート番号を指定します。通常、NTPサーバーは標準ポート１２３を使用しますが、特定の環境や要件により異なるポート番号でNTPサービスを提供している場合があります。そのような場合、このオプションで適切なポート番号を指定することで、chronyd が正しくNTPサーバーと通信できるように設定できます。ただし、ほとんどのNTPサーバーは標準のポート１２３を使用しているため、通常はこのオプションを指定する必要はありません。特別な理由がない限り、省略して問題ありません。（デフォルト 省略）</dd>

<dt>xleave</dt>
<dd>
NTP のインターリーブモードを有効にするオプションです。有効にすることで NTP サーバーからより正確な送信タイムスタンプを受け取ることを可能にします。これにより、時刻同期の精度と安定性が向上します。ただし、サーバーがインターリーブモードをサポートしていない場合や、クライアント数が多すぎる場合には、このモードが適用されないことがあります。
</dd>
</dl>

```tex:書式
書式：server <NTP Server(Hostname / IP address)> [option1] [option2] …
　例：​server 192.168.0.1 iburst minpoll 4 maxpoll 6 polltarget 16 offset -0.00005

デフォルト値：なし
```

:::note warn
<font color="Red">*1</font>「ホスト名」の名前解決できない場合、chronydは成功するまで間隔を広げながら名前解決を再試行し続けます。
:::

:::note warn
<font color="Red">*2</font> ネットワーク通信における「非対称性」とは、データが送信元から宛先へ到達する際の遅延時間と、宛先から送信元へ戻る際の遅延時間が異なる現象を指します。この非対称な遅延は、ネットワーク機器の処理時間やルーティング経路の違いなど、さまざまな要因によって生じます。
:::

:::note info
インターリーブモードとは：
NTP の通信モードの一つで、時刻同期の精度を向上させる手法です。通常のNTP通信では、ネットワーク遅延やサーバーの処理時間が時刻同期の精度に影響を及ぼす可能性があります。インターリーブモードでは、送受信されるNTPパケットのタイムスタンプ配置を工夫し、クライアントとサーバー双方が自身の送信時刻と受信時刻を正確に記録することで、通信遅延を補正し、より高精度な時刻同期を実現します。このモードを利用するには、サーバーとクライアントの双方がインターリーブモードをサポートしている必要があります。

以下でインターリーブモードの状況を確認できる。
\---------------------------------------------------------
[root@server1 ~]# chronyc ntodata
Unrecognized command
[root@server1 ~]# chronyc ntpdata

Remote address  : 167.179.119.205 (A7B377CD)
Remote port     : 123
～ 省略 ～
Interleaved     : No　★ ← ここで確認
～ 省略 ～
\---------------------------------------------------------
:::

### 【pool】
単一の NTP サーバーではなく NTP サーバーのプールを指定するために使用される設定項目です。「server」設定項目と同様のオプションが使用可能であり、1つだけ固有のオプションがあります。

#### 【固有オプション】
<dl>
<dt>maxsources</dt>
<dd>NTP サーバープールから時刻同期に使用する時刻同期先の最大数を指定するオプションです。（デフォルト４）</dd>
</dl>

```tex:書式
書式：pool <pool name> [option1] [option2] …
　例：​pool pool.ntp.org iburst maxsources 3

デフォルト値：pool 2.pool.ntp.org iburst
```

### 【minsources】
chronyd がシステム時計を更新する前に、時刻同期先の選択アルゴリズムによって『選択可能』と判断される必要がある時刻同期先の最小数を指定する設定項目です。値を1以上に設定すると、時刻同期の信頼性が向上します。たとえば、2に設定した場合、少なくとも2つの時刻同期先が選択可能でない限り、システム時計の更新は行われません。この設定により、1つの時刻同期先が誤った時刻を提供していても、他の時刻同期先と比較することで誤りを検出しやすくなります。ただし、設定値が高すぎると、必要な数の時刻同期先が確保できない場合に時刻同期が行えなくなる可能性があります。そのため、ネットワーク環境や利用可能な NTP サーバーの数を考慮して調整する必要があります。

```tex:書式
書式：minsources <Number of targets> 
　例：minsources 2

デフォルト値：1
```

### 【driftfile】
システム時計のドリフト（時間の進みや遅れの傾向）を記録するファイルを指定する設定項目です。chronyd は、このファイルに保存されたドリフト情報を基に、再起動時などに迅速にクロック補正を行います。

```tex:書式
書式：driftfile <path> 
　例：driftfile /var/lib/chrony/drift

デフォルト値：/var/lib/chrony/drift
```

### 【leapsecmode】
うるう秒<font color="Red">*3</font>が挿入される際の chronyd の動作（モード）を指定する設定項目です。指定できる動作は４つあります。

#### 【モード】
<dl>
<dt>system<font color="Red"> *4</font></dt>
<dd>カーネルがうるう秒を処理します。うるう秒が挿入される場合、カーネルはシステム時計が UTC の 23:59:59 を 2 回繰り返すことで 1 秒を追加します。一方、うるう秒が削除される場合、23:59:58 の次に 00:00:00 とし、1 秒を削除します。（システムドライバーがうるう秒をサポートしている場合のデフォルトモード [※ macOS 12 以前を除くすべてがサポート対象] ）</dd>

<dt>step<font color="Red"> *4</font></dt>
<dd>systemモードに似ているが、chronyd がうるう秒を処理します。うるう秒が挿入される際、chronyd はシステム時計を即座に １秒戻します。一方、うるう秒が削除される場合、システム時計を即座に １秒進めます。（システムドライバーがうるう秒をサポートしていない場合のデフォルトモード）</dd>

<dt>slew</dt>
<dd>うるう秒による１秒のずれを、時間をかけて徐々に補正します。これにより、システム時計は連続的に進み、時間の逆行が発生しません。ただし、完全な補正には時間がかかります。Linux では、デフォルトの maxslewrate 値を使用して修正に 12 秒かかります。</dd>

<dt>ignore</dt>
<dd>うるう秒の挿入を無視し、特別な補正を行いません。これにより、システム時計は UTC と１秒のずれが生じますが、通常の NTP 同期プロセスで徐々に修正されます。</dd>
</dl>

```tex:書式
書式：leapsecmode <mode> 
　例：leapsecmode slew

デフォルト値：system or step
```

:::note warn
<font color="Red">*3</font> うるう秒は、UTC（協定世界時）と地球の自転による平均太陽時との差を調整するために、必要に応じて 6 月または 12 月の最終日に 1 秒追加されることがあります。しかし、Unix システムでは 1 分は常に 60 秒、1 日は常に 86400 秒と定義されており、23:59:60 という時刻を直接扱うことができません。そのため、うるう秒の挿入時には特別な処理が必要となります。
:::

:::note warn
<font color="Red">*4</font> 時刻のずれが即時に修正されますが、一部のアプリケーションは時間の逆行に敏感であり、問題を引き起こす可能性があります。
:::

### 【leapsectz】
システムのタイムゾーンデータベース<font color="Red">*5</font>内の特定のタイムゾーンを指定し、chronyd が次のうるう秒の発生時期や現在の TAI（国際原子時）と UTC（協定世界時）のオフセットを把握するために使用する設定項目です。指定されたタイムゾーン内で、6月30日や12月31日の 23:59:59 および 23:59:60 が有効な時刻かどうかを定期的に確認します。通常、right/UTC タイムゾーンと併用されます。うるう秒情報を提供しない、または提供が遅れる参照クロックや他の時刻ソースを使用する場合に有用です。ただし、この設定項目を使用する場合は、leapsecmode を system に設定する必要があります。

```tex:書式
書式：leapsectz <timezone> 
　例：leapsectz  right/UTC

デフォルト値：right/UTC
```

:::note warn
<font color="Red">*5</font> うるう秒が発表された際には、システムのタイムゾーンデータベースを更新する必要があります。これにより、chronyd は最新のうるう秒情報を取得し、正確な時刻同期を維持できます。特に、うるう秒の挿入が予定されている場合、少なくとも 12 時間前までにタイムゾーンデータベースを更新することが推奨されています。なお、chronyd の再起動は不要です。
:::


### 【makestep】
システム時計の大きなずれを迅速に修正するための設定項目です。通常、chronyd はクロックの速度を微調整して徐々に時刻を修正します（Slewモード）。しかし、システム起動直後などで時刻のずれが大きい場合、この方法では修正に長時間を要することがあります。makestep を使用すると、指定した条件下でシステム時計を即座に正しい時刻に合わせること（stepモード）が可能です。

threshold は、ステップ修正を行う際の時刻のずれの閾値を秒単位で指定します。例えば、時刻のずれが０．１秒以上の場合にステップ修正が実行されます。

limit は、chronyd の起動後にステップ修正を許可するクロック更新回数の最大値を指定します。例えば、３と設定すると、最初の３回のクロック更新でのみステップ修正が行われます。一方、-１（負の値）を指定すると、この制限が無効になり、クロックのずれが閾値を超えた場合、常にステップ修正が適用されるようになります。

```tex:書式
書式：makestep <threshold> <limit>
　例：makestep 0.1 3

デフォルト値：0.1 3
```

### 【maxslewrate】
この設定項目は、chronyd が時刻を調整する際の最大スルーレート（slew rate）を指定します。要するに、時刻をどのくらいの速度で修正するかを設定するものです。値は、 parts per million（ppm）で指定します。１ppm は、１秒間に１００万分の１秒、つまり ０．０００００１秒の調整を行うことを意味します。例えば、１０００ppm に設定すると、chronyd は 1 秒間に最大で ０．００１秒（１ミリ秒）の時刻調整を行うことができます。したがって、１秒の時刻ずれを修正するには、約 １，０００ 秒（約１６分４０秒）かかります。

デフォルト値は、８３，３３３．３３３ppm で、この場合、１秒の時刻ずれを約１２秒で修正します。（システム時計が早ければ、１秒ごとに１１／１２秒、遅ければ１秒ごとに１３／１２秒進む ）

```tex:書式
書式：maxslewrate <Correction speed in ppm> 
　例：maxslewrate 83333.333

デフォルト値：83333.333
```

### 【allow】
この設定項目は、chronyd をNTPサーバーとして動作させる際に、特定のホストやサブネットからのNTPクライアントアクセスを許可するために使用します。デフォルトでは、chronyd はクライアントアクセスを許可せず、NTPクライアントとしてのみ動作します。しかし、allow設定を使用することで、chronyd を他のクライアントに対してNTPサーバーとして機能させることができます。

オプションの「 all 」を使用すると、指定されたIPアドレスやサブネットに関連する上位の設定制限を上書きします。

```tex:書式
書式：allow [all] <IP address or subnet>
　例：allow 192.168.0.0/16
 　　 allow all 172.17.0.0/16
　　　allow 0/0　← すべての IPv4 アドレスからのアクセスを許可
　　　allow ::/0　← すべての IPv6 アドレスからのアクセスを許可
　　　allow　← すべてのドレスからのアクセスを許可

デフォルト値：なし
```

:::note warn
・allow を使用する際は、ファイアウォール設定で UDP ポート 123（NTP が使用す
　るポート）を開放する必要があります。
 
・allow は複数回使用可能で、各行で異なるホストやサブネットを指定できます。

・allow 上から順に評価され、上にあるものほど優先順位が高くなります。
:::
### 【deny】
この設定項目は、chronyd をNTPサーバーとして動作させる際に、特定のホストやサブネットからのNTPクライアントアクセスを拒否するために使用します。設定の仕方（構文）は、allow と同様です。

```tex:書式
書式：deny [all] <IP address or subnet>
　例：deny 192.168.0.0/16

デフォルト値：なし
```

### 【bindaddress】
chronyd が NTP リクエストを受信する際に使用するソケットを、特定のローカルアドレスにバインドするための設定項目です。デフォルトでは、chronyd はすべてのネットワークインターフェースでリクエストを待ち受けますが、bindaddress を使用することで、特定の IP アドレスに限定してバインドできます。

```tex:書式
書式：bindaddress <IP address>
　例：bindaddress 192.168.0.1

デフォルト値：なし
```

:::note warn
・IPv4 と IPv6 の各プロトコルにつき 1 つの bindaddress しか指定できません。
:::



### 【local stratum】
この設定項目は、chronyd をローカル参照モードで動作させ、外部のNTPサーバーと同期していない場合<font color="Red">*6</font>でも、クライアントから見て時刻が同期しているように振る舞わせるためのものです。オプションは複数ありますが、ここでは「stratum」に注目します。

stratum オプションは、ローカル参照モードが有効なときにchronyd がクライアントに報告する階層（stratum）を設定します。stratum は１から１５の範囲で指定可能で、デフォルト値は１０です。階層を設定する際は、ネットワーク内の他のNTPサーバーや時刻同期先との関係を考慮し、適切な値を設定することが重要です。

```tex:書式
書式：local stratum <stratum> 
　例：local stratum 10

デフォルト値：10
```

:::note warn
<font color="Red">*6</font>「local stratum」を設定しない場合（デフォルト）、上位のNTPサーバーから時刻同期ができていないと、chronydのStratumは16となります。この状態では、下位のNTPクライアントに時刻を提供することができません。
:::

### 【port】

chronyd が NTP リクエストを受け付けるUDPポート番号を指定する設定項目です。デフォルトでは標準 NTP ポートである１２３番を使用します。

```tex:書式
書式：port <port> 
　例：port 123

デフォルト値：123
```
:::note warn
・port で指定したポートは、allow 設定項目または chronyc の allow コマンドで許可
　されたアドレス、NTPピア、ブロードキャストサーバーモードが有効な場合にの
　み開かれます。 

・カスタムポートを指定する際は、ファイアウォールやSELinuxの設定で該当ポート
　を許可する必要があります。 

・NTPクライアントとしてのみ動作させる場合、port ０と設定することでサーバー
　ポートを開かず、クライアント専用モードで動作します。
:::

### 【acquisitionport】
この設定項目は、NTP クライアントとしての動作する chronyd が NTP サーバーに時刻同期リクエストを送信する際の<font color="Red">送信元ポート</font>を指定するものです。デフォルトでは、chronyd は各リクエストごとにオペレーティングシステムがランダムに選んだポートを使用しますが、この設定を行うことで、すべてのリクエストを指定したポートから送信するように設定できます。

```tex:書式
書式：acquisitionport <port> 
　例：port 1123

デフォルト値：ランダム
```

:::note warn
・この設定を0にすると、ソケットの送信元ポートはオペレーティングシステムによ
　ってランダムに選択されます。

・送信元ポートを固定することで、ファイアウォールで特定のポートのみを許可す
　る設定が可能となり、セキュリティ管理を容易にすることができます。

・送信元ポートを固定すると、特定のポートが常に使用されるため、攻撃者にその
　ポートを狙われるリスクが増加します。そのため、特別な理由がない限り、この
　設定は避けることが推奨されます。
:::

### 【smoothtime】<font color="Red">※ 認識が正しいか自信がないです・・・。</font>
この設定項目は、chronyd がクライアントに提供する時刻を平滑化<font color="Red">*7</font>し、サーバーのクロックに大きな補正が適用された場合でも、クライアントがスムーズに追従できるようにするものです。

**第１引数 max-freq：**
平滑化された時刻（サーバーがクライアントに提供する時刻）と実際のNTP時刻との間で、最大どれだけズレていても許されるかを決めるものです。単位は ppm（parts per million）で、これは１秒あたりのマイクロ秒を意味します。例えば、max-freq 400 と設定すると、平滑化された時刻とNTP時刻のズレは、最大で１秒あたり 400ppm（400マイクロ秒）まで許されます。要するに、この設定は、サーバーがクライアントに提供する「調整後の時刻」が実際のNTP時刻とどれだけズレていても許容されるかを定義するものです。

**第２引数 max-wander：**
時刻のズレを修正する速度が、１秒間に最大どのくらい変化できるか（修正速度の増減幅）を決めるものです。単位はppm/秒で、1秒ごとに修正速度がどれだけ変わるかを制限します。例えば、max-wander 0.001 と設定すると、修正速度は1秒あたり最大0.001ppm（0.001マイクロ秒/秒）ずつしか変化しません。要するに、この設定は、時刻を急激に修正せず、修正速度を緩やかに増減させることで、クライアントがスムーズに追従できるようにするものです。

**第３引数 leaponly：** ※ オプション
平滑化プロセスを「うるう秒」にのみ適用し、通常のオフセットや周波数の変更は無視されるモードを有効にします。

これらのパラメータを調整することで、クライアントがサーバーの時刻補正に対して、どの程度迅速かつ安定して追従できるかを制御できます。

```tex:書式
書式：smoothtime <max-freq> <max-wander> [leaponly]
　例：smoothtime 400 0.001 leaponly

デフォルト値：なし
```

:::note info
<font color="Red">*7</font>「平滑化」とは、時刻の急激な変化を避け、緩やかに調整することを指します。
:::

:::note warn
・smoothtime は、サーバーがクライアントに提供する時刻を意図的に調整するもの
　であり、使用には注意が必要です。
 
・smoothtime を使用する場合、クライアントは他の NTP サーバーをポーリングし
 　ないように構成する必要があります。

・大きなオフセットがある場合、平滑化に時間がかかり、クライアントの時刻が大
　幅に遅れる可能性があります。
:::

chrony 公式では、クライアントがLinux上でchronydを使用している場合、以下の設定が推奨されています。
```tex
smoothtime 50000 0.01
```

また、クライアントがうるう秒をスムーズに処理できない場合、以下の設定を NTP サーバーに適用することで、うるう秒の影響を緩和できます。この設定により、NTP サーバーがうるう秒を適切に処理し、クライアント側では特別な設定を必要とせず、NTP サーバーの時刻に正確に追従できるようになります。（クライアントはうるう秒があることを知らず、サーバーの時間に従って最終的に正しく補正される）

```tex
leapsecmode slew
maxslewrate 1000
smoothtime 400 0.001024 leaponly
```

### 【bindcmdaddress】
この設定項目は、chronyd が chronyc からのコマンドパケットを受け取る際に使用するローカルIPアドレスを指定します。デフォルトでは、chronyd はループバックアドレス（127.0.0.1 および ::1）にバインドし、ローカルホストからのアクセスのみを許可しています。

```tex:書式
書式：bindcmdaddress <IP address> 
　例：bindcmdaddress 127.0.0.1

デフォルト値：127.0.0.1
```

### 【cmdallow】
この設定項目は、特定のホストやサブネットから chronyc コマンドを使用して chronyd にリモートアクセスし、監視データを取得することを許可します。デフォルトでは、chronyc によるリモートアクセスはローカルホスト（127.0.0.1や::1）のみに制限されています。設定の仕方（構文）は、allow と同様です。

```tex:書式
書式：cmdallow [all] <IP address or subnet>
　例：cmdallow 127.0.0.1

デフォルト値：127.0.0.1
```

:::note warn
・リモートアクセスを許可するには、bindcmdaddress 設定項目でコマンドを受け付
　けるアドレスを指定し、ループバックインターフェースのみをリッスンしないよ
　うに設定する必要があります。

・リモートアクセスを許可するにあたって、ファイアウォールで UDP ポート ３２
　３を開放する必要があります。
:::

### 【cmddeny】
この設定項目は、特定のホストやサブネットからの制御アクセス（主に chronyc コマンドによる監視や管理操作）を拒否するために使用します。設定の仕方（構文）は、cmdallow と同様です。

```tex:書式
書式：cmddeny [all] <IP address or subnet>
　例：cmddeny 192.168.0.0/16

デフォルト値：なし
```

### 【cmdport】
この設定項目は、chronyc からのモニタリングや制御コマンドを受け付ける際に使用する UDP ポート番号を指定します。デフォルトではポート ３２３ が使用されますが、cmdport を使用することでこのポート番号を変更できます。

```tex:書式
書式：cmdport  <port>
　例：cmdport  323

デフォルト値：323
```

:::note warn
・cmdport を「０」に設定すると、chronyd はコマンド用の UDP ポートを開かなくなります。これにより、リモートからの chronyc アクセスが無効化され、ローカルの非特権ユーザーからのアクセスも制限されます。
:::

### 【rtcsync】
この設定項目は、システム時計（ソフトウェアクロック）の時刻を定期的にハードウェアクロック（リアルタイムクロック、RTC）に同期させるためのものです。これにより、システムが再起動された際に、RTC から正確な時刻を取得できるようになります。

```tex:書式
書式：rtcsync
　例：rtcsync

デフォルト値：有効
```

:::note warn
・Linuxでは、カーネルが11分毎にシステムクロックの時刻をRTCに書き込みます。

・rtcsync は、rtcfile と併用できません。
:::

:::note info
リアルタイムクロック (RTC) とは：
マザーボード上に搭載されたハードウェアクロックです。ボタン電池などのバックアップ電源を利用して、サーバーの主電源がオフの際でも時刻情報を維持します。起動時にシステムクロックを初期化するために使用されます。
:::

### 【log】
この設定項目は、特定の情報をログファイルに記録するために使用します。ログファイルは、logdir 設定項目で指定されたディレクトリに保存されます。以下に、主要なオプションとその用途をまとめます。

#### 【オプション】
<dl>
<dt>measurements</dt>
<dd>
有効な NTP 測定値と関連情報を measurements.log に記録します。同期元のパフォーマンスを分析する際に役立ちます。
</dd>

<dt>statistics</dt>
<dd>
回帰処理に関する情報を statistics.log に記録します。時刻同期の精度や安定性を評価する際に使用します。
</dd>

<dt>tracking</dt>
<dd>
システムクロックの周波数変動やオフセットの変化（slewモード）を tracking.log に記録します。現在の同期状態を把握するのに適しています。
</dd>

<dt>rtc</dt>
<dd>
システムのリアルタイムクロックに関する情報を rtc.log に記録します。ハードウェアクロックの精度やドリフトを監視する際に使用します。
</dd>

<dt>refclocks</dt>
<dd>
生およびフィルタ処理された参照クロックの測定値を refclocks.log に記録します。参照クロックの動作状況を詳細に分析する際に役立ちます。
</dd>

<dt>tempcomp</dt>
<dd>
温度測定値とシステムレートの補正情報を tempcomp.log に記録します。温度変化によるクロックのドリフトを監視・補正する際に使用します。
</dd>
</dl>

```tex:書式
書式：log [option1] [option2] …
　例：log measurements statistics tracking

デフォルト値：なし
```

### 【logdir】
この設定項目は、log 設定項目で有効化されたログファイルを保存するディレクトリを指定します。指定したディレクトリが存在しない場合、chronyd が自動的にそのディレクトリを作成します。

```tex:書式
書式：logdir <path>
　例：logdir /var/log/chrony

デフォルト値：/var/log/chrony
```

:::note warn
・ログファイルが増加するとディスク容量を圧迫する可能性があるため、ログロー
　テーションの設定を適切に検討してください。
:::

### 【hwtimestamp】
この設定項目は、指定したネットワークインターフェースで送受信されるNTPパケットに対してハードウェアタイムスタンプを有効にするためのものです。これにより、NIC が自身のクロックを使用してパケットの送受信時刻を正確に記録し、カーネルやネットワークドライバ、ハードウェア内の処理やキューイングによる遅延を回避します。その結果、タイムスタンプの精度が向上し、測定されるオフセットがより正確になり、システムクロックの同期精度が高まります。

オプションは複数存在しますが、今回は割愛します。

```tex:書式
書式：hwtimestamp <IF> [option1] [option2] …
　例：hwtimestamp eth0 txcomp 
　　　hwtimestamp *

デフォルト値：無効
```

:::note warn

・NTPパケットの送受信双方（サーバーとクライアント）のNIC が HW タイムスタンプをサポートしている必要があります。これは ethtool -T \<IF> コマンドで確認できます。出力にhardware-raw-clock、hardware-transmit、hardware-receiveが含まれていることを確認してください。また、受信フィルタとしてallまたはntpが必要です。

※ 以下は、対応していないときの出力
\---------------------------------------------------------
　[root@server1 ~]# ethtool -T ens160
　Time stamping parameters for ens160:
　Capabilities:
　        software-receive
　        software-system-clock
　PTP Hardware Clock: none
　Hardware Transmit Timestamp Modes: none
　Hardware Receive Filter Modes: none
\---------------------------------------------------------

・サーバーやピアがインターリーブモードをサポートしている場合、server や peer 設定項目で xleave オプションを有効にする必要があります。

・chronyd は NIC のクロックを同期しません。

・カーネルがソフトウェアタイムスタンプをサポートしている場合、全てのインターフェースで自動的に有効になります。
:::
以下のサイトが、参考になります。

[**【RedHat】14.3. ハードウェアのタイムスタンプを使用した Chrony**](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/chrony-with-hw-timestamping_configuring-time-synchronization#chrony-with-hw-timestamping_configuring-time-synchronization)

### 【keyfile】
この設定項目は、NTP サーバーとクライアント、またはピア間で対称鍵認証を行う際に使用する共有鍵を格納したファイルの場所を指定します。これにより、メッセージ認証コード（MAC）を使用してNTPパケットを認証することができます。

```tex:書式
書式：keyfile <path>
　例：keyfile /etc/chrony.keys

デフォルト値：/etc/chrony.keys
```






# 参考資料
・[**【chrony公式】**](https://chrony-project.org/index.html)
・[**【RHEL - 第18章 chrony スイートを使用した NTP 設定】**](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-configuring_ntp_using_the_chrony_suite#sect-Introduction_to_the_chrony_Suite)
・[**【新しいNTPクライアント＆サーバ、chrony】**](https://qiita.com/yunano/items/7883cf295f91f4ef716b)
・[**【CentOS8】chronyの仕様や設定～[chrony.conf] や[chronyc sources] 表示結果の見方～**](https://milestone-of-se.nesuke.com/l7protocol/ntp/linux-spec/)
・[**【たった3行編集！ChronyでシンプルNTPサーバー構築】**](https://www.isoroot.jp/blog/2844/)
・[**【RedHat】14.3. ハードウェアのタイムスタンプを使用した Chrony**](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/chrony-with-hw-timestamping_configuring-time-synchronization#chrony-with-hw-timestamping_configuring-time-synchronization)
・[**【chronyc sources コマンドの出力結果の見方】**](https://rurukblog.com/post/chronycsources/)
・[**【chronyc tracking コマンドの出力結果の見方】**](https://rurukblog.com/post/chronyc-tracking/)
・[**【図解】NTPプロトコルの概要と仕組み～誤差補正の計算,仕様,シーケンス～**](https://milestone-of-se.nesuke.com/l7protocol/ntp/ntp-summary/)
・[**【セイコーの｢うるう秒｣対策（第３回）】**](https://www.seiko-sol.co.jp/leap-second/no-03/)
・[**【うるう秒】情報システムを止めないための対策まとめ**](https://devlog.arksystems.co.jp/2016/11/28/1526/)
・[**【RedHat】Five different ways to handle leap seconds with NTP**](https://developers.redhat.com/blog/2015/06/01/five-different-ways-handle-leap-seconds-ntp#)