💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 15.2 NTP 服务器的安装与设定 NTP 服务器也是一个很容易就可以架设成功的玩意儿,不过这个软件在不同的 distribution 上面可能有不一样的名称, 你要作的其实就是将他安装起来之后,规定一部上层 NTP 服务器来同步化你的时间即可啊! 如果你只是想要进行你自己单部主机的时间同步化,别架设 NTP ,直接使用 NTP 客户端软件即可喔! * * * ### 15.2.1 所需软件与软件结构 在 CentOS 6.x 上头,你所需要的软件其实仅有 ntp 这个玩意儿而已,请自行使用 rpm 去找找看,若没有安装,请利用 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 <==时区与时间都改变了! ``` 这个范例做完之后,记得将这两个档案改回来!不然以后你的时间都是美国时间啦! 接下来,我们先来谈一谈如何设计那个 /etc/ntp.conf 吧! * * * ### 15.2.2 主要配置文件 ntp.conf 的处理 由于 NTP 服务器的设定需要有上游服务器的支持才行,因此请回头参考一下 [15.1.4](#theory_NTP) 及 [15.1.5](#theory_stratum) 的介绍,这样才能够理解为何底下的设定是这样呦!好了,我假设俺的 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 [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 服务吧! * * * ### 15.2.3 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 下午, 如果我的服务器时间原本是错误的 2010/7/28,足足差了一年,那么上层服务器恐怕就不会将正确的时间传给我! 这时就会造成困扰了! * 服务器防火墙在 UDP port 123 有没有开啊?要特别注意的呢! * 等待的时间够不够长?鸟哥设定 NTP 等过最久的时间大约是一小时!你有等这么久过否? * * * ### 15.2.4 安全性设定 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 以及你的防火墙机制咯! * * *