Linux NTP服务器

时间服务器:NTP服务器

计算机内部所记录的时钟是记载于BIOS (CMOS) 内的, 但如果计算机上面的电池没电了或者某些特殊因素导致BIOS数据被清除,此时计算机的时间就会不准,而NTP这个服务可以

让你的主机随时保持正确的时间信息

关于时区与网络校时的通讯协议

例如架设一个登录档服务器的话,那么就要分析每个主机所传来的登录文件信息,如果每一部主机的时间都不相同,那就没有办法判断问题发生的时间点了,所以啰,『每一部主机

的时间同步化』就很重要了,

每一部主机时间同步化的重要性包括DHCP客户端/服务端的租约时间限制,网络侦测时所需要注意的时间点,刚刚谈到的登录文件分析功能,具有相关性

的主机彼此之间的错误侦测,之前谈到的丛集计算机等等,都需要具有相同的时间才能够捉出问题,那如何利用网络来进行主机的时间同步化?

因为地球是圆的,所以地球被分为24个时区了,依据【经纬度】坐标进行定位,经度为零的地点在英国『格林威治』这个城市所在的纵剖面上, 360 度角共分为 24 个时区,当然一

个时区就是这 15 度角,由于格林威治时间为标准时间 (Greenwich Mean Time, GMT 时间),加上地球自转的关系,因此,在格林威治以东的区域时间是比较快的(+小时),而以西

的地方当然就是较慢,以台湾为例,台湾所在地为东经 120 度北纬 25 度左右, 又因为在格林威治的东方,因此时间会比GMT时间快8小时,当格林威治时间为零点,台湾就已经

是早上八点了

什么是夏季节约时间 (daylight savings) ,在夏天的时候,白天会比较长,所以为了节约用电,因此在夏天的时候某些地区会将他们的时间定早一小时,如此一来, 我们就可以利

用阳光照明,省去了花费电力的时间,因为台湾实在太小了,并没有横跨两个时区,所以不会有这个概念

Coordinated Universal Time (UTC)与系统时间的误差

我们常常看见的 UTC 也就是 Coordinated Universal Time (协和标准时间),这个UTC 标准时间虽然与 GMT 时间放在同一个时区为基准, 不过由于计时的方式不同,UTC

时间与 GMT 时间有差不多 16 分钟的误差,事实上,我们身边有很多原子钟,例如表,还有计算机上面的BIOS内部含有一个原子钟在记录与计算时间的进行,不过由于原子

钟是利用计算芯片的原子震荡周期去计时的,这是因为每种芯片都有自己的独特的震荡周期之故,在不同的芯片之间多多少少都会有点差异性,因此也就造成了 BIOS 的时间会

经常的给他快了几秒或者慢了几秒,那就需要『网络校时』(Network Time Protocol, NTP)的功能来重新校正时间

NTP 通讯协议

Linux 操作系统的计时方式主要是由 1970/01/01 开始计算总秒数,使用date指令,会发现+%s的参数,可以取得总秒数,这个软件时钟,计算机硬件主要是以BIOS内部的时间

为主要的时间依据(硬件时钟),而偏偏这个时间可能因为 BIOS 内部芯片本身的问题,而导致 BIOS 时间与标准时间 (UTC) 有一点点的差异存在,因此为了避免主机时间为长期

运作下所导致的时间偏差,进行时间同步 (synchronize) 的工作就显的很重要了

软件时钟:由 Linux 操作系统根据 1970/01/01 开始计算的总秒数; 

硬件时钟:主机硬件系统上面的时钟,例如 BIOS 记录的时间;

NTP 这个 daemon 是如何让 Server 与 Client 同步他们的时间呢?

1. 首先,主机当然需要启动这个 daemon ,之后

2. Client 会向 NTP Server 发送出调校时间的 message ,

3. 然后 NTP Server 会送出目前的标准时间给 Client ,

4. Client 接收了来自 Server 的时间后,会据以调整自己的时间,就达成了网络校时咯

上面的步骤中可能会出现client到server的讯息传送时间过长,例如美国将数据传送回我的PC时,时间已经延迟了10秒钟,这样一来,我的 PC 校正的时间是 10 秒钟前的标准时

间,此外,如果美国那么 NTP 主机有太多的人喜欢上去进行网络校时了,所以 loading (负荷) 太重啦!导致讯息的回传又延迟的更为严重,为了这些延迟的问题,有一些 program

