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``;它包含了在可公开访问的网络连接上操作的建议选项。 .. code:: shell-session # 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 而无需通过键入以下内容重新启动系统: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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`` 指令配置。例如: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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 正常运行。