linux下NTP服务器实战(ntp软件)

linux下NTP服务器实战(ntp软件)

记录linux下NTP服务器搭建及相关管理操作,使用ntp软件包安装部署。

1. NTP服务器搭建实战

借助ntp软件包在linux上搭建ntp服务器,同时作为客户端从上游ntp服务器同步时间。

1.1 安装配置NTP服务器

1.1.1 安装NTP服务

在大多数Linux发行版上,NTP服务可以通过包管理器安装。

  • Debian/Ubuntu:
sudo apt update
sudo apt install ntp
  • RHEL/CentOS:
sudo yum install ntp
1.1.2 配置NTP服务器

安装完成后,编辑NTP服务器的配置文件 /etc/ntp.conf,不同发行版配置文件大同小异。

sudo vi /etc/ntp.conf
  1. 配置上游的时间服务器

配置上游服务器主要用于同步当前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
  1. 关于pool.ntp.org项目

pool.ntp.org 是一个以时间服务器的大虚拟集群为上百万的客户端提供可靠的易用的网络时间协议(NTP)服务的项目。NTP池正在为世界各地成百上千万的系统提供服务。它是绝大多数主流Linux发行版和许多网络设备的默认“时间服务器”。

官网:https://www.ntppool.org/zh/

  1. 国内外常见公有的NTP服务器:
  • 中国国家授时中心 (NTSC):ntp.ntsc.ac.cn

  • 阿里云NTP服务器:ntp.aliyun.com

  • 腾讯NTP服务器:ntp.tencent.com

  • 全球NTP服务器池:pool.ntp.org

  • 亚洲NTP服务器池:asia.pool.ntp.org

  • google NTP服务器:time.google.com

关于iburst参数:要延长初始同步所需的时间,请在服务器命令末尾添加以下选项:iburst,当服务器无法访问时,发送包含 8 个数据包的突发事件,而不是通常的一个数据包。

  1. 配置 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 地址,选项是以下一个或多个

  • ignore - 忽略所有NTP数据包。这会阻止客户端与服务器的任何通信。
  • Kod - 在客户端受到限制时,服务器会发送“KoD”(Kiss of Death)消息,告诉客户端它受到限制并且应停止请求。
  • limited - 限制客户端的请求速率。如果客户端请求太频繁,则会被拒绝,避免DOS攻击。ntpqntpdc 查询不受影响。
  • lowpriotrap - 匹配主机设置的陷阱低优先级。
  • nomodify - 客户端不能修改服务器的时间或配置。允许查询时间,但禁止发送修改请求(例如ntpqntpdc的配置修改命令)。
  • noquery - 禁止客户端查询NTP服务器状态。禁止使用ntpqntpdc等工具获取服务器状态信息。即使可以同步时间,也无法查询服务器的状态。
  • nopeer -阻止客户端尝试建立对等关系。客户端只能作为普通客户端,而不能作为对等服务器。
  • noserve - 拒绝 ntpq 和 ntpdc 查询以外的所有数据包。不允许客户端同步时间,也不提供服务。这样客户端无法通过此服务器同步时间,但可以接受查询请求(ntpqntpdc 查询)。
  • notrap - 禁止使用ntpdc的陷阱服务(trap service),该服务允许系统管理员通过陷阱命令接收事件或状态更改通知。
  • notrust - 拒绝未经加密身份验证的数据包。
  • ntpport - 修改匹配算法,使其仅在源端口是标准 NTP UDP 端口 123 时应用限制。
  • Version - 要求客户端使用特定版本的NTP协议。这个选项常用于防止低版本NTP客户端的访问。

restrict配置原则:

  • 最小权限原则:仅授予必要的权限。对于普通客户端,建议使用nomodifynopeernotrap等选项。
  • 安全性:对于未知或外部网络来源,使用ignorelimited选项,以提高NTP服务器的安全性。
  • 灵活性:对本地地址和可信网络可以给予更宽松的权限,而对外部或不可信网络施加更严格的限制。

示例配置:

以下是一些restrict命令的常见配置示例:

  1. 允许内网客户端同步时间,但禁止修改服务器配置
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
  • 允许IP范围在192.168.1.0/24子网内的客户端同步时间,但不允许修改服务器配置。
  1. 允许所有地址的时间查询,但不允许任何修改或陷阱服务
restrict default kod nomodify notrap nopeer noquery
  • 对所有未明确配置的客户端发送KoD信息,并阻止修改请求、陷阱服务、对等关系和查询服务。
  1. 允许本地系统的完全访问
restrict 127.0.0.1
restrict ::1
  • 允许本地回环地址(IPv4和IPv6)的完全访问。
  1. 禁止某个特定IP地址的访问
restrict 192.168.1.100 mask 255.255.255.255 ignore
  • 完全忽略来自192.168.1.100的所有NTP请求。
  1. 限制请求速率以防止DOS攻击
restrict default kod limited
  • 如果客户端的请求速率过高,NTP服务器将发送KoD消息并限制其进一步访问。
  1. 允许特定网络主机(如 192.0.2.250/32 )进行不受限制的访问:
restrict 192.0.2.250
  • 如果未指定掩码,默认为 255.255.255.255

更多的配置选项参考19.17. 配置 NTP | Red Hat Product Documentation

说明

ntpqntpdc 查询可用于放大攻击,因此请勿在可公开访问的系统上从 restrict 默认 命令中删除 noquery 选项。

1.1.3 启动和启用NTP服务

编辑配置文件后,启动NTP服务并设置为开机自启:

  • Debian/Ubuntu:
sudo systemctl restart ntp
sudo systemctl enable ntp
  • RHEL/CentOS:
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(Network Time Protocol)客户端状态的命令,能够显示当前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

参数解读:

  • remote: 该列显示客户端连接的NTP服务器的主机名或IP地址。行前的符号代表与该服务器的同步关系:

    • *:表示当前使用的NTP服务器,客户端与该服务器已经同步。
    • +:候选NTP服务器,如果当前的服务器失效,可能切换到这个服务器。
    • -:无效服务器,不能同步时间。
    • (空白):不在同步选择中。
  • refid: 参考ID,表示时间信息的层级和来源的代码(上游服务器的IP或其他标识符)。refid 有下面这些状态值:

    • IP地址:远程节点或服务器的 IP 地址;
    • .POOL.:ntp池;
    • LOCL:本机 (当没有远程节点或服务器不可用时);
    • .GPS.:美国 GPS;
    • .GAL.:伽利略定位系统欧洲 GNSS;
    • .BCST.:广播服务器
    • MCST.: 多播服务器
  • st: 服务器的层级(Stratum)。这是一个表示NTP服务器距离参考时钟的层级数,范围是 1 到 16,数值越小,表示更准确的时间来源。

    • 1:指服务器是参考时钟源。
    • 2及以下:表示服务器从上一级时间源同步。
    • 16: 用于表示一个未同步状态。
  • t: 该列表示该服务器的类型:

    • l: 表示本地。
    • u:表示一个unicast(单播)服务器。
    • b:表示一个broadcast(广播)服务器。
    • m:表示一个multicast(多播)服务器。
    • s:表示对称(对等)模式节点,用于备份。
    • p:表示NTP服务器来自NTP池
  • when: 这是客户端上一次从该服务器请求时间同步的时间(以秒计)。数值表示上次同步请求的时间距离现在多少秒。

  • poll: 该列显示客户端与该服务器之间的时间同步请求间隔(以秒计)。该间隔时间会动态调整,通常为64秒到1024秒之间。

  • reach: 这是一个八位二进制数,表示客户端最近与该服务器的响应情况。377表示最近8次请求都成功(即 11111111,转换为十进制为377),较低的数值表示有部分请求失败。

  • delay: 这是客户端与NTP服务器之间的网络延迟(往返延迟,以毫秒为单位),表示客户端发送请求到接收到服务器回复的往返时间。

  • offset: 这是客户端的本地时钟与该NTP服务器时钟之间的时间差(以毫秒为单位)。正数表示本地时钟比服务器慢,负数表示本地时钟比服务器快。

  • jitter: 这是客户端与NTP服务器之间时间同步的波动(以毫秒为单位),显示了时间同步的抖动程度。数值越小,表示同步越稳定。