已经开发了自动计算时间传送过程的误差,以更准确的校准自己的时间! 当然为了解决负荷,可以同时以server/client 及master/slave 的架构来提供用户进行网络校时的动作

所谓的 master/slave 就有点类似 DNS 的系统,举例来说,台湾的标准时间主机去国际标准时间的主机校时, 然后各大专院校再到台湾的标准时间校时,然后我们再到各大专院校的

标准时间校时!这样一来,那几部国际标准时间主机 (Time server) 的 loading 就不至于太大,而我们也可以很快速的达到正确的网络校时的目的

台湾常见的 Time Server 有 tick.stdtime.gov.tw         tock.stdtime.gov.tw       time.stdtime.gov.tw         clock.stdtime.gov.tw        watch.stdtime.gov.tw

至于NTP这个daemon以port 123为连结的端口(使用 UDP 封包),所以我们要利用 Time server 来进行时间的同步更新时,就要使用 NTP 提供的ntpdate 进行 port 123 的联机

NTP 服务器的阶层概念

由于NTP时间服务器采用类似阶层架构 (stratum) 来处理时间的同步化, 所以他使用的是类似一般server/client 的主从架构。网络社会上面有提供一些

主要与次要的时间服务器, 这些均属于第一阶及第二阶的时间服务器 (stratum-1,stratum-2)

由于这些时间服务器大多在国外,所以我们为了不浪费宽带与时间,台湾地区已经有标准的时间服务器了,所以当然我们可以直接选择台湾地区的 NTP 主机即可。

如果确实有架设NTP的需求时,我们可以直接选择台湾地区的上层NTP来同步化时间即可,  举例来说 tock.stdtime.gov.tw 这个国家单位的主机应该是

比较适合的。一般来说,我们在进行 NTP 主机的设定时,都会先选择多部上层的 TimeServer 来做为我们这一部 NTP Server 的校正之用,选择多部的原因是因为可以避免

因为某部时间服务器突然挂点时, 其他主机仍然可以提供我们的 NTP 主机来自我更新,然后我们的 NTP Server 才提供给自己的 Client 端更新时间。如此一来,国家单

位的 tock.stdtime.gov.tw 负载才不会太大,而我们的 Client 也可以很快速的达到校时的动作。

NTP 服务器的安装与设定

yum install ntp 安装即可,我们还需要时区相关的数据文件,所以你需要的软件有

ntp: 就是 NTP 服务器的主要软件啦,包括配置文件以及执行档等等。

tzdata: 软件名称为『 Time Zone data 』的缩写,提供各时区对应的显示格式。

与时间及 NTP 服务器设定相关的配置文件与重要数据文件有底下几个:

/etc/ntp.conf: 就是 NTP 服务器的主要配置文件,也是唯一的一个;

/usr/share/zoneinfo/: 由 tzdata 所提供,为各时区的时间格式对应档。例如台湾地区的时区格式对应档案在 /usr/share/zoneinfo/Asia/Taipei 就是了!这个目录里面的档案与底下要

谈的两个档案 (clock 与 localtime) 是有关系的,

/etc/sysconfig/clock: 设定时区与是否使用 UTC 时间钟的配置文件。每次开机后 Linux 会自动的读取这个档案来设定自己系统所默认要显示的时间,在我们台湾地区的本地时间

设定中,这个档案内应该会出现一行『ZONE="Asia/Taipei"』的字样, 这表示我们的时间配置文件案『要取用/usr/share/zoneinfo/Asia/Taipei 那个档案』的意思

/etc/localtime: 这个档案就是『本地端的时间配置文件』啦!刚刚那个clock 档案里面规定了使用的时间配置文件 (ZONE) 为/usr/share/zoneinfo/Asia/Taipei ,所以说这就是本地

端的时间了,此时Linux 系统就会将 Taipei 那个档案复制一份成为 /etc/localtime ,所以未来我们的时间显示就会以 Taipei 那个时间配置文件案为准

至于在常用于时间服务器与修改时间的指令方面,主要有底下这几个啦:

/bin/date: 用于 Linux 时间 (软件时钟) 的修改与显示的指令;

/sbin/hwclock: 用于 BIOS 时钟 (硬件时钟) 的修改与显示的指令!这是一个 root 才能执行的指令, 因为 Linux 系统上面 BIOS 时间与 Linux 系统 时间是分开的,所以使用 date 这个

指令调整了时间之后,还需要使用 hwclock才能将修改过后的时间写入 BIOS 当中

/usr/sbin/ntpd: 主要提供 NTP 服务的程序,配置文件为/etc/ntp.conf

