欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

时间服务器: NTP 服务器及客户端搭建

程序员文章站 2022-04-05 09:39:54
时间服务器: NTP 服务器及客户端搭建 一. NTP 服务器的安装与设定 1. NTP 服务器的安装与设定前言 2. 所需软件与软件结构 3. 主要配置文件 ntp.conf 的处理 4. NTP 的启动与观察: ntpstat, ntpq 5. 安全性设定 1.NTP 服务器的安装与设定前言 N ......

时间服务器: NTP 服务器及客户端搭建

一. NTP 服务器的安装与设定

1. NTP 服务器的安装与设定前言

2. 所需软件与软件结构

3. 主要配置文件 ntp.conf 的处理

4. NTP 的启动与观察: ntpstat, ntpq

5. 安全性设定

1.NTP 服务器的安装与设定前言

NTP 服务器很容易就可以架设成功,不过这个软件在不同的 distribution 上面可能有不一样的名称,要作的其实就是将他安装起来之后,规定一部上层 NTP 服务器来同步化你的时间即可啊!如果只是想要进行单部主机的时间同步化,不用架设 NTP ,直接使用 NTP 客户端软件即可!

2.所需软件与软件结构

*在 CentOS 6.x 上头,所需要的软件其实仅有 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 ,所以应该这样做:
[root@www ~]# date
Thu Jul 28 15:08:39 CST 2011  <==重点是 CST 这个时区喔!

[root@www ~]# vim /etc/sysconfig/clock
ZONE="America/New_York"       <==改的是这里啦!

[root@www ~]# cp/usr/share/zoneinfo/America/New_York/etc/localtime
[root@www ~]# date
Thu Jul 28 03:09:21 EDT 2011  <==时区与时间都改变了!
这个范例做完之后,记得将这两个档案改回.

3.主要配置文件 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 档案当中。

先让谈一谈如何在 ntp.conf 里面设定权限控制。利用 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或主机名,个人比较喜欢使用 IP 来设定说!至于那个 perfer 表示『优先使用』的服务器。

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

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

    因为预设的NTP Server本身的时间计算是依据BIOS的芯片震荡周期频率来计算的,但是这个数值与上层 Time Server 不见得会一致,所以 NTP 这个 daemon (ntpd) 会自动的去计算我们自己主机的频率与上层 Time server 的频率,并且将两个频率的误差记录下来,记录下来的档案就是在 driftfile 后面接的完整档名当中了!

关于档名:

    driftfile 后面接的档案需要使用完整路径文件名;该档案不能是连结档;该档案需要设定成ntpd这个daemon可以写入的权限。该档案所记录的数值单位为:百万分之一秒 (ppm)。
    driftfile 后面接的档案会被 ntpd 自动更新,所以他的权限一定要能够让 ntpd 写入才行。在 CentOS 6.x 预设的 NTP 服务器中,使用的 ntpd 的 owner 是 ntp ,这部份可以查阅 /etc/sysconfig/ntpd 就可以知道了。

关于keys:

keys [key_file]
    
    除了以 restrict 来限制客户端的联机之外,我们也可以透过密钥系统来给客户端认证, 如此一来可以让主机端更放心了。不过在这个章节里面我们暂不讨论这个部分,有兴趣的朋友可以参考 ntp-keygen 这个指令的相关说明喔!

根据上面的说明,我们最终可以取得这样的配置文件案内容:
(底下仅修改部分数据,保留大部分的设定值)

[root@www ~]# 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 服务。

4.NTP 的启动与观察

设定完 ntp.conf 之后就可以启动 ntp 服务器了。启动与观察的方式如下:

# 1. 启动 NTP 
[root@www ~]# /etc/init.d/ntpd start
[root@www ~]# chkconfig ntpd on
[root@www ~]# tail /var/log/messages  <==自行检查看看有无错误

# 2. 观察启动的端口看看:
[root@www ~]# netstat -tlunp | grep ntp
Proto Recv-Q Send-Q Local Address       Foreign Address  PID/Program name
udp        0      0 192.168.100.254:123 0.0.0.0:*        3492/ntpd
udp        0      0 192.168.1.100:123   0.0.0.0:*        3492/ntpd
udp        0      0 127.0.0.1:123       0.0.0.0:*        3492/ntpd
udp        0      0 0.0.0.0:123         0.0.0.0:*        3492/ntpd
udp        0      0 ::1:123             :::*             3492/ntpd
udp        0      0 :::123              :::*             3492/ntpd
# 主要是 UDP 封包,且在 port 123 这个端口的了。
    这样就表示我们的 NTP 服务器已经启动了,不过要与上层 NTP 服务器联机则还需要一些时间, 通常启动 NTP 后约在 15 分钟内才会和上层 NTP 服务器顺利连接上。 那要如何确认我们的 NTP 服务器有顺利的更新自己的时间呢?你可以使用底下几个指令来查阅 (请自行等待数分钟后再以下列指令查阅):

 [root@www ~]# ntpstat
