开篇直接给答案
Linux配置DNS域名解析,核心就是修改/etc/resolv.conf文件,但要想永久生效且不被系统覆盖,还得结合systemd-resolved或网络管理工具一起操作。纯手工改文件只对当前会话有效,重启网络服务或机器后大概率被重置,这是新手最容易踩的坑。
linux修改dns服务器地址命令:先分清你的系统用谁管网络
不同Linux发行版的DNS管理机制差别挺大,搞不清楚就瞎改,结果就是改了白改,先确认你的系统是用systemd-resolved、NetworkManager还是纯resolv.conf手工管理。
检查当前DNS配置文件状态
执行这条命令看/etc/resolv.conf的指向情况:
ls -l /etc/resolv.conf
- 显示为普通文件,说明是手工管理,直接编辑即可
- 显示为软链接指向/run/systemd/resolve/,说明被systemd-resolved接管
- 显示为软链接指向/run/NetworkManager/,说明由NetworkManager动态生成
临时修改DNS的方法
测试用的话,直接改文件最快:
vi /etc/resolv.conf
把nameserver换成你的目标DNS,比如用阿里DNS:
nameserver 223.5.5.5
nameserver 223.6.6.6
保存退出后立即生效,ping一下域名验证,这种改法重启就丢,适合临时调试。
永久修改DNS的正确姿势
如果你用的是CentOS/RHEL系列,网络管理通常是NetworkManager,永久配置要写在网卡配置文件里:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
在文件里加两行:
DNS1=223.5.5.5
DNS2=223.6.6.6
改完重启网络服务:
systemctl restart network
Ubuntu/Debian系统如果走Netplan,配置文件在/etc/netplan/下,YAML格式:
network:
version: 2
ethernets:
eth0:
nameservers:
addresses:
- 223.5.5.5
- 223.6.6.6
应用配置:
netplan apply
linux配置dns永久生效:绕开systemd-resolved这个坑
Ubuntu 18.04以上的系统默认启用systemd-resolved,很多人配置完DNS重启就失效,问题就出在这里,systemd-resolved会接管resolv.conf,你手工改的内容会被覆盖。

如何让手工配置不被覆盖
方案一,直接关掉systemd-resolved:
systemctl stop systemd-resolved
systemctl disable systemd-resolved
rm /etc/resolv.conf
vi /etc/resolv.conf
写入你的DNS配置,然后加个锁防止被改:
chattr +i /etc/resolv.conf
这样配置文件就被锁定了,谁都改不了,要解锁执行chattr -i。
方案二,保留systemd-resolved但改它的配置:
vi /etc/systemd/resolved.conf
取消注释并修改:
[Resolve]
DNS=223.5.5.5 223.6.6.6
FallbackDNS=114.114.114.114
重启服务生效:
systemctl restart systemd-resolved
验证DNS是否生效
改完之后用以下命令验证:
cat /etc/resolv.conf
nslookup www.baidu.com
dig www.baidu.com
看到能正常解析出IP就说明配置成功,用dig还能看到具体用的是哪个DNS服务器响应的。
排查DNS不生效的常见原因
多数情况下DNS配置不生效是下面几个原因:
- 配置文件语法错误,少写或多写了空格
- 网卡配置里的DNS优先级高于resolv.conf
- 防火墙屏蔽了UDP 53端口
- 本地hosts文件里有相关条目抢占了优先级
- DHCP获取的DNS覆盖了手动配置
排查顺序建议从简单的开始:先看resolv.conf内容对不对,再查网卡配置有没有冲突,最后检查网络连通性。
linux dns配置文件哪个:各发行版配置文件路径汇总
不同系统的DNS配置文件路径和使用方式有差异,整理成表格方便对照查阅:
| 发行版 | 主要配置文件 | 管理工具 | 重启生效方式 |
|---|---|---|---|
| CentOS 7/8 | /etc/sysconfig/network-scripts/ifcfg- | NetworkManager | systemctl restart network |
| Ubuntu 18.04+ | /etc/netplan/.yaml | Netplan | netplan apply |
| Debian | /etc/network/interfaces | ifupdown | systemctl restart networking |
| openSUSE | /etc/sysconfig/network/ifcfg- | wicked | wicked ifreload all |
| 通用 | /etc/resolv.conf | systemd-resolved | systemctl restart systemd-resolved |
容器场景下的DNS配置
Docker容器里的DNS配置逻辑不太一样,默认情况下容器继承宿主机的DNS设置,但你可以通过启动参数覆盖:
docker run --dns 223.5.5.5 --dns 223.6.6.6 nginx
容器内部改resolv.conf同样有效,但容器重建后就没了,生产环境建议用Docker Compose的dns配置项来管理:
services:
web:
image: nginx
dns:
- 223.5.5.5
- 223.6.6.6
多网卡场景下DNS配置优先级
服务器有多个网卡时,DNS配置容易出现混乱,行业共识是:NetworkManager管理下,网卡配置文件的DNS1、DNS2优先级最高,resolv.conf里的配置次之,如果你希望特定域名走特定DNS,可以在/etc/resolv.conf里配置search域:
search example.com
nameserver 10.0.0.2
nameserver 223.5.5.5
这样example.com相关的域名会优先用内网DNS解析,其他域名走公网DNS。
DNS配置后的测试与常见报错处理
配置完DNS不代表就完事了,要验证解析是否正常,同时还要会处理常见的DNS故障。
用dig和nslookup做解析测试
nslookup适合快速验证:
nslookup www.baidu.com
dig输出的信息更详细,能看到查询耗时、DNS服务器地址、TTL值等:
dig www.baidu.com
指定DNS服务器测试:
dig @223.5.5.5 www.baidu.com
这样能判断是DNS服务器的问题还是本地配置的问题。
常见报错及解决思路
报错:connection timed out; no servers could be reached
这个错误表示DNS服务器无响应,可能原因包括:DNS服务器地址写错、网络不通、防火墙拦截,用ping测DNS服务器的连通性:
ping 223.5.5.5
报错: server can’t find xxx: NXDOMAIN
表示域名不存在或DNS服务器没有该域名的记录,换个公共DNS试试,确认是域名问题还是DNS服务器数据问题。

