NTP服务器搭建
一、NTP通信协议
实际上,Linux操作系统的计时方式主要从1970年1月1日开始计算总秒数,因此,如果你还记得date这个命令的话,会发现他有个+%s的参数,可以去的总秒数,这个就是软件时钟。但是,如同前面说的,计算机硬件主要是以BIOS内部的时间为主要的时间依据(硬件时钟),而偏偏这个时间可能因为BIOS内部芯片本身的问题,而导致BIOS时间与标准时间(UTC)存在一点点的差异。所以,为了避免主机时间因为长期运行而导致时间偏差,进行时间同步(synchronize)的工作就显得很重要了。
软件时钟:由Linux操作系统根据1970/01/01开始计算的总秒数。
硬件时钟:主机硬件系统上面的时钟,例如BIOS记录的时间。
那么怎么让时间同步化呢?如果我们选择几部主要主机(Primary Server)调校时间,让这些Primary Server的时间同步之后,在开放网络服务让Client段链接,并且允许Client端调整自己的时间,不就可以实现全部计算机的时间同步了吗。那么什么协议可以实现这样的功能呢,那就是Network Time Protocol,即NTP协议,另外还有Digital Time Synchronization Protocol(DTSS)也可以实现相同的功能。不过,NTP是如何让Server与Client同步他们的时间的呢?
1)首先,主机当然需要启动这个daemon。
2)之后,Client会向NTP Server发送出校对时间的message.
3)然后NTP Server会送出当前的标准时间给Client。
4)Client接受了来自Server的时间后,会据此调整自己的时间,这样就实现了网络校时。
至于NTP这个daemon是以port123为连接的接口(使用UDP数据包),所以我们利用Time Server来进行时间同步更新时,就需要使用NTP这个软件提供的ntpdateup来进行port123的连接。
二、NTP服务器的层次概念
由于NTP时间服务器采用类似分级架构(straum)来处理时间的同步化,所以它使用的是类似一般Server/Client的主从架构。网络社会上会提供一些主要与次要的时间服务器,这些均属于第一级与第二级的时间服务器。
再进行NTP主机的设置时,都会选择多台上层的Time Server来作为我们这一台NTP Server的校时之用,选择堕胎的原因是因为可以避免因为某台时间服务器突然宕机时,其他主机仍然可以提供NTP主机来自我更新,然后NTP Server才提供给自己的Client端更新时间。
三、NTP服务器的安装和配置
1、所需软件与软件结构
Yum install ntp
Yum install tzdata
与时间及NTP服务器设置相关的的配置文件与重要数据文件有下面几个。
/etc/ntp.conf :就是NTP服务器的主要配置文件,也是唯一一个
/usr/share/zoneinfo/:由tzdata所提供的,为个时区的时间格式对应文件。例如我过的时区格式对应文件是/usr/share/zoneinfo/Asia/Shanghai.这个目录里面的问价与下面要谈的两个文件(clock与localtime)是有关系的。
/etc/sysconfig/clock:设置时区与是否使用UTC时钟的配置文件。每次开机候Linux会自动读取这个文件设置自己系统所默认要显示的时间。举例来说,在我们中国本地的时间设置中,这个文件内应该会出现一行ZONE=“Asia/Shanghai”的字样,这表示我们的时间配置文件要使用/usr/share/zoneinfo/Asia/Shanghai那个文件。
[[email protected] zoneinfo]# cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
/etc/localtime:就是本地的时间配置文件。刚刚那个clock文件里面规定了适应的时间配置文件为/usr/share/zoneinfo/Asia/Shanghai,所以说这就是本地的时间了,此时Linux系统会以Shanghai那个时间配置文件为准。
至于常用于时间服务器与修改时间命令,主要有以下几个:
/bin/date:用于Linux时间(软件时间)的修改与显示的命令。
/sbin/hwclock:用于BIOS时钟(硬件时钟)的修改与显示的命令。这个命令只有root才能执行,因为Linux系统上面的BIOS时间与Linux系统时间是分开的,所以使用date这个命令调整了时间之后,还需要使用hwclock才能将修改过后的时间写入BIOS中。
/usr/sbin/ntpd:主要提供NTP服务的程序。配置文件为/etc/ntp.conf
/usr/sbin/ntpdate:用于客户端的时间校正,如果不启用NTP而仅想要使用NTPclient功能的话,会用到这个命令。
2、主要配置文件ntp.conf的处理
举例配置
上层NTP服务器共有 tock.stdtime.gov.tw , tick. stdtime.gov.tw ,time. stdtime.gov.tw 三台,其中以tock.stdtime.gov.tw最为优先使用。
不对internet提供服务,仅允许来自内部网络912.168.100.0/24的查询。
检测BIOS时钟与Linux系统时间的差异并写入/var/lib/ntp/drift文件中。
下面来看一下如何在ntp.conf中设置权限控制。
1)利用restrict来管理权限控制
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的权限,然后再一个一个地启用允许登录的网段。
2)利用server设置上层NTP服务器
上册NTP服务器的设置方式为:
server [IP or hostname] [prefer]
在server后端可以按接IP或主机名,最好用IP,防止修改主机名后的麻烦。那个prefer表示优先适用的服务器。
3)以driftfile记录时间差异
driftfile [可以被ntpd写入的目录或文件]
因为默认的NTP Server本身的时间计算是依据BIOS的芯片时间振荡周期频率来计算的,但是这个数值与上层Time Server不见得一致。所以NTP这个daemon(ntpd)会自动去计算我们的主机的频率与上层Time Server的频率,并且将两个频率的误差记录下来,记录下来的文件就是在driftfile后面的完整文件名所指的文件。关于文件名必须要知道:
Driftfile后面接的文件需要使用完整路径文件名。
该文件不能是链接文件。
该文件所记录的数值单位为百万分之一秒(ppm)。
dirftfile 后面接的文件会被ntpd自动更新,所以他的权限一定要能够让ntpd写入才行。
4)keys[key_file]
除了restrict来限制客户端的连接之外,我们也可以通过密匙系统来给客户端认证,如此一来,可以让主机端放心了。
[[email protected] jboss6]#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.10.0 mask 255.255.255.0 nomodify 放行局域网来源
#2、设置主机来源,可以先把本来的下面这些内容注释掉
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
#server 3.rhel.pool.ntp.org iburst
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
这样就设置好了
3、NTP的启动与观察
#1、启动NTP
[[email protected] zoneinfo]# /etc/init.d/ntpd start 启动
Starting ntpd: [ OK ]
[[email protected] zoneinfo]# chkconfig ntpd on 设置开机启动
[[email protected] zoneinfo]# tail /var/log/messages 查看日志信息
Jan 28 17:09:28 localhost ntpd[33990]: Deferring DNS for 1.rhel.pool.ntp.org 1
Jan 28 17:09:28 localhost ntpd[33990]: Deferring DNS for 2.rhel.pool.ntp.org 1
Jan 28 17:09:28 localhost ntpd[33990]: Deferring DNS for 3.rhel.pool.ntp.org 1
Jan 28 17:09:28 localhost ntpd[33990]: 0.0.0.0 c016 06 restart
Jan 28 17:09:28 localhost ntpd[33990]: 0.0.0.0 c012 02 freq_set kernel 0.000 PPM
Jan 28 17:09:28 localhost ntpd[33990]: 0.0.0.0 c011 01 freq_not_set
Jan 28 17:09:30 localhost ntpd_intres[33992]: host name not found: 0.rhel.pool.ntp.org
Jan 28 17:09:30 localhost ntpd_intres[33992]: host name not found: 1.rhel.pool.ntp.org
Jan 28 17:09:30 localhost ntpd_intres[33992]: host name not found: 2.rhel.pool.ntp.org
Jan 28 17:09:30 localhost ntpd_intres[33992]: host name not found: 3.rhel.pool.ntp.org
#2、查看启动的端口
[[email protected] zoneinfo]# netstat -tlunp | grep ntp
udp 0 0 192.168.211.128:123 0.0.0.0:* 33990/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 33990/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 33990/ntpd
udp 0 0 fe80::20c:29ff:fe82:6e49:123 :::* 33990/ntpd
udp 0 0 ::1:123 :::* 33990/ntpd
udp 0 0 :::123 :::* 33990/ntpd
#主要是UDP数据包,并且在port 123这个端口
这就表示我们的NTP服务器已经启动了不过要与上层NTP服务器连接还需要一些时间,通常启动NTP后约在15分钟内才会和上层NTP服务器顺利连接上。那要如何确认我们的NTP服务器已经顺利地更新了自己的时间呢?
[[email protected] zoneinfo]# ntpstat 这是我自己的虚拟机,没有上层服务器
unsynchronised
time server re-starting
polling server every 8 s
[[email protected] zoneinfo]# ntpstat 鸟哥的例子
synchronized to NTP server (220.130.158.71) at stratum 3
time correct to within 538 ms
polling server every 128 s
这个命令可以列出我们的NTP服务器是否已经与上层连接。由上述的输出结果可以知道,时间已经校正约538ms,且每隔128秒会主动去更新时间。
[[email protected] zoneinfo]# ntpq –p
这个命令可以列出当前我们的NTP与相关上层NTP的状态。
4、安全性设置
服务器防火墙在UDP port 123上打开
[[email protected] zoneinfo]# vi /etc/sysconfig/iptables
iptables –A INPUT –I $EXTIF –p udp –s 192.168.100.0/24 –dport 123 –j ACCEPT
四、客户端时间更新方式
1、Linux手动校时工作:date hwclock
date MMDDhhmmYYYYY 月份 日期 小时 分钟 公元年
[[email protected] zoneinfo]# date 012809511016
date: cannot set date: Invalid argument
Sun Jan 28 09:51:00 LMT 1016
[[email protected] zoneinfo]#hwclock [-rw]
-r:read 读出当前BIOS内的时间参数
-w:write,将目前的linux系统时间写入BIOS中
查阅BIOS时间,并且写入更改过的时间
[[email protected] zoneinfo]# date ;hwclock –r
[[email protected] zoneinfo]# hwclock –w;hwclock –r;date
[[email protected] zoneinfo]# date 012809572016
Thu Jan 28 09:57:00 CST 2016
[[email protected] zoneinfo]# date
Thu Jan 28 09:57:11 CST 2016
[[email protected] zoneinfo]# hwclock -r
Thu 28 Jan 2016 05:58:18 PM CST -0.283336 seconds
[[email protected] zoneinfo]# hwclock -w
[[email protected] zoneinfo]# hwclock -r
Thu 28 Jan 2016 09:57:30 AM CST -0.095152 seconds
[[email protected] zoneinfo]# date
Thu Jan 28 09:57:34 CST 2016
[[email protected] zoneinfo]#
2、Linux的网络校时
因为NTP服务器本来就会与上层时间服务器进行时间的同步化,所以默认情况下,NTP服务器不可以使用ntpdate。即ntpdate与ntpd不能同时启用。
[[email protected] zoneinfo]#ntpdate 192.168.100.254 服务器
客户端最好也启动一下NTP服务,通过NTP去主动的更新时间。
[[email protected] zoneinfo]#ntpdate 192.168.100.254
[[email protected] zoneinfo] #vi /etc/ntp.conf
restrict 192.168.100.254 放行服务器来源
server 192.168.100.254 这就是服务器
[[email protected] zoneinfo]#/etc/init.d/ntpd start
[[email protected] zoneinfo]#chkconfig ntpd on
这样Client计算机就会主动到NTP服务器上去更新时间了。
不这样也可以
[[email protected] zoneinfo]#vi /etc/crontab
10 5 * * * root (/usr/sbin/ntpdate tock.ssdtime.gov.tw && /sbin/hwclock –w) &>/dev/null
这样每天05:10LINUX系统就会自动进行网络校时。