微信优化

weixinyouhua

linux配置dns域名解析

2026-09-02 10:07:05

开篇直接给答案

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,你手工改的内容会被覆盖。

linux配置dns域名解析

如何让手工配置不被覆盖

方案一,直接关掉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配置文件路径和使用方式有差异,整理成表格方便对照查阅:

linux配置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服务器数据问题。

linux配置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,永久改上层管理工具,这样配置才能稳定生效。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待