zoukankan      html  css  js  c++  java
  • linux服务之ntp与chrony

    centos7.2变成了chrony

    RHEL从7.0开始改用chrony同步时间,原ntp同步方式也可以使用,但要安装ntp服务。

    [root@1st-kvm plymouth]# rpm -qa|grep chro
    chrony-2.1.1-1.el7.centos.x86_64

    设置NTP Server前的准备
    其实这个标题应该改为设置"NTP Relay Server"前的准备更加合适. 因为不论我们的计算机配置多好运行时间久了都会产生误差,所以不足以给互联网上的其他服务器做NTP Server. 真正能够精确地测算时间的还是原子钟. 但由于原子钟十分的昂贵,只有少部分组织拥有, 他们连接到计算机之后就成了一台真正的NTP Server. 而我们所要做的就是连接到这些服务器上同步我们系统的时间,然后把我们自己的服务器做成NTP Relay Server再给互联网或者是局域网内的用户提供同步服务.

    [root@rac02 ~]# netstat -ln|grep 123
    tcp        0      0 172.16.2.2:12382            0.0.0.0:*                   LISTEN
    udp        0      0 172.16.2.2:27123            0.0.0.0:*
    udp        0      0 172.16.2.2:123              0.0.0.0:*
    udp        0      0 192.168.2.2:123             0.0.0.0:*
    udp        0      0 127.0.0.1:123               0.0.0.0:*
    udp        0      0 0.0.0.0:123                 0.0.0.0:*


    1). 架设一个NTP Relay Server其实非常简单,我们先把需要的RPM包装上
    [root@localhost ~]# yum install ntp
    Installing:
     ntp                               x86_64                           4.2.6p5-2.el6.centos                              updates                           593 k
    Installing for dependencies:
     ntpdate                           x86_64                           4.2.6p5-2.el6.centos                              updates                            75 k

    [root@localhost ~]# rpm -ql ntp
    /etc/dhcp/dhclient.d
    /etc/dhcp/dhclient.d/ntp.sh
    /etc/ntp.conf
    /etc/ntp/crypto
    /etc/ntp/crypto/pw
    /etc/rc.d/init.d/ntpd
    /etc/sysconfig/ntpd
    /usr/bin/ntpstat
    /usr/sbin/ntp-keygen
    /usr/sbin/ntpd
    /usr/sbin/ntpdc
    /usr/sbin/ntpq
    /usr/sbin/ntptime
    /usr/sbin/tickadj
    /var/lib/ntp
    /var/lib/ntp/drift
    /var/log/ntpstats
    [root@localhost ~]# rpm -ql ntpdate
    /etc/ntp
    /etc/ntp/keys
    /etc/ntp/step-tickers
    /etc/rc.d/init.d/ntpdate
    /etc/sysconfig/ntpdate
    /usr/sbin/ntpdate
    2).找到在互联网上给我们提供同步服务的NTP Server ,http://www.pool.ntp.org是NTP的官方网站,在这上面我们可以找到离我们城市最近的NTP Server. NTP建议我们为了保障时间的准确性,最少找两个NTP Server。
    下面是一个中国的,两个亚洲的
    server 2.cn.pool.ntp.org
    server 1.asia.pool.ntp.org
    server 3.asia.pool.ntp.org

    下面是另一些可选的
    server 133.100.11.8 prefer
    server 210.72.145.44
    server 203.117.180.36
    server 131.107.1.10
    server time.asia.apple.com
    server 64.236.96.53
    server 130.149.17.21
    server 66.92.68.246
    server www.freebsd.org
    server 18.145.0.30
    server clock.via.net
    server 137.92.140.80
    server 133.100.9.2
    server 128.118.46.3
    server ntp.nasa.gov
    server 129.7.1.66
    server ntp-sop.inria.fr
    server (国家授时中心服务器IP地址)

    3).在打开NTP服务器之前先和这些服务器做一个同步,使得我们机器的时间尽量接近标准时间. 这里我们可以用ntpdate命令

    要注意的是,ntpd 有一个自我保护设置: 如果本机与上源时间相差太大, ntpd 不运行. 所以新设置的时间服务器一定要先 ntpdate 从上源取得时间初值, 然后启动 ntpd服务。ntpd服务 运行后, 先是每64秒与上源服务器同步一次, 根据每次同步时测得的误差值经复杂计算逐步调整自己的时间, 随着误差减小, 逐步增加同步的间隔. 每次跳动, 都会重复这个调整的过程.


    ####假如你的时间差的很离谱的话第一次会看到调整的幅度比较大,所以保险起见可以运行两次. 那么为什么在打开NTP服务之前先要手动运行同步呢?
    1. 因为根据NTP的设置,如果你的系统时间比正确时间要快的话那么NTP是不会帮你调整的,所以要么你把时间设置回去,要么先做一个手动同步
    2. 当你的时间设置和NTP服务器的时间相差很大的时候,NTP会花上较长一段时间进行调整.所以手动同步可以减少这段时间
    [root@localhost ~]# date
    Mon Feb 16 03:28:27 EST 2015
    [root@localhost ~]# ntpdate 2.cn.pool.ntp.org
    26 Feb 01:50:10 ntpdate[6018]: step time server 202.112.31.197 offset 858068.183303 sec
    [root@localhost ~]# date
    Thu Feb 26 01:51:01 EST 2015
    [root@localhost ~]# ntpdate 2.cn.pool.ntp.org
    26 Feb 01:53:12 ntpdate[6021]: adjust time server 202.112.29.82 offset 0.010526 sec
    [root@localhost ~]# date
    Thu Feb 26 01:53:16 EST 2015

    这方面的文章网上有很多,讲的也很详细,主要就是修改/etc/init.d/ntp.conf文件,我稍作了修改,加了两行:
    
    server 210.72.145.44
    
    server cn.pool.ntp.org
    
    之后我就可以同步时间了,有人加了这么一行
    
    restrict 192.168.1.1mask 255.255.255.0 nomodify
    
    我没有加,但依然成功,看了下配置文件有这第一行
    
    restrict ::1
    
    可能这一行就包含那一行的意思吧!仅仅是猜测。下面给出一个样本加注释,仅供参考:
    
    # 1. 关于权限设定部分
    #   权限的设定主要以 restrict 这个参数来设定,主要的语法为:
    #   restrict IP mask netmask_IP parameter
    #   其中 IP 可以是软件地址,也可以是 default ,default 就类似 0.0.0.0
    #   至于 paramter 则有:
    #   ignore :关闭所有的 NTP 联机服务
    #   nomodify:表示 Client 端不能更改 Server 端的时间参数,不过,
    
    #   Client 端仍然可以透过 Server 端来进行网络校时。
    #   notrust :该 Client 除非通过认证,否则该 Client 来源将被视为不信任网域
    #   noquery :不提供 Client 端的时间查询
    
    #   notrap :不提供trap这个远程事件登入
    
    #  如果 paramter 完全没有设定,那就表示该 IP (或网域)“没有任何限制”
    
    restrict default nomodify notrap noquery # 关闭所有的 NTP 要求封包
    restrict 127.0.0.1    #这是允许本级查询
    restrict 192.168.0.1 mask 255.255.255.0 nomodify
    #在192.168.0.1/24网段内的服务器就可以通过这台NTP Server进行时间同步了
    # 2. 上层主机的设定
    #  要设定上层主机主要以 server 这个参数来设定,语法为:
    #  server [IP|HOST Name] [prefer]
    #  Server 后面接的就是我们上层 Time Server 啰!而如果 Server 参数
    #  后面加上 perfer 的话,那表示我们的 NTP 主机主要以该部主机来作为
    #  时间校正的对应。另外,为了解决更新时间封包的传送延迟动作,
    #  所以可以使用 driftfile 来规定我们的主机
    #  在与 Time Server 沟通时所花费的时间,可以记录在 driftfile 
    #  后面接的文件内,例如下面的范例中,我们的 NTP server 与 
    #  cn.pool.ntp.org联机时所花费的时间会记录在 /etc/ntp/drift文件内
    server 0.pool.ntp.org
    
    server 1.pool.ntp.org
    
    server 2.pool.ntp.org
    
    server cn.pool.ntp.org prefer
    
    #其他设置值,以系统默认值即可
    
    server  127.127.1.0     # localclock
    
    fudge   127.127.1.0 stratum 10
    
    driftfile /var/lib/ntp/drift
    broadcastdelay  0.008
    keys /etc/ntp/keys
    
    总结一下,restrict用来设置访问权限,server用来设置上层时间服务器,driftfile用来设置保存漂移时间的文件。


    配置和运行NTP Server
    现在我们就来创建NTP的配置文件了, 它就是/etc/ntp.conf. 我们只需要加入上面的NTP Server和一个driftfile就可以了

    # vi /etc/ntp.conf
    server 0.uk.pool.ntp.org
    server 1.uk.pool.ntp.org
    driftfile /var/lib/ntp/ntp.drift

    ####非常的简单. 接下来我们就启动NTP Server,并且设置其在开机后自动运行

    ####两种启动方式都可以
    [root@localhost ~]# /etc/init.d/ntpd start
    [root@localhost ~]# chkconfig --level 35 ntpd on
    [root@localhost ~]# service ntpd start
    Starting ntpd:                                             [  OK  ]
    [root@localhost ~]# watch ntpq -p
    [root@localhost ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     gus.buptnet.edu 202.112.10.60    3 u   15   64    3   88.266    8.172   0.832
     ns1.verd.co.id  202.162.32.12    3 u   14   64    3  210.501  -13.741   2.086
     ktdns.cdnetwork 131.107.13.100   2 u   12   64    3   76.944    7.119   2.529
    [root@localhost ~]# date
    Thu Feb 26 01:58:51 EST 2015
    现在我就来解释一下其中的含义
    remote: 它指的就是本地机器所连接的远程NTP服务器
    refid: 它指的是给远程服务器(e.g. gus.buptnet.edu)提供时间同步的服务器
    st: 远程服务器的级别. 由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端. 所以服务器从高到低级别可以设定为1-16. 为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的.
    t: 这个.....我也不知道啥意思^_^
    when: 我个人把它理解为一个计时器用来告诉我们还有多久本地机器就需要和远程服务器进行一次时间同步
    poll: 本地机和远程服务器多少时间进行一次同步(单位为秒). 在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增加了,可以尽快调整到正确的时间范围.之后poll值会逐渐增大,同步的频率也就会相应减小
    reach: 这是一个八进制值,用来测试能否和服务器连接.每成功连接一次它的值就会增加
    delay: 从本地机发送同步要求到服务器的round trip time
    offset: 这是个最关键的值, 它告诉了我们本地机和服务器之间的时间差别. offset越接近于0,我们就和服务器的时间越接近
    jitter: 这是一个用来做统计的值. 它统计了在特定个连续的连接数里offset的分布情况. 简单地说这个数值的绝对值越小我们和服务器的时间就越精确
    那么大家细心的话就会发现两个问题: 第一我们连接的是0.uk.pool.ntp.org为什么和remote server不一样? 第二那个最前面的+和*都是什么意思呢?
    第一个问题不难理解,因为NTP提供给我们的是一个cluster server所以每次连接的得到的服务器都有可能是不一样.同样这也告诉我们了在指定NTP Server的时候应该使用hostname而不是IP
    第二个问题和第一个相关,既然有这么多的服务器就是为了在发生问题的时候其他的服务器还可以正常地给我们提供服务.那么如何知道这些服务器的状态呢? 这就是第一个记号会告诉我们的信息
    *
    它告诉我们远端的服务器已经被确认为我们的主NTP Server,我们系统的时间将由这台机器所提供
    +
    它将作为辅助的NTP Server和带有*号的服务器一起为我们提供同步服务. 当*号服务器不可用时它就可以接管
    -
    远程服务器被clustering algorithm认为是不合格的NTP Server
    x
    远程服务器不可用
    了解这些之后我们就可以实时监测我们系统的时间同步状况了


    NTP安全设置
    运行一个NTP Server不需要占用很多的系统资源,所以也不用专门配置独立的服务器,就可以给许多client提供时间同步服务, 但是一些基本的安全设置还是很有必要的
    那么这里一个很简单的思路就是第一我们只允许局域网内一部分的用户连接到我们的服务器. 第二个就是这些client不能修改我们服务器上的时间
    在/etc/ntp.conf文件中我们可以用restrict关键字来配置上面的要求
    首先我们对于默认的client拒绝所有的操作
    restrict default kod nomodify notrap nopeer noquery
    然后允许本机地址一切的操作
    restrict 127.0.0.1
    最后我们允许局域网内所有client连接到这台服务器同步时间.但是拒绝让他们修改服务器上的时间
    restrict 192.168.1.0 mask 255.255.255.0 nomodify
    把这三条加入到/etc/ntp.conf中就完成了我们的简单配置. NTP还可以用key来做authenticaiton,这里就不详细介绍了

    只要在client的ntp.conf加上ntp server地址就可以了
    server 192.168.2.249

    1. 配置文件中的driftfile是什么?
    我们每一个system clock的频率都有小小的误差,这个就是为什么机器运行一段时间后会不精确. NTP会自动来监测我们时钟的误差值并予以调整.但问题是这是一个冗长的过程,所以它会把记录下来的误差先写入driftfile.这样即使你重新开机以后之前的计算结果也就不会丢失了
    2. 如何同步硬件时钟?
    NTP一般只会同步system clock. 但是如果我们也要同步RTC的话那么只需要把下面的选项打开就可以了

    vi /etc/sysconfig/ntpd  添加 SYNC_HWCLOCK=yes 这样,就可以让硬件时间与系统时间一起同步。

    在建立好ntp服务以后,可以用2个工具命令对ntp服务进行管理。
    一个是ntpq是一个交互式应用命令,在它的下面有很多的子命令可以供大家使用.使用peers可以查看同步进程。如果还需要其他的命令可以输入help 进行查看。还有一个工具命令是ntpdate这个命令一般用于ntp的客户端使用。可以在/var/adm/messages中看到ntp的同步信息的情况。如果需要更加详细的ntpq和ntpdate的信息可以使用man帮助进行查询。
    ntpdate与ntpd的关系类似于snmpwalk与snmpd的关系,一个客户端,一个服务端。

    ntpd与ntpdate的区别

    之前配置ntpd的时候搜到一句话,印象很深刻,也觉得很有标题党的效果,就借鉴为标题了:
    “我认为有几种人是必须不招聘/裁掉的: 1 用ntpdate代替ntpd的人”
    但具体原因不太懂,总觉得还是用ntpdate比较方便。
    今天问了红帽技术支持,对方的解释是:
    ntpd在实际同步时间时是一点点的校准过来时间的,最终把时间慢慢的校正对。而ntpdate不会考虑其他程序是否会阵痛,直接调整时间。
    一个是校准时间,一个是调整时间。
    以下是一个形象的假设:
    linuxtone限制用户注册1小时才能发帖。
    数据库服务器在 10:00分接受了我的注册邀请;
    10:03分,ntpdate将数据库时间强行改成9:35分;
    然后10:05分(9:37分)我尝试发帖,系统判断我注册时间是否满一小时会使用:9:37 - 10:00
    最后电脑就逻辑混乱了。。。
    类似的帖子网上也有很详细的说明,贴出来给大家看看:
    时钟的跃变,有时候会导致很严重的问题。许多应用程序依赖连续的时钟??毕竟,这是一项常见的假定,即,取得的时间是线性的,一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。
    不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday(2)设置系统时间,这有几个非常明显的问题:
    第 一,这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某 些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。
    第二,这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。
    第三,这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。
    因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。
    NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差??或者说 Local Clock 的自然漂移(drift)??记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。
    ##############
    最后提醒一下使用vmware的各位,因为虚拟机的时钟不太正常,比正常速度慢好多秒,所以在虚拟机上测试ntpd很难得到理想的结果,我当年就是为这个问题耽搁了好几天。。

  • 相关阅读:
    Oracle: 一个很让人纠结的sql问题,给自己长个记性
    TextInfo list of CultureInfo
    一个简单的面试题称粮食
    C++ 中什么是内联函数(zhuan)
    C/C++ 到 shellcode 过程
    常量指针与指针常量的区别(转帖)
    分清函数指针和指针函数
    如何编写自己的缓冲区溢出利用程序? (zz)
    动态获取API函数地址对抗win7 aslr安全机制(转)
    暴力搜索内存空间获得 Api 的线性地址
  • 原文地址:https://www.cnblogs.com/createyuan/p/4301491.html
Copyright © 2011-2022 走看看