(2)执行ntpdate xx.cn.pool.ntp.org命令时可能会报“the NTP socket is in use”的错误,如下图:
原因:造成该错误一般是因为系统ntpd服务器正在运行中,导致udp的123端口被ntpd占用。这可以通过service ntpd status或者 ps aux | grep ntpd 命令加以验证——大部分情况都是这个原因没跑了。
解决办法:若确实是这个原因,可使用命令 service ntpd stop 终止ntpd服务。实在不行可强行kill掉ntpd对应的pid。关闭ntpd服务之后就可以继续执行命令了。如上图。
(3)还有一种可能的报错是:no server suitable for synchronization found,这种情况可能是防火墙的原因,可直接跳到下面的防火墙部分,按照步骤开启防火墙的123 udp端口即可。“可能”两字使得这句话显得不那么自信,其实我在本地虚拟机上测试时确实报过这个错误,然后我开启123端口之后就解决了,但是当时并没有留下截图。但是不管怎样,123端口是无论如何都要打开的,所以作为排错,你在这一步先设置了也未尝不可。
2.4
上面2.3步骤中同步的是系统时间,接下来使用hwclock –systohc命令(sys(系统时间)to(写到)hc(Hard Clock))将系统时间设置成硬件时间。
3、配置/etc/ntp.conf主配置文件
此时若直接用service ntpd start命令启动189的ntp服务,其实已经可以向客户端提供时间更新服务了——这是因为,只要将NTP服务器的时间设定为正确时间,再将ntp服务启动,189就可以作为ntp服务器对内网中其他机器提供服务了,无需配置它的ntp主配置文件。但是,这样是满足不了企业安全性需求的(需配置ntp.conf中的restrict参数),并且谁也无法保证在189这一次性的时间调整之后,在接下来的时间里就它的时间永远都是对的(189需定时与外网ntp服务器做时间同步)。
因此在服务器接下来的运行期间,189需要定时与外网ntp服务器做时间同步,以保证它自己的时间不会跑偏。有两种方法:
(1) ntpdate + crontab的方法。
由前面我们知道,ntpdate 0.cn.pool.ntp.org命令可以将189的时间跟外网ntp服务器进行同步,因此只需在机器上建立相应的crontab任务定时的执行该命令就可以保证189在其运行期间的时间一致性了。比如,在crontab中添加:
0 12 * * * * ntpdate 0.cn.pool.ntp.org
若是采用这种方法,到这里就可以不用继续往下看了。
(2) ntpd服务的方法。
这种方法要好过第一种方法,因为ntpdate采用跃变的方式直接将时间修改过来,对一些依赖时间的应用程序可能会有影响。理想的做法是,在开机的时候使用ntpdate强制同步时间(因为机器刚开机,机器上的许多服务还没有启动,而且即使有个别应用已经启动并且ntpdate命令对其造成影响,影响也是相对较小的),在其他时候使用ntpd服务来平滑地同步时间。
接下来讲解的主要是采用第二种方法时ntp主配置文件/etc/ntp.conf的设置,该文件中需要注意的几个参数如下:
1)driftfile参数:解决NTP服务器校准时间时的传送延迟
格式: driftfile 文件名
用途:将与上级时间服务器联系时所花费的时间,记录在driftfile参数后面指定的文件内
注意:driftfile后面必须接完整的文件路径,不能是链接文件,并且必须要有ntpd守护进程可以写入的权限。
对应默认配置项:driftfile /var/lib/ntp/drift
注:实际操作中我没改过driftfile参数
2)restrict参数:权限的控制(非常重要的参数,内网ntp服务器需修改,内网ntp客户端可不用修改)
格式:restrict IP mask 掩码 参数
用途:IP规定了允许或不允许访问的地址(此处若为default,即为0.0.0.0所有ip),配合掩码可以对某一网段进行限制。
restrict参数包括:
ignore:关闭所有NTP服务
nomodify:客户端不能修改服务端的时间,但可以作为客户端的校正服务器
noquery:不提供时间查询,即用户端不能使用ntpq,ntpc等命令来查询ntp服务器
nopeer:不与同一层的其他服务器进行时间同步
kod:kod技术可以阻止“kiss of death”包(一种DOS攻击)对服务器的破坏
notrap:不提供trap远端事件登陆的功能