32.11. 用 NTP 进行时钟同步

随着时间的推移,计算机的时钟容易漂移。这是有问题的,因为许多网络服务要求网络上的计算机共享相同的准确时间。还需要准确的时间来确保文件时间戳保持一致。网络时间协议(NTP)是在网络中提供时钟精度的一种方法。

FreeBSD 包含 ntpd(8),它可以被配置为查询其他 NTP 服务器以同步该机器上的时钟或为网络中的其他计算机提供时间服务。

本节介绍如何在 FreeBSD 上配置 ntpd。更多文档可以在 /usr/share/doc/ntp/ 中找到,是 HTML 格式。

32.11.1. NTP 配置

在 FreeBSD 上,内置的 ntpd 可以用来同步系统的时钟。Ntpd 是使用 rc.conf(5) 变量和 /etc/ntp.conf 配置的,详见以下各节。

Ntpd 使用 UDP 数据包与其网络对等体进行通信。你的计算机与其 NTP 对等体之间的任何防火墙都必须配置为允许 UDP 数据包在端口 123 上传入和传出。

32.11.1.1. /etc/ntp.conf 文件

Ntpd 读取 /etc/ntp.conf 来决定要查询哪些 NTP 服务器。建议选择多个 NTP 服务器,以防止其中一个服务器无法到达或其时钟不可靠。当 ntpd 收到响应时,它倾向于选择可靠的服务器而不是不太可靠的。被查询的服务器可以是网络中的本地服务器,由 ISP 提供,也可以是从可公开访问的 NTP 服务器的联机列表中选择的。选择公共 NTP 服务器时,请选择地理位置接近的服务器并查看其使用策略。配置关键字从服务器池中选择一个或多个服务器。提供可公开访问的 NTP 池的在线列表,按地理区域进行组织。此外,FreeBSD 还提供了一个项目赞助的网站 0.freebsd.pool.ntp.org

例 46.示例 /etc/ntp.conf

这是 ntp.conf 文件的一个简单示例。它可以安全地按原样使用 restrict;它包含了在可公开访问的网络连接上操作的建议选项。

# Disallow ntpq control/query access.  Allow peers to be added only
# based on pool and server statements in this file.
restrict default limited kod nomodify notrap noquery nopeer
restrict source  limited kod nomodify notrap noquery

# Allow unrestricted access from localhost for queries and control.
restrict 127.0.0.1
restrict ::1

# Add a specific server.
server ntplocal.example.com iburst

# Add FreeBSD pool servers until 3-6 good servers are available.
tos minclock 3 maxclock 6
pool 0.freebsd.pool.ntp.org iburst

# Use a local leap-seconds file.
leapfile "/var/db/ntpd.leap-seconds.list"

此文件的格式在 ntp.conf(5) 中有说明。下面的说明仅提供了上述示例文件中使用的关键字的快速概述。

默认情况下,任何网络主机都可以访问 NTP 服务器。关键字 restrict 控制哪些系统可以访问该服务器。支持多个限制项,每个限制项都能完善前面语句中给出的限制。例子中显示的值授予本地系统完全的查询和控制权限,而只允许远程系统查询时间的能力。更多细节,请参考 ntp.conf(5)Access Control Support 一节。

关键字 server 指定要查询的单一服务器。该文件可以包含多个服务器关键字,每行列出一个服务器。pool 关键字指定了一个服务器池。Ntpd 将根据需要从这个池中添加一个或多个服务器,以达到使用 tos minclock 值指定的对等体的数量。iburst 关键字指示 ntpd 在第一次建立联系时与一个服务器执行八次快速数据包交换的突发,以帮助快速同步系统时间。

关键字 leapfile 指定了一个包含闰秒信息的文件的位置。该文件由 periodic(8) 自动更新。此关键字指定的文件位置必须与 /etc/rc.conf 中的 ntp_db_leapfile 变量中设置的位置匹配。

32.11.1.2. /etc/rc.conf 中的 NTP 条目

设置 ntpd_enable=YES 为在启动时启动 ntpd。把 ntpd_enable=YES 添加到 /etc/rc.conf 后,就可以立即启动 ntpd 而无需通过键入以下内容重新启动系统:

# service ntpd start

仅必须设置 ntpd_enable 为使用 ntpd。下面列出的 rc.conf 变量也可以根据需要进行设置。

设置 ntpd_sync_on_start=YES 为允许 ntpd 在启动时对时钟进行任意量的步进。通常,ntpd 将记录一条错误消息,如果时钟关闭超过 1000 秒,则退出。此选项在没有电池供电的实时时钟的系统上特别有用。

设置 ntpd_oomprotect=YES 防止 ntpd 守护程序被尝试从内存不足(OOM)状态恢复的系统杀死。

设置 ntpd_config= 为备用 ntp.conf 文件的位置。

根据需要设置 ntpd_flags= 为包含任何其他 ntpd 参数,但避免使用这些由 /etc/rc.d/ntpd 内部管理的参数:

  • -p(pid 文件的位置)

  • -c(设置 ntpd_config= 代替)

32.11.1.3. Ntpd 和未授权的 ntpd 用户

FreeBSD 上的 Ntpd 可以以非特权用户的身份启动和运行。这样做需要 mac_ntpd(4) 策略模块。/etc/rc.d/ntpd 启动脚本首先检查 NTP 配置。如果可能,它会加载 mac_ntpd 模块,然后以非授权用户 ntpd(用户 ID 123)的身份启动 ntpd。为了避免文件和目录访问的问题,当配置中包含任何与文件有关的选项时,启动脚本不会自动以 ntpd 身份启动 ntpd

ntpd_flags 中存在以下任何一项都需要手动配置,如下所述才能以 ntpd 用户身份运行:

  • -f 或 –driftfile

  • -i 或 –jaildir

  • -k 或 –keyfile

  • -l 或 –logfile

  • -s 或 –statsdir

ntp.conf 中存在以下任何关键字都需要手动配置,如下所述才能以 ntpd 用户身份运行:

  • crypto

  • driftfile

  • key

  • logdir

  • statsdir

要手动将 ntpd 配置为以 ntpd 用户身份运行,你必须:

  • 确保 ntpd 用户有权访问配置中指定的所有文件和目录。

  • 安排 mac_ntpd 模块加载或编译到内核中。有关详细信息,请参见 mac_ntpd(4)

  • /etc/rc.conf 中设置 ntpd_user="ntpd"

32.11.2. 将 NTP 与 PPP 连接结合使用

ntpd 不需要永久连接到互联网即可正常运行。然而,如果 PPP 连接被配置为按需拨号,则应该阻止 NTP 流量触发拨号或保持连接处于活动状态。可以在 /etc/ppp/ppp.conf 中使用 filter 指令配置。例如:

set filter dial 0 deny udp src eq 123
# Prevent NTP traffic from initiating dial out
set filter dial 1 permit 0 0
set filter alive 0 deny udp src eq 123
# Prevent incoming NTP traffic from keeping the connection open
set filter alive 1 deny udp dst eq 123
# Prevent outgoing NTP traffic from keeping the connection open
set filter alive 2 permit 0/0 0/0

要了解更多的细节,请参考 ppp(8) 中的 PACKET FILTERING 部分和 /usr/share/examples/ppp/ 中的例子。

注意

一些互联网接入提供商会封锁低编号的端口,因为应答永远无法到达计算机,会阻止 NTP 正常运行。