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

Ubuntu DNS 综合配置与排查指南

本博客将系统梳理 Ubuntu 系统下 DNS 的原理、查看方式、常用设置方法及企业实战配置案例,帮助我们在桌面与服务器环境下高效、规范地管理 DNS。


一、DNS 原理与 systemd-resolved 机制

现代 Ubuntu(17.10 及以后)默认采用 systemd-resolved 服务管理 DNS 解析。直接查看 /etc/resolv.conf 文件来确定系统实际使用的 DNS 解析地址可能并不完全准确,甚至可能具有误导性。

原因如下:

  1. systemd-resolved 的介入

    • 现代 Ubuntu 默认使用 systemd-resolved 服务来管理网络名称解析。
    • systemd-resolved 自身维护着 DNS 服务器列表(可以从 DHCP、NetworkManager、netplan 或静态配置中获取)。
    • 为了兼容传统应用,systemd-resolved 会管理 /etc/resolv.conf 文件。
  2. /etc/resolv.conf 的不同模式

    • 存根(Stub)模式 (最常见):在这种默认模式下,/etc/resolv.conf 文件通常会被 systemd-resolved 配置为指向一个本地的 DNS 存根解析器(Stub Resolver)。我们会看到类似这样的内容:
      # This file is managed by man:systemd-resolved(8). Do not edit.
      #
      # This is a dynamic resolv.conf file for connecting local clients to the
      # internal DNS stub resolver of systemd-resolved. This file lists only
      # the local systemd-resolved stub resolver as DNS server about forwarding
      # queries to the configured system DNS servers.
      # [...]
      nameserver 127.0.0.53
      options edns0 trust-ad
      search your-search-domain.com
      
      这里的 nameserver 127.0.0.53 指向的是 systemd-resolved 提供的本地服务。这个地址并不是系统真正用来向外查询的 DNS 服务器地址。 systemd-resolved 收到查询后,会使用它自己维护的、从网络配置(如 DHCP 或静态设置)获取的上游 DNS 服务器列表来进行实际的解析。
    • 静态/直连模式:在某些配置下,/etc/resolv.conf 可能被设置为直接包含上游 DNS 服务器的 IP 地址(例如 nameserver 8.8.8.8)。但这通常需要修改 systemd-resolved 的默认行为或使用传统的网络管理方式。
    • 被其他工具管理:如果系统没有使用 systemd-resolved 或者配置为让其他工具(如旧版的 resolvconf 包或 NetworkManager 直接管理)来控制 /etc/resolv.conf,那么文件内容可能反映的是实际的 DNS 服务器,但这在现代 Ubuntu 上不是默认情况。

如何准确查看 Ubuntu 使用的 DNS 服务器?

在默认使用 systemd-resolved 的系统上,最准确的方法是使用 resolvectl (或其旧名称 systemd-resolve) 命令:

resolvectl status
# 或者
systemd-resolve --status

这个命令的输出会更详细和准确,它会显示:

  • Global DNS Servers: 全局配置的 DNS 服务器。
  • Per-Link DNS Servers: 每个网络接口(Link)获取到的 DNS 服务器(例如通过 DHCP 获取的)。systemd-resolved 会根据路由和接口状态智能地选择使用哪个 DNS 服务器。
  • Current DNS Server: 当前实际用于解析的 DNS 服务器。
  • DNSSEC status: DNSSEC 相关状态。

总结:

  • 直接查看 /etc/resolv.conf 不总是准确的,尤其是在看到 nameserver 127.0.0.53 时,它只告诉我们系统在使用本地的 systemd-resolved 存根解析器。
  • 要获取 Ubuntu 系统(特别是使用 systemd-resolved 的现代版本)真实使用的上游 DNS 服务器列表推荐使用 resolvectl status 命令

二、Ubuntu DNS 设置方式全览