/usr/sbin/ntpdate: 用于客户端的时间校正,如果你没有要启用 NTP 而仅想要使用 NTP Client 功能的话,那么只会用到这个指令而已

例题

你的笔记本安装了CentOS这套系统,而且选择的时间是台湾,现在去美国,到了美国之后你的时间会不一致了,如何手动的调整时间参数?

因为时区数据文件在 /usr/share/zoneinfo 内,,在该目录内会找到/usr/share/zoneinfo/America/New_York 这个时区档,而时区配置文件在

/etc/sysconfig/clock ,且目前的时间格式在 /etc/localtime ,所以你应该这样做

date  输出 Thu Jul 28 15:08:39 CST 2011 <==重点是 CST 这个时区喔!

vim /etc/sysconfig/clock                      ZONE="America/New_York"   <==改的是这里啦!

cp /usr/share/zoneinfo/America/New_York /etc/localtime

再执行date   输出 Thu Jul 28 03:09:21 EDT 2011 <==时区与时间都改变了

主要配置文件 ntp.conf 的处理,由于NTP服务器的设定需要有上游服务器的支持才行,我假设我的NTP服务器所需要设定的架构如下:

我的上层 NTP 服务器共有 tock.stdtime.gov.tw, tick.stdtime.gov.tw,  time.stdtime.gov.tw 三部,其中以 tock.stdtime.gov.tw 最优先使用(prefer);

不对 Internet 提供服务,仅允许来自内部网域 192.168.100.0/24 的查询而已;

侦测一些 BIOS 时钟与 Linux 系统时间的差异并写入 /var/lib/ntp/drift 档案当中。

利用 restrict 来管理权限控制 , 在ntp.conf档案内可以利用 restrict 』『来控管权限,这个参数的设定方式为:

restrict [你的 IP] mask [netmask_IP] [parameter]

其中parameter的参数主要有底下这些: 

ignore: 拒绝所有类型的 NTP 联机;

nomodify: 客户端不能使用 ntpc 与 ntpq 这两支程序来修改服务器的时间参数, 但客户端仍可透过这部主机来进行网络校时的;

noquery: 客户端不能够使用 ntpq, ntpc 等指令来查询时间服务器,等于不提供 NTP 的网络校时

notrap: 不提供 trap 这个远程事件登录 (remote event logging) 的功能

notrust: 拒绝没有认证的客户端

那如果你没有在 parameter 的地方加上任何参数的话,这表示『该 IP 或网段不受任何限制』,一般来说,我们可以先关闭 NTP 的权限,然后再一个一个的启用允许登入的网段

利用 server 设定上层 NTP 服务器

上层 NTP 服务器的设定方式为:  server [IP or hostname] [prefer], 在server后端可以接IP或主机名,至于那个perfer 表示『优先使用』的服务器

以 driftfile 记录时间差异,设定的方式如下:

driftfile [可以被 ntpd 写入的目录与档案]

因为预设的 NTP Server 本身的时间计算是依据 BIOS 的芯片震荡周期频率来计算的, 这个数值与上层Time Server不见得会一致,所以NTP这个daemon会自动的去计算我们

自己主机的频率与上层Time server 的频率,并且将两个频率的误差记录下来,记录下来的档案就是在 driftfile 后面接的完整档名当中了,关于档名你必须要知道:

1.driftfile 后面接的档案需要使用完整路径文件名;

2. 该档案不能是连结档;

3. 该档案需要设定成 ntpd 这个 daemon 可以写入的权限

4. 该档案所记录的数值单位为:百万分之一秒 (ppm)

driftfile 后面接的档案会被 ntpd 自动更新, 他的权限一定要能够让ntpd写入才行,在centOS6预设的NTP服务器中,使用ntpd的拥有人是ntp,这部份可以查阅 /etc/sysconfig/ntpd

keys [key_file]  除了以 restrict 来限制客户端的联机之外,我们也可以透过密钥系统来给客户端认证, 如此一来可以让主机端更放心了 ,参考 ntp-keygen 这个指令的相关说明

底下仅修改部分数据,保留大部分的设定值

vim /etc/ntp.conf # 1. 先处理权限方面的问题,包括放行上层服务器以及开放区网用户来源:

restrict default kod nomodify notrap nopeer noquery  <==拒绝 IPv4的用户

restrict -6 default kod nomodify notrap nopeer noquery <==拒绝 IPv6 的用户

