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远端登陆,trap服务是一种远程时间日志服务
nopeer :提供时间服务,但不作为对等体。
kod :向不安全的访问者发送Kiss-Of-Death报文。
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服务器轮询更新一次时间
(5)ntpd、ntpdate的区别
使用之前得弄清楚一个问题,ntpd与ntpdate在更新时间时有什么区别。
ntpd不仅仅是时间同步服务器,它还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,
并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。
时钟的跃变,对于某些程序会导致很严重的问题。 许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即取得的时间是线性的,诸如一些操作,例如数据库事务,通常会依赖这样的事实:时间不会往回跳跃。 不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday(2)设置系统时间, 这有几个非常明显的问题:
1.这样做不安全
ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。
由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。
2.这样做不精确
一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。
与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。
3.这样做不够优雅
由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错 (例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。尤其对数据库等对时间敏感的程序应用。 因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。 其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。 NTPD在和时间服务器的同步过程中,会把BIOS计时器的振荡频率偏差——或者说Local Clock的自然漂移(drift)——记录下来。 这样即使网络有问题,本机仍然能维持一个相当精确的走时。
(6)server选项格式
server host [ key n ] [ version n ] [ prefer ] [ mode n ] [ minpoll n ] [ maxpoll n ] [ iburst ]
其中host是上层NTP服务器的IP地址或域名,随后所跟的参数解释如下所示:
key: 表示所有发往服务器的报文包含有秘钥加密的认证信息,n是32位的整数,表示秘钥号。
version: 表示发往上层服务器的报文使用的版本号,n默认是3,可以是1或者2。
prefer: 如果有多个server选项,具有该参数的服务器优先使用。
mode: 指定数据报文mode字段的值。
minpoll: 指定与查询该服务器的最小时间间隔为2的n次方秒,n默认为6,范围为4-14。
maxpoll: 指定与查询该服务器的最大时间间隔为2的n次方秒,n默认为10,范围为4-14。
iburst: 当初始同步请求时,采用突发方式接连发送8个报文,时间间隔为2秒。
(7)修改本机的时区
第一个就是修改/etc/localtime这个文件,这个文件定义了我么所在的local time zone.
我们可以在/usr/share/zoneinfo下找到我们的time zone文件然后拷贝去到/etc/localtimezone(或者做个symbolic link)
假设我们现在的time zone是BST(也就是英国的夏令时间,UTC+1)
# date
Thu Jul 5 23:33:40 BST 2007我们想把time zone换成上海所在的时区就可以这么做
# ln -sf /usr/share/zoneinfo/posix/Asia/Shanghai /etc/localtime
# date
Fri Jul 6 06:35:52 CST 2007
这样时区就改过来了(注意时间也做了相应的调整)
第二种方法也就是设置TZ环境变量的值. 许多程序和命令都会用到这个变量的值. TZ的值可以有多种格式,最简单的设置方法就是使用tzselect命令
# tzselect
...
TZ='America/Los_Angeles';export TZtzselect
会让你选择所在的国家和城市(我省略了这些步骤),最后输出相应的TZ变量的值.那么如果你设置了TZ的值之后时区就又会发生变化
# date
Thu Jul 5 15:48:11 PDT 2007
通过这两个例子我们也可以发现TZ变量的值会override /etc/localtime.。也就是说当TZ变量没有定义的时候系统才使用/etc/localtime来确定time zone.。所以你想永久修改time zone的话,那么可以把TZ变量的设置写入/etc/profile里。
好了,现在我们知道怎么设置时区了。
centos7以后使用另外一个时间同步服务器,叫chrony
同步时间ntp需要几小时甚至几天才能完成,而chrony只需要几秒钟甚至几分钟就能完成。
服务器端:
# yum install chrony -y
# vim /etc/chrony.conf
allow 192.168.2/24
local stratum 10
# service chronyd start
# chkconfig chronyd on
客户端:
# vim /etc/chrony.conf
#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
server 192.168.2.35 iburst
# chronyc
chronyc> sources
chronyc> sourcestats
CENTOS7修改时区的正确方法是:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime