一、概述
NTP服务器的阶层概念
网络时间按照NTP服务器的等级进行传播,根据离基准时间的远近将不同服务器归纳到不同的层中(Stratum),单个Stratum层的总数限制在15
0层(Stratum 0):表示高精度设备,例如原子钟、GPS时钟等,0层也称为参考时钟
1层(Stratum 1):这些设备和0层的设备相连,误差仅为微秒
2层(Stratum 2):这些设备和1层的设备通过网络相连
依次类推...,时间是按NTP的层级进行传播的(Peer之间是同层级传播)
NTP服务为C/S架构,NTP客户端请求NTP服务端,通过交互往返的数据包,客户端能够根据这个结果计算出准确的时间,客户端为了保证计算结果的精确度、可靠度,一般建议NTP服务客户端配置最少3个NTP服务器地址
列举部分NTP协议的软件实现
ntpdate:运行一次ntpdate命令,进行一次时间同步(该命令不是守护进程设计)ntp:NTP协议的实现,可充当NTP Client、NTP Server(守护进程设计)chrony:一个较新的NTP协议的实现,可充当NTP Client、NTP Server,Chrony相比ntp来说同步时间速度更快,精度更准,也是目前推荐的实现(守护进程设计)
二、ntpdate命令
ntpdate命令是一个客户端NTP程序,该程序并不是守护进程设计,ntpdate软件的绝大部分功能都已在ntpd中有包含,且ntpdate会逐渐进行退役
ntpdate设计用来通过指定的ntp服务器获取时间,并设置本地的时间,ntpdate的准确性、可靠性取决于服务器的数量,轮询查询的次数、间隔(该命令需要root权限执行)
#安装ntpdateCentOS中执行 yum install ntpdateUbuntu中执行 apt install ntpdate#ntpdate语法如下ntpdate [ -46bBdqsuv ] [ -a key ] [ -e authdelay] [ -k keyfile ] [ -o version ] [ -p samples ] [ -t timeout ] [ -U user_name] server [ ... ]#ntpdate命令选项解释如下:(可通过man ntpdate查看)-4仅使用IPv4-6仅使用IPv6-a key启用认证,并指定认证需要的密钥(默认禁用该功能)-B强制每次都使用adjtime()系统调用调整时间,即使偏移量+-500ms,默认情况下+-500ms使用settimeofday(),该情况下同步时间可能会超过1-2小时-b强制使用settimeofday()系统调用调整时间,而不是使用adjtime()调用来设置时间,在启动脚本中调用可以使用此选项-d启用调试模式,ntpdate将会完成所有动作,但是不修改本地时间,打印的输出信息可能会对调试很有帮助-e authdelay指定身份验证功能的处理延迟为authdelay,以秒和分为单位,给数字通常足够小,对于大多数用途来说可以忽略不记-k keyfile指定身份验证的密钥路径,默认为/etc/ntp/keys,该文件应该采用ntpd中所描述的格式-o version指定传出数据包的ntpd整数形式的版本号,可以为1、2,默认为4,该选项允许与较旧的NTP版本一起使用-p samples指定从每个服务器获取的样本数,可以是1-8,默认为4-q仅查询,不设置clock-s从标准输出转义日志输出到syslog,这主要是为了方便cron脚本而设计-t timeout指定从服务器收到响应的超时时间,可以是秒,分,该值四舍五入为0.2秒的倍数,默认值为1s-untpdate为传出数据包使用非特权端口,当处于防火墙背后且知名端口被防火墙阻断时很有用,-d选项始终使用非特权端口-v显示更多详细信息-U user_namentpdate不使用root权限,并将用户ID更改为user_name,并将GroupID更改为server_user的主要组
ntpdate可以根据需要来手动设置时间,或者设置开机脚本达到每次启动时运行一次,也可以使用cron脚本来周期性运行ntpdate命令(带cron脚本的ntpdate不能替代ntpd,ntpd使用了很多复杂的算法来最大限度提高时间的准确性、可靠性,ntpdate不会约束本地主机的时钟频率,ntpdate的准确性是有限的)
使用ntpdate和NTP服务器同步一次时间[root@ ~]# ntpdate 172.16.32.2546 May 10:54:35 ntpdate[2614]: adjust time server 172.16.32.254 offset 0.031896 sec将同步好的Linux Kernel时间写入BIOS硬件时钟,以便重启后保持时间准确hwclock -w(可选)可以在cron中设置每2个小时运行一次0 */2 * * * root /usr/sbin/ntpdate 172.16.32.254 > /dev/null 2>&1
若本机上运行了ntpd服务的话,无法再通过ntpdate命令来设置日期
三、ntpd守护进程、服务
使用ntpd守护能够自动调整时间
#安装ntpd守护进程CentOS系统中执行 yum install ntpUbuntu系统中执行 apt install ntp
安装完成之后,该服务可用systemd进行管理
#在CentOS中ntp服务的服务名和Ubuntu中有点不一样#CentOS中该service文件为/usr/lib/systemd/system/ntpd.service#Ubuntu中该service文件为/lib/systemd/system/ntp.service#当使用systemd进行管理的时候,注意名称区别(CentOS中服务名带d,Ubuntu中不带)systemctl enable ntpd.servicesystemctl enable ntp.servicesystemctl start ntpd.servicesystemctl start ntp.service
3.1 ntpd配置文件
ntpd的服务配置文件路径为/etc/ntp.conf,该文件的默认配置如下:
#为了方便查看,这里把配置文件中一些注释行删除driftfile /var/lib/ntp/driftrestrict default nomodify notrap nopeer noqueryrestrict 127.0.0.1 restrict ::1# Hosts on local network are less restricted.#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap#默认配置中配置了4个server字段,已指定了4台NTP服务器的地址server 0.centos. iburstserver 1.centos. iburstserver 2.centos. iburstserver 3.centos. iburstincludefile /etc/ntp/crypto/pwkeys /etc/ntp/keysdisable monitor
该默认配置已经将ntp设置为客户端模式,自动向server字段中配置的服务器进行时间同步
配置文件中的restrict字段的解释:指定可以和本机NTP服务通信的IP地址或网段,如果没有指定任何选项,那么表示客户端在访问本机提供的NTP服务器没有任何限制
restrict <ipaddr> <netmask> [ignore | nomodiy | noquery | notrap | notrust | nokod ]
ignore:关闭所有的NTP服务nomodiy:表示客户端不能更改NTP服务器的时间参数,但可以通过NTP服务器校对时间noquery:不提供NTP服务,notrap:不提供trap远程事件登陆(Remote Event Logging)的功能,拒绝任何被发送的控制包notrust:拒绝没有通过认证的客户端kod:kod技术可以阻止kiss of death包(一种DOS攻击)对服务器的破坏,kod用来发送特定的回应包,以减慢那些超过规定速度界限的客户机nopeer:不和其他同一层的NTP服务器进行时间同步
server字段中的iburst表示发送到服务器的前4个请求之间的间隔将为2s或者更短,表示在初次同步时能进行快速同步时间
3.2 ntpd作为客户端运行,自定义ntpd上层NTP服务器
假设需要自定义本机的上层NTP server,直接修改默认的服务器即可,例如这里配置阿里云公共NTP服务器阿里云NTP服务器 ()
#为了方便查看,这里把配置文件中一些注释行删除driftfile /var/lib/ntp/driftrestrict default nomodify notrap nopeer noqueryrestrict 127.0.0.1 restrict ::1# Hosts on local network are less restricted.#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap#指定server为阿里云公开NTP服务器(这里的server可以是ip地址、域名)server iburstserver iburstserver iburstserver iburstincludefile /etc/ntp/crypto/pwkeys /etc/ntp/keysdisable monitor
修改配置文件后,执行service ntpd restart重启ntp服务即可(注意在Ubuntu中服务名称不带d,ntp)
可以通过ntpstat命令查看本机上一次和NTP服务器时间同步的情况
[root@localhost ~]# ntpstat synchronised to NTP server (120.25.115.20) at stratum 3//进行校对的NTPservertime correct to within 956 ms//本地主机和上层NTP时间差polling server every 64 s//下次同步时间
也可以使用ntpd -p命令查看本机和上层NTP服务器通信的情况
[root@localhost ~]# ntpq -premote refidst t when poll reach delay offset jitter======================================================================*120.25.115.20 10.137.53.72 u 29 64 3 23.546 6.034 1.098+203.107.6.88 10.137.38.862 u 30 64 3 29.517 6.789 0.334#一些字段解释remote:本地主机所连接的上层服务器refid:上层NTP服务器的NTP服务器st:上层NTP服务器层级when:上一次与上层NTP服务器进行时间校对的时间
3.3 ntpd运行为客户端,向上层NTP服务同步时间;且同时ntpd运行为服务端,为本地子网中的客户端提供NTP时间同步服务
配置本机NTP服务向本地子网提供NTP授时服务,取消注释配置文件中的restrict字段,并修改该子网,可以配置多个,配置完成后,重启ntpd服务service ntpd restart,该配置实现了本机从指定的上层NTP服务器(例如这里本机上层NTP服务器配置的是阿里云公共NTP服务器)获取时间,并向本地子网提供时间同步服务
#为了方便查看,这里把配置文件中一些注释行删除driftfile /var/lib/ntp/driftrestrict default nomodify notrap nopeer noqueryrestrict 127.0.0.1 restrict ::1#允许向特定的本地子网提供NTP服务restrict 192.168.0.0 mask 255.255.0.0 nomodify notraprestrict 172.16.0.0 mask 255.240.0.0 nomodify notraprestrict 10.0.0.0 mask 255.0.0.0 nomodify notrap#指定server为阿里云公开NTP服务器(这里的server可以是ip地址、域名)server iburstserver iburstserver iburstserver iburstincludefile /etc/ntp/crypto/pwkeys /etc/ntp/keysdisable monitor
整体来说,一般情况下,配置文件的修改较为简洁,大体分为2个部分:上层NTP服务器配置,本地子网授权配置
四、Chronyd守护进程、服务
Chrony是NTP比较新的实现,chrony相比ntp有着较高的时间同步效率、准确度,推荐使用chrony
#安装chronyCentOS中执行 yum install chronyUbuntu中执行 apt-get install chrony#安装完成后可以用systemd管理,但是他们之间的服务名称有差别#在CentOS中service文件为/usr/lib/systemd/system/chronyd.service#在Ubuntu中service文件为/lib/systemd/system/chrony.service#管理chrony服务(以CentOS为例)systemctl enable chronyd.servicesystemctl start chronyd
4.1 chronyd配置文件
chronyd的配置文件路径为/etc/chrony.conf,该文件的默认配置如下:
#为了方便查看,这里删除一些注释行#默认配置中pool指令已指定了一台上层NTP服务器pool 2.centos. iburstdriftfile /var/lib/chrony/driftmakestep 1.0 3rtcsync# Allow NTP client access from local network.#allow 192.168.0.0/16# Serve time even if not synchronized to a time source.#local stratum 10keyfile /etc/chrony.keysleapsectz right/UTClogdir /var/log/chrony
该默认配置文件中的pool指令已经指定了一个上层NTP服务器,不做任何修改的话,chrony服务能够作为NTP客户端向上层NTP服务器进行时间同步
4.2 Chronyd作为NTP客户端,并指定上层NTP服务器
这里我们指定阿里云NTP服务器 ()作为我们服务器的上层NTP服务器,注释掉默认配置文件中的pool指令部分,使用server指令指定上层阿里云NTP服务器,配置如下:(这里的server指令后面可以跟上域名、IP地址)
#为了方便查看,这里删除一些注释行#默认配置中pool指令已指定了一台上层NTP服务器#pool 2.centos. iburst#指定上层NTP服务器为阿里云NTP服务器server iburstserver iburstserver iburst#(可选配置)本机向上层NTP服务器请求数据时,可进行限制的一些配置#acquisitionport 1123固定本机请求的源端口(对于穿越防火墙时,有利于防火墙统一配置策略)#bindacqaddress 192.168.1.1 固定本机请求数据包使用的源IP地址#bindacqdevice eth0 固定本机请求数据包的源网络接口driftfile /var/lib/chrony/driftmakestep 1.0 3rtcsync# Allow NTP client access from local network.#allow 192.168.0.0/16# Serve time even if not synchronized to a time source.#local stratum 10keyfile /etc/chrony.keysleapsectz right/UTClogdir /var/log/chrony
4.3 Chronyd作为客户端运行,和上层NTP同步时间;且Chronyd作为服务端运行,向本地子网提供NTP服务
Chronyd在和上层NTP进行同步时间同时,Chronyd作为服务端向本地子网提供NTP时间同步服务,需要在配置文件中配置allow指令,通过allow指令可以允许特定的本地子网向本机进行NTP时间同步,在allow范围之外的主机、子网将无法和本机进行NTP时间同步
#为了方便查看,这里删除一些注释行#默认配置中pool指令已指定了一台上层NTP服务器#pool 2.centos. iburst#指定上层NTP服务器为阿里云NTP服务器server iburstserver iburstserver iburst#(可选配置)本机向上层NTP服务器请求数据时,可进行限制的一些配置#acquisitionport 1123固定本机请求的源端口(对于穿越防火墙时,有利于防火墙统一配置策略)#bindacqaddress 192.168.1.1 固定本机请求数据包使用的源IP地址#bindacqdevice eth0 固定本机请求数据包的源网络接口driftfile /var/lib/chrony/driftmakestep 1.0 3rtcsync#允许特定的本地子网向本机进行NTP时间同步allow 192.168.0.0/16allow 172.16.0.0/12allow 10.0.0.0/8allow all //允许所有allow 0/0 //允许所有IPv4#(可选配置)定义本机chronyd服务监听的IP、端口、网卡#bindaddress 192.168.1.1#binddevice eth0#port 123# Serve time even if not synchronized to a time source.#local stratum 10keyfile /etc/chrony.keysleapsectz right/UTClogdir /var/log/chrony
特定时候,为了安全等因素考虑,可以通过port命令修改chronyd提供的NTP服务监听的端口,通过binddevice命令限制chronyd监听的网卡,若本机上有多个IP地址,可以通过bindaddress命令绑定本机监听的IP地址
4.4 在隔离的网络中,使用chronyd作为NTP服务端,为本地子网同步时间
某些时刻,在一个隔离的网络中(无互联网连接),需要本地子网中的所有主机时间一致(准不准不重要),这里通过local命令,配置即使本机上的chronyd上层NTP服务器不可达的情况下,仍然将本机的时间同步给本地子网中的客户端,配置如下:
#为了方便查看,这里删除一些注释行#默认配置中pool指令已指定了一台上层NTP服务器#pool 2.centos. iburst#指定上层NTP服务器为阿里云NTP服务器server iburstserver iburstserver iburst#(可选配置)本机向上层NTP服务器请求数据时,可进行限制的一些配置#acquisitionport 1123固定本机请求的源端口(对于穿越防火墙时,有利于防火墙统一配置策略)#bindacqaddress 192.168.1.1 固定本机请求数据包使用的源IP地址#bindacqdevice eth0 固定本机请求数据包的源网络接口driftfile /var/lib/chrony/driftmakestep 1.0 3rtcsync#允许特定的本地子网向本机进行NTP时间同步allow 192.168.0.0/16allow 172.16.0.0/12allow 10.0.0.0/8allow all //允许所有allow 0/0 //允许所有IPv4#(可选配置)定义本机chronyd服务监听的IP、端口、网卡#bindaddress 192.168.1.1#binddevice eth0#port 123#无论自己时间对不对都将自己的时间同步给本地子网中的客户端(可用于隔离的网络中)local#指定本地的NTP层级,用于报给给客户端local stratum 8keyfile /etc/chrony.keysleapsectz right/UTClogdir /var/log/chrony
上面配置中通过local、local stratum 8指令指定了隔离网络中依然向本地子网提供NTP服务,并把本机的时间同步给客户端,并向客户端报告本机的NTP层级为8(该层级你可以手动进行指定,这里我配置为8)
修改配置后,记得重启chronyd服务
上面配置文件中存在2种情况:
同时存在local字段配置和server字段配置:这种情况下,当本机的上层NTP服务器可达时,本机通过chrony运行为客户端模式上上层NTP服务器同步时间,且同时运行为服务端模式,向本地子网提供NTP服务;该情况下,配置中的local指令会被忽略,本地子网中的客户端查看到的本地服务器的NTP层级为该服务器上层级别+1,例如本地服务器中配置的上层NTP服务器为2层,那么本地子网中的客户端查询到的本地服务器的层级则为2+1=3层,配置中的local stratum 8不生效仅存在local字段配置:该chronyd仅作为服务端,无论本机的时间对不对,都将本机的时间同步给本地子网中的主机,这时,本地子网中的主机查询到的本地NTP服务器层级则为local startum 8中配置的层级
上面这2种情况下,allow字段都需要存在
4.5 chronyc命令解释
该命令是chronyd守护进程的命令行控制界面,chronyc有2个有用的选项如下:
chronyc 命令-h host指定联系到运行chronyd的主机上-p port指定chronyd用于监控连接的端口号,默认为udp323连接到指定机器上的chronyd服务端chronyc -h 192.168.1.1 -p 1123不加这2个参数默认表示连接到本机的chronyd上
该命令有一些有用的选项来监控chronyd服务端的状态信息,这里选取了几个,下面进行简单的介绍
source指令:该命令用于显示chronyd中的服务器状态,语法为sources [-a][-v],加上[-a]选项的话,表示所有源都会显示(all),包括未知的源,示例如下:
[root@us2 ~]# chronyc -a sources210 Number of sources = 2MS Name/IP address Stratum Poll Reach LastRx Last sample==========================================================================^* 120.25.115.20 2 6 176 +1317us[+7993us] +/- 16ms^- 203.107.6.88 2 6 175 -6810us[-6810us] +/- 43ms相关字段解释:M列:表示源的模式,^表示server,=表示peer,#表示本地连接的参考时钟S列:表示源的选择状态*表示当前用于同步时间的最佳源+表示用于同步的其他源,这些源和最佳源相结合-表示被认为可以选择用于同步但是当前未选择的源x表示认为是虚假信息的来源(即他的时间和大多数其他来源、或使用trust选项指定的来源不一致)~表示其时间有太多可变性?表示由于其他原因不能选择用于同步的源(例如无法访问,未同步,没有足够的测量值等)Stratum列:该服务器的NTP层级(这里显示阿里云的NTP服务器层级为2)Poll列:源的轮询速率,表示2的几次方,这里6表示2的6次方,为64,表示每64秒进行一次NTP测量
sourcestats指令:用来查看有关chronyd当前正在检查的每个源的时间偏移量,等估计过程等信息,语法格式为sourcestats [-a][-v],使用[-a]选项的话,会显示所有源
[root@us2 ~]# chronyc -a sourcestats 210 Number of sources = 2Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev==========================================================================120.25.115.20 23 13 28m+0.0031.263 +345ns 693us203.107.6.888 7 583-1.1665.425 -9714us 512us相关字段的解释:NP:当前为服务器保留的样本数,通过对这些点执行线性回归来估计漂移率、电流漂移NR:最后一次回归后具有相同符号的残差的运行次数,如果这个数字相对于样本数开始变得太小,如果运行次数太少,chronyd丢弃样本并重新运行回归,直到运行次数变得可以接受Span列:旧样本和最新样本之间的间隔时间,如果未显示单位表示默认单位为sFrequency列:服务器的估计剩余频率Freq Skew列:Freq估计误差范围Offset列:源的估计偏移量Std Dev列:估计的样本标准差
clients命令:该命令用于列出通过NTP、NTS-KE端口访问本机NTP服务的客户端列表(不包括UNIX套接字的访问),仅记录通过访问检查指令的主机(使用allow、deny、cmdallow、cmddeny命令或配置文件指令设置的主机)
[root@us2 ~]# chronyc -n clientsHostname NTP Drop Int IntL LastCmd Drop Int Last=========================================================================192.168.111.23 50 4 - 61 00 --相关列的解释:NTP列:从客户端收到的NTP数据包数量Drop列:为了限制响应速率而丢弃的NTP数据包数量Int列:NTP数据包之间的平均间隔IntL列:限制响应速率后NTP包之间的平均间隔Last列:自收最后一个NTP数据包以来的时间Cmd列:从客户端接收到的命令包或NTS-KE连接数Drop列:为限制响应速率而丢弃的命令包或NTS-KE连接数Int列:命令包或NTS-KE连接之间的平均间隔Last列:自收到最后一个命令包或NTS-KE连接以来的时间
4.6 chronyd命令解释
该命令为chrony的守护进程,该程序在启动的时候,如果没有在命令行指定配置文件,那么程序会从默认位置/etc/chrony.conf读取配置文件,输出的信息、告警记录到syslog中
chronyd命令解释:-4主机名将仅解析为IPv4地址,并且仅创建IPv4套接字-6主机名将仅解析为IPv6地址,并且仅创建IPv6套接字-f file指定配置文件的位置(/etc/chrony.conf)-n在此模式下运行时,程序将不会与终端分离-d在这种模式下运行时,程序不会将自身与终端分离,并且所有消息都将被写入终端,而不是syslog,当chronyd使用调试支持进行编译时,此选项可以使用两次来打印调试消息,该模式主要用于调试-l file此选项指定应用于记录日志的文件,而不是syslog或terminal-q在此模式下运行时,chronyd将设置系统时钟一次并退出。它不会从终端分离-Q该选项与-q选项相似,不同之处在于它仅打印偏移量而不对时钟进行任何更正,并且允许chronyd在没有root特权的情况下启动-pchronyd会输出配置并退出,该选项常常用于验证配置文件语法-r删除之前保存的每个NTP源的历史测量文件,这些文件是由dumpdir指令配置的-s将系统时钟设置为计算机的RTC或由driftfile指令指定的文件的最后的修改时间,RTC仅在Linux上受支持-U禁用对root权限的检查,并以非root用户下启动chronyd
五、总结
可以看出,chronyd和ntpd在配置文件中,很多配置部分都很类似,但有一定的差别
当下更加推荐chronyd服务
本文简要概述了几个NTP协议的软件实现,关于这几个NTP实现的详细信息请参考其官方网站
ntpd官方网站:
chronyd官方网站:chrony – Introduction