一文搞懂NTP

369 阅读3分钟

NTP

简介

NTP

网络时间协议(NTP)是一种用于同步计算机网络中各个设备时间的协议。NTP使用UDP端口123作为其传输层。

UTC

协调世界时(UTC)是世界上使用最广泛的时间标准,它基于国际原子时(TAI)并考虑了地球自转的变化。UTC通过将时刻与原子钟保持同步,并根据地球自转的变化进行调整,以便保持与地球运动相关的日常时间(例如白昼和黑夜)的一致性。这使得UTC成为全球标准时间。NTP协议和服务的主要目标之一就是确保网络中的设备与UTC保持同步,以便在全球范围内提供一致的时间参考。

中国采用中国标准时间(CST),它是UTC+8,这意味着中国的时区比协调世界时(UTC)快8小时。

ntpd、ntpdate

ntpd和ntpdate都是用于时间同步的工具

  • ntpd:是 Network Time Protocol(NTP)守护进程,负责在系统启动时启动并运行,持续不断地调整本地时钟来与网络时间服务器同步。ntpd能够逐渐调整本地时钟,以避免大幅度的时间跳变,从而更加平滑地同步本地时钟。
  • ntpdate:是一个简单的命令行工具,用于一次性地将本地时钟与远程NTP服务器进行同步。它会立即调整本地时钟,但在调整时会引起时间跳变,可能导致一些应用程序出现问题。ntpdate一般用于系统启动时进行时间同步,而不是作为持续性的时间同步解决方案。

在生产环境中慎用ntpdate

时钟的跃变会对一些程序造成严重问题,尤其是依赖连续时钟的应用程序,比如数据库事务。这些应用程序通常依赖于时间不会往回跳跃的特性。不幸的是,ntpdate调整时间的方式属于"跃变":它使用settimeofday()来设置系统时间,这可能导致时间跃变。

NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。

时区设置和同步

/etc/localtime

$ date -R
Mon, 18 Feb 2019 15:27:57 +0800
# 修改时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 修改时区后得重启cron和rsyslog
/etc/init.d/cron restart    # 解决调用相差8小时
/etc/init.d/rsyslog restart # 解决日志记录相差8小时

ntpdate

# 使用ntpdate,需要先/etc/init.d/ntp stop
ntpdate ntp1.aliyun.com

ntpq

ntpq实用程序用于监视NTP守护进程的ntpd操作并确定性能。 ntpq [-inp] [-c command] [host] [...]

# 时间误差不得超过1000s,时间相差过大ntpd同步会失败
$ date -s "2020-06-30 10:00:00"

# -4np p:输出ntp服务信息 4:ipv4解析 n:输出ip而不是主机名
$ ntpq -np4
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-172.xx.0.19     xx.xxx.xxx.151   4 u  391 1024  377    0.088   -0.667   0.394
*172.xx.0.78     xx.xxx.xxx.150   3 u  950 1024  377    0.083   -0.008   0.177  # *:响应的NTP服务器和最精确的服务器
 10.xxx.247.9    .STEP.          16 u    - 1024    0    0.000    0.000   0.000  # STEP 表示差距过大
-172.19.1.10     xx.xxx.xxx.150   3 u    9 1024  377   21.755   -0.311   0.247  # -: 可用的同步源,但精度不如+标记的
 10.xxx.80.10    .STEP.          16 u    - 1024    0    0.000    0.000   0.000
+10.xxx.10.250   xx.xxx.xxx.150   3 u  227 1024  377   23.543    0.604   0.226  # +: 可用的同步源,但不是首选的
 10.xxx.83.60    .STEP.          16 u    - 1024    0    0.000    0.000   0.000
 10.xxx.83.61    .STEP.          16 u    - 1024    0    0.000    0.000   0.000
 10.xxx.206.253  .STEP.          16 u    - 1024    0    0.000    0.000   0.000
 10.xxx.206.254  .STEP.          16 u    - 1024    0    0.000    0.000   0.000
 10.xxx.18.253   .STEP.          16 u    - 1024    0    0.000    0.000   0.000
 10.xxx.18.254   .STEP.          16 u    - 1024    0    0.000    0.000   0.000
+10.xxx.36.10    xx.xxx.xxx.150   3 u  669 1024  377   23.605    0.638   0.183
标志含义
remote响应这个请求的NTP服务器的名称
refidNTP服务器使用的更高一级服务器的名称
st正在响应请求的NTP服务器的级别
when上一次成功请求之后到现在的秒数
poll本地和远程服务器多少时间进行一次同步,单位秒,会逐步增大
reach用来测试能否和服务器连接,是一个八进制值,每成功连接一次它的值就会增加
delay从本地机发送同步要求到ntp服务器的往返时间
offset主机通过NTP时钟同步与所同步时间源的时间偏移量,单位为毫秒,offset越接近于0,主机和ntp服务器的时间越接近
jitter统计了在特定个连续的连接数里offset的分布情况。简单地说这个数值的绝对值越小,主机的时间就越精确

ntpd服务器部署

安装 aptitude install ntp

server

/etc/ntp.conf

$ cat /etc/ntp.confÏ
driftfile /var/lib/ntp/ntp.drift
statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats

filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

keys /etc/ntp.keys # 设置keys可以加
trustedkey 1 # 信任1号key
enable auth

server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org

# 访问控制
restrict default kod notrap nomodify nopeer noquery
restrict 127.0.0.1 nomodify

# ignore :关闭所有ntp服务
# noquery:不提供ntp服务
# notrap:不提供trap远程事件登录的功能
# nomodiy:表示客户端不能使用ntpq。ntpc更改ntp服务器的时间参数,可以通过ntp服务器进行时间矫正
# notrust:拒绝没有通过认证的客户端
# nokod:kod技术可以组织一种dos攻击

/etc/ntp.keys

注意:NTP Server和Client都应该添加/etc/ntp.keys这个key文件

# keyno type key
# keyno(1-65535)
# type(md5, sha1, ripemd160, sha224, sha256, sha384, sha512),openssl list -digest-algorithms所支持的
# key(密钥本身)
1 M abcdEFG

client

$ cat /etc/ntp.conf
driftfile /var/lib/ntp/ntp.drift
statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats

filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

keys /etc/ntp.keys # 设置keys可以加
trustedkey 1 # 信任1号key
enable auth

server 10.xx.xx.254 key 1 # 使用1号key

restrict default kod notrap nomodify nopeer noquery
restrict 127.0.0.1 nomodify

ntp.keys

$ sudo cat /etc/ntp.keys
1 M abcdEFG
/etc/init.d/ntp status