NTP(Chrony)サーバ構築

 数あるサーバ構築の中で、Chronyサーバ（NTP）構築は一番簡単らしいので実際に構築作業をした。


##環境 
Rocky Linux 8.6

## 理解すること
・デーモンプロセスChronyd
・クライアントコマンドchronyc
・設定ファイル /etc/chrony.conf
・SV構築基本手順


## 前提知識

■SV構築の基本手順
①最新パッケージのDLインストール  rpm dnf install
②設定ファイル編集               vi /etc 
③デーモン再起動                 systemctl start/restart
④FW許可                         firewall-cmd 
⑤動作確認

■NTP(Network Time Protocol)：
時刻情報プロトコルで、NW上にあるコンピュータの時刻を同期させるために使用する。このプロトコルを利用するクライアントコンピュータと、NW上のNTPサーバから基準となる時刻情報を受け取り、その情報をもとに内部時計を修正する。

■Chrony：
前述したNTPと同じ意味と解釈していい。
CentOS7以降sytemdの時代になり、NTPではなくChronyに代替された。
※以下chronyの説明だけする。


## Chrony SV構築手順

![chrony.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/2880ce44-8b83-c2a9-04aa-da673b7158e4.jpeg)


① 仮想SV2台用意(ChronyサーバとChronyクライアント)

→各々に2つNIC設置
  ・enp0s3：送信元NAT用（仮想LANから外部通信可）
  ・enp0s8：内部NW用


② 社内Chronyサーバとインターネット上のNTP SV(Stratum)と同期

③ 社内Chronyクライアントが社内Chronyサーバと同期


手順①はすでに構築済みのため、手順②から始める

仮想SVのNICのIP情報確認

```:Chrony SV
[root@localhost ~]# ip a s enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 172.16.1.1/24 brd 172.16.1.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
```

```:Chrony Cliant
[root@localhost ~]# ip a show enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 172.16.1.2/24 brd 172.16.1.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
       valid_lft forever preferred_lft forever
```

### NTP（NW経由で時刻を同期するプロトコル）のポート番号を調べる。

/etc/servicesファイルは、TCPやUDPのポート番号と、そのポートを利用するサービス
（あるいはプロトコル名）の情報を対応させるファイル。

```
[root@localhost ~]# grep ntp /etc/services | grep 123
ntp             123/tcp
ntp             123/udp                         # Network Time Protocol
```

NTP通信には123番ポートが使われることを確認。

### chronyデーモンのサービスの稼働状況確認

```
[root@localhost ~]# systemctl status chronyd.service 
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: e>
   Active: inactive (dead) since Fri 2022-11-04 03:33:41 JST; 3s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
```

3行目あたり`Active: inactive (dead)`とあるので、「chronyd.serviceというunitは存在するが稼働していない」

システム起動同時に、同unitを起動する設定になっているかデフォルトの状態を確認。
```
[root@localhost ~]# systemctl is-enabled chronyd.service 
disabled
```
システム起動時に chronydサービスは起動しない設定となっている。

### chronyd PKGの確認とDL&インストール

`rpm -qa`コマンドで指定したPKGがインストール済みか照会。
```
[root@localhost ~]# rpm -qa | grep chrony
chrony-4.1-1.el8.rocky.0.1.x86_64
```

## 設定ファイルの編集 /etc/chrony.conf

設定ファイルにコピーしバックアップファイルを作成しておく。
何かあっても、デフォルトの状態に復元可能にするため。

```
[root@localhost ~]# cp -p  /etc/chrony.conf /etc/chrony.conf_org
[root@localhost ~]# ls -l /etc/chrony.conf*
-rw-r--r--. 1 root root 1108 11月 4 4:00 /etc/chrony.conf
-rw-r--r--. 1 root root 1108 11月 4 4:00 /etc/chrony.conf_org
```

```:/etc/chrony.conf
      3 #pool 2.rhel.pool.ntp.org iburst   //Red Hatがインターネット上に公開してるNTP SV。
      4 #今回は面白くないのでこれをコメントアウトし、他のNTP SVを指定する
      5 server ntp.nict.jp iburst
```
5行目に、NICT-NTP 独立行政法人 情報通信研究機構が公開してるNTP SVを指定した。
※頭にserverを付ける
※iburst ( initial burst )：起動時に4回連続Stratumに問合せ精度を上げる

```:/etc/chrony.conf
     23 # Allow NTP client access from local network.
     24 # 仮想LAN(内部NW)でNTPクライアントとサーバを同期させるためIP指定
     25 allow 172.16.1.0/24
```

25行目：社内Chronyクライアントが社内Chronyサーバと同期させるために、クライアントのIP記述

ログファイル格納されるディレクトリ確認
```
35 # Specify directory for log files.
36 logdir /var/log/chrony
```
保存して設定ファイルの編集完了


### Stratumと同期をとれる状態か確認

`timedatectl`コマンドで設定ファイル編集しただけでは、tratumと同期をとれない状態と確認

```
[root@localhost ~]# timedatectl
               Local time: 金 2022-11-04 04:23:21 JST
           Universal time: 木 2022-11-03 19:23:21 UTC
                 RTC time: 木 2022-11-03 19:23:20
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: inactive
          RTC in local TZ: no
```

### デーモンの起動

編集した設定ファイル`/etc/chrony.conf`を読みに行かせるためにchronydデーモン（chronyd.service）の起動

```
[root@localhost ~]# systemctl status chronyd.service
→　inactive (dead)
[root@localhost ~]# systemctl start chronyd.service 
[root@localhost ~]# systemctl status chronyd.service 
Active: active (running)
```

