记录linux下NTP服务器搭建及相关管理操作,使用ntp软件包安装布署。
1.NTP服务器搭建实战
利用ntp软件包在linux上搭建ntp服务器,同时作为顾客端从上游ntp服务器同步时间。
1.1安装配置NTP服务器1.1.1安装NTP服务
在大多数Linux发行版上,NTP服务可以通过包管理器安装。
sudo apt update
sudo apt install ntp
sudo yum install ntp
1.1.2配置NTP服务器
安装完成后,编辑NTP服务器的配置文件/etc/ntp.conf,不同发行版配置文件长治小异。
sudo vi /etc/ntp.conf
配置上游的时间服务器
配置上游服务器主要用于同步当前NTP服务器的时间。默认情况下,系统指向linux发行版官方的NTP服务器。
centos配置,默认联接centos池:
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
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 address。其中 address 是 IP 单播地址或 DNS 可解析名称。
server ntp.ntsc.ac.cn
ubuntu配置,默认联接ubuntu池:
# Specify one or more NTP servers.
pool 0.ubuntu.pool.ntp.org iburst
pool 1.ubuntu.pool.ntp.org iburst
pool 2.ubuntu.pool.ntp.org iburst
pool 3.ubuntu.pool.ntp.org iburst
# Use Ubuntu's ntp server as a fallback.
pool ntp.ubuntu.com
# 加入中国国家授时中心作为上游ntp服务器
pool ntp.ntsc.ac.cn
关于项目
是一个以时间服务器的大虚拟集群为上百万的顾客端提供可靠的易用的网路时间合同(NTP)服务的项目。NTP池正在为世界各地成百上千万的系统提供服务。它是绝大多数主流Linux发行版和许多网路设备的默认“时间服务器”。
官网:
国外外常见公有的NTP服务器:
关于iburst参数:要延长初始同步所需的时间,请在服务器命令末尾添加以下选项:iburst,当服务器难以访问时,发送包含8个数据包的突发风波,而不是一般的一个数据包。
配置NTP服务的访问权限控制
要限制或控制对系统上运行的NTP服务的访问,请使用ntp.conf文件中的restrict命令。
restrict命令用于限制NTP顾客端对NTP服务器的访问权限。通过配置restrict命令,可以定义准许或拒绝什么顾客端与NTP服务器进行通讯,以及怎样进行通讯。restrict命令中的option(选项)用于进一步细化对顾客端的访问控制。
centos:
# Permit time synchronization with our time source, but do not
# permit the source to query or modify the service on this system.
restrict default nomodify notrap nopeer noquery
ubuntu:
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited
default是一种特殊的限制关键字,表示默认的访问控制策略。它适用于没有明晰列举的所有主机或网路。
restrict命令采用以下格式:
restrict address [mask] option
其中地址和网段指定您要应用限制的IP地址,选项是以下一个或多个:
restrict配置原则:
示例配置:
以下是一些restrict命令的常见配置示例:
容许外网顾客端同步时间,但严禁更改服务器配置:
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
容许所有地址的时间查询,但不容许任何更改或圈套服务:
restrict default kod nomodify notrap nopeer noquery
容许本地系统的完全访问:
restrict 127.0.0.1
restrict ::1
严禁某个特定IP地址的访问:
restrict 192.168.1.100 mask 255.255.255.255 ignore
限制恳求速度以避免DOS功击:
restrict default kod limited
准许特定网路主机(如192.0.2.250/32)进行不受限制的访问:
restrict 192.0.2.250
更多的配置选项参考19.17.配置NTP|RedHatProductDocumentation。
说明
ntpq和ntpdc查询可用于放大功击,因而切勿在可公开访问的系统上从restrict默认命令中删掉noquery选项。
1.1.3启动和启用NTP服务
编辑配置文件后,启动NTP服务并设置为开机自启:
sudo systemctl restart ntp
sudo systemctl enable ntp
sudo systemctl restart ntpd
sudo systemctl enable ntpd
备注
RHEL7/CentOS7中的默认NTP用户空间守护进程是chronyd。假如要使用ntpd守护进程,则必须禁用它。
systemctl stop chronyd
systemctl disable chronyd
systemctl status chronyd
1.1.4检测NTP的状态
要从ntpd获取简略状态报告,请运行以下命令:
要检测ntpd是否在系统启动时运行并配置为在系统启动时运行,请运行以下命令:
# centos
~]$ systemctl status ntpd
# ubuntu
~]$ systemctl status ntp
要从ntpd获取简略状态报告,请运行以下命令:
~]$ ntpstat
unsynchronised
time server re-starting

