NTP 服务
NTP 通信协议
NTP 是网络校时协议(Network Time Protocol)。为了修正因为 BIOS 内部芯片问题导致与标准时间(UTC, Coordinated Universal Time)存在的偏差,而通过网络进行时间同步(Synchronize)。此外,DTSS(Digital Time Synchronization Protocol)也可实现同样的功能。
Linux 系统中有两个时间:
- 软件时钟:Linux 自己的系统时间,从 1970.1.1 开始记录的时间参数。
- 硬件时钟:计算机在 BIOS 记录的实际时间(UTC),通过硬件记录。写入硬件时钟使用
hwclock
命令。
NTP 服务器使用的端口为 123,通过 UDP 数据包传输。
我国授时中心服务器的 IP 地址为 210.72.145.44。
NTP 服务器层次
NTP 时间服务器采用类似分级构架(Stratum)来处理时间的同步化,并且采用 Server/Client 的主从构架。网络上会提供一些主要与次要时间服务器,均属于第一级(stratum-1)与第二级(stratum-2)的时间服务器。
如果我们的 NTP 服务器向二级时间服务器要求时间同步,那么我们的 NTP 服务器即为三级(stratum-3)时间服务器。依此传递下去,最多可达 15 个阶层。
一般在进行 NTP 主机的设置时,会选择多台上层的 Time Server 来作为我们的 NTP 服务器校时用,这样可以避免某台时间服务器下线造成无法更新。
服务器设置
启动 NTP 服务器需要安装 ntp
软件:
[root@server2 ~]$ yum -y install ntp ntpdate
修改时区可以使用 timedatectl
命令。例如修改成上海时间:
[root@server2 ~]$ timedatectl set-timezone "Asia/Shanghai"
[root@server2 ~]$ timedatectl
Local time: Mon 2021-10-11 05:07:51 CST
Universal time: Sun 2021-10-10 21:07:51 UTC
RTC time: Sun 2021-10-10 21:07:51
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
服务器配置文件位于 /etc/ntp.conf
,其内容修改部分如下:
[root@server2 ~]$ vi /etc/ntp.conf
restrict 210.72.145.44
restrict 192.168.2.0 mask 255.255.255.0 nomodify
server 210.72.145.44
server cn.pool.ntp.org
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys
其中 restrict
行用来控制权限,上面运行局域网内主机通过这部主机来进行网络校时。其他可用参数有:
- ignore:拒绝所有类型的 NTP 连接。
- nomodify:客户端不能使用
ntpc
和ntpq
来修改服务器的时间参数,但可以通过这部主机来进行网络校时。 - noquery:客户端不能使用
ntpq
和ntpc
等命令来查询时间服务器,不提供 NTP 的网络校时。 - notrap:不提供 trap 这个远程时间登录(remote event logging)的功能。
- notrust:拒绝没有认证的客户端。
server
行用来设置上层 NTP 服务器地址,可以设置多个。
driftfile
行指定的文件用来记录本机与上层 Time Server 之间振荡周期频率误差。
keys
行指定用来认证的密钥文件。
服务器管理
配置修改完毕后,可以通过 systemctl
来启动 ntpd
服务:
[root@server2 ~]$ systemctl enable --now ntpd
[root@server2 ~]$ netstat -ntulp | grep ntpd
udp 0 0 10.1.1.1:123 0.0.0.0:* 30097/ntpd
udp 0 0 192.168.2.254:123 0.0.0.0:* 30097/ntpd
通常,NTP 启动后需要十五分钟内才会和上层 NTP 服务器连接上。可以使用 ntpstat
命令查询:
[root@server2 ~]$ ntpstat
synchronised to NTP server (111.230.189.174) at stratum 3
time correct to within 212 ms
polling server every 64 s
上面结果显示时间矫正了 212 ms,并且每隔 64 秒会主动去更新时间。
使用 ntpq
可以查询我们的 NTP 与相关上层 NTP 的状态:
[root@server2 ~]$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
210.72.145.44 .INIT. 16 u - 64 0 0.000 0.000 0.000
ntp.wdc1.us.lea 130.133.1.10 2 u 9 64 37 251.796 -4.729 0.252
*111.230.189.174 100.122.36.4 2 u 65 64 17 21.948 -6.164 0.297
+ntp6.flashdance 194.58.202.20 2 u 66 64 17 237.552 -6.099 5.726
+2402:f000:1:416 186.195.4.16 2 u 62 64 17 33.758 -3.033 0.306
-sv1.ggsrv.de 205.46.178.169 2 u 65 64 17 280.605 10.958 2.962
各字段意义如下:
- remote:NTP 主机的 IP 或主机名。最左边符号 * 代表目前使用的 NTP,符号 + 表示已连接的备选 NTP。
- refid:参考的上层 NTP 主机地址。
- st:stratum 阶层等级。
- when:上次时间同步操作后的时间间隔。
- poll:下次时间同步更新操作的时间间隔。
- reach:已经向上层 NTP 服务器要求更新的次数。
- delay:网络传输过程当中的延迟,单位为微秒。
- offset:时间补偿结果,单位为毫秒。
- jitter:Linux 系统时间与 BIOS 硬件时间的差异时间,单位为微秒。
客户端设置
客户端可以使用 ntpdate
命令来与服务器同步时间:
[root@server1 ~]$ ntpdate 192.168.2.254
11 Oct 15:54:26 ntpdate[125764]: adjust time server 192.168.2.254 offset -0.002236 sec
[root@server1 ~]$ date;hwclock -r
同步之后使用 hwclock
写入到硬件。ntpd
服务端和客户端之间时间误差不允许超过 1000 秒。
服务端配置也是修改 /etc/ntp.conf
文件:
[root@server1 ~]$ vi /etc/ntp.conf
restrict 192.168.2.254
server 192.168.2.254
之后启动 ntpd
服务,客户端就会自动到服务端同步时间:
[root@server1 ~]$ systemctl start ntpd