EC2にNTPサーバ立ててみた

## 概要
- NTP立ててみたくなった
- 立ててみた

## 構成
- NTPサーバ
    - EC2(AmazonLinux2023)
    - chrony
- NTPクライエント
    - EC2(AmazonLinux2023)
    - chrony

## 手順
### NTPサーバ側の設定を行う
:::note info
AmazonLinux2023だと元から入っているから入れる必要はないが、confファイルなどがない可能性もあるので、ない場合は入れなおすのが良いだろう。
:::

```sh
sudo yum update
sudo yum install chrony
```
chronyのインストールを行う
次に
```sh
sudo vi /etc/chrony.conf
```
を実行して、設定を書き換える

```conf:/etc/chrony.conf
# Use NTP servers from DHCP.
# sourcedir /run/chrony.d<-必要ないため、コメントアウト

# Include configuration found in /etc/chrony.d/*.conf
confdir /etc/chrony.d

# Use NTP sources found in /etc/chrony.d/*.sources
sourcedir /etc/chrony.d

# 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 0.0.0.0/0＜－今回は、全部許可（ここで制限しない分、今回はec2のインバウンドルールで制限した）

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

# Require authentication (nts or key option) for all NTP sources.
#authselectmode require

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

# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony

# Insert/delete leap seconds by slewing instead of stepping.
#leapsecmode slew

# Get TAI-UTC offset and leap seconds from the system tz database.
# Clients of leap smearing servers must not use this directive.
#leapsectz right/UTC

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

# Select which information is logged.
log measurements statistics tracking

server ntp.nict.jp iburst<-NICTのNTPサーバを利用する（本当は複数のようだ）
```
サーバに設定するntpサーバは、RFCで基本的にドメインで指定することが求められているようだ。
>[Q.1-2]	ホスト名ではなく、IPアドレスで設定しても良いですか？
[A.1-2]	ＮＴＰサーバの指定方法について、RFC-4330 10-6 および 10-7 でＩＰアドレスによる指定ではなく、ホスト名による設定が "SHOULD" とされています。
ＩＰアドレスはネットワークの構成変更やプロバイダの変更により変わる可能性があります。過去に(当機構ではありませんが、他機関の)ＮＴＰサーバをＩＰアドレスによって指定していた機器が、当該サーバのＩＰアドレス変更時に、変更前のＩＰアドレスに向って、大量のリクエストを発生させ、ネットワークがストップし、大きな問題となったことがあり、このような規定がRFCに盛り込まれるようになった経緯があります。
したがいまして、機器の制約上、ＤＮＳが利用できないなどがない限り、ホスト名を使っていただきたいと存じます。もし、やむを得ずＩＰアドレスで設定される場合には、ＩＰアドレスに変更が無いか、別途チェックされるよう、お願いいたします(https://jjy.nict.go.jp/tsp/PubNtp/qa.html#q1-2)。

設定が完了したら、保存して、再起動する、sourcesを実行することで、変更した結果を確認できる。
```sh
sudo systemctl restart chronyd
chronyc sources
```
```
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp-k1.nict.jp                1   6   177     1   -131us[ -114us] +/- 5542us
```

この時、設定したはずのドメインが見つからない場合は、設定でミスがある。
また、  Stratum、Reachの値に0があるとエラーを起こしている可能性がある。

### NTPクライエント側の設定を行う
クライエント側も同様にchronyをインストールした後、

```conf
server {先ほど作成したEC2のNTPサーバのパブリックIP} iburst ＜－を追記する
```
リスタートして実行することで、接続を確認する
```
systemctl restart chronyd
chronyc sources
```
```
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ec2-13-xx-xxx-xx.ap-nor>     2   7    37    34    +74us[ +199us] +/- 2960us
```
このような形で、帰ってくれば正常っぽい

:::note alert
NTPサーバのセキュリティグループで、UDP 123をクライエントEC2のパブリックIPで登録しなければ、アクセスがはじかれてしまうため注意してほしい。
自分は、誤ってTCP 123で開放していたため、10分程度時間を無駄にした、、、
:::

## まとめ
NTPサーバを立てること自体は比較的すぐに終わったが、その後の実際にクライエントから利用する部分でひどく手間取ってしまった。
次回はもう少しスムーズに立てられそうであるが、次回立てる機会は来るのだろうか、、、

（2025/02/02追記）ここら辺も参考にできる

https://qiita.com/nkojima/items/7d30c86ec951029e4c18