0

Linux DNS配置resolv.conf完全指南

2026.05.24 | youres | 18次围观

什么是resolv.conf

在Linux系统中,/etc/resolv.conf是DNS解析器的核心配置文件。当你的服务器需要访问外网域名时,系统会读取这个文件来决定使用哪个DNS服务器进行域名解析。

这个文件看似简单,只有几十行甚至几行配置,但它直接影响着服务器的网络连通性、解析速度和稳定性。配置不当会导致域名解析失败、网站访问缓慢甚至服务不可用。

resolv.conf文件结构详解

一个标准的resolv.conf文件由以下几个核心指令组成:

  • nameserver:指定DNS服务器IP地址,最多可以设置3个
  • search:定义域名搜索列表,用于短主机名补全
  • domain:定义本地域名(已废弃,被search取代)
  • options:设置解析器的高级选项

最小可用配置示例

nameserver 8.8.8.8
nameserver 8.8.4.4

这个配置指定了两个DNS服务器:Google的公共DNS。当第一个不可达时,系统会自动尝试第二个。

resolv.conf常用配置参数

nameserver指令

这是最常用的指令,用于指定DNS服务器的IP地址。Linux系统最多支持3个nameserver,查询时会按顺序尝试:

nameserver 114.114.114.114
nameserver 223.5.5.5
nameserver 8.8.8.8

国内用户常用114DNS和阿里DNS的组合,兼顾速度和稳定性。

search指令

search指令用于定义域名搜索路径。当你在服务器上ping一个短主机名时,系统会自动尝试加上search列表中的域名:

search example.com test.example.com

比如你执行ping server,系统会依次尝试:

  • server.example.com
  • server.test.example.com

options指令

options指令可以设置多个高级选项,常用选项包括:

options timeout:2 attempts:3 rotate single-request-reopen

各选项含义:

  • timeout:n:查询超时时间(秒),默认5秒
  • attempts:n:重试次数,默认2次
  • rotate:轮询多个DNS服务器,实现负载均衡
  • single-request-reopen:解决IPv4/IPv6并行查询时的端口冲突问题
  • ndots:n:域名中点号数量小于n时先进行search搜索,默认1

实战配置示例

场景一:国内服务器标准配置

# 国内服务器DNS配置
nameserver 114.114.114.114
nameserver 223.5.5.5
nameserver 8.8.8.8
options timeout:2 attempts:3 rotate

这个配置优先使用国内DNS,速度更快;同时保留Google DNS作为备用,提高可靠性。

场景二:企业内网环境

# 企业内网DNS配置
search corporate.local
nameserver 10.0.0.10
nameserver 10.0.0.11
options timeout:1 attempts:2

内网环境通常有自己的DNS服务器,用于解析内部域名。search指令让你可以使用短主机名访问内网服务。

场景三:高并发服务优化

# 高并发场景DNS优化
nameserver 10.0.0.10
nameserver 114.114.114.114
options timeout:1 attempts:2 rotate single-request-reopen ndots:0

高并发服务对DNS解析性能要求高。rotate实现DNS负载均衡,single-request-reopen避免端口冲突,ndots:0减少不必要的搜索尝试。

resolv.conf配置后的生效方法

修改resolv.conf后,配置通常会立即生效,因为Linux的DNS解析器是动态读取这个文件的。但有些情况下需要额外操作:

方法一:重启网络服务(传统方式)

systemctl restart networking   # Debian/Ubuntu
systemctl restart network      # CentOS/RHEL 7及以下
nmcli connection reload        # CentOS/RHEL 8+

方法二:清除DNS缓存

如果系统运行了DNS缓存服务(如systemd-resolved、nscd),需要清除缓存:

systemctl restart systemd-resolved  # 重启resolved服务
systemctl restart nscd              # 重启nscd服务

方法三:测试生效

nslookup www.baidu.com
dig www.baidu.com
ping -c 3 www.baidu.com

用这些命令验证DNS解析是否正常。

常见故障排查

故障一:resolv.conf被自动覆盖

很多Linux发行版会用DHCP客户端、NetworkManager或systemd-resolved自动管理resolv.conf,导致手动修改后重启网络就丢失。

解决方法:

  1. 对于DHCP环境:在/etc/dhcp/dhclient.conf中添加supersede domain-name-servers 114.114.114.114,223.5.5.5;
  2. 对于NetworkManager:修改连接配置nmcli con mod eth0 ipv4.ignore-auto-dns yes
  3. 对于systemd-resolved:直接配置/etc/systemd/resolved.conf,然后重启服务

故障二:DNS解析慢或超时

表现:访问域名时卡顿明显,ping域名比ping IP慢很多。

排查步骤:

  1. dig命令测试每个DNS服务器的响应时间
  2. 检查是否有不可达的nameserver(系统会等待timeout才会尝试下一个)
  3. 调整options中的timeout和attempts参数
  4. 检查防火墙是否屏蔽了53端口

故障三:IPv6 DNS导致解析慢

如果系统优先尝试IPv6 DNS而你的网络不支持IPv6,会导致明显的延迟。

解决方法:/etc/sysctl.conf中禁用IPv6,或者在options中添加single-request让IPv4和IPv6查询串行执行。

systemd-resolved与resolv.conf的关系

现代Linux发行版(如Ubuntu 18.04+、CentOS 8+)默认使用systemd-resolved管理DNS。这种情况下,/etc/resolv.conf通常是一个符号链接:

lrwxrwxrwx 1 root root 39 May  1 10:00 /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf

有三种模式:

  • stub模式:resolv.conf指向127.0.0.53(systemd-resolved本地存根),由systemd-resolved统一管理DNS
  • 直接模式:resolv.conf指向/run/systemd/resolve/resolv.conf,包含上游DNS服务器
  • 静态模式:删除符号链接,手动维护resolv.conf

推荐使用stub模式,让systemd-resolved统一管理,配置在/etc/systemd/resolved.conf中:

[Resolve]
DNS=114.114.114.114 223.5.5.5
FallbackDNS=8.8.8.8
Domains=~.
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#DNSOverTLS=no

最佳实践与注意事项

  1. 始终配置多个DNS服务器:避免单点故障。建议组合使用:本地DNS + 国内公共DNS + 国际公共DNS
  2. 控制nameserver数量:最多3个,超过的会被忽略。不是越多越好
  3. 优先使用离用户近的DNS:国内服务器优先用114、阿里、腾讯DNS,海外服务器可以用Google、Cloudflare DNS
  4. 谨慎使用search指令:search列表过长会拖慢短主机名解析。生产环境建议留空或只保留一个域名
  5. 注意文件权限:resolv.conf应该权限为644(rw-r--r--),归属root用户
  6. 虚拟机克隆后检查:克隆的虚拟机可能携带原机的DNS配置,需要更新
  7. 容器环境的DNS:Docker容器的resolv.conf由Docker daemon管理,不要在容器内直接修改

相关文章

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论