从零开始linux学习--搭建一台NTP Server (八)
之前两章笔者尝试搭建了dhcp服务器,不但可以在专网中统一的管理分配地址,还可以统一下发dns等option信息,实现网络中设备的统一管理。回顾第六章笔者看到的请求报文中,其中客户端option 55请求了dns、router、netmask等字段信息,并从dhcp服务器得到反馈。另外笔者注意到option 42的字段,客户端在请求了一个Network Time Protocol Server时,未能在offer报文中得到反馈。

没有得到dhcp服务器反馈是一个挺正常的事情,笔者网络中根本没有Network Time Protocol Server这台设备。正好,查阅了一些资料,本章笔者决定搭建一台NTP server。
对于多数带有计时功能的设备而言,其硬件内部都是有一个硬件时钟的,比如我们常见的台式电脑和笔记本电脑,都会在主板上安装一个纽扣电池,利用这个纽扣电池的供电使得设备在断电断网的情况下仍能保证正常计时。不过对于任何硬件时钟都不能准确没有偏差,如果两天电脑一台每天慢1s,一台每天快1s,那么一年365天过后两台设备也会相差10多分钟。这还只是设备偏差1±0.0000116s的情况,实际上某些设备会受到硬件成本、老化、空气湿度、灰尘等各种方面的影响偏差量会更大。
一年十多分钟的偏差对于家用的挂钟、秒表等影响确实不大,但对于服务器设备,尤其是网络中的一些日志记录服务器、摄像头等设备影响还是很大。这时候人们就开始思考,是否可以有一个设备,它拥有自动校准时间的功能,比如每天晚上07:00的时候看着新闻联播把误差产生的1s时间给调整好,最简单的方法就是服务器可以通过网络找到一台比较准时的时间服务器,用于时间校对。
时区的概念大家多少有点印象,笔者作为一名地理不及格的理科生,也大概知道某个地方是什么子午线。这些对于计算机工程应用来讲没什么大用处,笔者关心的只是计算机上采用的什么标准时间,如何量度的。首先先登录上节的设备,老规矩:
关闭dhcp服务:/bin/systemctl stop dhcpd.service
确认dhcp服务状态:/bin/systemctl status dhcpd.service
看一下笔者现在的服务器是什么时间:date

时间没有问题,但是时间后面有一个之前没有见过的概念CST,查了一下,即是标识了中国标准时间。
在NTP协议中定义了一系列复杂的算法用于系统的校时。笔者大致理了一下思路,假设有台时间正确的服务器A,有台时间偏差的服务器B,在A\B进行时间校准的时候B服务器会在NTP报文中插入发送消息的时间戳t1,当服务器A收到来自B服务器的报文之后在时间戳t1后继续加上A接收到报文的时间戳t2,当服务器A对服务器B进行反馈时,再继续在t2后增加时间戳t3并发送;最后,B服务器在时间t4收到这次交互的完整报文。这时,通过四个时间节点,就可以计算出正确的网络时间。如下所示。

RFC定义的相关算法非常复杂,但是对于工程应用而言,只需要从上层提供服务的NTP server上获取时间就可以了,关于同步算法就交给软件来实现吧。
目前阿里云等一些运营商都开始提供NTP服务器供网络用户使用。笔者呢,则打算从ntp官方网站上来进行时间同步:http://www.pool.ntp.org/zh/use.html
知识回顾了一遍,笔者就开始进行这次NTP server的搭建,明确下本节的目的:1.从园区网络同步上层的ntp时间;2.由于笔者专网之中没有ntp服务器,所以将该服务器作为ntp server对专网中的设备提供时间校准。
安装ntp服务软件,很简单:yum list | grep ntp

yum install ntp.x86_64
安装就完成了。
下面笔者首先进行第一步,从上层服务器同步时间:
ntp的配置文件只有一个/etc/ntp.conf,笔者对这个文件进行备份:cp/etc/ntp.conf /etc/ntp.conf.old

对文件ntp.conf进行修改:vi /etc/ntp.conf

配置文件如上一段标识了一些ntp服务器的信息,按照其格式,笔者将上层服务修改为官网上的服务器即可。


iburst当上层服务器不可用时,会发送包进行检测。笔者目前不是很需要,所以定义了一个优先的服务器0.pool.ntp.org,服务不可用了就算了,继续从下面两个服务器同步。
另一方面,笔者需要对专网内的用户提供NTP服务,看配置文件如下一段配置:

查了一下restrict default的说明,唯一有疑问的noquery参数,该参数说明用户端不能使用ntpc,ntpq查询时间服务器参数,可以进行网络校时。无误,允许笔者内网网段可以进行时间同步,按照本机127.0.0.1的格式新增如下内网IP就好了。

最后看一下同步的ntp时间和笔者之前介绍的系统时间差异日志文件位置如下:

wq!配置就完成了~
启动ntp服务:/bin/systemctl start ntpd.service
查看一下服务状态:/bin/systemctl status ntpd.service

由于ntp是采用的udp123端口进行通信,所以按照以前的以前的做法,防火墙上开通相应的udp端口。
firewall-cmd --zone=public--add-port=123/udp –permanent
firewall-cmd –reload
查看确认一下端口是否开放:firewall-cmd --list-all

最后笔者进行一次测试,检查服务器是否已经从上层服务器同步了时间:
ping 0.pool.ntp.org
先试试ping包通不通,并简单看看服务器IP地址。
ntpstat

经ntpstat命令测试发现已经从服务器120.25.108.11(0.pool.ntp.org)校准了时间467ms,并且服务器每64s从服务器进行一次时间同步。
服务器的时间同步已经完成,笔者测试一下。
专网内随便找一台交换机设备,telnet登陆看了一下系统时间,发现是2000年:

笔者华三的交换机,配置一下ntp server地址为笔者服务器专网网卡地址。

经过一些时间ntp同步,再看一下系统时间:

发现时间比着正常时间晚了8小时。由于中国时区是东八区领先UTC时间8小时,因此在交换机上配置上海的时区之后显示时间正常。