プロセスも確認し、chronudデーモンが稼働している事をPIDレベルで確認

```
[root@localhost ~]# ps aux | grep chronyd | grep -v grep
chrony     11209  0.0  0.0 132568  3620 ?        S    04:29   0:00 /usr/sbin/chronyd
```

システム起動と同時にchronydも起動させる
```
[root@localhost ~]# systemctl enable chronyd.service 
Created symlink /etc/systemd/system/multi-user.target.wants/chronyd.service → /usr/lib/systemd/system/chronyd.service.
[root@localhost ~]# systemctl is-enabled chronyd.service 
enabled
```

### Stratumと同期をとれる状態か確認

設定ファイルを編集し, chronydデーモンを起動したので編集した設定ファイルを読みにいった。
そのためStratumと同期とれているはず。
確認。

```
[root@localhost ~]# timedatectl 
               Local time: 金 2022-11-04 04:38:00 JST
           Universal time: 木 2022-11-03 19:38:00 UTC
                 RTC time: 木 2022-11-03 19:37:58
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```

Stratumと同期をとれる状態か確認できた。


### LAN内のChrony SVがStratumと同期する様子の確認

```
[root@localhost ~]# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* ntp-a3.nict.go.jp             1   6   377    18  -3407us[-4422us] +/-   26ms
```
同期がとれている場合、左側に*
ntp-a3.nict.go.jpというStratumを使ってChrony SVが同期する様子の確認できた。

これで社内Chrony SVがStratumとインターネット経由で同期した。

![chrony.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935967/939821ca-4ebe-539c-18f2-a1e95240503a.jpeg)


### FWの許可 `firewall-cmd`

現在のFWの状況を確認。

```
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  services: cockpit dhcpv6-client ntp ssh
```

現在デフォルトでは、【①ssh ②dhcpv6クライアント③cockpit】の3つのサービスしかFWは許可されていない。

今、NTPサーバとして振舞いたいのでNTP(ポート番号123)を許可したい。
FWの許可設定を行う。


## クライアントからのアクセスに対し、NTPを許可する。

色々なサービスがある中で今回FWを許可するntpがあるか確認
```
[root@localhost ~]# firewall-cmd --get-services | grep ntp
→ ntp 
長いので割愛
````
永続的にntpを許可する
```
[root@localhost ~]# firewall-cmd --add-service=ntp --permanent --zone=public
Warning: ALREADY_ENABLED: ntp
success
```
 firewalldというデーモンに設定変更した内容を読みこませるため、再起動する。
FWにNTPが追加されたか確認する
```
[root@localhost ~]# systemctl restart firewalld.service
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources: 
  services: cockpit dhcpv6-client ntp ssh telnet 
```

以上、LAN内のchrony SVの設定は終了。
現在、chrony SVのメモリにおいて、chronydデーモンは待機中。
誰かが時刻を聞きに来たら教えてあげるSV設置済みのため、
CLからのリクエストを待つ状態。 psコマンドで稼働中のchronydデーモンのプロセスID確認する。

```
[root@localhost ~]# ps aux | grep chrony | grep -v grep
chrony       782  0.0  0.1 151164  4540 ?        S    11月04   0:00 /usr/sbin/chronyd
```

メモリ上に展開されているPID782のchronydデーモンがクライアントからの時間リクエストを待っている状態です。
リクエストがあれば、chronydデーモンが正確な時間を返す。


## Chrony CL側の設定ファイル編集（）

①chrony PKGがインストール済みか・稼働状態を確認する
②クライアント側がアクセスするChrony SVのIPアドレスを編集ファイル`/etc/chrony.conf`に記述
③chronydデーモンの再起動し編集した設定ファイルを読み込ませる

```
[root@localhost ~]# rpm -qa | grep chrony
chrony-4.1-1.el8.rocky.0.1.x86_64     
[root@localhost ~]# systemctl status chronyd.service 
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Sat 2022-11-05 00:43:03 JST; 1s ago

```
インストール済みだが、サービスが稼働していない。


### 設定ファイルの編集

```
vi /etc/chrony.conf
→#pool 2.centos.pool.ntp.org iburst    ：コメントアウト#をつける
server 172.16.1.2 iburst               ：chronySVのIP追記
```

設定ファイル編集したので、デーモン再起動しデーモンの稼働状態を確認する
```
systemctl start chronyd.service ; systemctl status chronyd.service
→active (running)
```

以上、Chrony SV構築完了。

クライアントからのChronyアクセスのログは、SV側の`/var/log/messages`に格納されている。

```
[root@localhost ~]# grep chrony /var/log/messages
Nov  4 04:29:05 localhost chronyd[11209]: Using right/UTC timezone to obtain leap second data
Nov  4 04:29:09 localhost chronyd[11209]: Selected source 133.243.238.244 (ntp.nict.jp)
Nov  4 04:29:09 localhost chronyd[11209]: System clock TAI offset set to 37 seconds
Nov  4 23:39:59 localhost chronyd[782]: chronyd version 4.1 starting (+CMDMON +NTP +REFCLOCK +RTC 
```

## まとめ

Chrony SV構築手順：
①最新PKGのDLインストール 
    rpm  -qa  |  grep  chrony
    dnf  install  chrony  -y

②設定ファイルの編集
    vi  /etc/chrony.conf

③デーモン起動            
    systemctl  start/restart  chronyd

④FW許可
    firewall-cmd  --add-service=ntp  --permanent  --zone=public
    systemctl  restart  firewalld

⑤動作確認
    chronyc  sources/tracking/ntpdata