在Linux系统中,域名解析依赖一组配置文件的协作,其中最直接指定DNS服务器地址的文件是/etc/resolv.conf。不过解析行为还受名称服务切换机制和本地静态表影响,仅改一处未必生效。理解各文件职责,是排查解析异常的基础。

核心文件:/etc/resolv.conf
/etc/resolv.conf是glibc解析器读取的配置,用于定义系统向哪些DNS服务器发起查询。它的常见指令包括nameserver、search与options。例如下面这段配置,指定了首选与备用DNS,并设置了搜索域:
# /etc/resolv.conf 示例 nameserver 192.168.0.1 nameserver 8.8.8.8 search example.ipipp.com options timeout:2 attempts:3
nameserver最多可写三个,解析器依次尝试;search用于补全短主机名,比如ping host会尝试host.example.ipipp.com。options控制超时与重试。该文件由解析库直接读取,因此任何程序调用getaddrinfo都会参考它。
需要注意的是,在现代发行版中,这个文件经常被系统服务接管。如果你手动编辑后重启网络发现内容被重置,说明有管理工具在维护它,此时直接修改往往无效,应改由对应工具写入。
被接管的真相:systemd-resolved与NetworkManager
使用systemd的发行版常带systemd-resolved,它把真实配置放在/run/systemd/resolve/resolv.conf,而/etc/resolv.conf只是指向它的软链或经Stub监听127.0.0.53。查看状态可用:
# 查看解析服务状态 systemctl status systemd-resolved # 查看当前生效的DNS resolvectl status
若用NetworkManager,DNS通常写在连接配置里,如/etc/NetworkManager/system-connections/下的文件。修改后应执行nmcli con reload并重启连接。这种机制优点是集中管理、支持分连接指定DNS,缺点是对习惯直接改文件的用户不直观。
对于服务器场景,可关闭自动接管:在/etc/systemd/resolved.conf设DNS=与Domains=,或把/etc/resolv.conf改为普通文件并禁止服务覆盖。选择哪种,取决于你是否需要动态切换网络。
解析顺序控制:/etc/nsswitch.conf
决定先查本地还是先查DNS的,是/etc/nsswitch.conf里的hosts行。典型内容为:
# /etc/nsswitch.conf 片段 hosts: files dns myhostname
files对应/etc/hosts,dns对应DNS查询。上面顺序表示先查本地表,未命中再走DNS。若写成dns files,则反向。错误排序会导致内网别名失效或外网优先。该文件由nsswitch库读取,影响所有名称解析调用。
在容器或多租户环境,调整此顺序能实现隔离:例如让某些服务强制走本地代理。修改后无需重启,新进程立即生效,但已运行进程可能缓存结果,必要时用systemctl restart对应服务。
本地兜底:/etc/hosts
/etc/hosts是最早的域名映射文件,格式为IP加主机名。示例:
127.0.0.1 localhost 192.168.0.10 web01.ipipp.com web01
当nsswitch.conf中files在dns前,这里写的记录会优先生效。它常用于数据库主从、license绑定等不希望依赖外部DNS的场景。缺点是分散维护,节点多时易不一致。
结合前述文件,标准排障路径是:先cat /etc/resolv.conf看nameserver,再grep hosts /etc/nsswitch.conf确认顺序,最后用getent hosts 域名验证。这样能区分是配错还是被覆盖。
实践:永久定制DNS的推荐做法
若发行版用Netplan(如Ubuntu Server),应在/etc/netplan/*.yaml写:
network:
version: 2
ethernets:
eth0:
addresses: [192.168.0.10/24]
nameservers:
addresses: [192.168.0.1, 8.8.8.8]
search: [ipipp.com]
执行netplan apply后,底层会正确生成resolv.conf。这种方式避免手动改文件被清。对桌面用户,直接在NM图形界面填DNS最省事。
总之,Linux DNS配置不是单文件问题:/etc/resolv.conf是出口,nsswitch.conf是开关,/etc/hosts是后门,而真正的写入者可能是resolved或NM。理清链路,才能做到改得准、留得住。
linuxdns_configresolv_conf修改时间:2026-08-01 08:51:14