是关于如何在Ubuntu 17.04及更高版本中设置永久DNS的详细指南,此过程涉及多个步骤和方法,确保即使重启系统后配置依然有效。
通过/etc/network/interfaces
文件配置(传统方式)
适用场景
适用于使用传统网络管理工具(非Netplan)的情况,尤其适合物理机或早期版本的Ubuntu服务器。
操作步骤
-
打开配置文件
以管理员权限编辑/etc/network/interfaces
文件:sudo nano /etc/network/interfaces
-
定位对应网卡段落
找到类似如下的部分(例如eth0
或有线/无线接口):auto eth0 iface eth0 inet static address X.X.X.X netmask Y.Y.Y.Y gateway Z.Z.Z.Z
-
添加DNS条目
在上述段落下方新增一行:dnsnameservers 8.8.8.8 8.8.4.4 # Google公共DNS示例
⚠️ 注意:多个DNS用空格分隔,不要换行。
-
应用更改
保存文件后执行以下命令重启网络服务:sudo ifdown eth0 && sudo ifup eth0 # 仅重启指定接口 # 或直接重启整个系统验证生效性
-
验证结果
运行cat /etc/resolv.conf
查看是否已包含新设置的DNS地址。
参数 | 说明 |
---|---|
dnsnameservers |
指定DNS服务器IP列表,优先级按顺序排列 |
auto <接口名> |
确保系统自动启动该网络接口 |
iface <接口名> |
定义具体网络接口的配置块 |
利用resolvconf
工具实现动态同步
核心原理
通过创建基础模板文件,由resolvconf
服务自动生成最终的/etc/resolv.conf
,避免手动修改被覆盖的问题。
实施流程
- 安装依赖包(若未预装):
sudo apt install resolvconf
- 编辑默认模板
修改/etc/resolvconf/resolv.conf.d/base
文件:sudo vim /etc/resolvconf/resolv.conf.d/base
添加目标DNS服务器:
nameserver 218.2.2.2 # 电信DNSPod节点 nameserver 223.5.5.5 # 阿里云公共DNS
- 更新全局配置
执行刷新命令使改动立即生效:sudo resolvconf u
- 检查生效状态
再次查看/etc/resolv.conf
,确认底部已追加新的DNS记录。
💡 优势对比:此方法支持多网卡环境下的统一管理,且兼容DHCP动态分配场景。
现代化方案——修改Systemd解析服务(推荐用于新部署环境)
适用版本
特别适合Ubuntu 18.04+及后续版本,但向下兼容旧版系统如17.04同样有效。
详细步骤
- 调整主配置文件
编辑/etc/systemd/resolved.conf
:sudo nano /etc/systemd/resolved.conf
取消注释并修改关键参数:
[Resolve] DNS=8.8.8.8 114.114.114.114 # 同时使用谷歌与国内高速线路 FallbackDNS=8.8.8.8 # 备用兜底解析器 Cache=nonegative # 缓存策略优化建议值
- 重启服务进程
依次运行以下命令确保变更落地:sudo systemctl restart systemdresolved sudo systemctl enable systemdresolved # 设置为开机自启
- 重建符号链接(重要!)
为防止原始文件被其他组件篡改,需做软链替换:mv /etc/resolv.conf /etc/resolv.conf.bak # 备份原文件 ln s /run/systemd/resolve/resolv.conf /etc/resolv.conf
- 功能验证测试
使用dig
或nslookup
命令测试域名解析是否正常:dig www.ubuntu.com +short # 快速查询模式 nslookup google.com # 交互式诊断工具
配置项 | 默认值 | 作用描述 |
---|---|---|
DNS |
(空) | 主DNS服务器列表 |
FallbackDNS |
(空) | 当主控失败时的回退解析站 |
Domains |
(空) | 本地域名搜索后缀(如localdomain) |
LLMNR |
resolve | 链路层多播节点协议处理模式 |
MulticastDNS |
resolve | 组播DNS响应行为控制 |
DNSSEC |
yes | 安全扩展启用状态 |
Cache |
yes | 缓存机制开关及策略类型 |
常见问题与解答(Q&A)
Q1: 为什么直接修改/etc/resolv.conf
无法持久化?
A: 因为现代Linux发行版普遍采用动态网络管理器(如NetworkManager、systemdresolved),它们会定期重写该文件以覆盖用户手动更改的内容,必须通过上述专业化工具或配置文件进行间接控制。
Q2: 如何确认当前使用的DNS是否真正生效?
A: 可通过两种方式验证:①执行systemdresolve status
查看解析服务状态;②使用traceroute
跟踪数据包路径,观察是否经过预设的DNS服务器节点。
systemdresolve status | grep 'Current DNS Server' traceroute n T dns 8.8.8.8 # 测试到谷歌DNS的路由跳数
Q3: 如果遇到“DNS unreachable”错误怎么办?
A: 优先检查防火墙设置是否阻止了UDP/TCP端口53;其次确认上游DNS服务器可用性;最后尝试更换其他公共DNS(如Cloudflare的1.1.1.1),确保/etc/hosts
文件中