当前位置: 首页 > backend >正文

通过Netplan为Ubuntu服务器新增DNS以解析内部域名

在企业网络环境中,Ubuntu服务器常常需要访问内部服务,这些服务通常通过内部域名进行寻址。如果服务器默认配置的DNS无法解析这些内部域名,就需要手动添加公司的内部DNS服务器地址。本章节将详细介绍如何在Ubuntu 22.04 LTS服务器上使用Netplan工具新增DNS服务器IP,并提供解决配置后可能遇到的常见问题的步骤,确保服务器能够顺利解析内部域名。

### 前提条件

*   拥有一台运行Ubuntu 22.04 LTS(或使用Netplan进行网络管理的其它版本)的服务器。

*   已获取公司内部DNS服务器的IP地址(例如 `INTERNAL_DNS_IP`)。

*   知道目标服务器上负责网络连接的网卡接口名称(例如 `eth0`)及其当前的静态IP配置信息(IP地址、子网掩码、网关)。

### 步骤一:备份并编辑Netplan配置文件

Netplan的配置文件通常位于 `/etc/netplan/` 目录下,文件名可能为 `00-installer-config.yaml`、`01-netcfg.yaml` 或其他以 `.yaml` 结尾的文件。

1.  **备份现有配置文件**(非常重要):

    在进行任何修改之前,务必备份当前的Netplan配置文件,以便在出现问题时可以恢复。

    ```bash

    sudo cp /etc/netplan/your-config-file.yaml /etc/netplan/your-config-file.yaml.backup

    ```

    请将 `your-config-file.yaml` 替换为实际的文件名。

2.  **编辑配置文件**:

    使用文本编辑器(如 `nano` 或 `vim`)打开Netplan配置文件。

    ```bash

    sudo vim /etc/netplan/your-config-file.yaml

    ```

    找到负责服务器网络连接的接口配置段(例如 `eth0`)。如果该接口已配置了静态IP,其结构可能如下:

    ```yaml

    # 原始配置示例 (仅供参考)

    network:

      ethernets:

        eth0: # 假设这是你的网卡接口

          addresses:

          - SERVER_IP/24      # 替换为服务器的静态IP和子网掩码

          routes:

          - to: default

            via: GATEWAY_IP    # 替换为服务器的网关IP

          nameservers:

            addresses: [PUBLIC_DNS1, PUBLIC_DNS2] # 可能已有的公共DNS

      version: 2

    ```

3.  **新增内部DNS服务器IP**:

    在 `nameservers` -> `addresses` 列表中,将获取到的内部DNS服务器IP (`INTERNAL_DNS_IP`) 添加进去。**为了优先使用内部DNS解析内部域名,应将其放在列表的首位。**

    修改后的配置可能如下:

    ```yaml

    network:

      ethernets:

        eth0:

          addresses:

          - SERVER_IP/24

          routes:

          - to: default

            via: GATEWAY_IP

          nameservers:

            addresses:

            - INTERNAL_DNS_IP   # 新增的内部DNS,置于首位

            - PUBLIC_DNS1       # 原有的公共DNS 1 (可选,作为备用)

            - PUBLIC_DNS2       # 原有的公共DNS 2 (可选,作为备用)

            search: [company.com] # 建议添加公司的搜索域 (可选)

      version: 2

    ```

    *   **`INTERNAL_DNS_IP`**: 替换为实际的内部DNS服务器IP。

    *   **`PUBLIC_DNS1`, `PUBLIC_DNS2`**: 如果原来就有,可以保留作为备用。如果服务器主要用于内部服务访问,且内部DNS能正确转发外部请求,也可以只保留内部DNS。

    *   **`search: [company.com]`**: 这是一个推荐的选项。将 `company.com` 替换为公司的域名后缀。这样,你可以直接使用如 `ping internal-service` 而不是完整的 `ping internal-service.company.com`。

### 步骤二:应用Netplan配置并验证

1.  **检查配置文件语法**(可选但推荐):

    ```bash

    sudo netplan generate

    ```

    如果没有错误信息,说明YAML语法基本正确。

2.  **应用新的网络配置**:

    ```bash

    sudo netplan apply

    ```

    此命令会读取配置文件并使新的网络设置生效。在应用过程中,网络连接可能会短暂中断。

    **注意潜在的警告信息**:

    *   `Permissions for /etc/netplan/your-config-file.yaml are too open...`

        *   **处理**:出于安全考虑,Netplan配置文件不应被其他用户随意读写。执行 `sudo chmod 600 /etc/netplan/your-config-file.yaml` 来修正权限。此警告通常不影响功能。

3.  **检查 `systemd-resolved` 状态**:

    执行 `resolvectl status` 查看当前活动的DNS服务器。

    ```bash

    resolvectl status | less

    ```

    在输出中找到与配置的网络接口(如 `eth0`)相关的部分,关注 `Current DNS Server` 和 `DNS Servers` 列表。

    *   **常见陷阱**:如果 `Current DNS Server` 显示的不是你配置的 `INTERNAL_DNS_IP`,而是列表中的其他公共DNS,说明 `systemd-resolved` 没有优先使用内部DNS。

