内网环境集群主机的时间同步
场景描述
- 内网主机之间时间不一致,需要作同步;主机多数不能连接外网,只有极少数几台能连接外网
系统环境
- centos7
- root权限
实施方案
-
内网中一台主机A (如172.16.59.25)与外网互通,通过外网 NTP 服务器同步时间
-
主机A对内网提供 NTP 服务
-
内网其他机器通过主机A进行对时
实施过程
主机A设置
# 安装NTP软件
# 方式1
yum -y install ntp
# 方式2(严格按照顺序autogen->ntpdate->ntp)
rpm -hiv autogen-libopts-5.18-5.el7.x86_64.rpm
rpm -hiv ntpdate-4.2.6p5-18.el7.centos.x86_64.rpm
rpm -hiv ntp-4.2.6p5-18.el7.centos.x86_64.rpm
# 编辑NTP配置
vim /etc/ntp.conf
ntp.conf
配置如下
driftfile /var/lib/ntp/drift
# 默认拒绝客户端所有操作
restrict default kod notrap nomodify nopeer noquery
# 允许本地操作
restrict 127.0.0.1
restrict ::1
# 允许该网段同步时间,但不可修改NTP服务器时间
restrict 172.16.59.0 mask 255.255.255.0 nomodify
# 用于NTPD的上级服务器、本机时钟的同步,以及时钟的层次stratum
server cn.ntp.org.cn prefer
server edu.ntp.org.cn iburst
# 本机时间兜底
server 127.127.1.0
fudge 127.127.1.0 stratum 8
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
# 编辑 ntpd 文件
vim /etc/sysconfig/ntpd
ntpd
文件修改如下
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
# BIOS时间也会跟随改变
SYNC_HWCLOCK=yes
# 查看状态
systemctl status ntpd.service
ntpstat
# 重启服务
systemctl restart ntpd.service
# 开机启动
systemctl enable ntpd.service
其他主机设置
# 安装 ntpdate 软件
# 方式1
yum -y install ntp
# 方式2(严格按照顺序autogen->ntpdate->ntp)
rpm -hiv autogen-libopts-5.18-5.el7.x86_64.rpm
rpm -hiv ntpdate-4.2.6p5-18.el7.centos.x86_64.rpm
rpm -hiv ntp-4.2.6p5-18.el7.centos.x86_64.rpm
# 编辑配置文件
vi /etc/ntp.conf
ntp.conf
配置如下
driftfile /var/lib/ntp/drift
# 默认拒绝客户端所有操作
restrict default kod notrap nomodify nopeer noquery
# 禁止本身的server
# server cn.ntp.org.cn prefer
# server edu.ntp.org.cn iburst
restrict 172.16.59.25
restrict 127.0.0.1
restrict ::1
server 172.16.59.25
# server 127.127.1.0
# fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
# 编辑 ntpd 文件
vim /etc/sysconfig/ntpd
ntpd
文件修改如下
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
# BIOS时间也会跟随改变
SYNC_HWCLOCK=yes
systemctl restart ntpd.service
# 开机启动
systemctl enable ntpd.service
过程总结
可能失败原因及分析
-
NTP 服务刚启动后,客户端无法同步时间,需等待几分钟才可以
-
关闭或者设置防火墙,允许123端口
-
网络上存在多个 NTP 服务器时,客户端切换同步源后需要重启
-
如果本机与 NTP 服务器时间误差超过1000s,则同步失败。可以按照下面命令解决。
# 更改时区为中国 timedatectl set-timezone "Asia/Shanghai" # 与外网同步一次时间 ntpdate cn.ntp.org.cn # 注意 ntpdate
stratum 的概念
-
顶层是1,值为0时表示层数不明,层的值是累加的,比如 NTP 授时方向是 A -> B -> C,假设 A 的层值是3,那么B从A获取到时间层值为4,C从B获取到时间,C的层值被置为5。一般只有整个 NTP 系统最顶层的服务器stratum才设为1。
-
NTP 同步的方向是从stratum 值较小的节点向较大的节点传播,如果某个 NTP 客户端接收到 stratum 比自己还要大,那么 NTP 客户端认为自己的时间比接受到的时间更为精确,不会进行时间的更新。
-
对于大部分 NTP 软件系统来说,服务启动后,stratum 值初始是0,一旦 NTP 服务获取到了时间,NTP 层次就设置为上级服务器 stratum +1。对于具备卫星时钟、原子钟的专业 NTP 设备,一般 stratum 值初始是1。
NTPD运行过程
-
NTPD 启动后,stratum 值初始是0,此时 NTPD 接收到 NTP 请求,回复 stratum 字段为0的 NTP 包,客户端接收后,发现 stratum 字段无效,拒绝更新时间,造成时间更新失败。
-
几分钟后,NTPD从上级服务器获取到了更新,设置了正确的 stratum,回复 stratum 字段为 n+1的 NTP 包,客户端接收后,确认 stratum 有效,成功进行时间更新。
-
在 NTPD 上级服务器不可用的情况下,NTPD 将本机时钟服务模拟为一个上级 NTP 服务器,地址使用环回127.127.1.0。服务启动几分钟后,NTPD 从 127.127.1.0 更新了时钟,设置了有效的 stratum,客户端接收后,成功进行时间更新。
ntpd与ntpdate修改时间的区别
ntpd 不仅仅是时间同步服务器,他还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。
时钟的跃变,对于某些程序会导致很严重的问题。许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即,取得的时间是线性的,一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday设置系统时间,这有几个非常明显的问题:
第一,这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。
第二,这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。
第三,这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。
因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。
NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时
RTC硬件时间相关命令
clock –r 显示硬件时钟与日期
clock –s 将系统时钟调整为与目前的硬件时钟一致。
clock –w 将硬件时钟调整为与目前的系统时钟一致
查看和修改时间
# 查看时间和日期
date
date -R
timedatectl
# 查看本月月历
cal
# 设置时间和日期
# 例如:将系统日期设定成2019年11月3日的命令
date -s 11/03/2019
#将系统时间设定成下午5点55分55秒的命令
date -s 17:55:55
# 将当前时间和日期写入BIOS,避免重启后失效**
hwclock -w
# 修改时区
tzselect