如何在FreeBSD10.2上安装和配置OpenNTPd

来自菜鸟教程
跳转至:导航、​搜索

介绍

NTP,即网络时间协议,是一种标准化协议,提供了在各种操作系统上同步时间的方法。 OpenNTPd 是网络时间协议 (NTP) 的免费且易于使用的实现,最初是作为 OpenBSD 项目的一部分开发的。 它提供了从远程 NTP 服务器同步本地时钟的能力,也可以充当服务器本身。

本教程将向您展示如何在 FreeBSD 上安装 OpenNTPd。

先决条件

要学习本教程,您需要:

  • 一个带有 root 用户的 FreeBSD 10.2 Droplet; DigitalOcean 上的默认 freebsd 用户很好。

FreeBSD Droplet 需要 SSH 密钥才能进行远程访问。 有关设置 SSH 密钥的帮助,请阅读 如何在 FreeBSD 服务器上配置基于 SSH 密钥的身份验证。 要了解有关登录 FreeBSD Droplet 和基本管理的更多信息,请查看 FreeBSD 入门 教程系列。

第 1 步 — 安装 OpenNTPd

在安装 OpenNTPd 之前,更新 pkg 使用的存储库信息:

sudo pkg update

然后安装 OpenNTPd 包:

sudo pkg install openntpd

默认 OpenNTPd 配置使用 pool.ntp.org 作为其默认时间服务器,并配置为仅作为客户端计算机工作。 本教程的其余部分将展示如何更改使用的时间服务器以及如何将 OpenNTPd 配置为时间服务器。

