如何在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
。 使用 ee
、vi
或您喜欢的文本编辑器来编辑配置文件。
sudo ee /usr/local/etc/ntpd.conf
由 Ask Bjørn Hansen 的 GeoDNS 提供支持,pool.ntp.org
通常会返回您所在国家或附近的服务器的 IP 地址。 对于大多数用户来说,这将提供最好的结果。
或者,您也可以使用 br.pool.ntp.org
、de.pool.ntp.org
或 ru.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 服务:status
、restart
等。
第 7 步 — 故障排除(可选)
OpenNTPd 使用两个二进制文件:ntpd
和 ntpctl
。 第一个是守护进程本身,负责提供给客户端或服务器机器的 NTP 服务。 第二个用于显示有关正在运行的守护程序的信息。
本节将向您展示如何使用 ntpctl
、nc
和 sockstat
对 OpenNTPd 及其守护程序提供的 NTP 服务进行故障排除。 如果您有一个正在运行的服务,或者只是想要一种不同的方式来检查您的服务是否正在运行,请使用此部分。
获取状态和同行
OpenNTPd 的 ntpctl
使用本地套接字与 OpenNTPd 守护进程通信。 默认为 /var/run/ntpd.sock
。 本教程将介绍可以使用 ntpctl
运行的两种查询:status
和 peers
。
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 服务的机器的一些信息:stratum
、offset
和 delay
。
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 的 ntpd
、ntpd.conf
和 ntpctl
不是 FreeBSD 基本系统的一部分,因此它的手册页也不是操作系统默认的 MANPATH
的一部分。 为确保您将阅读 OpenNTPd 的手册页,您应该运行 man
和 -M /usr/local/man
。 不要与 FreeBSD 的默认 ntpd(8)
联机帮助页混淆。
man -M /usr/local/man ntpd
重复相同的过程来阅读 OpenNTPd 的 ntpctl(8)
或 ntpd.conf(5)
手册页。
结论
时间对于工作站、服务器、路由器和网络的功能具有内在的重要性。 如果没有同步时间,即使不是不可能,也很难准确关联设备之间的信息。 在安全性方面,如果您无法成功比较每个路由器和所有网络服务器之间的日志,您会发现很难对事件进行可靠的描述。