29.11. NTP时间校对

随着使用时间,电脑的时钟会逐渐偏移,这对需要网络上电脑有相同准确度时间的许多网络服务来说是一个大问题。准确的时间同样能确保档案时间戳记的一致性。网络时间协定(Network Time Protocol,NTP)是一种在网路上可以确保时间准确的方式。

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

本节将会介绍如何设定FreeBSD上的ntpd,更进一步的说明文件可于/usr/share/doc/ntp/找到HTML格式的版本。

29.11.1. NTP 设定

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

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

29.11.1.1. /etc/ntp.conf 文件

Ntpd读取/etc/ntp.conf以确定要查询哪些NTP服务器。建议选择多个NTP服务器,以防其中一个服务器无法访问或其时钟不可靠。由于ntpd接收到响应,所以它更倾向于可靠的服务器而不是不可靠的服务器。被查询的服务器可以是网络的本地服务器,由ISP提供,也可以从 online list of publicly accessible NTP servers的在线列表中选择。当选择公共的NTP服务器时,请选择一个在地理位置上接近的服务器,并查看其使用策略。pool配置关键字从服务器池中选择一个或多个服务器。 可以使用 online list of publicly accessible NTP pools, 它按地区归纳了部分 NTP 服务器。此外, FreeBSD 还提供了一个项目赞助的 NTP 池, 0.freebsd.pool.ntp.org

例 29.3. /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关键字控制哪些系统可以访问服务器。支持多个restrict条目,每个条目都可以细化前面语句中给出的限制。示例中的值赋予本地系统完全的查询和控制访问权限,而远程系统只允许查询时间。有关详细信息,请参阅ntp.conf(5)中的Access Control Support小节。

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

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

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

设置ntpd_enable=YES可以让ntpd在系统启动时启动。ntpd_enable=YES添加到/etc/rc.conf后,可以使用以下命令启动ntpd

# service ntpd start

使用 ntpd 时,ntpd_enable 必须设置。其他可选的 rc.conf 选项如下所述,可按需配置。

设置ntpd_sync_on_start=YES,允许ntpd在启动时同步时间。通常情况下,如果时钟关闭超过1000秒,ntpd会记录错误消息并退出。这个选项在没有电池支持的实时时钟的系统中特别有用。

设置ntpd_oomprotect=YES,以保护ntpd守护进程不会在系统从Out Of Memory (OOM 内存不足) 时退出。

设置 ntpd_config=选择使用的ntp.conf文件位置。

ntpd_flags=中添加ntpd所需参数,但不要添加定义在/etc/rc.d/ntpd内的参数:

  • -p (pid 文件位置)

  • -c(改为设置ntpd_config=

29.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 or --driftfile

  • -i or --jaildir

  • -k or --keyfile

  • -l or --logfile

  • -s or --statsdir

ntp.conf中出现以下任何一个关键字,都需要按照下面描述的手动配置,以ntpd用户的身份运行:

  • crypto

  • driftfile

  • key

  • logdir

  • statsdir

要让ntpdntpd用户身份运行,你必须:

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

  • mac_ntpd 模块静态编译或动态加载到内核中。参见 mac_ntpd(4)

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

29.11.2. 在PPP联机使用NTP

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无法运作,因为响应永远无到传送到该主机。

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

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

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