关于 NTP 服务器的基本概念: 时间服务器:NTP服务器
关于 NTP 服务器的实际搭建项目: NTP 时间服务器实战
NTP 服务器也是一个很容易就可以架设成功的玩意儿,不过这个软件在不同的 distribution 上面可能有不一样的名称, 你要作的其实就是将他安装起来之后,规定一部上层 NTP 服务器来同步化你的时间即可啊! 如果你只是想要进行你自己单部主机的时间同步化,别架设 NTP ,直接使用 NTP 客户端软件即可喔!
在 CentOS 6.x 上头,你所需要的软件其实仅有 ntp 这个玩意儿而已,请自行使用 rpm 去找找看,若没有安装,请利用 yum install ntp 即可啊!不过,我们还需要时区相关的数据文件,所以
1. 需要的软件:
2. 与时间及 NTP 服务器设定相关的配置文件与重要数据文件:
3. 常用于时间服务器与修改时间的指令:
由于 NTP 服务器的设定需要有上游服务器的支持才行,假设现有的 NTP 服务器所需要设定的架构如下:
好了,先让我们谈一谈如何在 ntp.conf 里面设定权限控制吧
在 ntp.conf 档案内可以利用『 restrict 』来控管权限,这个参数的设定方式为:
restrict [你的IP] mask [netmask_IP] [parameter]
其中 parameter 的参数主要有底下这些:
那如果你没有在 parameter 的地方加上任何参数的话,这表示『该 IP 或网段不受任何限制』的意思喔!一般来说,我们可以先关闭 NTP 的权限,然后再一个一个的启用允许登入的网段。
上层 NTP 服务器的设定方式为:
server [IP or hostname] [prefer]
在 server 后端可以接 IP 或主机名,至于那个 perfer 表示『优先使用』的服务器~有够简单吧!
设定的方式如下:
driftfile [可以被 ntpd 写入的目录与档案]
因为预设的 NTP Server 本身的时间计算是依据 BIOS 的芯片震荡周期频率来计算的,但是这个数值与上层 Time Server 不见得会一致啊!所以 NTP 这个 daemon (ntpd) 会自动的去计算我们自己主机的频率与上层 Time server 的频率,并且将两个频率的误差记录下来,记录下来的档案就是在 driftfile 后面接的完整档名当中了!关于档名你必须要知道:
driftfile 后面接的档案会被 ntpd 自动更新,所以他的权限一定要能够让 ntpd 写入才行。在 CentOS 6.x 预设的 NTP 服务器中,使用的 ntpd 的 owner 是 ntp ,这部份可以查阅 /etc/sysconfig/ntpd 就可以知道啦!
除了以 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.conf 之后就可以启动 ntp 服务器了。启动与观察的方式如下:
1. 启动 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 服务器有跟上层联机否。由上述的输出结果可以知道,每隔 64 秒会主动去更新时间喔!
ntpq -p
这个 ntpq -p 可以列出目前我们的 NTP 与相关的上层 NTP 的状态,上头的几个字段的意义为:
事实上这个输出的结果告诉我们,时间真的很准了啦!因为差异都在 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 以及你的防火墙机制咯!
上头介绍了 NTP 服务器的安装与设定,如果我们仅有十部不到的主机时,老实说,实在没有架设 NTP 服务器的需求。 只要能够在你的主机上头以 NTP 客户端软件来进行网络校时就能够同步化时间了,没必要时时刻刻进行时间的校正吧!^_^! 但是,如果是类似一定要时间同步的群集计算机群或登录服务器群,那就得要使用时间服务器比较好啰!
先来复习一下前面谈到的重点,那就是 Linux 操作系统当中其实有两个时间,分别是:
在软件时钟方面,我们可以透过 date 这个指令来进行手动修订,但如果要修改 BIOS 记录的时间,就得要使用 hwclock 这个指令来写入才行。相关的用法如下:
date MMDDhhmmYYYY
选项与参数: MM:月份 DD:日期 hh:小时 mm:分钟 YYYY:公元年
## 修改时间成为 1 小时后的时间该如何是好?
date
>> Thu Jul 28 15:33:38 CST 2011
date 072816332011
>> Thu Jul 28 16:33:00 CST 2011
hwclock [-rw]
选项与参数:
-r :亦即 read ,读出目前 BIOS 内的时间参数;
-w :亦即 write ,将目前的 Linux 系统时间写入 BIOS 当中啊!
# 查阅 BIOS 时间,并且写入更改过的时间啰!
date; hwclock -r
>> Thu Jul 28 16:34:00 CST 2011
>> Thu 28 Jul 2011 03:34:57 PM CST -0.317679 seconds
# 看一看,是否刚好差异约一个小时啊!这就是 BIOS 时间!
hwclock -w; hwclock -r; date
>> Thu 28 Jul 2011 04:35:12 PM CST -0.265656 seconds
>> Thu Jul 28 16:35:11 CST 2011
这样可以了解了吗?当我们进行完 Linux 时间的校时后,还需要以 hwclock 来更新 BIOS 的时间,因为每次重新启动的时候,系统会重新由 BIOS 将时间读出来,所以, BIOS 才是重要的时间依据吶。
在 Linux 的环境当中可利用 NTP 的客户端程序,亦即是 ntpdate 这支程序就能够进行时间的同步化。 不过你要知道的是,因为 NTP 服务器本来就会与上层时间服务器进行时间的同步化, 所以在预设的情况下,NTP 服务器不可以使用 ntpdate !也就是说 ntpdate 与 ntpd 不能同时启用的。 所以你不要在 NTP server 上头执行这个指令呦!我们就来看看如何处理吧!
ntpdate [-dv] [NTP IP/hostname]
选项与参数:
-d :进入除错模式 (debug) ,可以显示出更多的有效信息。 -v :有较多讯息的显示。
与主机 192.168.100.254 同步
ntpdate 192.168.100.254
>> 28 Jul 17:19:33 ntpdate[3432]: step time server 192.168.100.254 offset -2428.396146 sec
# 最后面会显示微调的时间有多少 (offset),因为这部主机时间差很多,所以秒数...
date; hwclock -r
编辑 /etc/crontab:vim /etc/crontab
,添加如下内容:
10 5 * * * root (/usr/sbin/ntpdate tock.stdtime.gov.tw && /sbin/hwclock -w) &> /dev/null
使用 crontab 之后,每天 5:10 Linux 系统就会自动的进行网络校时啰!相当的简易吧!不过,这个方式仅适合不要启动 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 项目批注,加入我们要的服务器即可
启动 Client 上的 ntp 服务
/etc/init.d/ntpd start chkconfig ntpd on
然后取消掉 crontab 的更新程序,这样你的 client 计算机就会主动的到 NTP 服务器去更新啰!也是轻松愉快啊! 不过针对客户端来说,使用 crontab 的方式来处理也很方便。