最近、自宅鯖を遊んでいる時に、家の内部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」がわからないから、教えて」ってサーバに投げた。
①クライアント
②サーバ
が、サーバ側も「「Stratum」のことなんでいらないよ」ってクライアントに返した。
■解決
ここで、やっとサーバ側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
以上