1. 持久性设置(重启后仍有效)

  • NetworkManager 图形界面(桌面推荐)
    • 系统托盘 → 网络设置 → IPv4/IPv6 → DNS 手动输入
  • Netplan 配置文件(Ubuntu 18.04+ 推荐,服务器/桌面通用)
    • 编辑 /etc/netplan/*.yaml,添加 nameservers: 字段
    • 应用:sudo netplan apply
  • nmcli 命令行(NetworkManager 环境)
    • nmcli connection modify "连接名称" ipv4.dns "DNS地址"
    • 激活:nmcli connection up "连接名称"

2. 临时性设置(重启或网络变动后失效)

  • 直接编辑 /etc/resolv.conf,添加 nameserver DNS服务器地址 行。(非常临时,不推荐长期使用)
  • resolvectl dns 命令(适用于 systemd-resolved)
    • sudo resolvectl dns <接口> <DNS1> <DNS2>
  • 使用 nmcli connection modify 临时修改(不保存配置)

3. 设置方式对比表

方法持久性/临时性适用环境/场景优点缺点推荐程度
NetworkManager 图形界面持久性桌面环境简单易用,图形化,持久化仅限桌面 NetworkManager非常推荐 (桌面)
netplan 配置文件持久性Ubuntu 18.04+,服务器/桌面配置文件管理,清晰,持久化,现代 Ubuntu 推荐需编辑 YAML,有学习曲线非常推荐 (通用)
nmcli (持久化)持久性NetworkManager 管理,服务器/脚本命令行操作,脚本自动化,持久化命令行操作,稍复杂推荐 (服务器/脚本)
/etc/resolv.conf (直接编辑)非常临时快速测试,应急最直接,立即生效非常临时,易被覆盖,不推荐长期使用,现代 Ubuntu 不推荐持久化不推荐 (持久化)
resolvectl dns临时systemd-resolved 系统相对规范的临时修改,符合现代系统机制临时性,重启失效,仅限 systemd-resolved 系统推荐 (临时测试)
nmcli (临时修改)相对临时NetworkManager 管理命令行操作,适用于 NetworkManager 临时修改需注意不保存配置,重启可能恢复持久化配置推荐 (NetworkManager 临时)

三、企业实战:通过 Netplan 为 Ubuntu 服务器新增 DNS 以解析内部域名

在企业网络环境中,Ubuntu 服务器常常需要访问内部服务,这些服务通常通过内部域名进行寻址。如果服务器默认配置的 DNS 无法解析这些内部域名,就需要手动添加公司的内部 DNS 服务器地址。以下为详细操作步骤:

1. 前提条件

  • 拥有一台运行 Ubuntu 22.04 LTS(或使用 Netplan 进行网络管理的其它版本)的服务器。
  • 已获取公司内部 DNS 服务器的 IP 地址(如 INTERNAL_DNS_IP)。
  • 知道目标服务器上负责网络连接的网卡接口名称(如 eth0)及其当前的静态 IP 配置信息。

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

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

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

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

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

  2. 编辑配置文件
    使用文本编辑器(如 nanovim)打开 Netplan 配置文件:

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

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

    network:ethernets:eth0:addresses:- SERVER_IP/24      # 替换为服务器的静态 IP 和子网掩码routes:- to: defaultvia: GATEWAY_IP    # 替换为服务器的网关 IPnameservers:addresses: [PUBLIC_DNS1, PUBLIC_DNS2] # 可能已有的公共 DNSversion: 2
    
  3. 新增内部 DNS 服务器 IP
    nameservers -> addresses 列表中,将获取到的内部 DNS 服务器 IP (INTERNAL_DNS_IP) 添加进去。为了优先使用内部 DNS 解析内部域名,应将其放在列表的首位。
    修改后的配置可能如下:

    network:ethernets:eth0:addresses:- SERVER_IP/24routes:- to: defaultvia: GATEWAY_IPnameservers: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:如原来就有,可保留作为备用。
    • search: [company.com]:推荐添加,便于内部域名自动补全。

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

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

    sudo netplan generate
    

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

  2. 应用新的网络配置

    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 服务器:

    resolvectl status | less
    

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

    • 常见陷阱:如果 Current DNS Server 显示的不是我们配置的 INTERNAL_DNS_IP,而是列表中的其他公共 DNS,说明 systemd-resolved 没有优先使用内部 DNS。
  4. 验证 DNS 解析

    resolvectl status  # 确认 Current DNS Server 是否为 INTERNAL_DNS_IP
    ping internal-service.company.com
    
  5. 强制 systemd-resolved 服务重新加载配置
    有时 systemd-resolved 服务可能没有完全应用 Netplan 所做的更改,或缓存了旧的状态。可尝试重启该服务:

    sudo systemctl restart systemd-resolved.service
    sudo netplan apply
    

    重启后再次验证。

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

问题描述

Ubuntu 18.04 及部分环境未安装 resolvectl,执行命令会报错:

resolvectl status
# 报错:resolvectl: command not found
终极解决方案:双重配置法确保 DNS 设置永久生效
  1. Netplan 配置
    编辑网络配置文件:

    sudo vim /etc/netplan/*.yaml
    

    添加关键配置:

    nameservers:addresses: [192.168.1.11]    # 内网 DNS 服务器search: [company.com]        # 关键搜索域(必须添加!)
    
  2. systemd-resolved 配置

    # 备份配置文件
    sudo cp /etc/systemd/resolved.conf /etc/systemd/resolved.conf.bak
    # 编辑配置文件
    sudo vim /etc/systemd/resolved.conf
    

    修改内容:

    [Resolve]
    DNS=192.168.1.11               # 指定内网 DNS
    Domains=~company.com           # 强制私有域名解析
    
  3. 应用配置

    # 应用网络配置
    sudo netplan apply
    # 重启 DNS 服务
    sudo systemctl restart systemd-resolved
    # 验证解析
    ping prefix.company.com
    
企业环境特别建议
  1. DNS 搜索域是核心关键
    • 所有内部服务请求都依赖正确配置的 search
    • 在 Netplan 和 resolved.conf 中必须双重配置
  2. 内网 DNS 优先策略
    # /etc/systemd/resolved.conf 最佳实践
    [Resolve]
    DNS=INTERNAL_DNS_IP    # 主内网 DNS
    FallbackDNS=           # 清空公共 DNS
    Domains=~company.com   # 私有域名空间
    
  3. 监控 NXDOMAIN 错误
    # 创建实时监控脚本
    while true; dosudo journalctl -u systemd-resolved --since "1 min ago" | grep NXDOMAINsleep 60
    done
    

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


四、常见排查与总结

  • 优先使用 resolvectl status 查看真实 DNS
  • 持久化配置优选 Netplan,桌面可用图形界面
  • 企业环境建议内部 DNS 优先,配置前务必备份
  • 遇到解析异常,重启 systemd-resolved 并检查配置

通过本指南,我们可以高效、规范地完成 Ubuntu 下 DNS 的配置与排查,确保系统网络解析的稳定与安全。

http://www.dtcms.com/a/332671.html

相关文章:

  • IP生意的天花板更高了吗?
  • 【数据分享】2022 年黑龙江省小麦、玉米和水稻幼苗影像数据集
  • Logstash 实战指南:从入门到生产级日志处理
  • GitHub 热榜项目 - 日榜(2025-08-15)
  • 硬核实用!R+贝叶斯解决真实问题:参数估计(含可靠性分析) + 回归建模(含贝叶斯因子比较) + 生产级计算实践 赠「常见报错解决方案」秘籍!
  • ubuntu 24.04 通过部署ollama提供大模型api接口
  • 线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉
  • CANDB++中的CAN_DBC快速编辑方法,使用文本编辑器(如notepad++和VScode)
  • Redis 知识点与应用场景
  • 六十六、【Linux数据库】MySQL数据导入导出 、 管理表记录 、 匹配条件
  • 日本服务器哪些服务商是可以免费试用的?
  • 拒绝“效果图”返工:我用Substance 3D Stager构建产品可视化工作流
  • 计算机视觉(opencv)实战五——图像平滑处理(均值滤波、方框滤波、高斯滤波、中值滤波)附加:视频逐帧平滑处理
  • vue2生命周期详解
  • Claude Opus 4.1深度解析:抢先GPT5发布,AI编程之王主动出击?
  • 【线上问题】1分钟学会如何定位 Java 应用 CPU 飙升问题
  • Spring中存在两个相同的Bean是否会报错?
  • Amazon Bedrock如何轻松实现复杂的生成式AI模型?
  • 纯C++实现halcon的threshold
  • 【Java EE进阶 --- SpringBoot】初识Spring(创建SpringBoot项目)
  • zynq代办事项
  • Vue 侦听器(watch 与 watchEffect)全解析2
  • 【100页PPT】数字化转型集团信息化总体解决方案(附下载方式)
  • Swift 实战:用最长递增子序列算法解“俄罗斯套娃信封”问题(LeetCode 354)
  • 日本服务器租用选哪个机房国内访问比较快?
  • 【LINUX网络】HTTP协议基本结构、搭建自己的HTTP简单服务器
  • 企微用户部门同步HRS系统
  • 电脑上练打字用什么软件最好:10款打字软件评测
  • 滑窗|贪心
  • Sonatype Nexus Repository Manager docker版本安装