本文大纲
一、简介
二、环境说明及配置
三、测试
四、常见问题解决
###############
一、简介
        NTP 服务器【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精 准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议***。
1、特性
        NTP提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。 NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上 获取。这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。按照离外部UTC 源的远近将所有服务器归入不同的Stratum(层)中。Stratum-1在顶层,有外部UTC接入,而Stratum-2则从Stratum-1获取 时间,Stratum-3从Stratum-2获取时间,以此类推,但Stratum层的总数限制在15以内。所有这些服务器在逻辑上形成阶梯式的架构相 互连接,而Stratum-1的时间服务器是整个系统的基础。
        计算机主机一般同多个时间服务器连接, 利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间。即使主机在长时间无法与某一时间服务器相联系的情况下,NTP服务依然有效运转。
       为防止对时间服务器的恶意破坏,NTP使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。
2、网络校对
    时间服务器可以利用以下三种方式与其他服务器对时:
    broadcast/multicast
    client/server
    symmetric
        broadcast/multicast 方式主要适用于局域网的环境,时间服务器周期性的以广播的方式,将时间信息传送给其他网路中的时间服务器,其时间仅会有少许的延迟,而且配置非常的简单。 但是此方式的精确度并不高,对时间精确度要求不是很高的情况下可以采用。
        symmetric的方式得一台服务器可以从远端时间服务器获取时钟,如果需要也可提供时间信息给远端的时间服务器。此一方式适用于配置冗余的时间服务器,可以提供更高的精确度给主机。
        client/server方式与symmetric方式比较相似,只是不提供给其他时间服务器时间信息,此方式适用于一台时间服务器接收上层时间服务器的时间信息,并提供时间信息给下层的用户。
        上 述三种方式,时间信息的传输都使用UDP协议。每一个时间包内包含最近一次的事件的时间信息、包括上次事件的发送与接收时间、传递现在事件的当地时间、及 此包的接收时间。在收到上述包后即可计算出时间的偏差量与传递资料的时间延迟。时间服务器利用一个过滤演算法,及先前八个校时资料计算出时间参考值,判断 后续校时包的精确性,一个相对较高的离散程度,表示一个对时资料的可信度比较低。仅从一个时间服务器获得校时信息,不能校正通讯过程所造成的时间偏差,而 同时与许多时间服务器通信校时,就可利用过滤算法找出相对较可靠的时间来源,然后采用它的时间来校时。
注:以上简介来自于百科。

二、环境说明及配置
    1、本地服务器环境

[root@essun ~]# cat /etc/redhat-release 
CentOS release 6.5 (Final) 
#kernel version  
[root@essun ~]# uname -r
2.6.32-431.el6.x86_64
#memory
[root@essun ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         15940      10857       5082          0        481       8615
-/+ buffers/cache:       1760      14179
Swap:         2047          0       2047

 2、安装ntp服务

[root@essun ~]# yum install -y ntp   
[root@essun ~]# rpm -ql ntp |grep ntp |head -10
/etc/dhcp/dhclient.d/ntp.sh
/etc/ntp.conf   #ntp配置文件
/etc/ntp/crypto 
/etc/ntp/crypto/pw
/etc/rc.d/init.d/ntpd  #ntp服务启动文件
/etc/sysconfig/ntpd    #ntp参数配置文件
/usr/bin/ntpstat       #查看ntp服务状态文件
/usr/sbin/ntp-keygen
/usr/sbin/ntpd
/usr/sbin/ntpdc

3、配置ntp服务器

[root@essun ~]# vim /etc/ntp.conf 
#这里有默认的配置文件模板及各项参数简要说明,可以自行选择使用或自己编写。
#以下是我的配置文件内容
ftfile /var/lib/ntp/driftrestrict 
default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery#针对ipv6设置
 
# 允许本地所有操作
restrict 127.0.0.1
restrict -6 ::1
 
# 允许172.16.0.0网段
restrict 172.16.0.0 mask 255.255.0.0 nomodify notrap
 
#服务器列表
server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org
 
#加密及key文件
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
 
# 如果无法与上层ntp server通信以本地时间为标准时间
server 127.127.1.0
fudge 127.127.1.0 stratum 8

参数说明:
        1)、 driftfile(ftfile) 文件名
            侦测BIOS时钟与Linux系统时间的差异写入次文件,记录在driftfile参数后面的文件内。
        注意:  driftfile 后面接的文件需要使用完整的路径文件名,不能是链接文件,并且文件的权限需要设定成 ntpd守护进程可以写入。
        2)、权限的设定主要以 restrict 这个参数来设定,主要的语法为:
            restrict IP地址 mask 子网掩码 参数
            其中 IP 可以是IP地址,也可以是 default ,default 就是指所有的IP
            参数有以下几个:
                ignore :关闭所有的 NTP 联机服务
                nomodify:客户端不能更改服务端的时间参数,但是客户端可以通过服务端进行网络校时。
                notrust :客户端除非通过认证,否则该客户端来源将被视为不信任子网
                noquery :不提供客户端的时间查询
                notrap:  不提供trap远程事件登录的功能
                kod:kod技术可以组织一种dos***
        3)、用server这个参数设定上级时间服务器,语法为:
            server  IP地址或域名 [prefer]
            IP地址或域名就是我们指定的上级时间服务器,如果 Server 参数最后加上 prefer,表示我们的 NTP 服务器主要以该部主机时间进行校准。

