网络时间协议(NTP)用来同步网络上不同主机的系统时钟。所有受管理的主机可以与一台名为NTP服务器的指定时间服务器同步时间。另一方面,NTP服务器则与任何公共NTP服务器或者你所选择的任何服务器同步自己的时间。所有NTP管理的设备其系统时间同步时可以精确到毫秒级。
由于制造方面的差异,所有(非原子)时钟并不完全以一样的速度运行。有些时钟往往走得快点,而有些时钟走得慢点。所以经过一段很长的时间后,一个时钟的时间与另一个时钟逐渐发生偏差,导致所谓的“时钟漂移”或“时间漂移”。为了尽量减小时钟漂移影响,使用NTP的主机应该定期与指定的NTP服务器进行联系,保持时钟同步。
不同主机之间的时间同步对计划备份、入侵检测日志、分布式任务调度或事务簿记之类的事务而言很重要,甚至可能是监管合规所需要的一个要求。
NTP时钟以分层层次结构来加以组织。该层次结构中的每一层被称为层(stratum)。层这个概念描述了某机器距离权威时间源有多少个NTP跳。
Stratum 0含有几乎没有时间漂移的时钟,比如原子钟。这些时钟无法通过网络直接使用。Stratum N(N 》 1)服务器对照Stratum N-1服务器同步其时间。Stratum N时钟可以通过网络彼此连接。
NTP最多可支持层次结构中的15层。Stratum 16被认为不同步、无法使用。
NTP提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。 NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。按照离外部UTC 源的远近将所有服务器归入不同的Stratun(层)中。Stratum-1在顶层,有外部UTC接入,而Stratum-2则从Stratum-1获取时间,Stratum-3从Stratum-2获取时间,以此类推,但Stratum层的总数限制在15以内。所有这些服务器在逻辑上形成阶梯式的架构相互连接,而Stratum-1的时间服务器是整个系统的基础。
计算机主机一般同多个时间服务器连接, 利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间。即使主机在长时间无法与某一时间服务器相联系的情况下,NTP服务依然有效运转。
为防止对时间服务器的恶意破坏,NTP使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。
在基本条件下,NTP客户端发出时间请求,与时间服务器交换时间,这个交换的结果是,客户端能计算出时间的延迟,它的弥补值,并调整与服务器时间同步。通常情况下,在设置的初始,在5至10分钟有内6次交换。 一旦同步后,每10分钟与服务器时间进行一次同步,通常要求单一信息交换。冗余服务器和不同的网络路径用于保证可靠性的精确度,除了客户端/服务器商的同步以外,NTP还支持同等计算机的广播同步。NTP在设计上是高度容错和可升级。时间按NTP服务器的等级传播。
主/被动对称模式(broadcast/multicast):一对一的连接,双方均可同步对方或被对方同步,先发出申请建立连接的一方工作在主动模式下,另一方工作在被动模式下。此方式适用于配置冗余的时间服务器,可以提供更高的精确度给主机。
客户/服务器模式(client/server):与主/被动模式基本相同。唯一区别在于,客户方可被服务器同步,但服务器不能被客户同步。
广播模式:一对多的连接,服务器不论客户工作在何种模式下,主动发出时间信息,客户由此信息调整自己的时间,此时网络延时d2忽略,因此在准度上有损失,但可满足秒级应用。广播模式而且配置非常的简单。但是此方式的精确度并不高,对时间精确度要求不是很高的情况下可以采用。
上述三种方式,时间信息的传输都使用UDP协议。每一个时间包内包含最近一次的事件的时间信息、包括上次事件的发送与接收时间、传递现在事件的当地时间、及此包的接收时间。在收到上述包后即可计算出时间的偏差量与传递资料的时间延迟。时间服务器利用一个过滤演算法,及先前八个校时资料计算出时间参考值,判断后续校时包的精确性,一个相对较高的离散程度,表示一个对时资料的可信度比较低。仅从一个时间服务器获得校时信息,不能校正通讯过程所造成的时间偏差,而同时与许多时间服务器通信校时,就可利用过滤算法找出相对较可靠的时间来源,然后采用它的时间来校时。
#centos 已经默认已经安装了NTP,Ubuntu等系统可用如下命令安装。
wget http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-4.2.8p12.tar.gz
tar -xzvf ntp-4.2.8p12.tar.gz
cd ntp-4.2.8p12
./configure
make
make install
安装完成后会在/etc下添加ntp.conf配置文件,默认启动使用该文件
使用场景:局域网
server :192.168.1.102
client :192.168.1.103
身份认证 :启用
运行命令 vim /etc/ntp.conf
打开配置文件
# 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
#default表示 地址0.0.0.0,掩码0.0.0.0 意为任意IP
#不允许所有IP操作 -6表示ipv6
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
#这是允许本机查询
restrict 127.0.0.1
restrict -6 ::1 # 6指ipv6
#在192.168.1.0/24网段内的服务器就可以通过这台NTP Server进行时间同步了
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# Use public servers from the pool.ntp.org project.
# 公共的NTP服务地址,因为该服务仅在内网使用,且该主机为服务器,所以配置本机地址
server 127.127.1.0
#NTP使用伪IP地址127.127.8.n 访问安装在本地计算机上的Meinberg无线电时钟。为了访问自己的系统时钟,也称为本地时钟,NTP使用伪IP地址127.127.1.0。此IP地址不得与127.0.0.1混淆,后者是本地主机的IP ,即计算机的环回接口。
#stratum 层次 根据上层server的层次而设定 作为局域网的time service provider,通常将stratum设置为10
fudge 127.127.1.0 stratum 10
# 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.
# 定义1~65535个key 客户端的需要与服务器端的内容一致
keys /etc/ntp/keys
# Specify the key identifiers which are trusted.
# 指定/etc/ntp/keys文件种信任的key,只有指定的key才可以与服务器同步
trustedkey 1 2
#由于身份验证涉及额外计算,因此关键字authdelay指定此时间量
authdelay 0.000094
# 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
运行命令 vim /etc/ntp.conf
打开密钥文件,添加密钥
# PLEASE DO NOT USE THE DEFAULT VALUES HERE.
1 M 1111111
2 M 5555555
运行命令 vim /etc/ntp.conf
打开配置文件
# 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
# 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
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# 指定服务器地址 和key
server 192.168.1.102 key 1
# 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
运行命令 vim /etc/ntp/keys
打开密钥文件,添加密钥
# PLEASE DO NOT USE THE DEFAULT VALUES HERE.
1 M 1111111
2 M 5555555
运行命令 vim /etc/sysconfig/ntpd
打开系统配置文件,配置硬件同步
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
#允许硬件系统时间同步
SYNC_HWCLOCK=yes
运行命令service ntpd start
分别启动服务端和客户端的服务,启动后的5分钟内会进行初始化等操作,在5分钟后开始同步时间,同时需要注意的是客户端和服务端时间相差1000s时,客户端的NTP会停止,需要手动调节系统时间。
也可运行ntpd -d
命令DEBUG模式启动
运行 watch ntpq -p
命令 可实时查看ntp的运行情况,执行指令后出现如下界面
指令“ntpq -p”可以列出目前我们的NTP与相关的上层NTP的状态,以上的几个字段的意义如下:
remote:即NTP主机的IP或主机名称。注意最左边的符号,如果由“+”则代表目前正在作用钟的上层NTP,如果是“*”则表示也有连上线,不过是作为次要联机的NTP主机。
refid:参考的上一层NTP主机的地址
st:即stratum阶层
when:几秒前曾做过时间同步更新的操作
poll:下次更新在几秒之后
reach:已经向上层NTP服务器要求更新的次数
delay:网络传输过程钟延迟的时间
offset:时间补偿的结果
jitter:Linux系统时间与BIOS硬件时间的差异时间
以centos为例,检查ntp服务是否开机启动,将其设置为开机启动。
[root@localhost ~]# chkconfig --list ntpd
ntpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost ~]# runlevel
N 3
[root@localhost ~]# chkconfig ntpd on #在运行级别2、3、4、5上设置为自动运行
[root@localhost ~]# chkconfig --list ntpd
ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@localhost ~]#
如果要设置在运行级别上自动运行,可以使用下面命令
chkconfig --level 345 ntpd on
restrict address [mask mask] [ippeerlimit int] [flag ...]
address IP地址
mask 子网掩码
ippeerlimit 将每个IP的对等请求数量限制为int,其中值为-1意味着“无限”,默认值-1,0的值表示“没有”。通常每个IP最多有1个对等请求,但是如果远程对等请求位于代理之后,那么每个IP很可能超过1个
flag 限制限制策略,没有flag表示给予对服务器的自由访问,这些标志通常可以分为两类,一类是限制时间服务的标志,另一类是限制信息查询和尝试对服务器进行运行时重新配置的标志。可以指定下列标志中的一个或多个flag参数
ignore
拒绝所有类型的包,包括NTPQ(1)和NTPDC(1)查询。
kod
如果在发生访问违规时设置此标志,则发送KISS O’-死亡(KOD)分组。KOD数据包的速率被限制为不超过每秒一个。如果另一个KOD包发生在最后一个之后的1秒内,则丢弃该分组。
limited
如果包间隔违反了丢弃命令中指定的下限,则拒绝服务。使用NTPD(1)的监视能力来保持客户端的历史。因此,只要有限制标志的限制条目,监视总是有效的。
lowpriotrap
声明匹配主机设置的陷阱为低优先级。服务器可以保持的陷阱数量有限(当前限制为3)。陷阱通常是在先到先服务的基础上分配的,后来的陷阱请求者被拒绝服务。此标志通过允许低优先级陷阱被稍后对正常优先级陷阱的请求覆盖来修改分配算法。
noepeer
否认短暂的同侪请求,即使他们来自一个经过验证的来源。注意,使用对称密钥进行身份验证的能力可以通过ntpkey文件的第三字段限制到一个或多个IPS或子网。默认情况下,不启用此限制,以保持向后兼容性。
nomodify
拒绝尝试修改服务器状态的ntpq(1)和ntpdc(1)查询(即运行时重新配置)。返回信息的查询被提交。
noquery
拒绝ntpq(1)和ntpdc(1)查询。时间服务不受影响。
nopeer
拒绝未经验证的数据包,这将导致新的关联。这包括当不存在配置的关联时,广播和对称活动分组。它还包括池关联,因此,如果您想使用池指令中的服务器,并且默认使用nopeer,则需要一个限制源…行也不包括nopeer指令。
noserve
拒绝ntpq(1)和ntpdc(1)查询以外的所有数据包。
notrap
拒绝为匹配主机提供模式6控制消息陷阱服务。陷阱服务是NTPQ(1)控制消息协议的子系统,它被远程事件日志记录程序所使用。
notrust
拒绝服务,除非数据包被加密验证。
ntpport
这实际上是匹配算法修饰符,而不是限制标志。它的存在使得限制条目只有在数据包中的源端口是标准的NTP UDP端口(123)时才匹配。可以指定ntpport和non-ntpport。ntpport被认为是更具体的,然后在列表中进行排序。
version
拒绝与当前NTP版本不匹配的数据包。
使用之前得弄清楚一个问题,ntpd与ntpdate在更新时间时有什么区别。ntpd不仅仅是时间同步服务器,他还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。
时钟的跃变,对于某些程序会导致很严重的问题。许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即,取得的时间是线性的,一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday(2)设置系统时间,这有几个非常明显的问题:
第一,这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。
第二,这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。
第三,这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。
因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。
NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。