Centos7部署NTP服务及客户端同步实践
知识点概述
NTP-Network Time Protocol(网络时间协议)
是一种用于同步计算机网络中各个设备时间的协议。而NTP服务器,则是这个协议的具体实现者,它像一座灯塔,为网络中的其他设备提供准确、可靠的时间基准。
工作原理
想象一下,全球各地的计算机和服务器就像是一个个散落在各个角落的时钟,它们各自运行,时间可能会因为各种原因(如硬件差异、网络延迟等)而产生偏差。而NTP服务器,就像是那个拥有最准确时间的“大师钟”,它通过接收来自高精度时间源(如原子钟、GPS卫星等)的时间信号,然后将这些时间信息传递给网络中的其他设备,帮助它们校准时间,实现时间同步。
NTP使用UDP协议,在端口号123上发送和接收时间戳
NTP-主要解决的问题
1、时间同步问题:
在一个分布式系统中,各个设备(如服务器、计算机、网络设备等)可能因为各自独立的时钟源而产生时间偏差。这些偏差可能会逐渐累积,导致系统间的时间不一致。NTP服务器通过提供统一、准确的时间基准,帮助这些设备校准时间,确保整个网络中的时间同步。
2、时间精度问题:
对于需要高精度时间同步的应用(如金融交易、科学研究、航空航天等),即使微小的时间偏差也可能导致严重的后果。NTP服务器通过接收来自高精度时间源(如原子钟、GPS卫星等)的时间信号,并经过精密的算法处理,能够为客户端提供高精度的时间同步服务。
3、时间漂移问题:
计算机硬件的时钟在长时间运行后,由于晶振老化等原因,可能会产生时间漂移,即时间逐渐偏离真实值。NTP服务器通过定期与客户端进行时间同步,可以及时发现并纠正这种时间漂移,保持系统时间的准确性。
4、跨时区协作问题:
在全球化日益加深的今天,跨时区的协作变得越来越普遍。NTP服务器通过提供全球统一的时间标准(如UTC),使得不同时区的团队可以基于统一的时间进行协作和沟通,减少因时间差异带来的误解和混乱。
5、安全相关问题:
在某些安全相关的应用中(如SSL/TLS证书验证、日志审计等),时间同步也是至关重要的。NTP服务器确保系统时间的准确性,从而防止了因时间偏差而导致的安全漏洞(如证书过期或未生效时的错误验证)。
6、网络时间一致性:
在大型网络中,特别是包含多个子网和设备的复杂网络环境中,保持网络时间的一致性对于整体网络的稳定性和性能至关重要。NTP服务器通过层次化的时间同步架构,确保整个网络中的设备都能保持时间的一致性。
操作实践
部分前置操作在这里不赘述,有以下配置需要在实践前处理好,如有问题可自行百度或者评论留言。
1.关闭SELinux安全模式及防火墙或者添加对应的放行策略,否则客户端无法访问NTP服务器;
2.配置可访问的yum源,如未配置将影响NTP服务的安装或者安装的时候可能会有依赖问题;
本次实践中:
NTP上游服务器(这个可以自己改,改成公网内网的都行):
域名 ntp.ntptest.com
IP 10.10.10.12
NTP服务器IP:10.110.99.1
客户端网段:10.110.99.0/24
部署NTP服务
# 安装 NTP (网络时间协议) 服务
# yum 是一个包管理工具,-y 选项表示自动回答“yes”以确认安装所有依赖包,避免在安装过程中出现提示
yum -y install ntp
# 备份原始 NTP 配置文件
# cp 命令用于复制文件,这里将 /etc/ntp.conf 复制到 /etc/ntp.conf.bk 作为备份,以防止配置错误时丢失原始文件
cp /etc/ntp.conf /etc/ntp.conf.bk
# 使用 vi 编辑器打开 NTP 配置文件
# vi 是一种文本编辑器,用于编辑 /etc/ntp.conf 文件,用户可以根据需求修改 NTP 服务器等配置
vi /etc/ntp.conf
ntp.conf配置文件详解
以下为修改后的配置详解,除了增加了配置注释,也变更了部分配置。
# For more information about this file, see the man pages
# ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5).
# driftfile 指定了一个文件,用于记录系统时钟漂移的值。
# NTP 会根据这个文件中的数据来调整本地时钟的精度。
driftfile /var/lib/ntp/drift
# restrict 指令用于设置对 NTP 服务的访问控制。
# default 选项指定了默认的限制,以下选项表示:
# - nomodify: 不允许远程主机修改本地 NTP 服务的配置。
# - notrap: 不允许远程主机使用 trap 命令。
# - nopeer: 不允许远程主机与本地 NTP 服务建立对等关系。
# - noquery: 不允许远程主机查询本地 NTP 服务状态。
#restrict default nomodify notrap nopeer noquery
# 允许来自本地回环接口(127.0.0.1 和 ::1)的所有访问。
# 此设置通常用于本地管理和监控 NTP 服务。
restrict 127.0.0.1 # 允许 IPv4 回环地址的访问
restrict ::1 # 允许 IPv6 回环地址的访问
# 此条目可以用于放宽本地网络(如 192.168.1.0/24)上的限制。
# 该配置允许本地网络中的主机进行时间同步,但不允许它们修改本地服务。
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# 允许来自 10.110.99.0/24 子网中的主机进行时间同步,但不允许它们修改 NTP 服务的设置。
restrict 10.110.99.0 mask 255.255.255.0 nomodify
# 使用 pool.ntp.org 项目中的公共 NTP 服务器进行时间同步。
# 这些服务器会根据网络状况动态调整,以提高可靠性。
# 选项 iburst 提高初始同步速度,如果与服务器的连接较慢,NTP 将更快地获取时间。
#server 0.centos.pool.ntp.org iburst # 第一个 NTP 服务器
#server 1.centos.pool.ntp.org iburst # 第二个 NTP 服务器
#server 2.centos.pool.ntp.org iburst # 第三个 NTP 服务器
#server 3.centos.pool.ntp.org iburst # 第四个 NTP 服务器
server ntp.geely.com iburst
# 以下是一些广播和多播配置的注释示例。
# 这些功能可以用于网络中的多个设备之间进行时间同步。
# 但是这些选项在默认情况下是禁用的。根据需要可解除注释。
#broadcast 192.168.1.255 autokey # 在指定的地址上设置广播服务器
#broadcastclient # 启用广播客户端以接收时间广播
#broadcast 224.0.1.1 autokey # 在指定的多播地址上设置广播服务器
#multicastclient 224.0.1.1 # 启用多播客户端以接收多播时间
#manycastserver 239.255.254.254 # 设置许多播服务器
#manycastclient 239.255.254.254 autokey # 启用许多播客户端以接收时间
# 启用公钥密码学以增强 NTP 通信的安全性。
#crypto
# includefile 指令用于包含其他配置文件,通常用于存储加密密钥。
# 在这里,它指向一个包含密码文件的路径。
includefile /etc/ntp/crypto/pw
# keys 指令指定一个包含对称密钥的文件路径。
# 这些密钥用于身份验证和加密。
keys /etc/ntp/keys
# trustedkey 指令指定哪些密钥标识符是可信的。
# 只有这些密钥可用于对 NTP 服务进行修改。
#trustedkey 4 8 42
# requestkey 是用于 ntpdc 工具的密钥标识符。
# 该工具用于对 NTP 进行调试和管理。
#requestkey 8
# controlkey 是用于 ntpq 工具的密钥标识符。
# ntpq 是用于查询 NTP 服务器状态的实用工具。
#controlkey 8
# statistics 指令用于启用不同类型的统计信息记录。
# 这些统计信息可以用于分析 NTP 服务的性能。
# 可记录的统计类型包括:
# - clockstats: 记录时钟统计信息
# - cryptostats: 记录加密统计信息
# - loopstats: 记录环路统计信息
# - peerstats: 记录对等体统计信息
#statistics clockstats cryptostats loopstats peerstats
# disable monitor 指令禁用监控功能,防止利用 ntpdc 的 monlist 命令进行放大攻击。
# 这在默认限制不包括 noquery 标志时尤为重要。
# 请参阅 CVE-2013-5211 以获取更多详细信息。
# 注意:使用有限限制标志时,监控将不会被禁用。
disable monitor
修改内容
主要修改内容
禁止默认访问限制的注释掉:
#restrict default nomodify notrap nopeer noquery
修改前: 这行命令用于设置默认的访问控制,限制所有未明确允许的主机的访问。
修改后: 该行被注释掉,意味着默认的访问限制被移除。这样可能允许更多的远程主机访问 NTP 服务,而不受限制。
本地网络限制的具体化:
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 10.110.99.0 mask 255.255.255.0 nomodify
修改前: 该行注释掉了对特定本地网络(192.168.1.0/24)的限制。
修改后: 将其替换为对 10.110.99.0.0/24 网络的限制,允许该网络的主机进行时间同步,但不允许它们修改 NTP 服务。这意味着服务的访问控制更具体化,适用于新的网络范围。
使用公共 NTP 服务器的更改:
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp.ntptest.com iburst
修改前: 配置使用了多个公共 NTP 服务器(centos.pool.ntp.org 项目)以提高时间同步的可靠性。
修改后: 只保留了一个指定的 NTP 服务器 ntp.ntptest.com,可以写多个,我这里只写了一个。
启动NTP服务
# 启动 NTP 服务
# systemctl 是用于管理 systemd 系统和服务的命令,start ntpd.service 命令会启动 NTP 守护进程
systemctl start ntpd.service
# 查看 NTP 服务的状态
# status 选项用于检查 ntpd.service 的当前状态,显示服务是否正在运行以及相关信息
systemctl status ntpd.service
输出示例:
● ntpd.service - Network Time Service # NTP服务的名称和描述
Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled) # 服务已加载,未设置为开机自动启动
Active: active (running) since Thu 2025-01-02 11:12:36 CST; 9min ago # 服务正在运行,自启动以来已运行约9分钟
Process: 28972 ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS (code=exited, status=0/SUCCESS) # 启动命令及其成功状态
Main PID: 28973 (ntpd) # 主进程ID
CGroup: /system.slice/ntpd.service # 服务的控制组
└─28973 /usr/sbin/ntpd -u ntp:ntp -g # 主进程的详细命令
Jan 02 11:12:36 hq-t-temp-centos7.4-2022q3 ntpd[28973]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123 # 在所有IPv4地址上监听UDP 123端口,但不处理请求
Jan 02 11:12:36 hq-t-temp-centos7.4-2022q3 ntpd[28973]: Listen and drop on 1 v6wildcard :: UDP 123 # 在所有IPv6地址上监听UDP 123端口,但不处理请求
Jan 02 11:12:36 hq-t-temp-centos7.4-2022q3 ntpd[28973]: Listen normally on 2 lo 127.0.0.1 UDP 123 # 正常监听本地回环接口的请求
Jan 02 11:12:36 hq-t-temp-centos7.4-2022q3 ntpd[28973]: Listen normally on 3 ens160 10.115.85.111 UDP 123 # 正常监听特定网络接口的请求
Jan 02 11:12:36 hq-t-temp-centos7.4-2022q3 ntpd[28973]: Listen normally on 4 lo ::1 UDP 123 # 正常监听IPv6本地回环接口的请求
Jan 02 11:12:36 hq-t-temp-centos7.4-2022q3 ntpd[28973]: Listen normally on 5 ens160 fe80::250:56ff:fe86:8070 UDP 123 # 正常监听另一个IPv6接口的请求
Jan 02 11:12:36 hq-t-temp-centos7.4-2022q3 ntpd[28973]: Listening on routing socket on fd #22 for interface updates # 监听接口更新的路由套接字
Jan 02 11:12:36 hq-t-temp-centos7.4-2022q3 ntpd[28973]: 0.0.0.0 c016 06 restart # 服务重启状态信息
Jan 02 11:12:36 hq-t-temp-centos7.4-2022q3 ntpd[28973]: 0.0.0.0 c012 02 freq_set kernel 22.895 PPM # 设置内核时钟频率为22.895 PPM
Jan 02 11:15:52 hq-t-temp-centos7.4-2022q3 ntpd[28973]: 0.0.0.0 c615 05 clock_sync # 成功与时间源同步的状态信息
# 显示当前系统日期和时间
# date 命令用于显示系统当前的日期和时间,这对于确认系统时间是否正确很有用
date
输出示例:
Thu Jan 2 11:12:20 CST 2025
# 再次使用 vi 编辑器打开 NTP 配置文件(可能是为了进行进一步的配置)
# 在此处再次编辑配置文件,用户可能需要根据实际需要进行调整
vi /etc/ntp.conf
# 重启 NTP 服务以应用配置更改
# restart 命令会停止并重新启动 ntpd.service,以使之前对配置文件的更改生效
systemctl restart ntpd.service
# 检查 NTP 服务的状态,确认其是否正常运行
# ntpstat 命令用于显示 NTP 服务的同步状态,它会告诉用户系统时间是否准确以及与 NTP 服务器的同步情况
ntpstat
输出示例:
synchronised to NTP server (10.10.10.12) at stratum 2 # 当前系统时钟已与 NTP 服务器 (10.10.10.12) 同步,且该服务器的层级为 2
time correct to within 27 ms # 当前时间与 NTP 服务器的差异在 27 毫秒以内,表示时间非常准确
polling server every 64 s # 每 64 秒向 NTP 服务器发送一次请求以维持同步
# 再次查看 NTP 服务的状态
# 这一步是确认重启后的服务状态,以确保 NTP 服务正常运行
systemctl status ntpd.service
# 显示当前的 NTP 配置文件内容
# cat 命令用于查看文件内容,这里用于显示当前的 /etc/ntp.conf 配置文件,以确认配置是否正确
cat /etc/ntp.conf
到这里,部署及初步配置已完成,接下来进行客户端时间同步测试。
时间同步测试
Windows端同步
在windows上打开‘控制面板’,找到‘时钟,语言和区域’设置,然后点击‘设置时候和日期’,选择‘internet时间‘,再点击’更改设置’,此处需要有管理员权限,否则无法更改,然后在弹出的窗口中输入NTP服务器的IP地址,点击’立即更新‘,成功更新后有圆框内的输出,再点确定即可。
Linux端同步
在终端中输入命令
手动同步NTP服务器时钟,测试是否可以访问
/usr/sbin/ntpdate 10.110.99.1
正常输出示例:
2 Jan 14:39:16 ntpdate[6815]: adjust time server 10.110.99.1 offset 0.003595 sec
确认可正常同步后,进行自动同步配置。
添加到计划任务中,每三十分钟同步一次,假定NTP服务器IP为10.110.99.1。
crontab -e
# crontab 是一个用于管理 cron 表的命令。cron 表是一种特殊的文件,定义了定期执行的任务(称为 cron 作业)。
# -e 选项表示“编辑”,系统会打开当前用户的 crontab 文件供编辑。
# 在末尾添加以下内容
30 * * * * /usr/sbin/ntpdate 10.110.99.1
# 每小时的第30分钟执行命令
# 用于同步系统时间到指定的NTP(网络时间协议)服务器
# /usr/sbin/ntpdate 是用于从NTP服务器获取当前时间的命令
# 10.110.99.1 是目标NTP服务器的IP地址
# 下面的 * 从左至右的含义:
# 分钟 (0 - 59): 30 表示在每小时的第30分钟运行
# 小时 (0 - 23): * 表示每小时都运行
# 日 (1 - 31): * 表示每个月的每天都运行
# 月 (1 - 12): * 表示每年的每个月都运行
# 星期 (0 - 7): * 表示每周的每天都运行 (0和7都代表星期天)
设置开机启动时的时间同步设置
echo "/usr/sbin/ntpdate 10.110.99.1" >> /etc/rc.local
# 将 "/usr/sbin/ntpdate 10.110.99.1" 这个命令追加到 /etc/rc.local 文件中
# 用于在系统启动时自动同步时间到指定的 NTP 服务器
# echo 命令用于将后面的字符串输出到标准输出
# ">>" 是重定向操作符,用于将输出追加到指定文件的末尾
# 如果文件不存在," >> " 会创建一个新文件
# 如果文件已经存在," >> " 会将输出添加到文件末尾,而不会覆盖原有内容
# /etc/rc.local 是一个在系统启动时执行的脚本文件
# 在许多 Linux 发行版中,/etc/rc.local 文件用于在系统启动时执行一些自定义命令
# 将这个 ntpdate 命令添加到此文件中,意味着每次系统启动时都会自动同步时间