# ubuntu18.04安装ntp，并配置内网校时，含离线安装NTP方法

在你的场景里，本质是做一个**NTP层级结构**：

- **server-1**：能访问互联网 → 作为上游时间源（NTP Server）
- **server-2**：不能访问互联网 → 从 server-1 同步时间（NTP Client）

下面一步步配置 👇

---

# 一、在 server-1 上配置（作为 NTP 服务器）

### 1. 安装 NTP 服务

```bash
sudo apt update
sudo apt install ntp

```

---

### 2. 修改配置文件

编辑：

```bash
sudo vim /etc/ntp.conf

```

确保有公网时间源（默认一般已经有）：

```bash
server 0.ubuntu.pool.ntp.org iburst
server 1.ubuntu.pool.ntp.org iburst
server 2.ubuntu.pool.ntp.org iburst

```

---

### 3. 允许内网 client（server-2）访问

在配置中添加（很关键）：

```bash
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

```

👉 根据你的内网网段修改，比如：

- `192.168.0.0`
- `10.0.0.0`

---

### 4. 重启服务

```bash
sudo systemctl restart ntp

```

---

### 5. 检查是否正常同步公网

```bash
ntpq -p

```

看到类似：

```
*ntp1.aliyun.com

```

说明已经同步成功 ✅

---

### 6. 确认监听端口

```bash
sudo netstat -lnup | grep 123

```

---

# 二、在 server-2 上配置（作为客户端）

---

### 1. 安装 NTP

```bash
sudo apt update
sudo apt install ntp

```

---

### 2. 修改配置文件

```bash
sudo vim /etc/ntp.conf

```

👉 注释掉所有公网 server：

```bash
# server 0.ubuntu.pool.ntp.org iburst
# server 1.ubuntu.pool.ntp.org iburst

```

👉 添加 server-1：

```bash
server 192.168.1.10 iburst

```

（这里填 server-1 的IP）

---

### 3. 重启服务

```bash
sudo systemctl restart ntp

```

---

### 4. 验证同步状态

```bash
ntpq -p

```

看到：

```
*192.168.1.10

```

说明已经成功同步 🎉

---

# 三、可选优化（推荐）

### 1. 强制 server-1 作为时间源（避免无外网时漂移）

在 server-1 的 `/etc/ntp.conf` 添加：

```bash
local stratum 10

```

---

### 2. 防火墙放行（如果有防火墙）

server-1 需要开放 UDP 123：

```bash
sudo ufw allow 123/udp

```

---

### 3. 手动立即校时（客户端）

server-2 可以执行一次：

```bash
sudo ntpdate 192.168.1.10

```

---

# 四、整体结构图

```
互联网 NTP
     ↓
 server-1（有公网）
     ↓
 server-2（内网）

```

---

# 五、常见问题排查

### ❌ server-2 不同步？

检查：

1. 能否 ping 通 server-1
2. 防火墙是否放行 123/UDP
3. server-1 是否在监听
4. `ntpq -p` 是否有 `reach` 值（非0）

---

在 Ubuntu 18.04 上离线安装 `ntp`，核心思路是：**在有网的机器上下载 `.deb` 安装包及其所有依赖包，拷贝到无网机器上，然后使用 `dpkg` 进行批量安装。**

由于 `ntp` 依赖于 `libopts25` 等库，直接拷贝一个 `ntp.deb` 通常会报错缺失依赖。最稳妥的方法是下载整个依赖树。

以下是具体操作步骤：

### 准备工作

- **机器 A**：有互联网权限的服务器（或任何一台能上网的 Ubuntu 18.04/相似环境电脑）。
- **机器 B**：目标服务器（无网，需要安装 ntp）。
- **传输工具**：U 盘、或者通过 `scp` 从机器 A 传到机器 B。

---

### 第一步：在机器 A（有网）上下载安装包及依赖

我们需要利用 `apt-get download` 配合 `--print-deps` 来一次性下载所有需要的包。

1. **创建存放目录**
    
    ```bash
    mkdir ~/ntp-offline-packages
    cd ~/ntp-offline-packages
    
    ```