4.  **验证DNS解析**:

    ```bash

    resolvectl status  # 确认 Current DNS Server 是否为 INTERNAL_DNS_IP

    ping internal-service.company.com

    ```

4.  **强制 `systemd-resolved` 服务重新加载配置**:

    有时候 `systemd-resolved` 服务可能没有完全应用Netplan所做的更改,或者缓存了旧的状态。尝试重启该服务:

    ```bash

    sudo systemctl restart systemd-resolved.service

    ```

    重启后,再次执行 `sudo netplan apply` 以确保所有配置同步。

5.  **再次验证DNS解析**:

    ```bash

    resolvectl status  # 确认 Current DNS Server 是否为 INTERNAL_DNS_IP

    ping internal-service.company.com

    ```


 

### 避坑小结:系统工具缺失陷阱解决方案

#### **问题描述**  

Ubuntu 18.04(35.19) 似乎未安装 `resolvectl`,执行命令会报错:  

```bash

resolvectl status

# 报错:resolvectl: command not found

```

#### **终极解决方案**  

采用双重配置法确保DNS设置永久生效:

1. **Netplan 配置**  

   编辑网络配置文件:

   ```bash

   sudo vim /etc/netplan/*.yaml

   ```

   添加关键配置:

   ```yaml

   nameservers:

     addresses: [192.168.1.11]    # 内网DNS服务器

     search: [company.com]        # 关键搜索域(必须添加!)

   ```

2. **systemd-resolved 配置**  

   ```bash

   # 备份配置文件

   sudo cp /etc/systemd/resolved.conf /etc/systemd/resolved.conf.bak

   

   # 编辑配置文件

   sudo vim /etc/systemd/resolved.conf

   ```

   修改内容:

   ```ini

   [Resolve]

   DNS=192.168.1.11               # 指定内网DNS

   Domains=~company.com           # 强制私有域名解析

   ```

3. **应用配置**  

   ```bash

   # 应用网络配置

   sudo netplan apply

   

   # 重启DNS服务

   sudo systemctl restart systemd-resolved

   

   # 验证解析

   ping prefix.company.com

   ```

#### 企业环境特别建议

1. **DNS搜索域是核心关键**

   - 所有内部服务请求都依赖正确配置的`search`域

   - 在Netplan和resolved.conf中**必须双重配置**

2. **内网DNS优先策略**

   ```ini

   # /etc/systemd/resolved.conf 最佳实践

   [Resolve]

   DNS=INTERNAL_DNS_IP    # 主内网DNS

   FallbackDNS=           # 清空公共DNS

   Domains=~company.com   # 私有域名空间

   ```

3. **监控NXDOMAIN错误**

   ```bash

   # 创建实时监控脚本

   while true; do

     sudo journalctl -u systemd-resolved --since "1 min ago" | grep NXDOMAIN

     sleep 60

   done

   ```

> **最终验证**:通过`dig +trace prefix.company.com`确认查询路径是否**首跳内网DNS**,这是判断配置成功的黄金标准。企业环境中,DNS配置错误导致的停机代价远高于配置验证的时间投入!



 

### 总结

通过Netplan为Ubuntu服务器添加内部DNS服务器是确保内部服务可访问性的常见操作。关键在于正确编辑YAML配置文件,将内部DNS置于优先位置,并通过 `sudo netplan apply` 应用。如果遇到解析问题,重启 `systemd-resolved.service` 服务是一个重要的排查步骤。同时,利用 `resolvectl status` 和 `nslookup` 等工具可以帮助诊断问题根源。始终记得在修改系统配置前进行备份。

http://www.xdnf.cn/news/13290.html

相关文章:

  • 设计模式-适配器模式
  • 微信小程序 - 手机震动
  • 《P1168 中位数》
  • 期末考试复习总结-《应用程序框架基础》
  • 系统网站首页三种常见布局vue+elementui
  • 【Element Plus】Menu组件:url访问页面时高亮对应菜单栏
  • 板凳-------Mysql cookbook学习 (十--4)
  • 小程序动画性能提升指南:CSS硬件加速与JavaScript动画框架对比
  • CentOS下的运维监控Grafana部署
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(三十二) -> 构建系统生命周期
  • okhttp 实现长连接的完整方案
  • OpenLayers 获取地图状态
  • Docker 安装教程(CentOS 系统)纯新手可入门
  • wordpress后台更新后 前端没变化的解决方法
  • Java异步编程之消息队列疑难问题拆解
  • 2506C++,C++的时间库
  • 搭建本地瓦片地图服务器的完整指南
  • 脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
  • SCAU期末笔记 - 数据分析与数据挖掘题库解析
  • 使用 ML.NET Model Builder 训练机器学习模型进行预测性维护
  • 60天python训练计划----day50
  • 连锁超市冷库节能解决方案:如何实现超市降本增效
  • spring中的ImportSelector接口详解
  • 《高等数学》(同济大学·第7版)第四章第一节不定积分的概念与性质
  • 微软PowerBI考试 PL300-在 Power BI 中设计语义模型 【附练习数据】
  • C++11列表初始化:从入门到精通
  • Python学习(8) ----- Python的类与对象
  • 用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
  • LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
  • OpenGL-什么是软OpenGL/软渲染/软光栅?