第 2 步 — 更改时间服务器((可选)

接下来的几个步骤将编辑默认配置文件 /usr/local/etc/ntpd.conf。 使用 eevi 或您喜欢的文本编辑器来编辑配置文件。

sudo ee /usr/local/etc/ntpd.conf

由 Ask Bjørn Hansen 的 GeoDNS 提供支持,pool.ntp.org 通常会返回您所在国家或附近的服务器的 IP 地址。 对于大多数用户来说,这将提供最好的结果。

或者,您也可以使用 br.pool.ntp.orgde.pool.ntp.orgru.pool.ntp.org 等国家区域来强制/限制结果以满足您的个人需求。 要了解有关 NTP 池项目的更多信息,请访问 pool.ntp.org

对于本教程中的示例,我们将使用 NTP.br,这是一个巴西项目,用于保存和分发巴西境内的合法时间。 如果您不在巴西,请使用您所在国家或地区的类似项目。

像这样定义您想要的时间服务器,用您选择的时间服务器替换 pool.ntp.br

/usr/local/etc/ntpd.conf

# $OpenBSD: ntpd.conf,v 1.2 2015/02/10 06:40:08 reyk Exp $
# sample ntpd configuration file, see ntpd.conf(5)

# Addresses to listen on (ntpd does not listen by default)
#listen on *

# sync to a single server
#server ntp.example.org

# use a random selection of NTP Pool Time Servers
# see http://support.ntp.org/bin/view/Servers/NTPPoolServers
servers pool.ntp.br

# use a specific local timedelta sensor (radio clock, etc)
#sensor nmea0

# use all detected timedelta sensors
#sensor *

# get the time constraint from a well-known HTTPS site
#constraints from "https://www.google.com/search?q=openntpd"

第三步——改变约束

自定义客户端设置还可以添加对约束的支持,因此 ntpd 可以通过 TLS 从受信任的 HTTPS 服务器查询 Date: 标头。

ntpd.conf(5) 手册页说:“接收到的时间信息超出约束附近范围的 NTP 数据包将被丢弃,此类 NTP 服务器将被标记为无效”。 这可以防止某些 MITM 攻击,同时保持时钟准确性。

将约束添加到 /usr/local/etc/ntpd.conf。 请务必使用一个或多个可靠、知名的 HTTPS 站点。 您可以通过删除下面突出显示的第一个 # 字符来取消注释文件中提供的示例行:

/usr/local/etc/ntpd.conf

# $OpenBSD: ntpd.conf,v 1.2 2015/02/10 06:40:08 reyk Exp $
# sample ntpd configuration file, see ntpd.conf(5)

# Addresses to listen on (ntpd does not listen by default)
#listen on *

# sync to a single server
#server ntp.example.org

# use a random selection of NTP Pool Time Servers
# see http://support.ntp.org/bin/view/Servers/NTPPoolServers
servers pool.ntp.br

# use a specific local timedelta sensor (radio clock, etc)
#sensor nmea0

# use all detected timedelta sensors
#sensor *

# get the time constraint from a well-known HTTPS site
# constraints from "https://www.google.com/search?q=openntpd"

第 4 步 — 将 OpenNTPd 配置为时间服务器

本节向您展示如何更改 OpenNTPd 的默认行为并将 FreeBSD 转换为能够通过 IPv4 和 IPv6 提供时间的 NTP 服务器。

服务器配置的最终结果应如下所示,其中 your_server_ip 替换为服务器的 IPv4 或 IPv6 地址。

/usr/local/etc/ntpd.conf

# $OpenBSD: ntpd.conf,v 1.2 2015/02/10 06:40:08 reyk Exp $
# sample ntpd configuration file, see ntpd.conf(5)

# Addresses to listen on (ntpd does not listen by default)
listen on your_server_ip

# sync to a single server
#server ntp.example.org

# use a random selection of NTP Pool Time Servers
# see http://support.ntp.org/bin/view/Servers/NTPPoolServers
servers pool.ntp.br

# use a specific local timedelta sensor (radio clock, etc)
#sensor nmea0

# use all detected timedelta sensors
#sensor *

# get the time constraint from a well-known HTTPS site
#constraints from "https://www.google.com/search?q=openntpd"

第 5 步 — 在引导时启动 OpenNTPd

OpenNTPd 的默认服务配置不会在 FreeBSD 的引导过程中启动守护进程。 要在 FreeBSD 上添加 ntpd 提供的 NTP 服务,请执行以下命令:

sudo sysrc openntpd_enable="YES"

输出应该是:

Outputopenntpd_enable:  -> YES

如果要在启动时立即设置时间,请将 -s 添加到 openntpd_flags-v 也可以用来记录所有对 adjtime 的调用。 将 -s 传递给 ntpd 将导致守护程序 在前台停留长达 15 秒,等待 配置的 NTP 服务器之一进行回复。 这是 不是默认的 ,像这样的自定义设置应该这样配置:

sudo sysrc openntpd_flags="-s -v"

输出应该是:

Outputopenntpd_flags:  -> -s -v

第 6 步 — 管理 OpenNTPd 服务

现在您已经编辑和定制了配置文件以满足您的所有需求,您可以启动 OpenNTPd 提供的服务。

启动服务:

sudo service openntpd start

如果启动成功,您将看到:

OutputStarting openntpd.

如果 OpenNTPd 守护进程的标志配置为记录调试信息,则开始输出应如下所示:

OutputStarting openntpd.
constraint certificate verification turned off
ntp_adjtime returns frequency of 8.643158ppm

您可以使用常用命令管理 OpenNTPd 服务:statusrestart 等。

第 7 步 — 故障排除(可选)

OpenNTPd 使用两个二进制文件:ntpdntpctl。 第一个是守护进程本身,负责提供给客户端或服务器机器的 NTP 服务。 第二个用于显示有关正在运行的守护程序的信息。

本节将向您展示如何使用 ntpctlncsockstat 对 OpenNTPd 及其守护程序提供的 NTP 服务进行故障排除。 如果您有一个正在运行的服务,或者只是想要一种不同的方式来检查您的服务是否正在运行,请使用此部分。

获取状态和同行

OpenNTPd 的 ntpctl 使用本地套接字与 OpenNTPd 守护进程通信。 默认为 /var/run/ntpd.sock。 本教程将介绍可以使用 ntpctl 运行的两种查询:statuspeers

status 显示对等体和传感器的状态以及系统时钟是否同步。 当系统时钟同步时,会显示层。 当系统时钟未同步时,将显示系统时钟的偏移量,由 adjtime 系统调用报告。 设置中值约束后,将显示与本地时间的偏移量。

使用 ntpctl 显示状态:

sudo ntpctl -s status

输出应类似于以下内容:

输出

8/8 peers valid, clock synced, stratum 2

peers 显示有关每个对等点的以下信息:权重(wt)、信任级别(tl)、层(st)以及距离对等点下一次更新(下一次轮询)的秒数。 偏移量、网络延迟和网络抖动值以毫秒为单位。 当系统时钟与对等点同步时,该对等点的权重列左侧会显示一个星号(*)。

使用 ntpctl 显示对等点信息:

sudo ntpctl -s peers

以下输出显示 OpenNTPd 正在运行并同步到响应为“200.160.7.193”(从 pool.ntp.br 解决)的第 1 层服务器的信息,并且您的 OpenNTPd 守护程序将更新时间通过 NTP 在 31 秒内:

Output        peer
           wt tl st  next  poll          offset       delay      jitter
        200.160.0.8 from pool pool.ntp.br
            1 10  2    8s   30s        -0.005ms    44.814ms     0.023ms
        200.160.7.193 from pool pool.ntp.br
         *  1 10  1   26s   31s        -0.012ms    44.814ms     0.027ms
        200.20.186.76 from pool pool.ntp.br
            1 10  1   18s   31s         0.023ms    37.481ms     0.031ms

. . .

监听套接字

您可以使用 sockstat 列出打开的 IPv4、IPv6 和 UNIX 域套接字。 列出与 NTP over IPv4 和 IPv6 相关的侦听套接字:

sudo  sockstat -4 -6 -p 123

输出

USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS     
_ntp     ntpd       44208 7  udp4   203.0.113.123:16987  200.160.0.8:123
_ntp     ntpd       44208 8  udp4   203.0.113.123:38739  200.160.7.193:123

. . .

如果您正在运行 OpenNTPd 以通过网络提供时间,LOCAL ADDRESS 列将显示您的 IP 地址行; your_ipv4_address:123,表示 IPv4 套接字,your_ipv6_address:123,表示正在侦听的 IPv6 套接字。

连接到互联网

使用 nc 不仅可以对 NTP 进行故障排除,还可以对许多网络守护进程及其套接字(UNIX、TCP 或 UDP)进行故障排除。 手册页说:“与 telnet 不同,netcat 可以很好地编写脚本并将错误消息分离到标准错误中,而不是像 telnet 那样将它们发送到标准输出”。

要检查您是否可以通过 IPv4 访问 NTP 服务器或池主机:

sudo nc pool.ntp.br 123 -z -4 -u -v 
OutputConnection to pool.ntp.br 123 port [udp/ntp] succeeded!

要检查您是否可以通过 IPv6 访问 NTP 服务器或池主机:

sudo nc pool.ntp.br 123 -z -6 -u -v 
OutputConnection to pool.ntp.br 123 port [udp/ntp] succeeded!

使用 ntpdate

使用 ntpdate 对您可能要使用的某些服务器进行故障排除。 您可以获取有关运行 NTP 服务的机器的一些信息:stratumoffsetdelay

sudo ntpdate -q -4 ntp.cais.rnp.br

输出将类似于:

Outputserver 200.144.121.33, stratum 3, offset -0.000049, delay 0.09001
1 Sep 17:28:54 ntpdate[66740]: adjust time server 200.144.121.33 offset -0.000049 sec

注意 ntpdate 的功能现在可以在 FreeBSD 的 ntpd 程序中使用。 请参阅 FreeBSD 的 ntpd 联机帮助页中的 -q 命令行选项,或使用 ntpq

警告: ntpdate 实用程序即将停用。


阅读手册页

OpenNTPd 的 ntpdntpd.confntpctl 不是 FreeBSD 基本系统的一部分,因此它的手册页也不是操作系统默认的 MANPATH 的一部分。 为确保您将阅读 OpenNTPd 的手册页,您应该运行 man-M /usr/local/man。 不要与 FreeBSD 的默认 ntpd(8) 联机帮助页混淆。

man -M /usr/local/man ntpd

重复相同的过程来阅读 OpenNTPd 的 ntpctl(8)ntpd.conf(5) 手册页。

结论

时间对于工作站、服务器、路由器和网络的功能具有内在的重要性。 如果没有同步时间,即使不是不可能,也很难准确关联设备之间的信息。 在安全性方面,如果您无法成功比较每个路由器和所有网络服务器之间的日志,您会发现很难对事件进行可靠的描述。