30.10. 通过 NTP 进行时钟同步

Contributed by Tom Hukins.

30.10.1. 纵览

随着时间的推移, 计算机的时钟会倾向于漂移。 网络时间协议 (NTP) 是一种确保您的时钟保持准确的方法。

许多 Internet 服务依赖、 或极大地受益于本地计算机时钟的准确性。 例如, web 服务器可能会接收到一个请求, 要求如果文件在某一时刻之后修改过才发送它。 在局域网环境中, 共享文件的计算机之间的时钟是否同步至关重要, 因为这样才能使时间戳保持一致。 类似 cron(8) 这样的程序, 也依赖于正确的系统时钟, 才能够准确地执行操作。

FreeBSD 附带了 ntpd(8) NTP 服务器, 它可以用于查询其它的 NTP 服务器, 并配置本地计算机的时钟, 或者为其它机器提供服务。

30.10.2. 选择合适的 NTP 服务器

为了同步您的系统时钟, 需要首先找到至少一个 NTP 服务器以供使用。 网络管理员, 或 ISP 都可能会提供用于这样目的的 NTP 服务器──请查看他们的文档以了解是否是这样。 另外, 也有一个在线的 公开的 NTP 服务器列表, 您可以从中选一个较近的 NTP 服务器。 请确认您选择的服务器的访问策略, 如果需要的话, 申请一下所需的许可。

选择多个相互不连接的 NTP 服务器是一个好主意, 这样在某个服务器不可达, 或者时钟不可靠时就可以有别的选择。 这是因为, ntpd(8) 会智能地选择它收到的响应──它会更倾向于使用可靠的服务器。

30.10.3. 配置您的机器

30.10.3.1. 基本配置

如果只想在系统启动时同步时钟, 则可以使用 ntpdate(8)。 对于经常重新启动, 并且不需要经常同步的桌面系统来说这比较适合, 但绝大多数机器都应该运行 ntpd(8)

在引导时使用 ntpdate(8) 来配合运行 ntpd(8) 也是一个好主意。 ntpd(8) 渐进地修正时钟, 而 ntpdate(8) 则直接设置时钟, 无论机器的当前时间和正确时间有多大的偏差。

要启用引导时的 ntpdate(8), 需要把 ntpdate_enable="YES" 加到 /etc/rc.conf 中。 此外, 还需要通过 ntpdate_flags 来设置同步的服务器和选项, 它们将传递给 ntpdate(8)

30.10.3.2. 一般配置

NTP 是通过 /etc/ntp.conf 文件来进行配置的, 其格式在 ntp.conf(5) 中进行了描述。 下面是一个例子:

server ntplocal.example.com prefer
server timeserver.example.org
server ntp2a.example.net

driftfile /var/db/ntp.drift

这里, server 选项指定了使用哪一个服务器, 每一个服务器都独立一行。 如果某一台服务器上指定了 prefer (偏好) 参数, 如上面的 ntplocal.example.com, 则会优先选择这个服务器。 如果偏好的服务器和其他服务器的响应存在显著的差别, 则丢弃它的响应, 否则将使用来自它的响应, 而不理会其他服务器。 一般来说, prefer 参数应该标注在非常精确的 NTP 时源, 例如那些包含特殊的时间监控硬件的服务器上。

driftfile 选项, 则指定了用来保存系统时钟频率偏差的文件。 ntpd(8) 程序使用它来自动地补偿时钟的自然漂移, 从而使时钟即使在切断了外来时源的情况下, 仍能保持相当的准确度。

另外, driftfile 选项也保存上一次响应所使用的 NTP 服务器的信息。 这个文件包含了 NTP 的内部信息, 它不应被任何其他进程修改。

30.10.3.3. 控制您的服务器的访问

默认情况下, NTP 服务器可以被整个 Internet 上的主机访问。 如果在 /etc/ntp.conf 中指定 restrict 参数, 则可以控制允许哪些机器访问您的服务器。

如果希望拒绝所有的机器访问您的 NTP 服务器, 只需在 /etc/ntp.conf 中加入:

restrict default ignore

注意:

这样做会禁止您的服务器访问在本地配置中列出的服务器。 如果您需要令 NTP 服务器与外界的 NTP 服务器同步时间, 则应允许指定服务器。 请参见联机手册 ntp.conf(5) 以了解进一步的细节。

如果只希望子网内的机器通过您的服务器同步时钟, 而不允许它们配置为服务器, 或作为同步时钟的节点来时用, 则加入

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

这里, 需要把 192.168.1.0 改为您网络上的 IP 地址, 并把 255.255.255.0 改为您的子网掩码。

/etc/ntp.conf 可能包含多个 restrict 选项。 要了解进一步的细节, 请参见 ntp.conf(5)Access Control Support(访问控制支持) 小节。

30.10.4. 运行 NTP 服务器

要让 NTP 服务器在系统启动时随之开启, 需要把 ntpd_enable="YES" 加入到 /etc/rc.conf 中。 如果希望向 ntpd(8) 传递更多参数, 需要编辑 /etc/rc.conf 中的 ntpd_flags

要在不重新启动机器的前提下启动服务器, 需要手工运行 ntpd, 并带上 /etc/rc.conf 中的 ntpd_flags 所指定的参数。 例如:

# ntpd -p /var/run/ntpd.pid

30.10.5. 在临时性的 Internet 连接上使用 ntpd

ntpd(8) 程序的正常工作并不需要永久性的 Internet 连接。 然而, 如果您的临时性连接是配置为按需拨号的, 那么防止 NTP 通讯频繁触发拨号, 或保持连接就有必要了。 如果您使用用户级 PPP, 可以使用 filter 语句, 在 /etc/ppp/ppp.conf 中进行必要的设置。 例如:

 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/ 中的例子。

注意:

某些 Internet 访问提供商会阻止低编号的端口, 这会导致 NTP 无法正常工作, 因为响应无法到达您的机器。

30.10.6. 进一步的信息

关于 NTP 服务器的文档, 可以在 /usr/share/doc/ntp/ 找到 HTML 格式的版本。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.