报错: Temporary failure in name resolution
系统glibc库无法连接DNS服务器,大概率是resolv.conf配置错误或权限问题,检查文件内容和权限:
ls -l /etc/resolv.conf
cat /etc/resolv.conf
配置多个DNS的轮询策略
在resolv.conf里写多个nameserver,系统会按顺序尝试,第一个不通才用第二个,这种策略下,排在前面的DNS压力会比较大,如果想实现负载均衡,可以用systemd-resolved的rotate选项:
[Resolve]
DNS=223.5.5.5 114.114.114.114 8.8.8.8
FallbackDNS=1.1.1.1
Cache=yes
DNSStubListener=yes
业界常用的做法是配置一个主DNS加一个备DNS,比如内网环境用公司DNS做首选,公网DNS做备份。
Q&A:linux配置dns域名解析常见问题
为什么我改了/etc/resolv.conf后,重启就还原了?
因为你的系统用了systemd-resolved或NetworkManager动态管理DNS配置,resolv.conf只是它们生成的临时文件,重启后会被重新生成,解决办法是修改上层管理工具的配置,比如systemd-resolved的resolved.conf文件,或网卡配置文件里的DNS参数,改完再重启服务。
配置DNS时需要配置几个nameserver合适?
建议配置2个,一主一备,只配一个的话,DNS服务器出问题整个域名解析就瘫痪了,配太多也没意义,系统只会按顺序尝试,不会做智能负载均衡,内网环境推荐配置内网DNS优先,公网DNS做兜底。
linux下怎样测试DNS解析速度?
用dig命令可以看到具体的解析耗时:
dig www.baidu.com
返回结果里的Query time就是查询耗时,单位是毫秒,还可以用time命令配合nslookup做粗略测试:
time nslookup www.baidu.com
对比不同DNS服务器的响应时间,选择速度快的作为首选DNS,内网DNS通常比公网DNS快,因为网络跳数少,延迟更低。
配置DNS域名解析这事,说白了就是让系统知道去哪问路,掌握配置文件位置和系统管理机制,遇到问题按链路排查,大部分DNS故障都能快速定位解决,核心记住一点:临时改resolv.conf,永久改上层管理工具,这样配置才能稳定生效。