2. **下载 ntp 及其所有依赖包**  
    执行以下命令。这条命令会解析 `ntp` 的所有依赖，并下载当前系统架构（通常是 amd64）对应的所有 `.deb` 文件。
    
    ```bash
    # 获取依赖列表并下载
    apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances ntp | grep "^\w")
    
    ```
    
    *解释：*
    
    
    - `apt-cache depends ...`：列出 ntp 的所有深层依赖。
    - `grep "^\w"`：过滤出有效的包名。
    - `apt-get download`：只下载 `.deb` 包到当前目录，不进行安装（所以不会报依赖错误）。
3. **确认下载结果**  
    查看目录下是否有多个 `.deb` 文件：
    
    ```bash
    ls -lh *.deb
    
    ```
    
    您应该能看到类似 `ntp_*.deb`, `libopts25_*.deb`, `libedit2_*.deb` 等文件（具体依赖数量视系统环境而定，通常 5-10 个左右）。
4. **打包文件**  
    为了方便传输，打个包：
    
    ```bash
    cd ..
    tar -czvf ntp-offline.tar.gz ntp-offline-packages
    
    ```

---

### 第二步：传输到机器 B（无网）

将 `ntp-offline.tar.gz` 复制到机器 B。

- **方法 1 (U 盘)**：拷贝到 U 盘，插到机器 B 上挂载复制。
- **方法 2 (SCP)**：如果机器 B 虽然没外网但能和机器 A 内网互通： ```bash
    # 在机器 A 上执行
    scp ntp-offline.tar.gz user@server2-ip:/home/user/
    
    ```

---

### 第三步：在机器 B（无网）上安装

1. **解压文件**
    
    ```bash
    tar -xzvf ntp-offline.tar.gz
    cd ntp-offline-packages
    
    ```
2. **批量安装所有 .deb 包**  
    使用 `dpkg -i` 配合通配符 `*.deb` 一次性安装当前目录下所有的包。`dpkg` 会自动处理同一批次内的依赖关系。
    
    ```bash
    sudo dpkg -i *.deb
    
    ```
3. **验证安装结果**
    
    
    - **检查状态**：
        
        ```bash
        dpkg -l | grep ntp
        
        ```
        
        如果状态显示 `ii`，说明安装成功。
    - **检查服务**：
        
        ```bash
        systemctl status ntp
        
        ```
        
        如果看到 `active (running)`，说明服务已启动。
    - **如果报错 "dependency problems"**:  
        如果在第 2 步中仍然报错缺少某个特定的包（极少见，除非机器 A 和 B 的系统版本差异巨大，比如一个是 18.04.1 一个是 18.04.6 且基础库不同），您需要记下缺少的包名，回到机器 A，单独下载那个包：
        
        ```bash
        # 在机器 A 上
        apt-get download <缺失的包名>
        
        ```
        
        然后再次拷贝到机器 B 运行 `sudo dpkg -i *.deb`。

---

### 第四步：配置时间同步

安装完成后，您就可以按照之前的方案配置 `/etc/ntp.conf` 了：

1. **编辑配置**：
    
    ```bash
    sudo vim /etc/ntp.conf
    
    ```
    
    
    - 注释掉所有 `pool` 或 `server` 指向外网的行。
    - 添加指向服务器 1 的内网 IP： ```conf
        server 192.168.x.x iburst  # 替换为服务器 1 的 IP
        
        ```
2. **重启服务**：
    
    ```bash
    sudo systemctl restart ntp
    
    ```
3. **验证同步**：
    
    ```bash
    ntpq -p
    
    ```
    
    看到服务器 1 的 IP 前面出现 `*` 号即表示成功。

### 💡 备选方案：如果无法下载依赖

如果机器 A 和机器 B 的小版本号差异太大导致依赖包不匹配，或者您觉得下载依赖太麻烦，还有一个“简单粗暴”但**不推荐用于生产环境**的方法：

使用 `ntpdate` 命令（无需守护进程，只需一个二进制文件）：

1. 在机器 A 上下载 `ntpdate` 包：`apt-get download ntpdate`。
2. 如果它依赖 `libopts25`，也一起下载。
3. 在机器 B 上 `dpkg -i *.deb`。
4. 在机器 B 上写个定时任务：`*/5 * * * * /usr/sbin/ntpdate -u 192.168.x.x`。  
    *(缺点：时间是跳变的，不是平滑过渡，可能导致日志时间错乱，但在极度受限环境下可用)*。

**首选方案依然是上述的完整 `ntp` 离线安装。**