Linux resolv.conf 配置详解

9次阅读

/etc/resolv.conf 是 linux dns 客户端核心配置文件,由 glibc resolver 读取,定义 nameserver(最多 3 个)、search/domain 域补全规则及 options 行参数,影响所有域名解析应用;手动修改易被网络管理工具覆盖,推荐通过 networkmanager 或 systemd-resolved 等工具管理。

Linux resolv.conf 配置详解

/etc/resolv.conf 是 Linux 系统中 DNS 客户端的核心配置文件,由 C 标准库中的 resolver(域名解析器)读取,用于将域名转换为 IP 地址。它不启动服务,也不运行进程,只被调用时生效。任何依赖域名访问网络的应用(如 curl、ping、wget、systemd-resolved 下游程序等)都会受其影响。

nameserver:指定 DNS 服务器地址

这是唯一必需的配置项,格式为 nameserver x.x.x.x,支持 IPv4 和 IPv6 地址。可写多行,但最多只生效前三个 —— glibc 解析器硬限制为 MAXNS = 3(见 /usr/include/resolv.h)。解析顺序严格按文件中出现的先后:先向第一个 nameserver 发起查询;超时或返回 SERVFAIL/REFUSED 后,才尝试下一个。

  • 推荐配置 2–3 个稳定、低延迟的 DNS,例如:
    nameserver 223.5.5.5
    nameserver 114.114.114.114
    nameserver 8.8.8.8
  • 避免写入不可达或高延迟的 DNS,否则会拖慢整体解析耗时(默认单次超时 5 秒,重试 2 次)
  • 若系统启用 systemd-resolved,/etc/resolv.conf 往往是软链接(指向 /run/systemd/resolve/stub-resolv.conf),直接编辑无效

search 与 domain:控制短域名补全行为

当程序使用未带点(.)的主机名(如 redismysql)发起解析时,resolver 会按规则自动补全后缀,再尝试查询。这个行为由 searchdomain 控制,二者互斥,后出现者生效。

  • search example.com test.internal:对 redis 尝试依次查 redis.example.comredis.test.internalredis.(即 FQDN 形式)
  • domain corp.local:等效于 search corp.local,仅支持一个域
  • 补全是否触发,还受 options ndots:n 影响:只有域名中“点”的数量少于 n 时才补全。默认 ndots:1,所以 redis 补全,redis.db 不补全(除非设为 ndots:2

options:调整解析器行为参数

通过 options 行可覆盖 resolver 默认策略,常用子项包括:

  • timeout:2:单次 DNS 请求等待响应的秒数,整数,上限封顶为 30
  • attempts:2:对每个 nameserver 最多重试次数(不含首次),默认 2,即最多发 3 次请求
  • rotate:启用轮询模式,每次解析随机选择 nameserver,而非固定顺序,有助于负载分散
  • no-check-names:跳过对主机名中下划线、非 ASCII 字符等的合法性检查(某些内部服务命名需开启)

注意事项与常见陷阱

手动修改 /etc/resolv.conf 容易被覆盖,尤其在使用 NetworkManager、systemd-networkd 或 DHCP 的环境中。更稳妥的做法是:

  • NetworkManager 用户:用 nmcli connection modify " 连接名 " ipv4.dns "8.8.8.8 114.114.114.114" + ipv4.ignore-auto-dns yes
  • systemd-resolved 用户:停用服务并重建静态文件,或改用 resolvectl dns 管理
  • 容器或 Kubernetes Pod 中的 resolv.conf 通常由 kubelet 注入,受 --resolv-confdnsConfig 字段控制
  • 文件中以 #; 开头的为注释;每行只能有一个关键字;空格 /Tab 分隔值;禁止跨行
text=ZqhQzanResources