Comment on page
32.11.用 NTP 进行时钟同步
随着时间的推移,计算机的时钟容易漂移。这是有问题的,因为许多网络服务要求网络上的计算机共享相同的准确时间。还需要准确的时间来确保文件时间戳保持一致。网络时间协议(NTP)是在网络中提供时钟精度的一种方法。
本节介绍如何在 FreeBSD 上配置 ntpd。更多文档可以在 /usr/share/doc/ntp/ 中找到,是 HTML 格式。
Ntpd 使用 UDP 数据包与其网络对等体进行通信。你的计算机与其 NTP 对等体之间的任何防火墙都必须配置为允许 UDP 数据包在端口 123 上传入和传出。
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 nopeerrestrict source limited kod nomodify notrap noquery# Allow unrestricted access from localhost for queries and control.restrict 127.0.0.1restrict ::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 6pool 0.freebsd.pool.ntp.org iburst# Use a local leap-seconds file.leapfile "/var/db/ntpd.leap-seconds.list"
默认情况下,任何网络主机都可以访问 NTP 服务器。关键字
restrict
控制哪些系统可以访问该服务器。支持多个限制项,每个限制项都能完善前面语句中给出的限制。例子中显示的值授予本地系统完全的查询和控制权限,而只允许远程系统查询时间的能力。更多细节,请参考 ntp.conf(5) 的 Access Control Support
一节。关键字
server
指定要查询的单一服务器。该文件可以包含多个服务器关键字,每行列出一个服务器。pool
关键字指定了一个服务器池。Ntpd 将根据需要从这个池中添加一个或多个服务器,以达到使用 tos minclock
值指定的对等体的数量。iburst
关键字指示 ntpd
在第一次建立联系时与一个服务器执行八次快速数据包交换的突发,以帮助快速同步系统时间。关键字
leapfile
指定了一个包含闰秒信息的文件的位置。该文件由 periodic(8) 自动更新。此关键字指定的文件位置必须与 /etc/rc.conf 中的 ntp_db_leapfile
变量中设置的位置匹配。设置
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=
代替)
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
用户有权访问配置中指定的所有文件和目录。 - 在 /etc/rc.conf 中设置
ntpd_user="ntpd"
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
注意一些互联网接入提供商会封锁低编号的端口,因为应答永远无法到达计算机,会阻止 NTP 正常运行。