ntpd时钟同步服务

CentOS配置时间同步NTP

原因很简单,ntpd是步进式的逐渐调整时间,而ntpdate是断点更新,比如现在服务器时间是9.18分,而标准时间是9.28分,ntpd会在一段时间内逐渐的把时间校准到与标准时间相同,而ntpdate会立刻把时间调整到9.28分,如果你往数据库内写入内容或在其他对时间有严格要求的生产环境下,产生的后果会是很严重的。(注:当本地时间与标准时间相差30分钟以上是ntpd会停止工作)

NTP通信协议原理

  1. 首先主机启动NTP。
  2. 客户端会向NTP服务器发送调整时间的message。
  3. 然后NTP server会送出当前的标准时间给client
  4. client接受来自server的时间后,会根据这个信息来调整自己的时间。这样就实现了网络对时。

NTP这个deamon采用了UDP 123端口。当我们要利用Tim server来进行实践的同步更新时,就需要使用NTP软件提供的ntpdate来连接端口123

相关的命令和配置文件

安装与配置

restrict [address] mask [netmask_ip] [parameter]

其中parameter的参数主要有:
ignore     :    拒绝所有类型的ntp连接
nomodify   :    客户端不能使用ntpc与ntpq两支程式来修改服务器的时间参数
noquery    :    客户端不能使用ntpq、ntpc等指令来查询服务器时间,等于不提供ntp的网络校时
notrap     :    不提供trap这个远程时间登录的功能
notrust    :    拒绝没有认证的客户端
nopeer     :    不与其他同一层的ntp服务器进行时间同步

验证与状态检查

如果所有远程服务器的jitter值是4000并且delay和reach的值是0,那么说明时间同步是有问题的。

可能的原因是防火墙阻断了与server之间的通讯,即123端口是否正常开放;

此外每次重启NTP服务器之后大约要3-5分钟客户端才能与server建立正常的通讯连接,否则你在客户端执行“ntpdate 服务器ip”的时候将返回:

27 Jun 10:20:17 ntpdate[21920]: no server suitable for synchronization found

启动NTPD

我采用了一个很笨的办法来手动启动ntpd,而不是把ntpd加入服务,写一个简单的脚本

vi ntpstart.sh
ntpdate cn.pool.ntp.org
ntpdate cn.pool.ntp.org
service ntpd start

然后加入/etc/rc.local:

/shpath/ntpstart.sh

这是因为我有一台服务器启动后的时间总是与标准时间差别很大,每次启动后ntpd要花很多时间才能把时间校准,所以我是先在系统启动后ntpdate更新两次,然后再启动ntpd服务,在freebsd里好像有修改配置文件,让时间服务器在系统启动之前启动的,centos还没仔细琢磨。

客户端配置

更详细的介绍参见台湾 鸟哥的Linux私房菜: http://linux.vbird.org/linux_server/0440ntp.php

附录

中国国家授时中心(陕西西安) 210.72.145.44
上海: 61.129.66.79 (t2.hshh.org) 61.129.42.44 (ntp.fudan.edu.cn) 202.120.2.101 (ntp.sjtu.edu.cn)
浙江 218.75.4.130 (t1.hshh.org)
内蒙古 218.21.130.42 (t1.hshh.org)
香港: 137.189.11.66 (clock.cuhk.edu.hk ) 137.189.11.128 (ntp.cuhk.edu.hk )
台湾: 220.130.158.52(time.stdtime.gov.tw) 220.130.158.72(Clock.stdtime.gov.tw)
220.130.158.51(tick.stdtime.gov.tw) 220.130.158.54(watch.stdtime.gov.tw)
asia.pool.ntp.org, 更多亚洲服务器请参考 http://www.pool.ntp.org/zone/asia
cn.pool.ntp.org, 更多中国服务器请参考 http://www.pool.ntp.org/zone/cn
tw.pool.ntp.org, 更多中国台湾服务器请参考 http://www.pool.ntp.org/zone/tw
hk.pool.ntp.org, 更多中国香港服务器请参考 http://www.pool.ntp.org/zone/hk

12/02/15补充:
取消ntpd自动启动,在系统启动时,指定ntpdate远程标准时间服务器两次,然后service ntpd start
好像也可以修改rc.conf或者加上一堆什么参数来实现,我偷懒用这个笨办法来保证时间的准确了

解决ntp的错误

解决ntp的错误 no server suitable for synchronization found

当用ntpdate -d 来查询时会发现导致 no server suitable for synchronization found 的错误的信息有以下2个:

错误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同步上。

以下的定义是让NTP Server和其自身保持同步,如果在/ntp.conf中定义的server都不可用时,将使用local时间作为ntp服务提供给ntp客户端。

server 127.127.1.0
fudge 127.127.1.0 stratum 8

在ntp server上重新启动ntp服务后,ntp server自身或者与其server的同步的需要一个时间段,这个过程可能是5分钟,在这个时间之内在客户端运行ntpdate命令时会产生no server suitable for synchronization found的错误。

那么如何知道何时ntp server完成了和自身同步的过程呢? 在ntp server上使用命令:

watch ntpq -p

出现画面:
Every 2.0s: ntpq -p                                                                                                             Thu Jul 10 02:28:32 2008
     remote           refid      st t when poll reach   delay   offset jitter
==============================================================================
 192.168.30.22   LOCAL(0)         8 u   22   64    1    2.113 179133.   0.001
 LOCAL(0)        LOCAL(0)        10 l   21   64    1    0.000   0.000  0.001

注意LOCAL的这个就是与自身同步的ntp server。

注意reach这个值,在启动ntp server服务后,这个值就从0开始不断增加,当增加到17的时候,从0到17是5次的变更,每一次是poll的值的秒数,是64秒*5=320秒的时间。

如果之后从ntp客户端同步ntp server还失败的话,用ntpdate –d来查询详细错误信息,再做判断。

错误2.Server dropped: no data

从客户端执行ntpdate –d时有错误信息如下:

ntpdate -d 192.168.30.22

transmit(192.168.30.22)
transmit(192.168.30.22)
transmit(192.168.30.22)
transmit(192.168.30.22)
transmit(192.168.30.22)
192.168.30.22: Server dropped: no data
server 192.168.30.22, port 123
.....
28 Jul 17:42:24 ntpdate[14148]: no server suitable for synchronization found

出现这个问题的原因可能有两个:

1.检查ntp的版本,如果你使用的是ntp4.2(包括4.2)之后的版本,在restrict的定义中使用了notrust的话,会导致以上错误。使用以下命令检查ntp的版本:ntpq -c version。下面是来自ntp官方网站的说明:

The behavior of notrust changed between versions 4.1 and 4.2.
In 4.1 (and earlier) notrust meant "Don't trust this host/subnet for time".
In 4.2 (and later) notrust means "Ignore all NTP packets that are not cryptographically authenticated." This forces remote time servers to authenticate themselves to your (client) ntpd

解决:把notrust去掉。

2.检查ntp server的防火墙。可能是server的防火墙屏蔽了upd 123端口。 可以用命令service iptables stop来关掉iptables服务后再尝试从ntp客户端的同步,如果成功,证明是防火墙的问题,需要更改iptables的设置。