{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2025-08-06 18:12:42","updateBy":"admin","updateTime":"2025-08-31 18:12:42","remark":null,"id":121,"articleTitle":"Linux基础：NTP服务","articleUrl":"service_ntp","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/ee03af4419724d50a127c34d6a588554.png","articleFlag":"0","draftStatus":"1","reprintStatement":"0","articleSummary":"NTP (Network Time Protocol)，即网络时间协议，是用来使计算机时间同步化的一种协议。它可以在大规模、不可靠的互联网环境中，将客户端的时钟精确地同步到时间服务器，从而保持所有设备时间的**高精度一致性。","articleContent":"## NTP 服务详解\n\n### 1. 什么是 NTP？\n\n*   **NTP (Network Time Protocol)**，即网络时间协议，是用来使计算机时间同步化的一种协议。\n*   **目的**：它可以在大规模、不可靠的互联网环境中，将客户端的时钟精确地同步到时间服务器，从而保持所有设备时间的**高精度一致性**。\n*   **精度**：在理想的局域网环境中，NTP 可以达到毫秒（ms）甚至亚毫秒级的同步精度。\n\n### 2. 为什么需要 NTP？\n\n时间同步对于现代计算至关重要，原因包括：\n\n*   **故障排查与分析**：当多台服务器日志时间不一致时，追踪跨系统的问题将变得极其困难。\n*   **分布式系统与数据库**：集群、分布式应用和数据库（如 Kubernetes, Elasticsearch, Cassandra）严重依赖一致的时间来处理事务、排序事件和解决冲突。\n*   **安全与认证**：许多安全协议（如 Kerberos）和证书体系都基于时间戳。时间不同步会导致认证失败、证书失效。\n*   **计划任务**：确保 `cron` 或 `at` 作业在正确的时间执行。\n*   **金融交易**：所有交易记录必须有精确且一致的时间戳。\n\n### 3. NTP 工作原理：分层架构 (Stratum)\n\nNTP 使用一种分层、树状结构的时间分发模型，称为 **Stratum**。\n\n*   **Stratum 0**：最高精度的时间源，如原子钟、GPS 时钟。它们本身不直接连接到网络。\n*   **Stratum 1**：直接连接到 Stratum 0 设备的服务器。它们被称为“主时间服务器”，是整个 NTP 体系的基础。\n*   **Stratum 2**：向 Stratum 1 服务器同步时间的服务器。它们之间也会相互通信（对等体）以提高精度和可靠性。\n*   **Stratum 3**：向 Stratum 2 服务器同步时间的服务器。\n*   以此类推... (Stratum 层级越高，精度理论上越低，但通常 Stratum 3 已足以满足绝大多数企业需求)\n\n**形象比喻**：Stratum 0 是“真理之源”，Stratum 1 是“权威来源”， Stratum 2/3 是“分发节点”，我们的电脑就是最终的“消费者”。\n\n### 4. CentOS/RHEL 7 中的 NTP 实现\n\n从 CentOS/RHEL 7 开始，系统默认集成了两个 NTP 实现，**`chrony` 是默认的选择**：\n\n1.  **`chrony`**：\n    *   **特点**：设计用于间歇性连接网络（如笔记本电脑）、网络不稳定或虚拟化环境。它能更快地同步时钟，并且消耗资源更少。\n    *   **组件**：\n        *   `chronyd`：守护进程，在后台运行并进行时间同步。\n        *   `chronyc`：命令行管理工具，用于监控和修改 `chronyd` 的运行状态。\n    *   **配置文件**：`/etc/chrony.conf`\n\n2.  **`ntpd`** (传统实现)：\n    *   **特点**：非常成熟、稳定，功能丰富。在需要极高精度或复杂配置的传统环境中可能仍是首选。\n    *   **组件**：\n        *   `ntpd`：守护进程。\n        *   `ntpq`：传统的查询和管理工具。\n        *   `ntpdate`：用于一次性时间同步的工具（现已不推荐单独使用，`chronyd` 和 `ntpd` 都能很好地处理初始同步）。\n    *   **配置文件**：`/etc/ntp.conf`\n\n下面是 CentOS 7 中 NTP 服务主要组件及其作用的概览：\n\n| 组件名称       | 主要功能                                                     | 备注                                                         |\n| :------------- | :----------------------------------------------------------- | :----------------------------------------------------------- |\n| **ntpd**       | 传统的 NTP 守护进程，通过网络时间协议同步系统时钟。          | 功能丰富，支持多种工作模式和高精度同步。                     |\n| **chronyd**    | 实现 NTP 协议的守护进程，通常用于不同步的系统或间歇性连接网络的环境。 | 能更快同步时钟，且消耗资源更少。                             |\n| **ntpdate**    | 用于一次性将系统时间与 NTP 服务器同步的工具。                | 适用于初步同步或脚本中，通常由 `ntpd` 或 `chronyd` 维护长期同步。 |\n| **防火墙配置** | 确保 UDP 123 端口开放，以便 NTP 客户端与服务端通信或接收广播/组播。 | 保障 NTP 服务网络可达性的基础安全措施。                      |\n\n## 安装与配置\n\n在 CentOS 7 上配置 NTP 服务，你可以选择传统的 **ntpd** 或较新的 **chrony**。以下是基本的安装和配置步骤。\n\n1. **安装 NTP 服务**\n   使用 `yum` 包管理器安装：\n\n   ```bash\n   sudo yum install ntp\n   ```\n\n   或者，你也可以选择安装 `chrony`：\n\n   ```bash\n   sudo yum install chrony\n   ```\n\n2. **配置 NTP 服务器 (`/etc/ntp.conf`)**\n   编辑配置文件 `/etc/ntp.conf` 来设定时间源和访问控制。\n\n   * **指定上游时间服务器**：使用 `server` 指令。`iburst` 选项可以加速初始同步。\n\n     ```\n     server 0.centos.pool.ntp.org iburst\n     server 1.centos.pool.ntp.org iburst\n     server 2.centos.pool.ntp.org iburst\n     server 3.centos.pool.ntp.org iburst\n     ```\n\n     你也可以使用其他公共 NTP 池（如 `pool.ntp.org`）或特定的服务器（如 `ntp.aliyun.com`）。\n\n   * **配置访问权限**：使用 `restrict` 指令控制哪些客户端可以访问你的 NTP 服务器以及其权限。\n\n     *   `nomodify`：客户端不能修改服务器配置。\n     *   `notrap`：不提供 trap 服务。\n     *   `noquery`：禁止客户端查询。\n     *   `notrust`：拒绝未认证的客户端。\n     *   `ignore`：拒绝所有类型的 NTP 连接。\n         例如，允许特定网段查询和同步时间，但不允许修改配置：\n\n     ```\n     restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap\n     ```\n\n   * **配置日志**（可选）：启用日志记录便于排查问题。\n\n     ```\n     statsdir /var/log/ntp/\n     logfile /var/log/ntp/ntp.log\n     ```\n\n3. **配置 Chrony (`/etc/chrony.conf`)**\n   如果选择 `chrony`，其主要配置文件是 `/etc/chrony.conf`。\n\n   * **指定上游时间服务器**：\n\n     ```\n     server ntp1.aliyun.com iburst\n     server ntp2.aliyun.com iburst\n     ```\n\n   * **配置访问权限**：使用 `allow` 指令允许特定网络访问：\n\n     ```\n     allow 192.168.0.0/24\n     ```\n\n4. **配置防火墙**\n   NTP 使用 **UDP 123** 端口。需确保防火墙允许该端口的通信：\n\n   ```bash\n   sudo firewall-cmd --permanent --add-service=ntp\n   sudo firewall-cmd --reload\n   ```\n\n   如果使用 `chrony`，命令相同。\n\n5. **启动并启用服务**\n\n   * 对于 `ntpd`：\n\n     ```bash\n     sudo systemctl start ntpd\n     sudo systemctl enable ntpd\n     ```\n\n   * 对于 `chronyd`：\n\n     ```bash\n     sudo systemctl start chronyd\n     sudo systemctl enable chronyd\n     ```\n\n6. **验证同步状态**\n\n   * 对于 `ntpd`，使用 `ntpq -p` 查看邻居状态和同步信息：\n\n     ```bash\n     ntpq -p\n     ```\n\n   * 对于 `chronyd`，使用 `chronyc sources`：\n\n     ```bash\n     chronyc sources\n     ```\n\n   * 使用 `date` 命令检查当前系统时间。\n\n## 常用命令与操作\n\n以下命令主要针对 **`chrony`** (默认) 和 **`ntpd`**。\n\n### 1. 服务管理命令\n\n**对于 `chrony`：**\n\n```bash\n# 启动服务\nsudo systemctl start chronyd\n\n# 停止服务\nsudo systemctl stop chronyd\n\n# 重启服务\nsudo systemctl restart chronyd\n\n# 重新加载配置（不断开现有连接）\nsudo systemctl reload chronyd\n\n# 设置开机自启\nsudo systemctl enable chronyd\n\n# 查看服务状态\nsudo systemctl status chronyd\n```\n\n**对于 `ntpd`：**\n\n```bash\nsudo systemctl start ntpd\nsudo systemctl stop ntpd\nsudo systemctl restart ntpd\nsudo systemctl enable ntpd\nsudo systemctl status ntpd\n```\n\n### 2. 状态查看与监控命令\n\n**`chrony` 使用 `chronyc`：**\n\n```bash\n# 查看时间源状态（最常用）\nchronyc sources\n# 输出解释：\n# M - 源状态：^=服务器，？=未连接，#=已连接但状态不佳，*=最佳源\n# S - 源层级 (Stratum)\n# Name/IP - 源地址\n# Poll - 轮询间隔（秒）\n# Reach - 可达性（8进制，377表示最近8次查询全部成功）\n# LastRx - 最后一次接收到更新的时间\n# Last sample - 本地时钟与源的最后一次测量偏移量\n\n210 Number of sources = 14\nMS Name/IP address         Stratum Poll Reach LastRx Last sample\n===============================================================================\n^+ 223.4.249.80                  2   4   177    15  -4033us[-3883us] +/-   29ms\n^? 11.116.248.15                 0   6     0   10y     +0ns[   +0ns] +/-    0ns\n^+ 100.100.3.1                   2   4   177    14   -285us[ -135us] +/-   14ms\n^+ 100.100.3.2                   2   4   377     1  +1690us[+1833us] +/-   16ms\n^+ 100.100.3.3                   2   4   361     1  +1941us[+2084us] +/-   16ms\n^+ 203.107.6.88                  2   4   177    15  +2098us[+2248us] +/-   18ms\n^? 11.196.129.104                0   6     0   10y     +0ns[   +0ns] +/-    0ns\n^? 11.196.133.88                 0   6     0   10y     +0ns[   +0ns] +/-    0ns\n^? 10.143.0.44                   0   6     0   10y     +0ns[   +0ns] +/-    0ns\n^? 10.143.0.45                   0   6     0   10y     +0ns[   +0ns] +/-    0ns\n^? 10.143.0.46                   0   6     0   10y     +0ns[   +0ns] +/-    0ns\n^+ 100.100.5.1                   2   4   377     0   -166us[  -23us] +/-   14ms\n^+ 100.100.5.2                   2   4   377     0    +58us[ +200us] +/-   14ms\n^* 100.100.5.3                   2   4   377     0   +115us[ +257us] +/-   13ms\n\n# 查看更详细的时间源信息\nchronyc sources -v\n\n# 查看当前同步状态（检查是否已同步）\nchronyc tracking\n# 关注 \"Leap status\" (正常为 Normal)、\"Stratum\"、\"Ref time\" (参考时间)\n\n# 查看 NTP 服务器是否可访问\nchronyc ntpdata <server-ip-or-name>\n```\n\n**`ntpd` 使用 `ntpq`：**\n\n```bash\n# 交互式模式查看对等体状态（输入 peer 或 peers 查看列表，输入 quit 退出）\nntpq -p\n# 输出解释（前缀）：\n# remote - 服务器地址\n# refid - 该服务器的上层参考\n# st - 层级 (Stratum)\n# t - 类型 (u=单播， b=广播)\n# when - 上次轮询至今的秒数\n# poll - 轮询间隔（秒）\n# reach - 可达性（8进制）\n# delay - 网络延迟（毫秒）\n# offset - 时间偏移量（毫秒）\n# jitter - 偏移偏差（毫秒）\n\n# 直接打印对等体信息后退出\nntpq -pn\n```\n\n### 3. 手动时间调整命令\n\n**注意**：在 NTP 服务运行时，应避免使用以下命令进行大的时间调整，应由 NTP 守护进程自动平滑调整。这些命令主要用于 NTP 服务未运行时的初始设置或紧急修复。\n\n```bash\n# 查看当前系统时间\ndate\n\n# 手动设置系统日期和时间（格式：MMDDhhmmYYYY.ss）\nsudo date MMDDhhmmYYYY.ss\n# 示例：将日期设置为 2023年10月27日 15:30:00\nsudo date 102715302023.00\n\n# 使用 ntpdate 进行一次性同步（如果 ntpd/chronyd 未运行）\n# 注意：在较新系统中，此命令可能默认未安装，且不推荐在与守护进程同时运行时使用\nsudo ntpdate -u <ntp-server>\n# 示例：sudo ntpdate -u ntp.aliyun.com\n\n# 设置硬件时钟（BIOS时间）与系统时间同步\nsudo hwclock --systohc\n# 或将硬件时钟的时间同步到系统时间\nsudo hwclock --hctosys\n```\n\n### 4. 防火墙配置\n\nNTP 使用 **UDP 123** 端口。\n\n```bash\n# 允许 NTP 服务（会自动开放 UDP 123 端口）\nsudo firewall-cmd --add-service=ntp --permanent\nsudo firewall-cmd --reload\n\n# 或者直接允许 UDP 123 端口\nsudo firewall-cmd --add-port=123/udp --permanent\nsudo firewall-cmd --reload\n```\n\n### 总结与选择\n\n| 特性         | **`chrony` (推荐)**        | **`ntpd` (传统)**          |\n| :----------- | :------------------------- | :------------------------- |\n| **适用场景** | 动态网络、虚拟机、移动设备 | 稳定网络、需要传统高级功能 |\n| **同步速度** | **快**                     | 慢                         |\n| **资源占用** | **低**                     | 中等                       |\n| **命令工具** | `chronyc`                  | `ntpq`, `ntpdc`            |\n| **配置文件** | `/etc/chrony.conf`         | `/etc/ntp.conf`            |\n\n","categoryId":1,"viewCount":142,"categoryName":"Linux","author":"球接子","authorAvatar":null,"tagIds":[10],"tagNames":["Linux基础"]}}