本博客将系统梳理 Ubuntu 系统下 DNS 的原理、查看方式、常用设置方法及企业实战配置案例,帮助我们在桌面与服务器环境下高效、规范地管理 DNS。
一、DNS 原理与 systemd-resolved 机制
现代 Ubuntu(17.10 及以后)默认采用 systemd-resolved
服务管理 DNS 解析。直接查看 /etc/resolv.conf
文件来确定系统实际使用的 DNS 解析地址可能并不完全准确,甚至可能具有误导性。
原因如下:
systemd-resolved
的介入:- 现代 Ubuntu 默认使用
systemd-resolved
服务来管理网络名称解析。 systemd-resolved
自身维护着 DNS 服务器列表(可以从 DHCP、NetworkManager、netplan 或静态配置中获取)。- 为了兼容传统应用,
systemd-resolved
会管理/etc/resolv.conf
文件。
- 现代 Ubuntu 默认使用
/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 上不是默认情况。
- 存根(Stub)模式 (最常见):在这种默认模式下,
如何准确查看 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.yaml
、01-netcfg.yaml
或其他以 .yaml
结尾的文件。
备份现有配置文件(非常重要)
sudo cp /etc/netplan/your-config-file.yaml /etc/netplan/your-config-file.yaml.backup
请将
your-config-file.yaml
替换为实际的文件名。编辑配置文件
使用文本编辑器(如nano
或vim
)打开 Netplan 配置文件:sudo vim /etc/netplan/your-config-file.yaml
找到负责服务器网络连接的接口配置段(如
eth0
)。如果该接口已配置了静态 IP,其结构可能如下:network: ethernets: eth0: addresses: - SERVER_IP/24 # 替换为服务器的静态 IP 和子网掩码 routes: - to: default via: GATEWAY_IP # 替换为服务器的网关 IP nameservers: addresses: [PUBLIC_DNS1, PUBLIC_DNS2] # 可能已有的公共 DNS version: 2
新增内部 DNS 服务器 IP
在nameservers
->addresses
列表中,将获取到的内部 DNS 服务器 IP (INTERNAL_DNS_IP
) 添加进去。为了优先使用内部 DNS 解析内部域名,应将其放在列表的首位。
修改后的配置可能如下: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
:如原来就有,可保留作为备用。search: [company.com]
:推荐添加,便于内部域名自动补全。
3. 步骤二:应用 Netplan 配置并验证
检查配置文件语法(可选但推荐)
sudo netplan generate
如果没有错误信息,说明 YAML 语法基本正确。
应用新的网络配置
sudo netplan apply
此命令会读取配置文件并使新的网络设置生效,期间网络连接可能会短暂中断。
注意潜在的警告信息:
Permissions for /etc/netplan/your-config-file.yaml are too open...
- 处理:出于安全考虑,Netplan 配置文件不应被其他用户随意读写。执行
sudo chmod 600 /etc/netplan/your-config-file.yaml
修正权限。此警告通常不影响功能。
- 处理:出于安全考虑,Netplan 配置文件不应被其他用户随意读写。执行
检查
systemd-resolved
状态
执行resolvectl status
查看当前活动的 DNS 服务器:resolvectl status | less
在输出中找到与配置的网络接口(如
eth0
)相关的部分,关注Current DNS Server
和DNS Servers
列表。- 常见陷阱:如果
Current DNS Server
显示的不是我们配置的INTERNAL_DNS_IP
,而是列表中的其他公共 DNS,说明systemd-resolved
没有优先使用内部 DNS。
- 常见陷阱:如果
验证 DNS 解析
resolvectl status # 确认 Current DNS Server 是否为 INTERNAL_DNS_IP ping internal-service.company.com
强制
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 设置永久生效
Netplan 配置
编辑网络配置文件:sudo vim /etc/netplan/*.yaml
添加关键配置:
nameservers: addresses: [192.168.1.11] # 内网 DNS 服务器 search: [company.com] # 关键搜索域(必须添加!)
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 # 强制私有域名解析
应用配置
# 应用网络配置 sudo netplan apply # 重启 DNS 服务 sudo systemctl restart systemd-resolved # 验证解析 ping prefix.company.com
企业环境特别建议
- DNS 搜索域是核心关键
- 所有内部服务请求都依赖正确配置的
search
域 - 在 Netplan 和 resolved.conf 中必须双重配置
- 所有内部服务请求都依赖正确配置的
- 内网 DNS 优先策略
# /etc/systemd/resolved.conf 最佳实践 [Resolve] DNS=INTERNAL_DNS_IP # 主内网 DNS FallbackDNS= # 清空公共 DNS Domains=~company.com # 私有域名空间
- 监控 NXDOMAIN 错误
# 创建实时监控脚本 while true; do sudo journalctl -u systemd-resolved --since "1 min ago" | grep NXDOMAIN sleep 60 done
最终验证:通过
dig +trace prefix.company.com
确认查询路径是否首跳内网 DNS,这是判断配置成功的黄金标准。企业环境中,DNS 配置错误导致的停机代价远高于配置验证的时间投入!
四、常见排查与总结
- 优先使用
resolvectl status
查看真实 DNS - 持久化配置优选 Netplan,桌面可用图形界面
- 企业环境建议内部 DNS 优先,配置前务必备份
- 遇到解析异常,重启 systemd-resolved 并检查配置
通过本指南,我们可以高效、规范地完成 Ubuntu 下 DNS 的配置与排查,确保系统网络解析的稳定与安全。