synchronised to NTP server (220.130.158.71) at stratum 3
   time correct to within 538 ms
   polling server every 128 s

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

[root@www ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*tock.stdtime.go 59.124.196.87    2 u   19  128  377   12.092   -0.953   0.942
+59-124-196-83.H 59.124.196.86    2 u    8  128  377   14.154    7.616   1.533
+59-124-196-84.H 59.124.196.86    2 u    2  128  377   14.524    4.354   1.079

这个 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 下午, 如果我的服务器时间原本是错误的 2015/11/11,差了几年,其实超过不到一年上层服务器就不会将正确的时间传给我们! 这时就会造成困扰了!

服务器防火墙在 UDP port 123 有没有开,要特别注意!

等待的时间够不够长?设定 NTP 等过最久的时间可能会大约是一小时!

5.安全性设定

NTP 服务器在安全的相关性方面,其实刚刚我们在 /etc/ntp.conf 里面的 restrict 参数中就已经设定了 NTP 这个 daemon 的服务限制范围了!不过,在防火墙 iptables 的部分,还是需要开启联机监听的啦!所以,在你的 iptables 规则的 scripts 当中,需要加入这一段 (我是以开放 192.168.100.0/24 这个网域作为范例的!)

[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -p udp -s 192.168.100.0/24 --dport 123 -j ACCEPT

[root@www ~]# /usr/local/virus/iptables/iptables.rule
若还要开放其他的网段或者客户端主机,修改 /etc/ntpd.conf 以及防火墙机制即可!

二. 客户端的时间更新方式

1. 客户端的时间更新方式

2. Linux 手动校时工作: date, hwclock

3. Linux 的网络校时: ntpdate

4. 案例演示

1.客户端的时间更新方式

    上头介绍了 NTP 服务器的安装与设定,如果我们仅有十部不到的主机时,老实说,实在没有架设 NTP 服务器的需求。 只要能够在你的主机上头以 NTP 客户端软件来进行网络校时就能够同步化时间了,没必要时时刻刻进行时间的校正吧, 但是,如果是类似一定要时间同步的丛集计算机群或登录服务器群,那就得要使用时间服务器比较好.

2.Linux 手动校时工作: date, hwclock

软件时钟: Linux 自己的系统时间,由 1970/01/01 开始记录的时间参数
硬件时钟: 计算机系统在BIOS记录的实际时间,这也是硬件所记录的在软件时钟方面,我们可以透过date这个指令来进行手动修订,但如果要修改BIOS 记录的时间,就得要使用 hwclock 这个指令来写入才行。

相关的用法如下:

[root@clientlinux ~]# date MMDDhhmmYYYY
选项与参数:
MM:月份
DD:日期
hh:小时
mm:分钟
YYYY:公元年

# 1. 修改时间成为 1 小时后的时间该如何是好?
[root@clientlinux ~]# date
Thu Jul 28 15:33:38 CST 2011

[root@clientlinux ~]# date 072816332011
Thu Jul 28 16:33:00 CST 2011
# 这样时间立刻就变成一个小时后了!
 [root@clientlinux ~]# hwclock [-rw]
选项与参数:
-r :亦即 read ,读出目前 BIOS 内的时间参数;
-w :亦即 write ,将目前的 Linux 系统时间写入 BIOS 当中啊!

# 2. 查阅 BIOS 时间,并且写入更改过的时间啰!
[root@clientlinux ~]# date; hwclock -r
Thu Jul 28 16:34:00 CST 2011
Thu 28 Jul 2011 03:34:57 PM CST  -0.317679 seconds
# 看一看,是否刚好差异约一个小时!这就是 BIOS 时间!

[root@clientlinux ~]# 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才是重要的时间依据。

3.Linux 的网络校时

    在 Linux 的环境当中可利用 NTP 的客户端程序,亦即是 ntpdate 这支程序就能够进行时间的同步化。 不过你要知道的是,因为 NTP 服务器本来就会与上层时间服务器进行时间的同步化, 所以在预设的情况下,NTP 服务器不可以使用 ntpdate !也就是说 ntpdate 与 ntpd 不能同时启用的。 所以你不要在 NTP server 上头执行这个指令,我们就来看看如何处理吧:

 [root@clientlinux ~]# ntpdate [-dv] [NTP IP/hostname]
选项与参数:
-d :进入除错模式 (debug) ,可以显示出更多的有效信息。
-v :有较多讯息的显示。

[root@clientlinux ~]# ntpdate 192.168.100.254
28 Jul 17:19:33 ntpdate[3432]: step time server 192.168.100.254 offset -2428.396146 sec
# 最后面会显示微调的时间有多少 (offset),因为这部主机时间差很多,所以秒数...

[root@clientlinux ~]# date; hwclock -r
四  7月 28 17:20:27 CST 2011
公元2011年07月28日 (周四) 18时19分26秒  -0.752303 seconds
# 这里还得 hwclock -w 写入 BIOS 时间才行!

[root@clientlinux ~]# 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 即可:

[root@clientlinux ~]# ntpdate 192.168.100.254
# 由于 ntpd 的 server/client 之间的时间误差不允许超过 1000 秒,
# 因此你得先手动进行时间同步,然后再设定与启动时间服务器。

[root@clientlinux ~]# 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 项目批注,加入我们要的服务器即可

[root@clientlinux ~]# /etc/init.d/ntpd start
[root@clientlinux ~]# chkconfig ntpd on

    然后取消掉crontab的更新程序,这样你的client计算机就会主动的到NTP服务器去更新。不过针对客户端来说,我还是比较习惯使用crontab的方式来处理就是了,这种方式同样很通用,效果也不错。

4.案例演示

    让我们来做个实际演练,在练习之前,请将服务器的 NFS 设定数据都清除,但是保留 rpcbind 不可关闭。至于客户端的环境下, 先关闭 autofs 以及取消之前在 /etc/rc.d/rc.local 里面写入的开机自动挂载项目。同时删除 /home/nfs 目录呦! 接下来请看看我们要处理的环境为何:

模拟的环境状态中,服务器端的想法如下:

假设服务器的 IP 为 192.168.100.254 这一部;

/tmp 分享为可擦写,并且不限制使用者身份的方式,分享给所有 192.168.100.0/24 这个网域中的所有计算机;

/home/nfs 分享的属性为只读,可提供除了网域内的工作站外,向 Internet 亦提供数据内容;

/home/upload 做为 192.168.100.0/24 这个网域的数据上传目录,其中,这个 /home/upload 的使用者及所属群组为 nfs-upload 这个名字,他的 UID 与 GID 均为 210;

/home/andy 这个目录仅分享给 192.168.100.10 这部主机,以提供该主机上面 andy 这个使用者来使用,也就是说, andy 在 192.168.100.10 及 192.168.100.254 均有账号,且账号均为 andy ,所以预计开放 /home/andy 给 andy 使用他的家目录.

服务器端设定的实地演练:
首先,就是要建立 /etc/exports 这个档案的内容.

[root@www ~]# vim /etc/exports
/tmp         192.168.100.0/24(rw,no_root_squash)
/home/nfs    192.168.100.0/24(ro)  *(ro,all_squash)
/home/upload 192.168.100.0/24(rw,all_squash,anonuid=210,anongid=210)
/home/andy   192.168.100.10(rw)

再建立每个对应的目录的实际 Linux 权限,我们一个一个来看:

# 1. /tmp
[root@www ~]# ll -d /tmp
drwxrwxrwt. 12 root root 4096 2011-07-27 23:49 /tmp

# 2. /home/nfs
[root@www ~]# mkdir -p /home/nfs
[root@www ~]# chmod 755 -R /home/nfs
# 修改较为严格的档案权限将目录与档案设定成只读!不能写入的状态,会更保险一点!

# 3. /home/upload
[root@www ~]# groupadd -g 210 nfs-upload
[root@www ~]# useradd -g 210 -u 210 -M nfs-upload
# 先建立对应的账号与组名及 UID 喔!
[root@www ~]# mkdir -p /home/upload
[root@www ~]# chown -R nfs-upload:nfs-upload /home/upload
# 修改拥有者!如此,则用户与目录的权限都设定妥当啰!

# 4. /home/andy
[root@www ~]# useradd andy
[root@www ~]# ll -d /home/andy
drwx------. 4 andy andy 4096 2011-07-28 00:15 /home/andy

这样一来,权限的问题大概就可以解决了!

重新启动 nfs 服务:

[root@www ~]# /etc/init.d/nfs restart

在 192.168.100.10 这部机器上面演练一下:

# 1. 确认远程服务器的可用目录:
[root@clientlinux ~]# showmount -e 192.168.100.254
Export list for 192.168.100.254:
/home/andy   192.168.100.10
/home/upload 192.168.100.0/24
/home/nfs    (everyone)
/tmp         192.168.100.0/24

# 2. 建立挂载点:
[root@clientlinux ~]# mkdir -p /mnt/{tmp,nfs,upload,andy}

# 3. 实际挂载:
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/tmp         /mnt/tmp
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/nfs    /mnt/nfs
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/upload /mnt/upload
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/andy   /mnt/andy

整个步骤大致上就是这样.