共计 7677 个字符,预计需要花费 20 分钟才能阅读完成。
NTP全称为 Network Time Protocol,即网络时间协议。一般在 Linux 系统中用来同步集群中不同机器的时间。
本文描述的 ntp 服务部署框架如下图示
如上图,框架中的有 外网 ntp 服务器 、 内网 ntp 服务器 和内网中的其他机器。为讲解方便先作如下假设:
外网 ntp 服务器:xx.cn.pool.ntp.org
内网 ntp 服务器:10.xxx.xxx.189
内网中的其他机器:10.xxx.xxx.148 和 10.xxx.xxx.149
(189、148 和 149 等的操作系统都是 Red Hat 6.5)
机器之间的关系是这样的:
(1)外网 ntp 服务器与内网 ntp 服务器的关系:
内网 ntp 服务器 189 首先根据外网 ntp 服务器的时间,调整自己的时间至同准确时间一致,然后通过 ntpd 或 ntpdate 定时向外网 ntp 服务器同步时间。此时外网服务器为 ntp 服务器,189 为 ntp 客户端;
(2)内网 ntp 服务器与内网其他机器的关系:
在 189 的时间调整准确之后,它便可以作为 ntp 服务器为内网中的其他机器提供服务了。此时 189 为 ntp 服务端,而 148 和 149 等其他机器为 ntp 客户端。
即整个架构中 189 同时作为 ntp 服务器和客户端而存在,就像一个三世同堂的家庭中,爸爸既是爸爸也是儿子,同样的道理。
一、内网 ntp 服务器(10.xxx.xxx.189)的 设置
1、检查并安装ntp
使用rpm -qa | grep ntp 命令查看服务器是否安装了 ntp,如果出现下面两个说明已安装。
倘若没有安装,可使用 yum install -y ntp 命令进行安装(前提是服务器的 yum 可用,若是 yum 无法使用,也可以到网上找到相应的 rpm 包进行手动安装)
2、使用 ntpdate 同步 NTP 服务器时间
这一步的主要命令有两个:
(1)ntpdate 0.cn.pool.ntp.org #ntpdate修改系统时间
(2)hwclock –systohc #将硬件时间修改到与系统时间相同
由于 NTP 的限制,如果系统时间与正确的时间相差太大的话,NTP 是不会帮你做调整的——网上也有另一种说法,就是当你的时间设置和正确的时间相差很大的时候,NTP 不会直接不同步,而是会花上很长一段时间进行同步调整——关于这点我没有实际测试过,反正不管是由于哪种原因,总之我们需要先通过 ntpdate 做一个时间同步,把 189 的时间调整到跟实际相同,用到的是第(1)个命令。
2.1
首先我们要先确定好自己的时区(若时区已经正确了可略过这步)。
根据所在地点重新设置时区。以上海为例。
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #将时区设置成上海
[root@zabbix ~]# date
Mon Mar 12 18:28:42 CST 2018 #可以看到我们的时区已经设置过来了,因为时区显示为 CST 了,CST即 china standard time。
2.2
同步之前需要知道可用的外网 NTP 服务器是多少,通过 NTP 官网 http://www.pool.ntp.org 找到离自己城市最近的 NTP 服务器,如下图:
我取到的公网 NTP 服务器地址如下:
server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org
2.3
找到外网 ntp 服务器之后,接下来使用 ntpdate 将时间调准。
[root@zabbix ~]# ntpdate 0.cn.pool.ntp.org
12 Mar 14:03:12 ntpdate[19868]: step time server 85.199.214.100 offset 1114.672613 sec
注:可以执行两三遍以减少时延
执行前系统时间为下午 1 点 42 分,是错误的。
执行后系统时间修改为下午 2 点 3 分,已修改为正确时间。
注意:
(1)使用 ntpdate 修改时使用的是 跃变 的方式,就是说 ntpdate 命令是简单的将时间从某个点修改为另一个时间点,中间没有平滑的过渡。
(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 远端事件登陆的功能
notrust:客户端除非通过认证,否则指定的网段为不信任网段 #ntp4.2 之后的版本,已经默认没有这个参数,如果你添加了,会报错的。
对应默认配置项:
restrict default kod nomodify notrap nopeer noquery #默认对所有 client 拒绝所有的操作
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1 #允许本机地址的一切操作
restrict -6 ::1
3)server 参数:设定上级时间服务器(非常重要的参数,内网 ntp 服务器和客户端都需要配置)
格式: server IP 地址或域名 [prefer]
用途:IP 地址或域名即为该 NTP 服务器指定的上级 NTP 服务器。当指定多个 NTP 服务器时,使用 prefer 参数 的服务器优先级最高,如果都没有使用 prefer 参数,那么服务器的优先级则按 从上到下 的顺序依次由高到低。在指定上层服务器后,至少 15min 才会与上层 NTP 服务器进行时间校对。
默认配置项:
server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
server 2.rhel.pool.ntp.org iburst
server 3.rhel.pool.ntp.org iburst
在实际操作中我的修改只有 两点,分别为:restrict 和 server。如下图
4)ntp 服务默认只会同步系统时间。若是希望 ntp 也同时能修改机器的 硬件时间 ,则需要将硬件时间的修改加入配置文件:在/etc/sysconfig/ntpd 文件中,添加SYNC_HWCLOCK=yes
5)除此之外,还有一个文件:/etc/ntp/step-tickers
在我的实际操作中,内网 ntp 服务器 189 没有修改这个文件的也没有问题,但是内网的 ntp客户端 如 148 和 149 都配置了,不配置的话 148、149 无法与 189 进行时间同步,出现的情况为:148、149 等 ntp 客户端的 ntpd 服务虽然启动了,但是不会与 189 的 ntp 服务器进行同步,查看客户端 ntp 状态时会一直显示下图所示的状态
网上关于 step-tickers 文件的解释是:当 ntpd 服务启动时,会自动与该文件中记录的上层 NTP 服务进行时间校对。
关于 ntp.conf and step-tickers 区别:
step-tickers is used by ntpdate where as ntp.conf is the configuration file for the ntpd daemon. ntpdate is initially run to set the clock before ntpd to make sure time is within 1000 sec. ntp will not run if the time difference between the server and client by more then 1000 sec (or there about). The start up script will read step-tickers for servers to be polled by ntpdate.
默认情况下,我们配置的 NTP 服务器不会去时间源那里同步时间,所以必须修改 /etc/ntp/step-tickers 文件,加入我们的时间源,这样每次通过 /etc/init.d/ntpd 来启动服务的时候就会自动更新时间了。
4、防火墙设置
配置完成之后,其实就可以启动服务了,但是在启动之前,我们先看一下防火墙设置。
NTP 服务需要使用到UDP 端口号 123,在系统的防火墙(Iptables)启动的情况下,必须开放 UDP 端口号 123。
使用 /etc/init.d/iptables status 命令查看防火墙状态。
上图中我的防火墙在我之前安装其他服务的时候已经关闭了,所以这里不需要再设置了。但是如果你的防火墙没关。则需要按照如下步骤开放防火墙的 123 端口。
(1)/sbin/iptables -I INPUT -p udp –dport 123 -j ACCEPT #开放 udp 的 123 端口
(2)/etc/rc.d/init.d/iptables save #保存配置
(3)/etc/rc.d/init.d/iptables restart #重启防火墙服务
(4)/etc/init.d/iptables status #查看已开放端口
在服务器的防火墙开启,并且开放了 123 端口的示例:
(5)也可以使用 lsof 命令来查看某一端口是否开放:lsof -i:123
如果防火墙没有开放 UDP 端口号 123,肯定是会出问题的,到时候出错了可以直接上网查。
5.将 ntp 服务加入开机自启动
这一步其实挺有必要的,因为你的集群在部署好 ntp 服务之后,在往后项目的开发过程中都极少去关注它了,若某个时候你的某台服务器由于某些原因重启了(这总会发生的….),而你的 ntp 服务又不是开机自启动的,那么这台服务器在一段时间后就有可能时间跑偏了。
步骤如下:
(1)使用 chkconfig –list | grep ntpd 命令查看是否已将 ntp 服务加入开机自启动
(2)若没有加入,则使用 chkconfig ntpd on 命令将其加入
6.接下来就可以启动 ntpd 服务了。
(1)service ntpd start # 开启 ntp 服务
(2)service ntpd status # 查看状态
(3)service ntpd stop #停止 ntp 服务
(4)service ntpd restart #重启 ntp 服务
上图可见,在开启 ntpd 服务之后若是 立马查询 状态则有可能会出现unsynchronised。
这是由于每次重启 NTP 服务器之后大约要 3-5 分钟客户端才能与 server 建立正常的通讯连接。当此时用客户端连接服务端就会报这样的信息。一般等待几分钟就可以了。因此客户端重启 ntpd 服务之后执行 ntpstat 查看的时候有可能会出现这种情况。
NTP 服务启动之后,可以使用下面几个命令进行查看其状态。
(1)ntpstat命令 : 查看 ntp 服务器有无和上层 ntp 连通
正常连通的情况如下图所示:
(2)ntpq –p命令 : 该命令可以列出目前我们的 NTP 与相关的上层 NTP 的状态
其中:
remote:即 NTP 主机的 IP 或主机名称。注意最左边的符号,如果由 “+” 则代表目前正在作用钟的上层 NTP,如果是 “*” 则表示也有连上线,不过是作为次要联机的 NTP 主机。
refid:参考的上一层 NTP 主机的地址
st:即 stratum 阶层——理论上说,NTP 服务器是分等级(Stratum)的,Stratum = 1 的 NTP 服务器是直接和世界标准时钟同步的,包括 GPS 时间、铯原子钟、某些手机网络等。NIST、中国国家授时中心和中国教育网的第一级时间服务器都是这个级别的。Stratum = 2 的 NTP 服务器是和 Stratum = 1 的服务器同步的,性能稍差,但精确度也在毫秒的量级,所以用起来没什么区别。再往下每同步一级,Stratum 就加一。(这一段从网上摘抄过来)
when:几秒前曾做过时间同步更新的操作
poll:下次更新在几秒之后
reach:已经向上层 NTP 服务器要求更新的次数
delay:网络传输过程钟延迟的时间
offset:时间补偿的结果
jitter:Linux 系统时间与 BIOS 硬件时间的差异时间
(3)watch“ntpq –p”命令:
Ctrl + C 退出。
二、内网 ntp 客户端(10.xxx.xxx.148/149)设置
内网 ntp 客户端的设置跟内网 ntp 服务器 189 的 ntp 服务器设置其实差别不大: 在上一步中,189 是客户端,外网的 xx.cn.pool.ntp.org 是服务器;这一步,148 和 149 是客户端,189 变成服务器了。
所以在这一步的配置中,只需要把上一步中的外网服务器地址全部换成 189 的地址就可以了。
简要步骤如下:
1.rpm -qa | grep ntp 检查是否安装了 ntp
2.ntpdate 同步系统时间,并修改硬件时间
ntpdate 10.xxx.xxx.189 (两遍)
hwclock –systohc
3.修改 /etc/ntp.conf 主配置文件,添加 server
server 10.xxx.xxx.189 prefer
server 10.xxx.xxx.180
注:ntp 客户端不用修改 restrict 参数
4.修改 /etc/ntp/step-tickers, 添加 server:
server 10.xxx.xxx.189 prefer
server 10.xxx.xxx.180
5.将硬件时间的修改加入配置文件
在 /etc/sysconfig/ntpd 文件中,添加
SYNC_HWCLOCK=yes
6.防火墙的设置
/etc/init.d/iptables status
7.是否开机自启动
chkconfig –list | grep ntpd
8.启动服务并查看状态
service ntpd start
ntpstat
ntpq -p
主要的不同有两点:
(1)客户端的 /etc/ntp.conf 文件中的 restrict 参数可以不用配置,它的 /etc/ntp.conf 文件中 只需 要修改 server 来 设定 189 为它的上层时间服务器即可,其他保持默认。
(2)上一步配置内网 ntp 服务器设置时 /etc/ntp/step-tickers 是不用配置的,但是在这里的客户端设置时需要配置该文件:在该文件中加上 189,如下所示:
图中之所以有两行是因为我做了简单的负载均衡和高可用,因此用 prefer 参数 指定 189 为 首选ntp 服务器。
我这里更主要的是关注实施的步骤,更多的理论可以关注下面几篇文章,讲的非常好,我刚开始实施的时候就是看的这几篇文章,浅显易懂。
https://www.linuxidc.com/Linux/2013-11/92275.htm
https://www.linuxidc.com/Linux/2013-11/92275p2.htm
本文永久更新链接地址:https://www.linuxidc.com/Linux/2018-03/151402.htm