Chrony时间同步

目前Centos使用Chrony来提供NTP服务。

将Chrony当成客户端

我们可以将Chrony当成客户端来使用,此时,你需要将你想要同步的NTP server加入配置(例如myserver为NTP server):

1
2
server ~ $ cat /etc/chrony.conf
server myserver iburst

然后重启:

1
server ~ $ systemctl restart chronyd

查看和服务器的连通状态

下面MS是^*,^(脱字符号) 是服务器的意思,*(星号)代表当前处于同步状态,?(问号)表示连接断开。例如,我将服务器时钟调快一个小时,在客户端会显示yyyy为 -36000s。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server ~ $ chronyc sources -v
210 Number of sources = 1
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| / xxxx = adjusted offset,
|| Log2(Polling interval) -. | yyyy = measured offset,
|| \ | zzzz = estimated error.
|| | |
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* myserver 3 6 377 39 -1274s[ -3600s] +/- 29ms

如果服务器手动date修改了walltime,客户端效果有点诡异,感觉每次makestep都会跳来跳去的,时间不会跟随服务器变更(没有深究,可能理解有误),而会变为互联网的正常时间(客户端不联网):

1
2
3
4
5
6
7
8
9
10
11
12
server ~ $ date
Wed Dec 5 11:59:44 CST 2018
server ~ $ chronyc -a makestep
200 OK
200 OK
server ~ $ date
Wed Dec 5 11:22:34 CST 2018
server ~ $ chronyc -a makestep
200 OK
200 OK
server ~ $ date
Wed Dec 5 12:01:21 CST 2018

如果是客户端自己的时间被date修改了,可以通过chronyc -a makestep来同步。

1
2
3
4
5
6
7
8
9
server ~ $ date -s "-2hour"
Wed Dec 5 10:04:38 CST 2018
server ~ $ date
Wed Dec 5 10:04:53 CST 2018
server ~ $ chronyc -a makestep
200 OK
200 OK
server ~ $ date
Wed Dec 5 12:05:00 CST 2018

而使用waitsync不会跳跃同步:

1
2
3
server ~ $ chronyc -a waitsync
200 OK
try: 1, refid: myserver, correction: 0.000000009, skew: 13.208

将Chrony当成服务端

现在我们将其当成服务器来配置,主要修改以下几个地方:

1
2
3
4
5
6
7
8
9
10
server ~ $ cat /etc/chrony.conf
# 对于安全要求比较高的,这里可以限制谁能访问本机提供的NTP服务。
allow 客户端IP
# 修改监听地址
bindcmdaddress 0.0.0.0
# Serve time even if not synchronized to any NTP server.
# 这个地方很重要,如果服务器本身也不能同步时间,那么就用本地时间替代,层级为10
local stratum 10

此程序会监听两个端口:

  1. 端口 323/udp 为默认的管理端口,可以通过cmdport $newPort 来修改。
  2. 端口 123/udp 为标准的NTP监听端口,如果要对外提供ntp server功能,必须开启防火墙和监听地址为外部可访问地址,可以通过port $newPort 来修改。

想要别人访问自己的ntp端口,必须防火墙放通,通过如下命令可永久放通:

1
2
firewall-cmd --zone=public --add-port=123/udp --permanent
firewall-cmd --reload

如果误添加了端口,可以通过类似命令来删除(不存在的时候删除会报错):

1
firewall-cmd --zone=public --remove-port=323/tcp

看看原本服务器和客户端的时间差,如下相差约11秒:

1
2
3
server ~ $ echo -e "local: $(date +"%F %T")\nremote:$(sshpass -p 密码 ssh -p 端口 admin@客户端IP date +\"%F %T\")\n"
local: 2018-12-10 14:40:02
remote:2018-12-10 14:40:13

客户端执行同步命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
client ~ $ ntpdate -v -d 服务端IP
10 Dec 14:40:03 ntpdate[5190]: ntpdate 4.2.4p8@1.1612-o Wed Aug 25 13:54:52 UTC 2010 (1)
Looking for host 10.250.250.251 and service ntp
host found : 10.250.250.251
transmit(10.250.250.251)
receive(10.250.250.251)
transmit(10.250.250.251)
receive(10.250.250.251)
transmit(10.250.250.251)
receive(10.250.250.251)
transmit(10.250.250.251)
receive(10.250.250.251)
transmit(10.250.250.251)
server 10.250.250.251, port 123
stratum 10, precision -19, leap 00, trust 000
refid [10.250.250.251], delay 0.02565, dispersion 0.00000
transmitted 4, in filter 4
reference time: dfb888b8.70b9338e Mon, Dec 10 2018 14:39:52.440
originate timestamp: dfb888b9.70b98204 Mon, Dec 10 2018 14:39:53.440
transmit timestamp: dfb888c3.e10d573c Mon, Dec 10 2018 14:40:03.879
filter delay: 0.02570 0.02565 0.02570 0.02568
0.00000 0.00000 0.00000 0.00000
filter offset: -10.4388 -10.4388 -10.4388 -10.4388
0.000000 0.000000 0.000000 0.000000
delay 0.02565, dispersion 0.00000
offset -10.438836
10 Dec 14:40:03 ntpdate[5190]: step time server 10.250.250.251 offset -10.438836 sec

这表示执行成功,如果遇到如下错误:

1
2
3
4
5
6
...
10.250.250.251: Server dropped: strata too high
...
stratum 16, precision -19, leap 11, trust 000
...
10 Dec 14:31:43 ntpdate[31119]: no server suitable for synchronization found

是因为服务端自身也没有同步好自己的时钟,且没有运行本地时间作为时钟源,Chrony服务端记得开启:

1
local stratum 10

再次确认,时钟是否同步成功:

1
2
3
server ~ $ echo -e "local: $(date +"%F %T")\nremote:$(sshpass -p 密码 ssh -p 端口 admin@客户端IP date +\"%F %T\")\n"
local: 2018-12-10 14:40:30
remote:2018-12-10 14:40:30