定時帰る術-chronydのイロイロ


最近、自宅鯖を遊んでいる時に、家の内部NTP同期もやってみようかと思って、設定してみたら、うまくいかない
さっそく環境をみてみよう。

# 環境

■NTPサーバ
```
[root@test02 ~]# ip a show enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:81:9f:3d brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
[root@test02 ~]#
[root@test02 ~]#
[root@test02 ~]#
[root@test02 ~]# egrep -v "^$|^#" /etc/chrony.conf
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.1.0/24
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
log measurements statistics tracking
```






■クライアント

```
[root@test01 ~]# ip a show enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:df:e0:bf brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.101/24 brd 192.168.1.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
[root@test01 ~]#
[root@test01 ~]#
[root@test01 ~]#
[root@test01 ~]# egrep -v "^$|^#" /etc/chrony.conf
server 192.168.1.102 iburst  prefer
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
log measurements statistics tracking
[root@test01 ~]#
[root@test01 ~]#
[root@test01 ~]# chronyc -n sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^? 192.168.1.102                 0   6     0     -     +0ns[   +0ns] +/-    0ns
[root@test01 ~]# ping -c 1 192.168.1.102
PING 192.168.1.102 (192.168.1.102) 56(84) bytes of data.
64 bytes from 192.168.1.102: icmp_seq=1 ttl=64 time=0.410 ms

--- 192.168.1.102 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.410/0.410/0.410/0.000 ms
[root@test01 ~]#
```
# トラブルシューティング

■事象
サービス何回もrestartしてみたが、「?」のままで「*」になってくれない


■犯人さがす
直感的には、クライアント側は問題ないと思って、サーバ側の設定を見てみよう

①まずは、セキュリティ系は、大丈夫そう

```
[root@test02 ~]#
[root@test02 ~]# systemctl is-active firewalld nftables
inactive
inactive
[root@test02 ~]# getenforce
Disabled
[root@test02 ~]#
```

②chronydのallow設定も問題なさそう
```
[root@test02 ~]# grep allow /etc/chrony.conf
allow 192.168.1.0/24
```
③NTPの仕組み的には、まずはクライアントからリクエストをサーバに送る
なので、クライアントからのpingは大丈夫だけど、サーバからクライアントへの通信がちゃんと通るかをping確認しても、大丈夫そう

```
[root@test02 ~]# ping -c 1 192.168.1.101
PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101: icmp_seq=1 ttl=64 time=1.75 ms
```

④実はここでもう手上げな状況、仮想環境の何かのネットワークバグかと信じたく、あきらめようとする時に、あれ、パケットキャプチャまだやってないことが気づいた

とりあえず、クライアント側でパケットキャプチャをとってきて、「wireshark」で確認（-wを付けず、そのまま表示させてもよい）
```
 tcpdump host 192.168.1.102 -i enp0s8 -vv -w /var/tmp/101_4.cap
```

■パケット確認
クライアント側の「Peer Clock Stratum: unspecified or invalid (0)」で、対向のサーバに「「Stratum」がわからないから、教えて」ってサーバに投げた。
①クライアント
![クライアント_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569536/1a04b616-41db-6557-c1d1-33ec18e31abf.png)

②サーバ
が、サーバ側も「「Stratum」のことなんでいらないよ」ってクライアントに返した。
![サーバ_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569536/336da654-eef8-8349-db4c-c7700db83775.png)


■解決
ここで、やっとサーバ側chronyd設定が足りないのが気づいた
↓のところがコメントアウトされているままのが原因でした。
↓を外して同期できた。

```
[root@test02 ~]# grep -i Stratum /etc/chrony.conf
#local stratum 10
```




# 振り返

chronydを使って、ちゃんと時刻同期ができているのかは「chronyc -n sources」を使うことが多い
各列の意味がちゃんと理解できなくて、今回は見てみようかと思います。

■Stratum
サーバ側の「Stratum」設定値
※一番上位のNTPサーバは「Stratum 1」、次は「Stratum 2、Stratum 3など」
（15まで、デフォルトは10）
実際のパケットをみると、「Stratum」設定値をプラス1でやり取りしてるようにみえる。
例えば、デフォルト10の場合は、11でクライアントに送る。
（原因推測：NTPの世界では、「Stratum 1」が一番上位信頼性が高いサーバとなり、それ以外のNTPサーバ（自社/自宅などのNTPサーバ）が「Stratum 1」であることがあり得ないことだと同じと考える。「Stratum 1」にしても、chronyで「Stratum 2」にする仕組みだと思う。）


■poll
chronyの方で自動的に変更してくれる。安定だと判断された場合は、最大10になる。
「2^poll」の計算結果でサーバと同期する（pollが6の場合、2^6=64）

■Reach
サーバとずれがあった場合は、「Reach」が更新される。
最近の8回での同期が大丈夫であれば、「377」が表示されるた。
（「377」であれば、大丈夫って言えるかも）

■LastRx
クライアントがついの前から受信されたのか。
安定してない場合、「2^poll」の計算結果になったら、サーバと同期する。

■Last sample
前回同期でのずれ[実際調整された時間]+/- 誤差範囲

```
[root@test01 chrony]# chronyc -n sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.1.102                10   6    17     1    +15us[  +21us] +/-  454us
```



以上