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服务器的名称 |
| refid | NTP服务器使用的更高一级服务器的名称 |
| st | 正在响应请求的NTP服务器的级别 |
| when | 上一次成功请求之后到现在的秒数 |
| poll | 本地和远程服务器多少时间进行一次同步,单位秒,会逐步增大 |
| reach | 用来测试能否和服务器连接,是一个八进制值,每成功连接一次它的值就会增加 |
| delay | 从本地机发送同步要求到ntp服务器的往返时间 |
| offset | 主机通过NTP时钟同步与所同步时间源的时间偏移量,单位为毫秒,offset越接近于0,主机和ntp服务器的时间越接近 |
| jitter | 统计了在特定个连续的连接数里offset的分布情况。简单地说这个数值的绝对值越小,主机的时间就越精确 |
ntpd服务器部署
安装 aptitude install ntp
server
$ 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