Ubuntu/CentOS 配置部署 时间同步、NTP服务(chronyd,ntpd,ntpdate)
一、概述NTP服务器的阶层概念网络时间按照NTP服务器的等级进行传播,根据离基准时间的远近将不同服务器归纳到不同的层中(Stratum),单个Stratum层的总数限制在150层(Stratum 0):表示高精度设备,例如原子钟、GPS时钟等,0层也成为参考时钟1层(Stratum 1):这些设备和0层的设备相连,误差仅为微秒2层(Stratum 2):这些设备和1层的设备通过网络相连依次类推..
一、概述
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权限执行)
#安装ntpdate
CentOS中执行 yum install ntpdate
Ubuntu中执行 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
-u ntpdate为传出数据包使用非特权端口,当处于防火墙背后且知名端口被防火墙阻断时很有用,-d选项始终使用非特权端口
-v 显示更多详细信息
-U user_name ntpdate不使用root权限,并将用户ID更改为user_name,并将GroupID更改为server_user的主要组
ntpdate可以根据需要来手动设置时间,或者设置开机脚本达到每次启动时运行一次,也可以使用cron脚本来周期性运行ntpdate命令(带cron脚本的ntpdate不能替代ntpd,ntpd使用了很多复杂的算法来最大限度提高时间的准确性、可靠性,ntpdate不会约束本地主机的时钟频率,ntpdate的准确性是有限的)
使用ntpdate和NTP服务器同步一次时间
[root@ ~]# ntpdate 172.16.32.254
6 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 ntp
Ubuntu系统中执行 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.service
systemctl enable ntp.service
systemctl start ntpd.service
systemctl start ntp.service
3.1 ntpd配置文件
ntpd的服务配置文件路径为/etc/ntp.conf,该文件的默认配置如下:
#为了方便查看,这里把配置文件中一些注释行删除
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 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.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
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable 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服务器 (aliyun.com)
#为了方便查看,这里把配置文件中一些注释行删除
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 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 ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
修改配置文件后,执行service ntpd restart重启ntp服务即可(注意在Ubuntu中服务名称不带d,ntp)
可以通过ntpstat命令查看本机上一次和NTP服务器时间同步的情况
[root@localhost ~]# ntpstat
synchronised to NTP server (120.25.115.20) at stratum 3 //进行校对的NTPserver
time correct to within 956 ms //本地主机和上层NTP时间差
polling server every 64 s //下次同步时间
也可以使用ntpd -p命令查看本机和上层NTP服务器通信的情况
[root@localhost ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
======================================================================
*120.25.115.20 10.137.53.7 2 u 29 64 3 23.546 6.034 1.098
+203.107.6.88 10.137.38.86 2 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/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
#允许向特定的本地子网提供NTP服务
restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap
restrict 172.16.0.0 mask 255.240.0.0 nomodify notrap
restrict 10.0.0.0 mask 255.0.0.0 nomodify notrap
#指定server为阿里云公开NTP服务器(这里的server可以是ip地址、域名)
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
整体来说,一般情况下,配置文件的修改较为简洁,大体分为2个部分:上层NTP服务器配置,本地子网授权配置
四、Chronyd守护进程、服务
Chrony是NTP比较新的实现,chrony相比ntp有着较高的时间同步效率、准确度,推荐使用chrony
#安装chrony
CentOS中执行 yum install chrony
Ubuntu中执行 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.service
systemctl start chronyd
4.1 chronyd配置文件
chronyd的配置文件路径为/etc/chrony.conf,该文件的默认配置如下:
#为了方便查看,这里删除一些注释行
#默认配置中pool指令已指定了一台上层NTP服务器
pool 2.centos.pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
# 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 10
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
该默认配置文件中的pool指令已经指定了一个上层NTP服务器,不做任何修改的话,chrony服务能够作为NTP客户端向上层NTP服务器进行时间同步
4.2 Chronyd作为NTP客户端,并指定上层NTP服务器
这里我们指定阿里云NTP服务器 (aliyun.com)作为我们服务器的上层NTP服务器,注释掉默认配置文件中的pool指令部分,使用server指令指定上层阿里云NTP服务器,配置如下:(这里的server指令后面可以跟上域名、IP地址)
#为了方便查看,这里删除一些注释行
#默认配置中pool指令已指定了一台上层NTP服务器
#pool 2.centos.pool.ntp.org iburst
#指定上层NTP服务器为阿里云NTP服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
#(可选配置)本机向上层NTP服务器请求数据时,可进行限制的一些配置
#acquisitionport 1123 固定本机请求的源端口(对于穿越防火墙时,有利于防火墙统一配置策略)
#bindacqaddress 192.168.1.1 固定本机请求数据包使用的源IP地址
#bindacqdevice eth0 固定本机请求数据包的源网络接口
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
# 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 10
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
4.3 Chronyd作为客户端运行,和上层NTP同步时间;且Chronyd作为服务端运行,向本地子网提供NTP服务
Chronyd在和上层NTP进行同步时间同时,Chronyd作为服务端向本地子网提供NTP时间同步服务,需要在配置文件中配置allow指令,通过allow指令可以允许特定的本地子网向本机进行NTP时间同步,在allow范围之外的主机、子网将无法和本机进行NTP时间同步
#为了方便查看,这里删除一些注释行
#默认配置中pool指令已指定了一台上层NTP服务器
#pool 2.centos.pool.ntp.org iburst
#指定上层NTP服务器为阿里云NTP服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
#(可选配置)本机向上层NTP服务器请求数据时,可进行限制的一些配置
#acquisitionport 1123 固定本机请求的源端口(对于穿越防火墙时,有利于防火墙统一配置策略)
#bindacqaddress 192.168.1.1 固定本机请求数据包使用的源IP地址
#bindacqdevice eth0 固定本机请求数据包的源网络接口
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
#允许特定的本地子网向本机进行NTP时间同步
allow 192.168.0.0/16
allow 172.16.0.0/12
allow 10.0.0.0/8
allow 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 10
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
特定时候,为了安全等因素考虑,可以通过port命令修改chronyd提供的NTP服务监听的端口,通过binddevice命令限制chronyd监听的网卡,若本机上有多个IP地址,可以通过bindaddress命令绑定本机监听的IP地址
4.4 在隔离的网络中,使用chronyd作为NTP服务端,为本地子网同步时间
某些时刻,在一个隔离的网络中(无互联网连接),需要本地子网中的所有主机时间一致(准不准不重要),这里通过local命令,配置即使本机上的chronyd上层NTP服务器不可达的情况下,仍然将本机的时间同步给本地子网中的客户端,配置如下:
#为了方便查看,这里删除一些注释行
#默认配置中pool指令已指定了一台上层NTP服务器
#pool 2.centos.pool.ntp.org iburst
#指定上层NTP服务器为阿里云NTP服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
#(可选配置)本机向上层NTP服务器请求数据时,可进行限制的一些配置
#acquisitionport 1123 固定本机请求的源端口(对于穿越防火墙时,有利于防火墙统一配置策略)
#bindacqaddress 192.168.1.1 固定本机请求数据包使用的源IP地址
#bindacqdevice eth0 固定本机请求数据包的源网络接口
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
#允许特定的本地子网向本机进行NTP时间同步
allow 192.168.0.0/16
allow 172.16.0.0/12
allow 10.0.0.0/8
allow all //允许所有
allow 0/0 //允许所有IPv4
#(可选配置)定义本机chronyd服务监听的IP、端口、网卡
#bindaddress 192.168.1.1
#binddevice eth0
#port 123
#无论自己时间对不对都将自己的时间同步给本地子网中的客户端(可用于隔离的网络中)
local
#指定本地的NTP层级,用于报给给客户端
local stratum 8
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /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 sources
210 Number of sources = 2
MS Name/IP address Stratum Poll Reach LastRx Last sample
==========================================================================
^* 120.25.115.20 2 6 17 6 +1317us[+7993us] +/- 16ms
^- 203.107.6.88 2 6 17 5 -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 = 2
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
==========================================================================
120.25.115.20 23 13 28m +0.003 1.263 +345ns 693us
203.107.6.88 8 7 583 -1.166 5.425 -9714us 512us
相关字段的解释:
NP:当前为服务器保留的样本数,通过对这些点执行线性回归来估计漂移率、电流漂移
NR:最后一次回归后具有相同符号的残差的运行次数,如果这个数字相对于样本数开始变得太小,如果运行次数太少,chronyd丢弃样本并重新运行回归,直到运行次数变得可以接受
Span列:旧样本和最新样本之间的间隔时间,如果未显示单位表示默认单位为s
Frequency列:服务器的估计剩余频率
Freq Skew列:Freq估计误差范围
Offset列:源的估计偏移量
Std Dev列:估计的样本标准差
clients命令:该命令用于列出通过NTP、NTS-KE端口访问本机NTP服务的客户端列表(不包括UNIX套接字的访问),仅记录通过访问检查指令的主机(使用allow、deny、cmdallow、cmddeny命令或配置文件指令设置的主机)
[root@us2 ~]# chronyc -n clients
Hostname NTP Drop Int IntL Last Cmd Drop Int Last
=========================================================================
192.168.111.23 5 0 4 - 61 0 0 - -
相关列的解释:
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特权的情况下启动
-p chronyd会输出配置并退出,该选项常常用于验证配置文件语法
-r 删除之前保存的每个NTP源的历史测量文件,这些文件是由dumpdir指令配置的
-s 将系统时钟设置为计算机的RTC或由driftfile指令指定的文件的最后的修改时间,RTC仅在Linux上受支持
-U 禁用对root权限的检查,并以非root用户下启动chronyd
五、总结
可以看出,chronyd和ntpd在配置文件中,很多配置部分都很类似,但有一定的差别
当下更加推荐chronyd服务
本文简要概述了几个NTP协议的软件实现,关于这几个NTP实现的详细信息请参考其官方网站
ntpd官方网站:http://www.ntp.org
chronyd官方网站: chrony – Introduction
更多推荐
所有评论(0)