三、测试
    1、启动服务

[root@essun ~]# service ntpd start
[root@essun ~]# /usr/bin/ntpstat 
synchronised to NTP server (202.112.29.82) at stratum 3    
time correct to within 37 ms   
polling server every 1024 s
[root@essun ~]# netstat -an |grep 123
udp        0      0 172.16.5.100:123            0.0.0.0:*                               
udp        0      0 114.112.175.211:123         0.0.0.0:*                               
udp        0      0 127.0.0.1:123               0.0.0.0:*                               
udp        0      0 0.0.0.0:123                 0.0.0.0:*
#查看何时ntp server完成了和自身同步的过程
[root@essun ~]# watch ntpq -p 
Every 2.0s: ntpq -p                                     Sat Oct 25 17:52:31 2014
 
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+dns2.synet.edu. 202.118.1.46     2 u   92 1024  377   82.340    2.289   0.318
 dns.sjtu.edu.cn .INIT.          16 u    - 1024    0    0.000    0.000   0.000
*dns1.synet.edu. 223.255.185.2    2 u  375 1024  377   83.362    2.974   0.184
 LOCAL(0)        .LOCL.           8 l   12   64  377    0.000    0.000   0.000

 注意LOCAL的这个就是与自身同步的ntp server。
注意reach这个值,在启动ntp server服务后,这个值就从0开始不断增加,当增加到17的时候,从0到17是5次的变更,每一次是poll的值的秒数,是64秒*5=320秒的时间。
如果之后从ntp客户端同步ntp server还失败的话,用ntpdate –d来查询详细错误信息,再做判断。
    2、客户端同步
      启动服务之后要等几分钟或者十几分钟后就可以实现时间同步了。
      客户端同步命令      

[root@essun ~]# ntpdate 172.16.5.100
25 Oct 17:59:55 ntpdate[30434]: adjust time server 172.16.5.100 offset -0.001452 sec

四、常见问题解决
    1、Server dropped: Strata too high    
        在ntp客户端运行ntpdate serverIP,出现no server suitable for synchronization found的错误。
        在ntp客户端用ntpdate –d serverIP查看,发现有“Server dropped: strata too high”的错误,并且显示“stratum 16”。而正常情况下stratum这个值得范围是“0~15”。
这是因为NTP server还没有和其自身或者它的server同步上,在服务端运行watch ntpd -p即可以查看到自身的同步情况,等同步完成后,客户再同步就可以了。
    2、Server dropped: no data
     从客户端执行netdate –d时有错误信息如下:

[root@essun ~]# ntpdate -d 172.16.5.100                                         25 Oct 18:48:25 ntpdate[2214]: ntpdate 4.2.6p5@1.2349-o Sat Nov 23 18:21:48 UTC 2013 (1)
Looking for host 172.16.5.100 and service ntp
host found : bogon
transmit(172.16.5.100)
transmit(172.16.5.100)
transmit(172.16.5.100)
transmit(172.16.5.100)
transmit(172.16.5.100)
172.16.5.100: Server dropped: no data
server 172.16.5.100, port 123
stratum 0, precision 0, leap 00, trust 000
refid [172.16.5.100], delay 0.00000, dispersion 64.00000
transmitted 4, in filter 4
reference time:    00000000.00000000  Mon, Jan  1 1900  8:05:57.000
originate timestamp: 00000000.00000000  Mon, Jan  1 1900  8:05:57.000
transmit timestamp:  d7f5fe7d.038d2774  Sat, Oct 25 2014 18:48:29.013
filter delay:  0.00000  0.00000  0.00000  0.00000 
         0.00000  0.00000  0.00000  0.00000 
filter offset: 0.000000 0.000000 0.000000 0.000000
         0.000000 0.000000 0.000000 0.000000
delay 0.00000, dispersion 64.00000
offset 0.000000

25 Oct 18:48:30 ntpdate[2214]: no server suitable for synchronization 
found

出现这个问题的原因可能有两个:
    a、检查ntp的版本,如果你使用的是ntp4.2(包括4.2)之后的版本,在restrict的定义中使用了notrust的话,会导致以上错误。
使用以下命令检查ntp的版本:

[root@essun ~]# ntpq -v 
ntpq - standard NTP query program - Ver. 4.2.4p8

   解决办法:
            把notrust去掉
    b、检查ntp server的防火墙。可能是server的防火墙屏蔽了upd 123端口或是由于跨网段导致网络不通
     解决办法:
        如果是防火墙是原因,可以将防火墙暂时关闭,再次尝试同步时间,如果成功,修改防火墙规则即可。    
        如果由于不在同一网段,那么只要添加默认的路由即可。