备注

在NTP中,Stratum 16 表示服务器无法获得有效的时间源,也就是说该服务器不同步。NTP会将其状态标记为 unsynchronized,所以这并不是正常的层级,而是表示失去同步的状态。

因此,尽管NTP的层级范围通常为Stratum 0到15,但当服务器无法与上级服务器同步时,它的Stratum值会被设置为16,表示该服务器不适合作为时间源。

2.2 配置NTP客户端

2.2.1 安装NTP客户端

客户端如果是linux,也需要安装NTP软件包,通常使用与服务器相同的安装命令。如果是其他系统,参考对应的ntp配置指南。

  • Debian/Ubuntu:
sudo apt update
sudo apt install ntp
  • RHEL/CentOS:
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服务

和服务器配置类似,启动NTP客户端服务并设置为开机自启:

  • Debian/Ubuntu:
sudo systemctl restart ntp
sudo systemctl enable ntp
  • RHEL/CentOS:
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。请参阅《 红帽企业 Linux 7 虚拟化部署和管理指南 》中的 KVM 客户机计时管理 章节。

2.3 配置硬件时钟更新

系统时钟可用于更新硬件时钟,也称为实时时钟(RTC)。下面是配置硬件时钟的三种方法:

  1. 即时一次性更新

要对硬件时钟进行即时一次性更新,以 root 用户身份运行这个命令:

~]# hwclock --systohc
  1. 在每次引导时更新

要在执行 ntpdate 同步程序后在每次引导时更新硬件时钟,请执行以下操作:

1)在 /etc/sysconfig/ntpdate 文件中添加以下行:

SYNC_HWCLOCK=yes

2)以 root 用户身份启用 ntpdate 服务:

~]# systemctl enable ntpdate.service

请注意,ntpdate 服务使用 /etc/ntp/step-tickers 文件中定义的 NTP 服务器。

注意

在虚拟机上,下次启动主机时将更新硬件时钟,而不是虚拟机。

  1. 通过 NTP 更新

每次由 ntpdchronyd 服务更新系统时钟时,可以更新硬件时钟:

以 root 用户身份启动 ntpd 服务:

~]# systemctl start ntpd.service

要使行为在引导后保留,请在引导时自动启动该服务:

~]# systemctl enable ntpd.service

或者

以 root 用户身份启动 chronyd 服务:

~]# systemctl start chronyd.service

要使行为在引导后保留,请在引导时自动启动该服务:

~]# systemctl enable chronyd.service

因此,每次由 ntpdchronyd 同步系统时钟时,内核会在 11 分钟内自动更新硬件时钟。

警告

这种方法可能并不总是有效,因为上面提到的 11 分钟模式并不总是启用。因此,硬件时钟不一定会在系统时钟更新中更新。

要检查软件时钟与硬件时钟的同步,以 root 用户身份使用 ntpdc -c kerninfontptime 命令:

~]# 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。这是在启动时选择的,因为它是一个虚拟机。请注意,可用的时钟源取决于构架。

要覆盖默认时钟源,请在内核 GRUB 2 菜单条目的末尾附加 clocksource 指令。使用 grubby 工具进行更改。例如:要强制系统中的默认内核使用 tsc 时钟源,请输入以下命令:

~]# grubby --args=clocksource=tsc --update-kernel=DEFAULT

2.5 配置文件:/etc/sysconfig/ntpd

在 服务启动时,该文件将由 ntpd 读取。默认内容如下:

# Command line options for ntpd
OPTIONS="-g"

在不使用 -g 选项的情况下,ntpd 会拒绝同步与系统时间差距过大的 NTP 服务器(超过 1000 秒的差异)。这是为了避免系统时间出现突兀的跳跃,影响系统稳定性。

