如何设置 Linux 客户端以使用通过 dhcp 提供的 ntp 信息?

如何设置 Linux 客户端以使用通过 dhcp 提供的 ntp 信息?

有很多教程解释如何设置dhcpd服务器,以及向 dhcp 客户端提供 ntp 建议,我一直认为ntp配置是自动执行的。最近我开始看到本地网络中的时钟漂移,所以我认为这是一个错误的假设。因此,我开始研究如何最大限度地减少 ntp 客户端配置,前提是已ntp-server通过 .net 进行了设置建议dhcpd

除了这个 Ubuntu 特定帮助教程之外,我找不到太多东西https://help.ubuntu.com/community/UbuntuTime。即使在这里(请参阅“故障排除 -> 使用哪个配置文件?”下的段落),信息也很少,但它表示如果/etc/ntp.conf.dhcp找到文件,则会使用该文件。首先,作者在这里指的实际位置是/var/lib/ntp/ntp.conf.dhcp在 中观察到的/etc/init.d/ntp,但无论如何,该文件的存在并不能保证 ntp 会向 请求服务器dhclient。因此,我必须为本地 ntp 服务器显式添加该server子句。ntp.conf.dhcp但既然如此,为什么我还要在dhcpd服务器上设置 ntp 设置呢?

这似乎违背直觉,即设置一次 ntp 设置(即在服务器上)并让dhcpd服务器将信息委托给客户端。我怎样才能最小化(如果不是完全避免的话)ntp.conf 的客户端配置?或者,我如何ntp通过dhclient.

是否有适合所有 Linux 发行版的 cli 解决方案?

我假设每个客户端都应该有 的可执行文件ntpd,但我不知道如何从那里继续。

谢谢

编辑:手动运行时ubuntu客户端详细输出dhclient

sudo dhclient -1 -d -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth0/20:cf:30:0e:6c:12
Sending on   LPF/eth0/20:cf:30:0e:6c:12
Sending on   Socket/fallback
DHCPREQUEST of 192.168.112.150 on eth0 to 255.255.255.255 port 67 (xid=0x2e844b8f)
DHCPACK of 192.168.112.150 from 192.168.112.112
reload: Unknown instance: 
invoke-rc.d: initscript smbd, action "reload" failed.
RTNETLINK answers: File exists
 * Stopping NTP server ntpd
   ...done.
 * Starting NTP server ntpd
   ...done.
bound to 192.168.112.150 -- renewal in 41963 seconds.

ntpd 服务已重新启动,但运行ntpq -cpe -cas后我仍然在 ntp 服务器列表中看不到我的本地 ntp 服务器。

当然我的dhcpd服务器有option ntp-servers

subnet 192.168.112.0 netmask 255.255.255.0 {
        max-lease-time 604800;
        default-lease-time 86400;
        authoritative;
        ignore client-updates;

        option ntp-servers 192.168.112.112; #self

        ... (many other options)
}

答案1

如果您使用的 dhcp 服务器配置为提供该ntp-servers选项,则可以通过添加ntp-servers到 中的默认请求行来配置 dhclient 来请求 ntp-servers dhclient.conf,如 Ubuntu Linux 中的本示例末尾所示(从 19.04 开始,但至少自 12.04 起存在):

request subnet-mask, broadcast-address, time-offset, routers,
        domain-name, domain-name-servers, domain-search, host-name,
        dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
        netbios-name-servers, netbios-scope, interface-mtu,
        rfc3442-classless-static-routes, ntp-servers;

/etc/ntp.conf来自 DHCP 的信息将用于创建/etc/ntp.conf.dhcp.

必须告诉您的 ntpd 使用 /etc/ntp.conf.dhcp(如果存在)。在我使用的 Ubuntu 版本上,这是通过/etc/dhcp/dhclient-exit-hooks.d/ntp. <-- 该文件告诉 NTPd 如果存在则使用它,如果不存在则/etc/ntp.conf.dhcp仅使用。/etc/ntp.conf

答案2

这实际上取决于您正在使用的网络设置/dhcp/NTP 组件以及您的发行版集成工作的组合。

截至 2020 年,至少一些发行版考虑了克罗尼作为 NTPD 的更好的1替代方案,因此默认情况下安装 Chrony,然后仅为 Chrony 维护 DHCP 客户端与 DHCP 客户端的集成。

对于网络设置,发行版中流行的默认设置是网络管理器(而 NetworkManager 使用发行版默认配置自动调用 DHCP 客户端)。因此,如果您使用发行版默认值(即 NetworkManager 和 Chrony),则期望选择 DHCP 提供的(本地)NTP 服务器。

NetworkManager 和 Chrony

使用时克罗尼您可以验证您的 DHCP 公布的 NTP 服务器是否已与 Chrony 通信,如下所示:

# chronyc sources
210 Number of sources = 5
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^- fritz.box                     3   6     0  1015   +627us[  -23us] +/-   47ms
^* ntp3.rrze.ipv6.uni-erlan>     1   7   377    47   +997us[+1007us] +/-   26ms
^+ tethys.hot-chilli.net         2   7   377    47   +522us[ +533us] +/-   51ms
^+ mail.jabber-germany.de        3   7   377    46   +352us[ +352us] +/-   61ms
^+ 2a.ncomputers.org             2   7   377    44  -2900us[-2900us] +/-   73ms

(这是来自使用默认配置的带有 NetworkManager 和 Chrony 的 Fedora 31 系统。)

该示例显示,我的家庭路由器 ( fritz.box) 中包含的本地 NTP 服务器(通过 DHCP 宣布)实际上已为 Chrony 所知(通过某些 NetworkManager 粘合配置/代码),但目前 Chrony 并未使用它(参见M -> --ie第二列)因为最后 8 个回复无效(参见Reach -> 0)。

S
    This column indicates the state of the source.
      ·   * indicates the source to which chronyd is currently
            synchronised.
      ·   + indicates acceptable sources which are combined with the
            selected source.
      ·   - indicates acceptable sources which are excluded by the
            combining algorithm.

[..] Reach 这显示了以八进制数打印的源的可达性寄存器。该寄存器有 8 位,并根据来自源的每个收到或丢失的数据包进行更新。值 377 表示从最近八次传输中收到了所有有效答复。

(F32 上的 chronyc(1)

正如您所看到的,对于这样的发行版,一切都应该开箱即用。2您只需确保安装了 Chrony 和 NetworkManager(并且您的本地 NTP 服务器发送了有效的回复)。

网络和时间同步

网络化时间同步是 systemd 的端口,启用后(而不是 NetworkdManager 和 Chrony),它们处理网络设置并作为 NTP 客户端。

如果 systemd 已经在使用(很可能是),那么它可以被视为服务器和小型嵌入式设备的 NetworkManager 和 Chrony 的更轻量级替代品。但是,某些发行版(例如 RHEL/CentOS 8)不打包这些组件。

当 Networkd 和 Timesyncd 都启用时,Networkd 默认使用 DHCP 提供的 NTP可供 Timesyncd 使用的服务器,它比其他服务器更喜欢它


1另请参阅:

Chrony 应优先用于所有系统,除了由不支持 chrony 的工具管理或监视的系统,或具有无法与 chrony 一起使用的硬件参考时钟的系统。

(RedHat 在其RHEL 7 管理指南

从安全角度来看(在 CII,我们是安全人员),Chrony 是这三个 NTP 实现之间明显的赢家。

(来自核心基础设施倡议委托的 2017 年安全审计,来自低水温网络

Chrony 的 NTP 实现比较

当然,2模错误。例如 Fedora 中过去的错误:

答案3

相关内容