restrict 220.130.158.71 <==放行 tock.stdtime.gov.tw 进入本 NTP 服务器

restrict 59.124.196.83<==放行 tick.stdtime.gov.tw 进入本 NTP 服务器

restrict 59.124.196.84<==放行 time.stdtime.gov.tw 进入本 NTP 服务器

restrict 127.0.0.1 <==底下两个是默认值,放行本机来源

restrict -6 ::1 restrict 192.168.100.0 mask 255.255.255.0 nomodify <==放行区网来源

# 2. 设定主机来源, 请先将原本的 [0|1|2].centos.pool.ntp.org 的设定批 注掉:

server 220.130.158.71 prefer <==以这部主机为最优先

server 59.124.196.83

server 59.124.196.84

# 3.预设时间差异分析档案与暂不用到的 keys 等,不需要更动它:

driftfile /var/lib/ntp/drift

keys /etc/ntp/keys  这样就设定妥当了,准备来启动 NTP 服务吧

NTP 的启动与观察:设定完 ntp.conf 之后就可以启动 ntp 服务器了

/etc/init.d/ntpd start   chkconfig ntpd on    tail /var/log/messages <==自行检查看看有无错误

# 2. 观察启动的埠口看看:  netstat -tlunp | grep ntp  主要是UDP封包,在port 123这个端口上,这样表示我们的NTP服务器已经启动了,不过与上层NTP服务器联机则还需要

一些时间,通常启动NTP后约在 15 分钟内才会和上层 NTP 服务器顺利连接上,那要如何确认我们的 NTP 服务器有顺利的更新自己的时间呢?你可以使用底下几个指令来查阅

ntpstat 这个指令可以列出我们的NTP服务器有跟上层联机否,由上述的输出结果可以知道,时间有校正约 538 * 10^(-3) 秒,且每隔 64 秒会主动去更新时间

ntpq -p  这个 ntpq -p 可以列出目前我们的 NTP 与相关的上层 NTP 的状态,上头的几个字段的意义为:

remote:亦即是 NTP 主机的 IP 或主机名~注意最左边的符号

如果有『 * 』代表目前正在作用当中的上层 NTP

如果是『 + 』代表也有连上线,而且可作为下一个提供时间更新的候选者

refid:参考的上一层 NTP 主机的地址

st:就是 stratum 阶层啰!

when:几秒钟前曾经做过时间同步化更新的动作;

poll:下一次更新在几秒钟之后;

reach:已经向上层 NTP 服务器要求更新的次数

delay:网络传输过程当中延迟的时间,单位为 10^(-6) 秒

offset:时间补偿的结果,单位与 10^(-3) 秒

jitter:Linux 系统时间与 BIOS 硬件时间的差异时间, 单位为 10^(-6)秒

事实上这个输出的结果告诉我们,时间真的很准了,因为差异都在 0.001 秒以内, 可以符合我们的一般使用了,另外,你也可以检查一下你的BIOS时间与Linux系统时间的差异

就是/var/lib/ntp/drift 这个档案的内容, 就能了解到咱们的 Linux系统时间与 BIOS 硬件时钟到底差多久?单位为 10^(-6) 秒

要让你的 NTP Server/Client 真的能运作,在上述的动作中得注意:

上述的 ntpstat 以及 ntpq -p 的输出结果中,你的 NTP 服务器真的要能够连结上层 NTP 才行喔! 否则你的客户端将无法对你的 NTP 服务器进行同步更新的

你的 NTP 服务器时间不可与上层差异太多。举例来说,鸟哥测试 NTP 服务器约在 2011/7/28 下午, 如果我的服务器时间原本是错误的 2010/7/28,足足 差了一年,那么上层服务器

恐怕就不会将正确的时间传给我! 这时就会造成困 扰了

服务器防火墙在 UDP port 123 有没有开啊?要特别注意的呢!

等待的时间够不够长? NTP 等过最久的时间大约是一小时

安全性设定:NTP 服务器在安全的相关性方面,其实刚刚我们在 /etc/ntp.conf 里面的restrict 参数中就已经设定了 NTP 这个 daemon 的服务限制范围了,不过,在防火墙

iptables的部分,还是需要开启联机监听的啦,所以,在你的 iptables 规则的scripts 当中,需要加入这一段 (我是以开放 192.168.100.0/24 这个网域作为范例的!)

vim /usr/local/virus/iptables/iptables.allow

iptables -A INPUT -i $EXTIF -p udp -s 192.168.100.0/24 --dport 123 -j ACCEPT