-g 选项告诉 ntpd启动时,允许对系统时间进行一次性的大幅度调整。无论系统时间与 NTP 服务器时间的差异有多大,ntpd 都会进行同步,而不会拒绝。一旦初始同步完成,后续的时间调整会使用渐进式的方式(通过微调时间来同步),避免时间突变。

典型场景

  • 系统启动时:如果系统启动时时间差异较大(例如停电、CMOS 电池失效等导致系统时间不准确),ntpd -g 可以保证服务器启动时立即将时间调整到正确值,而不会因为时间差距过大而拒绝同步。
  • 恢复网络连接后:在系统断网一段时间后重新连接时,可能会遇到较大的时间偏差。此时使用 -g 选项可以确保 ntpd 能够正确同步时间。

2.6 相关工具

ntpdate

ntpdate 是一个用于手动同步计算机时间的命令行工具,它通过与指定的 NTP(网络时间协议)服务器通信来调整系统时钟。虽然 ntpdate 被认为是一种较为老旧的方式,并且其功能已被 ntpd 等更现代的服务替代,但它仍然广泛用于需要立即同步时间的场景。适用于网络不稳定、NTP服务未长期运行、或系统启动时进行一次性同步的情况。

命令格式:

ntpdate [选项] [NTP服务器地址]

常用选项:

  • -q:查询指定 NTP 服务器的时间,但不实际进行同步。
  • -u:使用非特权端口与服务器通信,避免因为端口被占用而无法同步。
  • -b:强制时间设置,即使与系统时间差异较大时也立即同步(会跳跃调整时间)。
  • -s:将同步信息记录到系统日志。
  • -v:输出详细信息。

示例:

  1. 同步时间:
ntpdate ntp.aliyun.com

这会将系统时间与阿里云的 NTP 服务器同步。

  1. 只查询时间:
ntpdate -q pool.ntp.org

这会向 pool.ntp.org 服务器查询时间,但不会实际调整系统时钟。

注意事项:

  • ntpdate 通常用于临时同步时间。如果需要持续保持时间的同步,应该使用 ntpd 或者 chrony 服务,它们会定期与 NTP 服务器保持同步,提供更稳定和持续的时间调整。
  • 在一些 Linux 发行版中,ntpdate 已经被标记为弃用,推荐使用 ntpd -gq 来代替其功能。
  • 使用ntpdate同步时间时,停止ntpd或者chrony服务,避免ntp socket冲突,类似如下错误:ntpdate[37630]: the NTP socket is in use, exiting
timedatectl

timedatectl 是 Linux 系统中用于管理和查看系统时间和日期配置的命令行工具。它是 systemd 的一部分,允许管理员查询和修改系统的时间设置、时区配置以及与 NTP(网络时间协议)相关的服务。常用命令如下:

  1. 查看当前时间、日期和时间设置
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
  1. 设置系统时间和日期
sudo timedatectl set-time "2024-08-28 12:00:00"

这个命令将系统时间设置为 2024 年 8 月 28 日中午 12 点。

  1. 设置系统时区
sudo timedatectl set-timezone America/New_York

这个命令将系统时区设置为 America/New_York

  1. 启用 NTP
sudo timedatectl set-ntp true

这个命令启用基于 NTP 的时间同步。

  1. 禁用 NTP
sudo timedatectl set-ntp false

这个命令禁用 NTP 时间同步。

  1. 设置硬件时钟为 UTC
sudo timedatectl set-local-rtc 0

这个命令将硬件时钟设置为使用 UTC,而不是本地时间。

  1. 设置硬件时钟为本地时间
sudo timedatectl set-local-rtc 1

这个命令将硬件时钟设置为使用本地时间。

3. 相关资料

  1. 使用ntpd配置ntp:https://docs.redhat.com/zh_hans/documentation/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-configure_ntp

  2. How to read the ntpq output?: https://access.redhat.com/solutions/7057435

  3. 19.20. 其它资源 | Red Hat Product Documentation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lldhsds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值