1. 为什么需要设置永久DNS服务器?
在Linux系统中,DNS(Domain Name System)设置默认是通过DHCP自动获取的,但这种方式存在几个明显问题:
- 网络切换时的稳定性问题:当从办公室网络切换到家庭网络时,DHCP分配的DNS服务器可能发生变化,导致解析不稳定
- 公共DNS的安全隐患:ISP提供的DNS可能记录查询历史,且响应速度不一定最优
- 临时修改的易失性:通过/etc/resolv.conf的修改会在重启后失效
我在管理服务器集群时曾遇到一个典型案例:某次机房网络切换后,由于依赖DHCP获取DNS,导致批量作业中的域名解析全部失败。这正是我们需要配置永久DNS的根本原因。
2. Ubuntu/Debian中的DNS配置机制
2.1 现代Linux的DNS管理演变
传统上,Linux通过/etc/resolv.conf文件管理DNS设置,但现代Ubuntu/Debian(18.04及以后版本)采用了新的管理架构:
NetworkManager → resolvconf → /etc/resolv.conf这种设计带来了几个关键变化:
- 允许不同网络接口使用不同DNS配置
- 支持DNS-over-TLS等新特性
- 防止手动修改被意外覆盖
2.2 关键配置文件解析
系统中涉及DNS配置的主要文件包括:
/etc/resolv.conf:实际使用的DNS配置(符号链接)/etc/systemd/resolved.conf:systemd-resolved服务的主配置/etc/NetworkManager/NetworkManager.conf:NetworkManager的全局配置/etc/netplan/*.yaml:Ubuntu的Netplan网络配置
注意:直接修改/etc/resolv.conf在大多数现代系统中是无效的,因为它会被各种网络服务自动覆盖。
3. 三种永久DNS配置方法详解
3.1 方法一:通过Netplan配置(Ubuntu首选)
适用于使用Netplan的网络配置(Ubuntu 17.10+默认):
- 定位Netplan配置文件:
ls /etc/netplan/- 编辑配置文件(示例为50-cloud-init.yaml):
network: version: 2 ethernets: ens33: dhcp4: no addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 1.1.1.1] search: [mydomain.com]- 应用配置:
sudo netplan apply关键参数说明:
addresses: DNS服务器IP列表(建议至少配置两个)search: 域名搜索列表(可省略)- 保持dhcp4: no以避免冲突
3.2 方法二:通过NetworkManager配置
适用于桌面环境或NetworkManager管理的系统:
- 查看当前连接名称:
nmcli connection show- 修改DNS配置(以连接名"Wired connection 1"为例):
sudo nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 8.8.4.4" sudo nmcli connection modify "Wired connection 1" ipv4.ignore-auto-dns yes- 重新激活连接:
sudo nmcli connection up "Wired connection 1"实测技巧:
- 使用
ipv4.ignore-auto-dns yes禁用DHCP的DNS推送 - 可通过GUI操作:右键网络图标 → 编辑连接 → IPv4设置
3.3 方法三:通过systemd-resolved配置
适用于不使用NetworkManager的服务器环境:
- 编辑resolved配置文件:
sudo nano /etc/systemd/resolved.conf- 修改以下内容:
[Resolve] DNS=8.8.8.8 1.1.1.1 FallbackDNS=9.9.9.9 Domains=mydomain.com DNSOverTLS=opportunistic- 重启服务:
sudo systemctl restart systemd-resolved- 验证状态:
systemd-resolve --status进阶配置:
DNSOverTLS:启用DNS加密传输Cache=yes:启用本地缓存DNSSEC=allow-downgrade:启用DNSSEC验证
4. DNS配置的验证与排错
4.1 基础验证命令
# 查看当前使用的DNS服务器 systemd-resolve --status # 测试域名解析 dig example.com nslookup example.com # 检查DNS响应时间 time dig example.com4.2 常见问题排查
问题1:修改后DNS不生效
- 检查是否有多个配置方式冲突
- 确认没有残留的dhclient进程:
ps aux | grep dhclient问题2:部分域名无法解析
- 检查search域设置是否正确
- 测试不同DNS服务器的响应差异:
dig @8.8.8.8 example.com dig @1.1.1.1 example.com问题3:DNS响应缓慢
- 测试不同DNS服务器的延迟:
for dns in 8.8.8.8 1.1.1.1 9.9.9.9; do echo -n "$dns: "; time dig @$dns example.com | grep "Query time" done4.3 推荐DNS服务器组合
根据我的实测经验,推荐以下组合方案:
| 主DNS | 备用DNS | 特点 |
|---|---|---|
| 1.1.1.1 | 8.8.8.8 | 全球覆盖好 |
| 223.5.5.5 | 119.29.29.29 | 国内优化 |
| 9.9.9.9 | 208.67.222.222 | 安全防护强 |
5. 高级配置与优化技巧
5.1 本地DNS缓存配置
安装并配置dnsmasq提升解析效率:
- 安装dnsmasq:
sudo apt install dnsmasq- 配置上游DNS(/etc/dnsmasq.conf):
server=8.8.8.8 server=1.1.1.1 cache-size=1000- 修改Netplan/NetworkManager指向本地:
nameservers: addresses: [127.0.0.1]5.2 多网络环境适配
针对笔记本等移动设备,可以配置网络特定DNS:
- 创建NetworkManager连接配置片段:
sudo mkdir -p /etc/NetworkManager/conf.d/- 创建办公室配置(/etc/NetworkManager/conf.d/office.conf):
[connection-office] match-device=mac:00:11:22:33:44:55 ipv4.dns=10.0.0.53; ipv4.ignore-auto-dns=true5.3 DNS-over-TLS配置
通过systemd-resolved启用加密DNS:
- 编辑/etc/systemd/resolved.conf:
[Resolve] DNS=1.1.1.1 DNSOverTLS=yes- 验证加密状态:
sudo tcpdump -i any port 8535.4 企业内网DNS的特殊处理
对于需要同时访问内外网的环境:
nameservers: addresses: [10.0.0.53, 8.8.8.8] search: [internal.corp, corp.com]配合dnsmasq可实现智能分流:
server=/internal.corp/10.0.0.53 server=/corp.com/10.0.0.53 server=8.8.8.8