NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP基于UDP报文进行传输,使用的UDP端口号为123。
使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。
对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。
一句话描述NTP的作用:本地服务器(或计算机)通过网络同步服务器上的时间来保证本地服务器(或计算机)时间的准确性
目前最新版本的NTP协议是Version4
中国国家授时中心的地址:ntp.ntsc.ac.cn
chrony:
chrony是两个用来维持计算机系统时钟准确性的程序,这两个程序命名为chronyd和chronyc。
chronyd是一个在系统后台运行的守护进程。他根据网络上其他时间服务器时间来测量本机时间的偏移量从而调整系统时钟。对于孤立系统,用户可以手动周期性的输入正确时间(通过chronyc)。在这两种情况下,chronyd决定计算机快慢的比例,并加以纠正。chronyd实现了NTP协议并且可以作为服务器或客户端。
chronyc是用来监控chronyd性能和配置其参数的用户界面。他可以控制本机及其他计算机上运行的chronyd进程。
NTP工作模式和端口
C/S模式
[root@Kylinos63 ~]# grep ntp /etc/services
nntp 119/tcp #主要用于阅读和张贴新闻文章到Usenet上的Internet应用协议
nntp 119/udp
ntp 123/tcp
ntp 123/udp # NTP协议端口
nntps 563/tcp # NNTP over SSL
nntps 563/udp
ntp使用123端口,chronyd使用323端口。
NTP工作原理
NTP的基本工作原理如图所示。Device A和Device B通过网络相连,它们都有自己独立的系统时钟,需要通过NTP实现各自系统时钟的自动同步。为便于理解,作如下假设:
在Device A和Device B的系统时钟同步之前,Device A的时钟设定为10:00:00am,Device B的时钟设定为11:00:00am。
Device B作为NTP时间服务器,即Device A将使自己的时钟与Device B的时钟同步。
NTP报文在Device A和Device B之间单向传输所需要的时间为1秒。
系统时钟同步的工作过程如下:
- Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1)。
- 当此NTP报文到达Device B时,Device B加上自己的时间戳,该时间戳为11:00:01am(T2)。
- 当此NTP报文离开Device B时,Device B再加上自己的时间戳,该时间戳为11:00:02am(T3)。
- 当Device A接收到该响应报文时,Device A的本地时间为10:00:03am(T4)。
- 至此,Device A已经拥有足够的信息来计算两个重要的参数:
- NTP报文的往返时延Delay=(T4-T1)-(T3-T2)=2秒。
- Device A相对Device B的时间差offset=((T2-T1)+(T3-T4))/2=1小时。
这样,Device A就能够根据这些信息来设定自己的时钟,使之与Device B的时钟同步。
NTP也是数形层次结构,所有的NTP结构中的节点两种角色,一种是时钟源,一种是客户端。每一层上的时钟源或客户端可以向你上一层的时钟源请求矫正。所以就有了一个Stratum层的说法!
UTC:协调世界时(英:Coordinated Universal Time ,法:Temps Universel Coordonné),又称世界统一时间,世界标准时间,国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。) UTC +8
Stratum 层,NTP服务网络结构,利用离时间UTC源的远近,将服务器化为不同的层,我们如果定义了时间源为Stratum为0,那么直接连接了UTC的时间源(如国家授时中心,也可以理解为UTC)则为1,以此类推
1:NTP提供准确时间,首先要有准确的时间来源,国家或国际授时中心提供的时间是精确时间(UTC)。NTP获得UTC的时间来源可以通过不同过的方式,包括网络,卫星,天文台)
2:时间按NTP服务器的等级传播,按照离外部UTC源的远近将所有的服务器化为不同的层,也就是stratum其中Stratum-1在顶层,离UTC最近,或者直接连接了UTC)。而Stratum-2则从-1上获取时间,Stratum-3从-2上获取时间,以此类推!但是Stratum总是有限制的(15以内)。所以第一层是整个时间服务系统的基础
3:我们客户端可以连接多个时间服务器,利用统计科学的算法过滤来自不同时间服务器的时间,以最佳的路径和来源矫正主机的时间,这样即使与某一台时间服务器无法连接,NTP照样有效运转!
NTP 访问控制
当同步子网中的一台时间服务器发生意外或遭到恶意攻击时,通常不应该导致子网中其它时间服务器的计时错误。因此, NTP 还提供了如下安全机制:访问权限、 KOD 和 NTP 认证功能。这样就对网络的安全性提供了保障。
访问权限
设备提供一种比较简单安全措施:访问权限,即通过设置访问权限对本地时钟进行保护。
NTP 的访问控制基于访问控制列表 ACL(Access Control List)实现。NTP 支持 5 个等级的访问限制,每个访问限制可指定相应的 ACL 规则。如果 NTP 访问请求命中该访问限制的 ACL 规则,则说明两者匹配成功,即该访问请求享有此级别的访问限制。
当 1 个 NTP 访问请求到达本地时,按照最小访问限制到最大访问限制依次匹配,以第 1 个匹配的为准,匹配顺序如下:
1. peer:(最大访问权限)可以对本地时钟进行时间请求和控制查询,本地时钟也可以同步到远程服务器。
2. server:可以对本地时钟进行时间请求和控制查询,但本地时钟不会同步到远程服务器。
3. synchronization:只允许对本地时钟进行时间请求。
4. query:(最小访问权限)只允许对本地时钟进行控制查询。
5. limited:仅在使能 KOD 功能后生效。在使能 KOD 后控制入方向报文的速率并且发送 Kiss码。
KOD
当单位时间内,服务器收到大量客户端访问报文导致无法负荷时,可在服务器上使能 KOD(Kiss-o'-Death)功能来进行接入控制。KOD 是 NTPv4 提出的一种全新的访问控制技术,主要用于服务器向客户端提供状态报告和接入控制等信息。
KOD 报文是特殊的 NTP 报文,当 NTP 报文携带的层数(Stratum)信息为 0 时,该报文被称为KOD 报文,此时报文中会携带代表接入控制信息的 ASCII(又称 Kiss 码)。目前仅支持 DENY和 RATE 两种 Kiss 码。
在服务器上使能 KOD 功能后,服务器会根据配置向客户端发送 DENY 或 RATE Kiss 码。
说明:使能 KOD 功能后,还需要配置相应的 ACL 规则。当 ACL 规则为 deny,此时服务器发送 DENY Kiss 码;当 ACL 规则为 permit 且接收到的 NTP 报文速率达到配置的上限时,此时服务器发送RATE Kiss 码。
当客户端接收到 DENY Kiss 码,客户端将断开与服务器的所有连接,并停止向服务器发送报文。
当客户端接收到 RATE Kiss 码,客户端将立即缩短与该服务器的轮询时间间隔,且以后每次接收到 RATE Kiss 码,轮询时间间隔都会进一步缩短。
认证功能
在安全性要求较高的网络中,可以启用 NTP 认证功能。不同工作模式下可配置不同的密钥。
当用户在某一 NTP 工作模式下启用 NTP 认证时,系统会记录下此工作模式下相应的密钥 ID。
发送过程
首先判断在此工作模式下是否需要认证。如果不需要则直接发送报文;如果需要则根据相应密钥 ID 和加密算法对报文进行加密,然后发送报文。
说明:
目前设备只支持 MD5 的密钥验证算法。
接受过程
在接受报文时,首先判断是否要对报文进行认证处理。如果不需要认证,则直接对报文进行后续处理;如果需要认证,则根据对应密钥 ID 和解密算法来认证。如果认证失败,则直接丢弃报文;如果认证通过,则对接收到的报文进行处理
NTP安装
ntp-4.2.6p5-1.el6.x86_64.rpm //NTP服务端端软件包
ntpdate-4.2.6p5-1.el6.x86_64.rpm //NTP客户端更新工具软件包
[root@Kylinos63 ~]# rpm -pql /media/Packages/ntp-4.2.6p5-1.el6.x86_64.rpm
……
/etc/ntp.conf #服务端配置文件位置
……
[root@Kylinos63 ~]# systemctl enable ntpd //任何一个我们需要的服务,配置开机启动
[root@Kylinos63 ~]# systemctl restart ntpd //当前启动
[root@Kylinos63 ~]# netstat -antup | grep 123
udp 0 0 192.168.1.63:123 0.0.0.0:* 7119/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 7119/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 7119/ntpd
udp 0 0 fe80::20c:29ff:fe06:85d7:123 :::* 7119/ntpd
udp 0 0 ::1:123 :::* 7119/ntpd
udp 0 0 :::123 :::* 7119/ntpd
#监控所有IP,包括IPV6
NTP服务端配置文件
[root@Kylinos63 ~]# vim /etc/ntp.conf
driftfile /var/lib/ntp/drift #侦测BIOS时钟与Linux系统时间的差
restrict default kod nomodify notrap nopeer noquery
#限制服务器访问权限,default=0.0.0.0 ,nomodify禁止远程主机修改本地服务器配置,notrap不提供trap远程事件登入事件,noquery客户端不能够使用 ntpq, ntpc 等指令来查询时间服务器,等于不提供 NTP 的网络校对;
restrict -6 default kod nomodify notrap nopeer noquery #值得针对IPV6,上面一行指IPV4
restrict 127.0.0.1 #放行本机,没有任何参数表示该网段或者IP不受限制
restrict -6 ::1 #放行本机的IPV6
restrict 192.168.0.0 mask 255.255.0.0 nomodify //该网段可以进行校时
restrict 0.0.0.0 mask 0.0.0.0 notrust //拒绝没有认证的用户端
server time-nw.nist.gov prefer //prefer 该服务器优先
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 放行区域,并附加权限
server 0.rhel.pool.ntp.org iburst #不同的NTP服务器,从哪儿同步时间
server 1.rhel.pool.ntp.org iburst #服务器同步顺序,前面的优先级越大
server 2.rhel.pool.ntp.org iburst #iburst当一个运程NTP服务器不可用时,向它发送一系列的并发包进行检测。
server 3.rhel.pool.ntp.org iburst
#剩下的是一些安全选项,不用我们去修改,注意上面的配置项目即可
说明:
restrict:作用:对ntp做权限控制
格式:restrict [ip] [mask] [par]
par:
ignore:忽略所有类型的NTP连接请求
nomodify:限制客户端不能使用命令ntpc和ntpq来修改服务器端的时间
noquery:不提供NTP网络校时服务
notrap:不接受远程登录请求
notrust:不接受没有经过认证的客户端的请求
nopeer: 提供时间服务,但不作为对等体。
kod: 向不安全的访问者发送Kiss-Of-Death报文。
【如果没有用任何参数,那么表示不做任何限制】
例子:restrict 10.220.5.0 mask 255.255.255.0 nomodify <<<允许10.220.5.0/24 网段主机进行时间同步
#设置默认策略为允许任何主机进行时间同步
restrict default ignore
server:作用:指定ntp服务器的地址
格式:server [ip or hostname] [perfer]
例子:server 127.127.1.0 <<<将当前主机作为时间服务器,读取本地BIOS时间
fudge:作用:设置时间服务器的层级
格式:fudge ip [startnum int]
例子:fudge 10.225.5.1 startnum 10
注意:fudge必须和server一块用, 而且是在server的下一行
startnum
0~15
0:表示顶级
10:通常用于给局域网主机提供时间服务
配置文件中的driftfile是什么?
我们每一个system clock的频率都有小小的误差,这个就是为什么机器运行一段时间后会不精确. NTP会自动来监测我们时钟的误差值并予以调整.但问题是这是一个冗长的过程,所以它会把记录下来的误差先写入driftfile.这样即使你重新开机以后之前的计算结果也就不会丢失了。
chronyd的配置文件
# vim /etc/chrony.conf
allow 192.168.211.131 ##允许哪些客户端来同步主机的时间,相当于ntpd中的restrict
local stratum 10 ##本机不同步任何主机时间,本机作为时间源,相当于ntpd中的fudge
server 192.168.211.132 iburst ##本机同步192.168.211.132主机的时间,chronyd中的pool与server作用一样。
NTP客户端的使用
默认我们安装的环境,启用了ntpd的服务,如果没用关闭,会报错:
[root@Kylinos64 ~]# ntpdate 192.168.1.63
8 Oct 15:10:53 ntpdate[4039]: the NTP socket is in use, exiting
[root@Kylinos64 ~]# systemctl stop ntpd
[root@Kylinos64 ~]# ntpdate 192.168.1.63 //ntpdate格式:ntpdate IP(域名)
8 Oct 15:12:07 ntpdate[4058]: adjust time server 192.168.1.63 offset -0.000473 sec
[root@Kylinos64 ~]# ntpdate 0.rhel.pool.ntp.org
8 Oct 15:13:18 ntpdate[4061]: adjust time server 202.112.10.36 offset -0.000603 sec
NTP其他相关设置
[root@Kylinos63 ~]# vim /etc/sysconfig/clock //安装系统是选择的时区
# The time zone of the system is defined by the contents of /etc/localtime.
# This file is only for evaluation by system-config-date, do not rely on its
# contents elsewhere.
ZONE="Asia/Shanghai"
[root@Kylinos63 ~]# ls /usr/share/zoneinfo/Asia/ //所有的亚洲的时区地址
……
Amman Brunei Gaza Kamchatka Macau Pyongyang Shanghai Ulan_Bator
……
[root@Kylinos63 ~]# cat /etc/localtime //本地时间配置文件,看不懂
TZif2
�����\���'p����Z��6ip ~h�!Iap"^J�#)Cp$Gg%_�&'I&�A�(+(�#�q�~�pLMTCDTCSTTZif2
�������������\�������'p������������Z��6ip ~h�!Iap"^J�#)Cp$Gg%_�&'I&�A�(+(�#�q�~�pLMTCDTCST
CST-8
当你选中时区为上海,系统会把/usr/share/zoneinfo/Asia/Shanghai拷贝到/etc/localtime下面,这两个文件是一样的:
[root@Kylinos63 ~]# diff /etc/localtime /usr/share/zoneinfo/Asia/Shanghai //没有差别
同步硬件时钟
ntp服务,默认只会同步系统时间。
如果想要让ntp同时同步硬件时间,可以设置/etc/sysconfig/ntpd文件,
在/etc/sysconfig/ntpd文件中,添加【SYNC_HWCLOCK=yes】这样,就可以让硬件时间与系统时间一起同步。
允许BIOS与系统时间同步,也可以通过hwclock -w 命令。
服务器时间同步实验
Kylinos63位NTP Server,Kylinos64位我们需要被同步的服务器
使用客户端去同步
[root@Kylinos64 ~]# ntpdate 1.cn.pool.ntp.org
8 Oct 16:11:01 ntpdate[52271]: adjust time server 202.118.1.81 offset -0.000400 sec
[root@Kylinos64 ~]# date -s 2015-10-01 //修改一下时间再同步测试
[root@Kylinos64 ~]# date
Thu Oct 1 00:00:01 CST 2015
[root@Kylinos64 ~]# ntpdate 1.cn.pool.ntp.org
8 Oct 16:13:23 ntpdate[52285]: step time server 202.118.1.81 offset -0.000963 sec
[root@Kylinos64 ~]# date
Thu Oct 8 16:13:28 CST 2015
NTP服务器搭建
一般我们不需要搭建内部 的NTP服务器,因为服务器直接从网络上直接拿取时间同步
NTP服务的启动与观察
启动NTP服务之前,我们记得选需要同步一次时间,手动同步,NTPD服务有一个自我保护设置,如果本机时间和上层时间相差太大,ntpd不运行
[root@Kylinos63 ~]# date -s 2014/01/01
[root@Kylinos63 ~]# service ntpd stop
[root@Kylinos63 ~]# ntpdate cn.pool.ntp.org
1 Jan 00:11:57 ntpdate[49865]: no server suitable for synchronization found
[root@Kylinos63 ~]# date -s 2015/10/08
[root@Kylinos63 ~]# ntpdate cn.pool.ntp.org
8 Oct 17:16:24 ntpdate[49867]: step time server 202.118.1.130 offset 0.000198 sec
[root@Kylinos63 ~]# service ntpd restart
[root@Kylinos63 ~]# ntpstat //列出是否与上游服务器连接(5分钟等待)
synchronised to local net at stratum 11 #我们现在已经是在第11层了
time correct to within 7948 ms #ms毫秒,一毫秒为1秒的千分之一
polling server every 64 s #64秒主动更新一次
#该指令列出NTP服务器是否与上层联机,由输出结果可知,上面是指本地NTPServer层,如果上层不是本地的,则可以看到时哪个上层的IP
[root@Kylinos63 ~]# ntpq -p //列出我们NTP服务器与上游NTP服务器的连接状态
remote refid st t when poll reach delay offset jitter
===================================================================
news.neu.edu.cn 202.118.1.46 2 u 20 64 4 49.564 2.154 0.000
+gus.buptnet.edu 202.112.10.60 3 u 16 64 4 36.510 -2.181 0.250
*202.118.1.130 202.118.1.46 2 u 164 64 4 48.148 1.616 0.533
LOCAL(0) .LOCL. 10 l 109 64 6 0.000 0.000 0.000
#ntpq -p 列出目前我们ntp与相关上层ntp的状态,字段如下
remote:本机和上层的IP或主机名,+表示优先,*表示次先
refid:上层NTP主机的地址
st:层值 stratum,remote远程服务器的级别.由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端.所以服务器从高到低级别可以设定为1-16.为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的.
when:几秒钟之前和NTP服务器通信过
poll:下次更新在几秒之后
reach:上层服务器发送了多少次请求
delay:延迟多长时间
offset:时间补偿结果,主机通过NTP时钟同步与所同步时间源的时间偏移量,单位为毫秒(ms)。offset越接近于0,主机和ntp服务器的时间越接近
jitter:linux系统当前时间和BIOS硬件时间相差
如果报错:Synchronization Found的错误,是由于每于每次与ntp服务器链接之后大约需要2-5分钟时间客户端方可与Server建立正常通讯连接,此时客户户端连接与服务端连接马上同步就会报这个错误。等待几分钟即可。
在chronyd中使用chronyc sources -v查看状态
拓展:时间/时区设定
概念说明
几个常见的概念,进行总结如下:
项目 | 说明 |
时区 | 因时区不同显示的时间不同,牵扯到夏令时和调整等问题,date命令可查看 |
系统时钟:System Clock | linux OS的时间,date命令可查看 |
硬件时钟:RTC:Real Time Clock | 主板上由电池供电的BIOS时间,hwclock -r可查看 |
NTP: Network Time Protocol | 本机时间和实际的时间之间的经常会有差别,一般使用NTP服务器进行时间校准 |
系统时间和硬件时间查看
[root@devops ~]# hwclock -r ; date;
Sat 03 Feb 2018 09:18:26 AM EST -0.692300 seconds
Sat Feb 3 09:19:19 EST 2018
从这里可以看出,系统时间和硬件时间已经由几十秒的不同步了
同步系统时间和硬件时间
使用hctosys选项可将硬件时间设定到系统时间上,反向操作使用systohc即可,以下是硬件时间->系统时间调整的例子:
[root@devops ~]# hwclock -r ; date; hwclock --hctosys; hwclock -r; date;
Sat 03 Feb 2018 09:29:38 AM EST -0.921131 seconds
Sat Feb 3 09:30:27 EST 2018
Sat 03 Feb 2018 09:29:40 AM EST -1.080703 seconds
Sat Feb 3 09:29:40 EST 2018
但是时间还是会经常性发生gap,以某个时间为主的话建议在使用之前确认或者同步一下更为准确。
设定文件
/usr /share/zoneinfo/
在这个目录下放置的是各主要时区的时间设定文件
[root@devops ~]# ls /usr/share/zoneinfo/
Africa Atlantic Chile Eire GB GMT+0 Indian Japan MST Pacific PRC Singapore UTC Zulu
America Australia CST6CDT EST GB-Eire Greenwich Iran Kwajalein MST7MDT Poland PST8PDT Turkey WET
Antarctica Brazil Cuba EST5EDT GMT Hongkong iso3166.tab Libya Navajo Portugal right UCT W-SU
Arctic Canada EET Etc GMT0 HST Israel MET NZ posix ROC Universal zone1970.tab
Asia CET Egypt Europe GMT-0 Iceland Jamaica Mexico NZ-CHAT posixrules ROK US zone.tab
比如常用的Asia/Shanghai
[root@devops ~]# file /usr/share/zoneinfo/Asia/Shanghai
/usr/share/zoneinfo/Asia/Shanghai: timezone data, version 2, 2 gmt time flags, 2 std time flags, no leap seconds, 16 transition times, 2 abbreviation chars
[root@devops ~]#
[root@devops ~]# more /usr/share/zoneinfo/Asia/Shanghai
TZif2--More--(80%)
CST-8
/etc /localtime
本地时间配置文件, 此文件一般为/etc/share/zoneinfo下面的文件的软链接,比如当前EST时间,可以清晰地看出其实际是链接到纽约的时间
[root@devops ~]# ll /etc/localtime
lrwxrwxrwx. 1 root root 38 Jan 18 17:02 /etc/localtime -> ../usr/share/zoneinfo/America/New_York
我们将其改变为Asia/Shanghai
[root@devops ~]# rm /etc/localtime
rm: remove symbolic link ‘/etc/localtime’? y
[root@devops ~]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@devops ~]# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 33 Feb 4 08:15 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai
而此时,时间已经实时地被调整为CST
[root@devops ~]# date
Sun Feb 4 08:15:46 CST 2018
[root@Kylinos63 ~]# hwclock -r //读取BIOS时间参数
[root@Kylinos63 ~]# hwclock -w //写入当前时间到bios
使用timedatectl可以进行如下常见操作
查看当前时间/日期/时区:timedatectl或者timedatectl status
查看所有可用时区:timedatectl list-timezones
设置时区:timedatectl set-timezone “时区信息”
设置UTC:timedatectl set-timezone UTC
设置时间:timedatectl set-time HH:MM:SS
设置日期:timedatectl set-time YYYY-MM-DD
设置日期时间:timedatectl set-time “YYYY-MM-DD HH:MM:SS”
设置硬件时钟为本地时间:timedatectl set-local-rtc 1
设置硬件时钟为UTC时间:timedatectl set-local-rtc 0
启动NTP时间同步(启用NTP服务或者Chrony服务):timedatectl set-ntp true
禁用NTP时间同步:timedatectl set-ntp false
使用示例
查看当前时间/日期/时区
命令:timedatectl或者timedatectl status
执行示例
[root@platform ~]# timedatectl status
Local time: Fri 2019-03-08 06:07:19 EST
Universal time: Fri 2019-03-08 11:07:19 UTC
RTC time: Fri 2019-03-08 09:41:48
Time zone: America/New_York (EST, -0500)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: no
Last DST change: DST ended at
Sun 2018-11-04 01:59:59 EDT
Sun 2018-11-04 01:00:00 EST
Next DST change: DST begins (the clock jumps one hour forward) at
Sun 2019-03-10 01:59:59 EST
Sun 2019-03-10 03:00:00 EDT