场景描述

  • 内网主机之间时间不一致,需要作同步;主机多数不能连接外网,只有*少数几台能连接外网

系统环境

  • centos7
  • root权限

实施方案

  • 内网中一台主机A (如172.16.59.25)与外网互通,通过外网 NTP 服务器同步时间
  • 主机A对内网提供 NTP 服务
  • 内网其他机器通过主机A进行对时

实施过程

主机A设置

  1. # 安装NTP软件
  2. # 方式1
  3. yum -y install ntp
  4. # 方式2(严格按照顺序autogen->ntpdate->ntp)
  5. rpm -hiv autogen-libopts-5.18-5.el7.x86_64.rpm
  6. rpm -hiv ntpdate-4.2.6p5-18.el7.centos.x86_64.rpm
  7. rpm -hiv ntp-4.2.6p5-18.el7.centos.x86_64.rpm
  8. # 编辑NTP配置
  9. vim /etc/ntp.conf

ntp.conf 配置如下

  1. driftfile /var/lib/ntp/drift
  2. # 默认拒*客户端所有操作
  3. restrict default kod notrap nomodify nopeer noquery
  4. # 允许本地操作
  5. restrict 127.0.0.1
  6. restrict ::1
  7. # 允许该网段同步时间,但不可修改NTP服务器时间
  8. restrict 172.16.59.0 mask 255.255.255.0 nomodify
  9. # 用于NTPD的上级服务器、本机时钟的同步,以及时钟的层次stratum
  10. server cn.ntp.org.cn prefer
  11. server edu.ntp.org.cn iburst
  12. # 本机时间兜底
  13. server 127.127.1.0
  14. fudge 127.127.1.0 stratum 8
  15. includefile /etc/ntp/crypto/pw
  16. keys /etc/ntp/keys
  17. disable monitor
  1. # 编辑 ntpd 文件
  2. vim /etc/sysconfig/ntpd

ntpd 文件修改如下

  1. OPTIONS=“-u ntp:ntp -p /var/run/ntpd.pid”
  2. # BIOS时间也会跟随改变
  3. SYNC_HWCLOCK=yes
  1. # 查看状态
  2. systemctl status ntpd.service
  3. ntpstat
  4. # 重启服务
  5. systemctl restart ntpd.service
  6. # 开机启动
  7. systemctl enable ntpd.service

其他主机设置

  1. # 安装 ntpdate 软件
  2. # 方式1
  3. yum -y install ntp
  4. # 方式2(严格按照顺序autogen->ntpdate->ntp)
  5. rpm -hiv autogen-libopts-5.18-5.el7.x86_64.rpm
  6. rpm -hiv ntpdate-4.2.6p5-18.el7.centos.x86_64.rpm
  7. rpm -hiv ntp-4.2.6p5-18.el7.centos.x86_64.rpm
  8. # 编辑配置文件
  9. vi /etc/ntp.conf

ntp.conf配置如下

  1. driftfile /var/lib/ntp/drift
  2. # 默认拒*客户端所有操作
  3. restrict default kod notrap nomodify nopeer noquery
  4. # 禁止本身的server
  5. # server cn.ntp.org.cn prefer
  6. # server edu.ntp.org.cn iburst
  7. restrict 172.16.59.25
  8. restrict 127.0.0.1
  9. restrict ::1
  10. server 172.16.59.25
  11. # server 127.127.1.0
  12. # fudge 127.127.1.0 stratum 10
  13. includefile /etc/ntp/crypto/pw
  14. keys /etc/ntp/keys
  15. disable monitor
  1. # 编辑 ntpd 文件
  2. vim /etc/sysconfig/ntpd

ntpd 文件修改如下

  1. OPTIONS=“-u ntp:ntp -p /var/run/ntpd.pid”
  2. # BIOS时间也会跟随改变
  3. SYNC_HWCLOCK=yes

# 重启服务 systemctl restart ntpd.service # 开机启动 systemctl enable ntpd.service

过程总结

可能失败原因及分析

  • NTP 服务刚启动后,客户端无法同步时间,需等待几分钟才可以
  • 关闭或者设置防火墙,允许123端口
  • 网络上存在多个 NTP 服务器时,客户端切换同步源后需要重启
  • 如果本机与 NTP 服务器时间误差超过1000s,则同步失败。可以按照下面命令解决。
    1. # 更改时区为中国
    2. timedatectl set-timezone “Asia/Shanghai”
    3. # 与外网同步一次时间
    4. ntpdate cn.ntp.org.cn
    5. # 注意 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硬件时间相关命令

  1. clock –r 显示硬件时钟与日期
  2. clock –s 将系统时钟调整为与目前的硬件时钟一致。
  3. clock –w 将硬件时钟调整为与目前的系统时钟一致

查看和修改时间

  1. # 查看时间和日期
  2. date
  3. date -R
  4. timedatectl
  5. # 查看本月月历
  6. cal
  7. # 设置时间和日期
  8. # 例如:将系统日期设定成2019年11月3日的命令
  9. date -s 11/03/2019
  10. #将系统时间设定成下午5点55分55秒的命令
  11. date -s 17:55:55
  12. # 将当前时间和日期写入BIOS,避免重启后失效**
  13. hwclock -w
  14. # 修改时区
  15. tzselect