NTP:Network Time Protocol,网络时间协议。它是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到UTC(世界协调时钟),其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。
NTP时间服务器就是利用NTP协议提供时间同步服务的。
注意: 在CentOS8.0中默认不再支持ntp软件包,时间同步将由chrony来实现。
NTP时间服务器搭建
1. 安装NTP软件包
(1)查看本机系统版本
# cat /etc/cent0s-release
(2)安装ntp软件包
# yum install ntp -y
(3) 查看ntp安装后生成哪些文件
# rpm -ql ntp
主配置文件:
/etc/ntp.conf
2. 配置NTP Server
(1)首先我们要在互联网上找到给我们提供同步服务的NTP Server
http://www.pool.ntp.org是NTP的官方网站,在这上面我们可以找到离我们城市最近的NTP Server. NTP建议我们为了保障时间的准确性,最少找两个NTP Server。
那我们就找两个离我们最近的NTP Server.查找地址:http://www.ntp.org.cn/pool
比如我找了这两个节点
58.220.133.132 114.67.103.73
(2)在打开NTP服务器之前先和这些服务器做一个同步,使得我们机器的时间尽量接近标准时间.
这里我们可以用ntpdate命令手动更新时间
假如你的时间差的很离谱的话第一次会看到调整的幅度比较大,所以保险起见可以运行两次. 那么为什么在打开NTP服务之前先要手动运行同步呢? 1. 因为根据NTP的设置,如果你的系统时间比正确时间要快的话,那么NTP是不会帮你调整的,所以要么你把时间设置回去,要么先做一个手动同步 2. 当你的时间设置和NTP服务器的时间相差很大的时候,NTP会花上较长一段时间进行调整.所以手动同步可以减少这段时间
那我们先手动同步时间:
# ntpdate 58.220.133.132 # ntpdate 114.67.103.73
(3)配置和运行NTP Server
现在我们就来创建NTP的配置文件了, 它就是 /etc/ntp.conf.。我们只需要加入上面的NTP Server和一个driftfile就可以了。
# vim /etc/ntp.conf
server 58.220.133.132 //上面找到的两个时间服务器 server 114.67.103.73 server 192.168.2.80 //外部时间服务器不可用时,以本地时间作为时间服务器
fudge 192.168.2.80 stratum 10 //时间服务器的层级:0-15,0为*,如果要想别的ntp服务器更新时间,请不要设为0;10通常用于给局域网内主机提供时间同步服务
启动NTP Server,并让它开机后自动启动
# service ntpd start # chkconfig ntpd on
(4) 查看NTP服务的运行状况
现在我们已经启动了NTP的服务,但是我们的系统时间到底和服务器同步了没有呢? 为此NTP提供了一个很好的查看工具: ntpq (NTP query)
建议在打开NTP服务器后就可以运行ntpq命令来监测服务器的运行.这里我们可以使用watch命令来查看一段时间内服务器各项数值的变化
# watch ntpq -p
Every 2.0s: ntpq -p Fri Feb 5 16:19:34 2021 remote refid st t when poll reach delay offset jitter ============================================================================== 58.220.133.132 10.137.53.7 3 u 1 64 3 45.328 14.467 14.522 114.67.103.73 .STEP. 16 u - 64 0 0.000 0.000 0.000 192.168.2.0 .STEP. 16 - - 64 0 0.000 0.000 0.000
remote - 本机和上层ntp服务器的ip或主机名,“+”表示优先,“*”表示次优先 refid - 它指的是给远程服务器(e.g. 58.220.113.132)提供时间同步的服务器 st - 由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端. 所以服务器从高到低级别可以设定为1-16.
- 为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的. when - 还有多久本地机器就需要和远程服务器进行一次时间同步 poll - 本地机和远程服务器多少时间进行一次同步(单位为秒). 在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增加了,可以尽快调整到正确的时间范围.之后poll值会逐渐增大,同步的频率也就会相应减小 reach - 这是一个八进制值,用来测试能否和服务器连接.每成功连接一次它的值就会增加 delay - 从本地主机发送同步要求到服务器的round trip time offset - 这是个最关键的值, 它告诉了我们本地机和服务器之间的时间差别. offset越接近于0,我们就和服务器的时间越接近 jitter - 这是一个用来做统计的值. 它统计了在特定个连续的连接数里offset的分布情况. 简单地说这个数值的绝对值越小我们和服务器的时间就越精确
实际观测时,我们会发现两个问题:
第一,如果我们配置中配置的不是ip地址而是主机名,主机名有时候会和remote server不一样? 第二就是最前面的+和*都是什么意思呢?
第一个问题不难理解,因为NTP提供给我们的是一个cluster server所以每次连接的得到的服务器都有可能是不一样.同样这也告诉我们了在指定NTP Server的时候应该使用hostname而不是IP
第二个问题和第一个相关,既然有这么多的服务器就是为了在发生问题的时候其他的服务器还可以正常地给我们提供服务.那么如何知道这些服务器的状态呢? 这就是第一个标记会告诉我们的信息 *:它告诉我们远端的服务器已经被确认为我们的主NTP Server,我们系统的时间将由这台机器所提供 +:它将作为辅助的NTP Server和带有*号的服务器一起为我们提供同步服务. 当*号服务器不可用时它就可以接管 -:远程服务器被clustering algorithm认为是不合格的NTP Server x:远程服务器不可用
了解这些之后我们就可以实时监测我们系统的时间同步状况了。
(5)NTP安全设置
运行一个NTP Server不需要占用很多的系统资源,所以也不用专门配置独立的服务器,就可以给许多client提供时间同步服务。但是一些基本的安全设置还是很有必要的
那么这里一个很简单的思路就是第一我们只允许局域网内一部分的用户连接到我们的服务器. 第二个就是这些client不能修改我们服务器上的时间。
权限的设定主要以 restrict 这个参数来设定:
主要的语法为:restrict IP地址 mask 子网掩码 参数
其中 IP 可以是IP地址,也可以是 default ,default 就是指所有的IP 参数有以下几个: ignore :关闭所有的 NTP 联机服务 nomodify:客户端不能更改服务端的时间参数,但是客户端可以通过服务端进行网络校时。 notrust :客户端除非通过认证,否则该客户端来源将被视为不信任子网 noquery :不提供客户端的时间查询 notrap:不提供trap远端登陆:拒绝为匹配的主机提供模式6控制消息陷阱服务。陷阱服务是 ntpdq 控制消息协议的子系统,用于远程事件日志记录程序。 nopeer :用于阻止主机尝试与服务器对等,并允许欺诈性服务器控制时钟 kod :访问违规时发送 KoD 包。 restrict -6 表示IPV6地址的权限设置。 Note:如果没有在parameter的地方加上任何参数的话,这表示该IP或网段不受任何限制。一般来说,我们可以先关闭NTP的权限,然后再一个一个的启用允许登入的网段。
在/etc/ntp.conf文件中我们可以用restrict关键字来配置上面的要求
首先我们对于默认的client拒绝所有的操作
restrict default kod nomodify notrap nopeer noquery
然后允许本机地址一切的操作
restrict 127.0.0.1
最后我们允许局域网内所有client连接到这台服务器同步时间.但是拒绝让他们修改服务器上的时间
restrict 192.168.2.0 mask 255.255.255.0 nomodify
把这三条加入到/etc/ntp.conf中就完成了我们的简单配置. NTP还可以用key来做authentication,这里就不详细介绍了。
3、NTP Server整个配置样例:
# For more information about this file, see the man pages # ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5). driftfile /var/lib/ntp/drift //driftfile详解:我们每一个system clock的频率都有小小的误差,这个就是为什么机器运行一段时间后会不精确. //NTP会自动来监测我们时钟的误差值并予以调整.但问题是这是一个冗长的过程,所以它会把记录下来的误差先写入driftfile. //这样即使你重新开机以后之前的计算结果也就不会丢失了 # Permit time synchronization with our time source, but do not # permit the source to query or modify the service on this system. restrict default kod nomodify notrap nopeer noquery //这两行表示默认拒绝所有来源的访问 restrict -6 default kod nomodify notrap nopeer noquery # Permit all access over the loopback interface. This could # be tightened as well, but to do so would effect some of # the administrative functions. restrict 127.0.0.1 //这两行表示允许本机的一切操作 restrict -6 ::1
# Hosts on local network are less restricted. restrict 192.168.2.80 mask 255.255.255.0 nomodify //允许局域网内所有client连接到这台服务器同步时间.但是拒绝让他们修改服务器上的时间 # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 58.220.133.132 //这两行是指定ntp服务器地址 server 114.67.103.73 server 192.168.2.80 //外部时间服务器不可用时,以本地时间作为时间服务器 fudge 192.168.2.80 stratum 10 //时间服务器的层级:0-15,0为*,如果要想别的ntp服务器更新时间,请不要设为0;10通常用于给局域网内主机提供时间同步服务 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst #broadcast 192.168.1.255 autokey # broadcast server #broadcastclient # broadcast client #broadcast 224.0.1.1 autokey # multicast server #multicastclient 224.0.1.1 # multicast client #manycastserver 239.255.254.254 # manycast server #manycastclient 239.255.254.254 autokey # manycast client # Enable public key cryptography. #crypto includefile /etc/ntp/crypto/pw # Key file containing the keys and key identifiers used when operating # with symmetric key cryptography. keys /etc/ntp/keys # Specify the key identifiers which are trusted. #trustedkey 4 8 42 # Specify the key identifier to use with the ntpdc utility. #requestkey 8 # Specify the key identifier to use with the ntpq utility. #controlkey 8 # Enable writing of statistics records. #statistics clockstats cryptostats loopstats peerstats
4、NTP Client的设置
如果我们想让局域网内的其他client都进行时间同步的话,那么我们就都应该照样再搭建一台Relay Server,然后把所有的client都指向这两台服务器(注意不要把所有的client都指向Internet上的服务器). 只要在client的/etc/ntp.conf加上Relay Server就可以了。
# vim /etc/ntp.conf server 192.168.2.80
5.其他相关问题
(1)配置文件中的driftfile是什么?
我们每一个system clock的频率都有小小的误差,这个就是为什么机器运行一段时间后会不精确. NTP会自动来监测我们时钟的误差值并予以调整.但问题是这是一个冗长的过程,所以它会把记录下来的误差先写入driftfile.这样即使你重新开机以后之前的计算结果也就不会丢失了。
(2)如何同步硬件时钟?
NTP一般只会同步system clock. 但是如果我们也要同步RTC(hwclock)的话,那么只需要在脚本配置文件中开启就可以了=
# vi /etc/sysconfig/ntpd SYNC_HWCLOCK=yes
(3)利用crontab让LINUX NTP定时更新时间
注:让linux运行ntpdate更新时间时,linux不能开启NTP服务,否则会提示端口被占用:如下
# ntpdate 1.rhel.pool.ntp.org 20 May 09:34:14 ntpdate[6747]: the NTP socket is in use, exiting
(4)NTP客户端的设置
a、LINUX做为客户端自动同步时间
如果想定时进行时间校准,可以使用crond服务来定时执行。
编辑 /etc/crontab 文件
30 8 * * * root /usr/sbin/ntpdate 192.168.0.80; /sbin/hwclock -w #192.168.0.80是NTP服务器的IP地址
然后重启crond服务
service crond restart
这样,每天 8:30 Linux 系统就会自动的进行网络时间校准。
b、WINDOWS 需要打开windows time服务和RPC的二个服务
如果在打开windows time 服务时报 错误1058,进行下面操作
1.运行 cmd 进入命令行,然后键入
w32tm /register 进行注册
正确的响应为:W32Time 成功注册。
2.如果上一步正确,用 net start "windows time" 或 net start w32time 启动服务。
(5)其它造成无法成功更新的原因:
a、客户端的日期必须要设置正确,不能超出正常时间24小时,不然会因为安全原因被拒绝更新。其次客户端的时区必须要设置好,以确保不会更新成其它时区的时间。
b、fudge 192.168.2.80 stratum 10 如果是LINUX做为NTP服务器,stratum(层级)的值不能太大,如果要向上级NTP更新可以设成2
c、LINUX的NTP服务器必须记得将从上级NTP更新的时间从系统时间写到硬件里去 hwclock --systohc
NTP一般只会同步system clock. 但是如果我们也要同步RTC(hwclock)的话那么只需要把下面的选项打开就可以了
# vi /etc/sysconfig/ntpd SYNC_HWCLOCK=yes
(5)Linux如果开启了NTP服务,则不能手动运行ntpdate更新时间(会报端口被占用),它只能根据/etc/ntp.conf 里server 字段后的服务器地址按一定时间间隔自动向上级NTP服务器更新时间。可以运行命令 ntpstat 查看每次更新间隔:
# ntpstat
synchronised to NTP server (58.220.133.132) at stratum 4 //#本NTP服务器层次为4,已向58.220.133.132 NTP服务器同步过
time correct to within 115 ms //时间校正到相差115ms之内
polling server every 64 s //每64秒会向上级NTP服务器轮询更新一次时间