/usr/local/virus/iptables/iptables.rule 若还要开放其他的网段或者客户端主机,请修改/etc/ntpd.conf 以及你的防火墙机制

客户端的时间更新方式

Linux 手动校时工作: date, hwclock

那就是 Linux 操作系统当中其实有两个时间,分别是:

软件时钟: Linux 自己的系统时间,由 处理了,因为是全中文接口的图形化软件1970/01/01 开始记录的时间参数

硬件时钟: 计算机系统在 BIOS 记录的实际时间,这也是硬件所记录的

在软件时钟方面,我们可以透过 date 这个指令来进行手动修订,但如果要修改BIOS记录的时间,就要使用hwclock这个指令来写入才行,相关的语法:

date MMDDhhmmYYYY  选项与参数:  MM:月份  DD:日期  hh:小时  mm:分钟   YYYY:公元年

# 1. 修改时间成为 1 小时后的时间该如何是好?

date查看现在的时间 接着执行date 072816332011设定一小时后的时间

hwclock [-rw] 选项与参数:

-r :亦即 read ,读出目前 BIOS 内的时间参数;

-w :亦即 write ,将目前的 Linux 系统时间写入 BIOS 当中啊!

# 2. 查阅 BIOS 时间,并且写入更改过的时间啰

date; hwclock -r 可以看到差异约为一个小时,接着执行 hwclock -w; hwclock -r; date 可以看到软件时钟与硬件时钟就同步了

当我们进行完 Linux 时间的校时后,还需要以 hwclock 来更新BIOS 的时间,因为每次重新启动的时候,系统会重新由 BIOS 将时间读出来,所以,BIOS 才是重要的时间依据

Linux 的网络校时

在NTP的客户端程序,亦即是ntpdate这支程序就能够进行时间的同步化,不过,因为NTP服务器本来就会与上层时间服务器进行时间的同步化,所以在预设的情况下,NTP

服务器不可以使用ntpdate,也就是说 ntpdate 与 ntpd 不能同时启用的,所以你不要在NTP server上面执行这个指令

ntpdate [-dv] [NTP IP/hostname]  选项与参数:

-d :进入除错模式 (debug) ,可以显示出更多的有效信息

-v :有较多讯息的显示

ntpdate 192.168.100.254  # 最后面会显示微调的时间有多少 (offset)

date; hwclock -r 可以看到Linux时间与BIOS时间又出现不一致了,此时还得记得hwclock -w 写入 BIOS 时间才行

vim /etc/crontab

# 加入这一行去! 10 5 * * * root (/usr/sbin/ntpdate tock.stdtime.gov.tw && /sbin/hwclock -w) &> /dev/null 定时自动的进行网络校时,这个方式仅适合不要启动NTP的情况

如果机器数量太多了,那么客户端最好也启动一下NTP服务,透过 NTP 去主动的更新时间 ,修改 /etc/ntp.conf 即可:

ntpdate 192.168.100.254

# 由于 ntpd 的 server/client 之间的时间误差不允许超过 1000 秒

# 因此你得先手动进行时间同步,然后再设定与启动时间服务器

vim /etc/ntp.conf

#server 0.centos.pool.ntp.org

#server 1.centos.pool.ntp.org

#server 2.centos.pool.ntp.org

restrict 192.168.100.254 <==放行服务器来源!

server 192.168.100.254 <==这就是服务器!

# 很简单,就是将原本的 server 项目批注,加入我们要的服务器即可 /etc/init.d/ntpd start             chkconfig ntpd on

然后取消掉 crontab 的更新程序,这样你的 client 计算机就会主动的到 NTP 服务器去更新, 不过针对客户端来说,使用 crontab 的方式来处理其实就可以了

 Windows 的网络校时,点选上图中的『变更日期与时间设定值』,选择国际网路时间,你可以自行填写台湾的时间服务器来对应时间,当然也可以填写自己的时间服务器

之后系统就会主动的上网去更新时间了,不过,这是 Windows XP 之后的窗口系统才有的功能,如果是比较早期的 Windows , 例如 Windows 95/2000 预设是没有这个功能的

不过没有关系,因为国家频率与时间标准实验室(http://www.stdtime.gov.tw/) 也有提供一个客户端软件 ! 链接资料如下http://www.stdtime.gov.tw/chinese/EXE/NTPClock.exe

你可以下载,直接执行他就知道如何处理了,因为是全中文接口的图形化软件


















































































































































                                                                                                  








































 























































 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值