polling server every 64 s
~]$ ntpstat
synchronised to NTP server (10.5.26.10) at stratum 2
time correct to within 52 ms
polling server every 1024 s
1.1.5验证与上游NTP服务器的同步状态
ntpq-p是用于查询NTP(NetworkTimeProtocol)顾客端状态的命令,还能显示当前NTP顾客端与NTP服务器的联接状态和同步信息。
# 当前ntp服务器与上游ntp服务器之间的同步状态
root@ntp:~# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
0.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.000
1.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.000
2.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.000
3.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 0.000 0.000
ntp.ubuntu.com .POOL. 16 p - 64 0 0.000 0.000 0.000
ntp.ntsc.ac.cn .POOL. 16 p - 64 0 0.000 0.000 0.000
+time.neu.edu.cn .PTP. 1 u 113 512 7 66.445 -2.918 3.346
+time.neu.edu.cn .PTP. 1 u 118 512 7 63.918 -0.716 2.553
-2001:da8:a807:: 10.10.10.123 2 u 26 512 377 75.826 -6.177 4.441
-2001:da8:9000:: .PTP. 1 u 302 512 377 72.684 -4.933 4.542
*dns2.synet.edu. .BDS. 1 u 110 512 7 61.158 -0.967 2.786
参数剖析:
refid:参考ID,表示时间信息的层级和来源的代码(上游服务器的IP或其他标示符)。refid有下边这种状态值:
st:服务器的层级(Stratum)。这是一个表示NTP服务器距离参考时钟的层级数,范围是1到16,数值越小,表示更确切的时间来源。
t:该列表示该服务器的类型:
when:这是顾客端上一次从该服务器恳求时间同步的时间(以秒计)。数值表示先前同步恳求的时间距离现今多少秒。
poll:该列显示顾客端与该服务器之间的时间同步恳求间隔(以秒计)。该间隔时间会动态调整,一般为64秒到1024秒之间。
reach:这是一个八位二补码数,表示顾客端近来与该服务器的响应情况。377表示近来8次恳求都成功(即11111111,转换为十补码为377),较低的数值表示有部份恳求失败。
delay:这是顾客端与NTP服务器之间的网路延后(往返延后,以微秒为单位),表示顾客端发送恳求到接收到服务器回复的往返时间。
offset:这是顾客端的本地时钟与该NTP服务器时钟之间的时间差(以微秒为单位)。负数表示本地时钟比服务器慢,正数表示本地时钟比服务器快。
jitter:这是顾客端与NTP服务器之间时间同步的波动(以微秒为单位),显示了时间同步的晃动程度。数值越小,表示同步越稳定。
备注
在NTP中,Stratum16表示服务器未能获得有效的时间源,也就是说该服务器不同步。NTP会将其状态标记为unsynchronized,所以这并不是正常的层级,而是表示丧失同步的状态。
为此,虽然NTP的层级范围一般为Stratum0到15,但当服务器未能与上级服务器同步时,它的Stratum值会被设置为16,表示该服务器不适宜作为时间源。
2.2配置NTP顾客端2.2.1安装NTP顾客端
顾客端假如是linux,也须要安装NTP软件包,一般使用与服务器相同的安装命令。假如是其他系统,参考对应的ntp配置手册。
sudo apt update
sudo apt install ntp
sudo yum install ntp
2.2.2配置NTP顾客端
编辑NTP顾客端的配置文件/etc/ntp.conf:
sudo vi /etc/ntp.conf
在该文件中,配置顾客端从NTP服务器同步时间:
# 配置NTP服务器IP地址
server 10.210.10.220 iburst
10.210.10.220是我搭建的NTP服务器地址,可以按照实际情况修改为你自己的NTP服务器IP或域名。
2.2.3启动和启用NTP服务
和服务器配置类似linux服务器代维,启动NTP顾客端服务并设置为开机自启:
sudo systemctl restart ntp
sudo systemctl enable ntp
sudo systemctl restart ntpd
sudo systemctl enable ntpd
2.2.4验证时间是否正确
不仅使用ntpstat,ntpq-p检测顾客端与ntp服务器的同步情况,再就是使用date命令查看时间是否正确。
2.其他的相关知识点2.1关于NTP端口
NTP流量由端口123上的UDP数据包组成,须要通过基于网路和主机的防火墙容许NTP运行。
系统防火墙(firewalld)放行ntp流量:
# 配置放行udp 123端口
~]# firewall-cmd --zone=public --add-port=123/udp
# 永久配置放行
~]# firewall-cmd --permanent --zone=public --add-port=123/udp
系统防火墙(ufw)放行ntp流量:
sudo ufw allow 123/udp
2.2管理虚拟机上的时间
虚拟机难以访问实际的硬件时钟,虚拟时钟不稳定,由于稳定性依赖于主机系统的工作负载。因而,使用中的虚拟化应用程序应该提供半虚拟化时钟。在带有KVM的红帽企业Linux上,默认时钟源为kvm-clock。请参阅《红帽企业Linux7虚拟化布署和管理手册》中的KVM顾客机计时管理章节。
2.3配置硬件时钟更新
系统时钟可用于更新硬件时钟,亦称为实时时钟(RTC)。下边是配置硬件时钟的三种方式:
即时一次性更新
要对硬件时钟进行即时一次性更新,以root用户身分运行这个命令:
~]# hwclock --systohc
在每次引导时更新
要在执行ntpdate同步程序后在每次引导时更新硬件时钟,请执行以下操作:
1)在/etc/sysconfig/ntpdate文件中添加以下行:
SYNC_HWCLOCK=yes
2)以root用户身分启用ntpdate服务:
~]# systemctl enable ntpdate.service
请注意,ntpdate服务使用/etc/ntp/step-tickers文件中定义的NTP服务器。
注意
在虚拟机上,上次启动主机时将更新硬件时钟,而不是虚拟机。
通过NTP更新
每次由ntpd或chronyd服务更新系统时钟时,可以更新硬件时钟:
以root用户身分启动ntpd服务:
~]# systemctl start ntpd.service
要使行为在引导后保留,请在引导时手动启动该服务:
~]# systemctl enable ntpd.service
或则
以root用户身分启动chronyd服务:
~]# systemctl start chronyd.service
要使行为在引导后保留,请在引导时手动启动该服务:
~]# systemctl enable chronyd.service
为此,每次由ntpd或chronyd同步系统时钟时,内核会在11分钟内手动更新硬件时钟。
警告
这些方式可能并不总是有效,由于前面提及的11分钟模式并不总是启用。为此,硬件时钟不一定会在系统时钟更新中更新。
要检测软件时钟与硬件时钟的同步,以root用户身分使用ntpdc-ckerninfo或ntptime命令:
~]# ntpdc -c kerninfo
结果可能类似如下:
pll offset: 0 s
pll frequency: 0.000 ppm
maximum error: 8.0185 s
estimated error: 0 s
status: 2001 pll nano
pll time constant: 6
precision: 1e-09 s
frequency tolerance: 500 ppm
或则
~]# ntptime
结果可能类似如下:
ntp_gettime() returns code 0 (OK)
time dcba5798.c3dfe2e0 Mon, May 8 2017 11:34:00.765, (.765135199),
maximum error 8010000 us, estimated error 0 us, TAI offset 0
ntp_adjtime() returns code 0 (OK)
modes 0x0 (),
offset 0.000 us, frequency 0.000 ppm, interval 1 s,
maximum error 8010000 us, estimated error 0 us,
status 0x2001 (PLL,NANO),
time constant 6, precision 0.001 us, tolerance 500 ppm,
要辨识硬件时钟是否与系统时钟同步,请查看输出中的状态行。假如该行包含词组unsync或UNSYNC,则硬件时钟不会与系统时钟同步。
硬件时钟与系统时钟同步。
status 0x2001 (PLL,NANO)
硬件时钟未与系统时钟同步。
status 0x41 (PLL,UNSYNC)
2.4配置时钟源
要列举系统中的可用时钟源,请运行以下命令:
~]$ cd /sys/devices/system/clocksource/clocksource0/
clocksource0]$ cat available_clocksource
kvm-clock tsc hpet acpi_pm
clocksource0]$ cat current_clocksource
kvm-clock
在前面的示例中,内核使用的是kvm-clock。这是在启动时选择的ntp服务器搭建 linux,由于它是一个虚拟机。请注意,可用的时钟源取决于架构。
要覆盖默认时钟源ntp服务器搭建 linux,请在内核GRUB2菜单条目的末尾附加clocksource指令。使用grubby工具进行修改。诸如:要强制系统中的默认内核使用tsc时钟源,请输入以下命令:
~]# grubby --args=clocksource=tsc --update-kernel=DEFAULT
2.5配置文件:/etc/sysconfig/ntpd
在服务启动时,该文件将由ntpd读取。默认内容如下:
# Command line options for ntpd
OPTIONS="-g"
在不使用-g选项的情况下linux系统安装教程,ntpd会拒绝同步与系统时间差别过大的NTP服务器(超过1000秒的差别)。这是为了防止系统时间出现突兀的跳跃,影响系统稳定性。
-g选项告诉ntpd在启动时,容许对系统时间进行一次性的大幅度调整。无论系统时间与NTP服务器时间的差别有多大,ntpd就会进行同步,而不会拒绝。一旦初始同步完成,后续的时间调整会使用渐进式的方法(通过微调时间来同步),防止时间突变。
典型场景:
2.6相关工具ntpdate
ntpdate是一个用于自动同步计算机时间的命令行工具,它通过与指定的NTP(网路时间合同)服务器通讯来调整系统时钟。其实ntpdate被觉得是一种较为老旧的形式,但是其功能已被ntpd等更现代的服务取代,但它依然广泛用于须要立刻同步时间的场景。适用于网路不稳定、NTP服务未常年运行、或系统启动时进行一次性同步的情况。
命令格式:
ntpdate [选项] [NTP服务器地址]
常用选项:
示例:
同步时间:
ntpdate ntp.aliyun.com
这会将系统时间与阿里云的NTP服务器同步。
只查询时间:
ntpdate -q pool.ntp.org
这会向服务器查询时间,但不会实际调整系统时钟。
注意事项:
timedatectl
timedatectl是Linux系统中用于管理和查看系统时间和日期配置的命令行工具。它是systemd的一部份,容许管理员查询和更改系统的时间设置、时区配置以及与NTP(网路时间合同)相关的服务。常用命令如下:
查看当前时间、日期和时间设置
timedatectl
输出类似于:
[root@client~]# timedatectl
Local time: Thu 2024-08-29 16:28:39 CST
Universal time: Thu 2024-08-29 08:28:39 UTC
RTC time: Thu 2024-08-29 08:28:39
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
设置系统时间和日期
sudo timedatectl set-time "2024-08-28 12:00:00"
这个命令将系统时间设置为2024年8月28日下午12点。
设置系统时区
sudo timedatectl set-timezone America/New_York
这个命令将系统时区设置为America/New_York。
启用NTP
sudo timedatectl set-ntp true
这个命令启用基于NTP的时间同步。
禁用NTP
sudo timedatectl set-ntp false
这个命令禁用NTP时间同步。
设置硬件时钟为UTC
sudo timedatectl set-local-rtc 0
这个命令将硬件时钟设置为使用UTC,而不是本地时间。
设置硬件时钟为本地时间
sudo timedatectl set-local-rtc 1
这个命令将硬件时钟设置为使用本地时间。
3.相关资料
使用ntpd配置ntp:
Howtoreadthentpqoutput?:
19.20.其它资源|RedHatProductDocumentation