0x01 前言

统一的时间对于服务集群、数据库甚至是个人电脑都非常重要。集群时间不一致会导致集群失败甚至是数据不能同步,家用电脑时间不正确也会导致各种各样的问题。

但服务或设备较多的情况下,让他们各自为政地从外网获取时间也有风险,因此,配置一个内部的NTP服务器非常有必要。

在我配置zabbix和ELK集群的时候就因为时间不同步导致数据在时间线上重叠,使得数据丢失了一大部分;在网站服务器集群测试中因为时间的误差巨大,使得数字证书不被信任而集群失败。

0x02 准备

在我的环境中没有用于接收GPS或北斗授时信号的硬件,淘宝上的接收模块也不贵,如果有必要,建议购买硬件设备来接收GPS和北斗信号。

而我选择采用我国各个高校的NTP服务为pfsense同步时间,再通过pfsense给内网提供NTP服务。pfsense只能添加10个NTP源服务器,以下是我目前使用的服务器域名:

s2m.time.edu.cn
s2k.time.edu.cn
s2j.time.edu.cn
s2h.time.edu.cn
s2g.time.edu.cn
s2f.time.edu.cn
s2e.time.edu.cn
s2d.time.edu.cn
s2c.time.edu.cn
s2b.time.edu.cn

以下是豆瓣上一篇附有NTP服务器地址的文章:

需要注意的是,我国高校的NTP服务器一般是ping不通的,也无法通过ntpq查看状态。这些服务器也是时断时续,所以多填写几个以便冗余。

0x03 NTP服务器

获取到了外部的NTP服务器后,下一步是配置NTP服务。首先打开pfsense的NTP设置界面Services–>NTP–>Settings:

以下是一些设置项:

  • Interface:监听的端口,请注意在防火墙放行UDP 123端口
  • Time Servers:外部NTP服务器地址,可以填写域名或IP
  • NTP Graphs:启用RRD记录图表
  • Logging:启用log

你还可以通过ACL控制一些请求,例如ntpq:

在这里我保持默认,不做限制。如果勾选了上图篮框中的内容,那么下面的检查步骤则无法继续进行。

0x04 检查

保存后查看一下服务状态,如果未启动则手动启动即可:

然后检查外部NTP服务器的状态,依次点击:Status –> NTP:

从上图中可以发现有许多Unreach/Pending状态的节点,这有可能是无法连接或是因为有足够源服务器提供数据而暂时停用。

至于Candidate状态的节点则是备选节点,Active Peer则为当前首选的NTP服务器。

下面我用一台安装了ntp软件包的centos7进行测试:

[[email protected] ~]# ntpq -p 10.1.1.1
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ns.pku.cn       .XFAC.          16 u    -  512    0    0.000    0.000   0.000
 ntp.glnet.edu.c .XFAC.          16 u    -  512    0    0.000    0.000   0.000
 mx.dlut.edu.cn  .XFAC.          16 u    -  512    0    0.000    0.000   0.000
 cert.scu.edu.cn .XFAC.          16 u    -  512    0    0.000    0.000   0.000
+202.112.26.37   210.23.18.200    2 u    6  512  177   43.690   -1.063  23.087
*dns1.synet.edu. 202.118.1.48     2 u  189  512  377   58.922    0.540  50.441
 mailgw.xanet.ed .XFAC.          16 u    -  512    0    0.000    0.000   0.000
 222.197.165.167 .XFAC.          16 u    -  512    0    0.000    0.000   0.000
+gus.buptnet.edu 10.3.9.9         4 u  533  512  277   45.440   -2.145  37.554
 202.112.0.7     .XFAC.          16 u    -  512    0    0.000    0.000   0.000
  • remote:源服务器的IP地址或域名
  • refid:同步时间源的标识,可能是一个无线电时钟(GPS授时等)或者是另一个NTP服务器
  • st:远程服务器的层次,0最好,代表数据源可能是原子钟等硬件设备,更多信息可以参考以下页面:
  • t:代表本地服务类型:
    • l = 本地硬件(例如GPS)
    • u = 单播
    • m = 多播
    • b = 广播
    • – = 网络
  • when:距离上次同步后的秒数
  • poll:轮询间隔(单位:秒)
  • reach:8位状态寄存器,1代表成功与NTP源服务器同步时间:
    • 00000001 = 001
    • 00000011 = 003
    • 00000111 = 007
    • 00001111 = 017
    • 00011111 = 037
    • 00111111 = 077
    • 01111111 = 177
    • 11111111 = 377
  • delay:本地与源服务器的时延(单位:毫秒)
  • offset:本地时间与源服务器时间的差值
  • jitter:本地与源服务器时间的平均差(越小越好)

0x05 Centos7 应用

我们先在centos上应用。我们需要安装一个软件:

[[email protected] ~]# yum info ntpdate
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
Name        : ntpdate
Arch        : x86_64
Version     : 4.2.6p5
Release     : 25.el7.centos.2
Size        : 121 k
Repo        : installed
From repo   : centos7-updates
Summary     : Utility to set the date and time via NTP
URL         : http://www.ntp.org
License     : (MIT and BSD and BSD with advertising) and GPLv2
Description : ntpdate is a program for retrieving the date and time from
            : NTP servers.

在进行同步之前,请确认系统中的时区是正确的,使用以下命令检查时间与时区:

[[email protected] ~]# date -R
Thu, 20 Apr 2017 23:52:18 +0800

也可以检查以下文件,查看目前所设置的时区:

[[email protected] ~]# ll /etc/localtime 
lrwxrwxrwx. 1 root root 35 Apr  5 18:10 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

如果不正确,可以通过创建软链接的方式修改:

#删除现有软链接
[[email protected] ~]# rm -f /etc/localtime

#新建软链接
[[email protected] ~]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

然后重启系统即可生效。

确认时区后即可开始同步时间,使用以下命令进行同步:

[[email protected] ~]# ntpdate 10.1.1.1
21 Apr 00:01:34 ntpdate[28602]: adjust time server 10.1.1.1 offset -0.000430 sec

将以上命令添加到定时任务中:

#打开文件
[[email protected] ~]# vim /etc/crontab

#插入以下内容
*/5 * * * * root ntpdate 10.1.1.1

#重启crond
[[email protected] ~]# systemctl restart crond.service

0x06 windows 应用

windows上我使用修改策略的方式配置NTP客户端,在运行窗口中输入gpedit.msc打开策略组窗口:

然后定位到计算机配置 –> 管理模板 –> 系统 –> windows 时间服务 –> 时间提供程序,并双击打开“配置 windows NTP客户端”:

  • NtpServer:填写服务器地址,我的是10.1.1.1
  • 类型:NTP
  • SpecialPollInterval:轮询间隔

修改完成后点击“确定”保存。

然后启动“启用 Windows NTP 客户端”与禁用“Windows NTP 服务器”:

完成后到控制面板的以下区域单击“设置时间和日期”测试同步:

0x07 结语

其实DHCP中也可以指定NTP服务器,但我发现几乎没有设备会采用DHCP中所指定的NTP服务器,都是使用软件预设的值。