当前位置:首页 > 虚拟主机 > 正文

Linux怎么配置DNS命令?linux设置dns方法大全

在Linux系统中配置DNS,最直接、最持久且推荐优先使用的方法是修改/etc/resolv.conf文件或通过nmcli等网络管理工具进行设置,但需注意系统环境差异(如systemd-resolved、NetworkManager等)可能覆盖手动配置,掌握命令级操作、理解配置文件优先级、并学会验证与排错,是确保DNS解析稳定高效的关键。


理解Linux DNS配置的基本机制

Linux系统通过系统解析器(glibc的getaddrinfo)读取/etc/resolv.conf,该文件定义了DNS服务器地址(nameserver)和搜索域(search),但现代Linux发行版常引入systemd-resolvedNetworkManagernetplan等工具,它们会动态改写/etc/resolv.conf,导致手动修改失效,配置前必须确认当前系统的网络管理栈。

查看当前DNS配置状态:

cat /etc/resolv.conf ls -l /etc/resolv.conf # 查看是否为软链接 systemd-resolve --status # 检查systemd-resolved是否运行


最核心的配置命令与操作

临时生效:直接修改resolv.conf

适用于快速测试或无需持久化的场景。

sudo vi /etc/resolv.conf

在文件中添加或修改:

nameserver 8.8.8.8 nameserver 114.114.114.114 search example.com

保存后立即生效。但注意:若/etc/resolv.conf是软链接,直接修改会失败,需先移除链接并创建普通文件,或改用下方推荐方法。

永久生效:使用网络管理工具

(1)NetworkManager(大多数桌面/服务器默认)

# 查看当前连接 nmcli connection show # 为指定连接设置DNS(替换为你的连接名称) sudo nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 114.114.114.114" sudo nmcli connection modify "Wired connection 1" ipv4.ignore-auto-dns yes # 重启连接生效 sudo nmcli connection down "Wired connection 1" && sudo nmcli connection up "Wired connection 1"

(2)systemd-resolved(现代Ubuntu/Debian)

# 编辑resolved配置文件 sudo vi /etc/systemd/resolved.conf # 取消注释并设置 [Resolve] DNS=8.8.8.8 114.114.114.114 FallbackDNS=1.1.1.1 # 重启服务 sudo systemctl restart systemd-resolved

(3)netplan(Ubuntu 18.04+云服务器)

# 编辑/etc/netplan/00-installer-config.yaml network: ethernets: eth0: dhcp4: true nameservers: addresses: [8.8.8.8, 114.114.114.114] version: 2

应用配置:

sudo netplan apply

使用resolvectl命令(systemd环境)

sudo resolvectl dns eth0 8.8.8.8 # 设置网卡eth0的DNS sudo resolvectl domain eth0 example.com


配置优先级与常见陷阱

系统解析顺序(由/etc/nsswitch.conf控制)通常为:hosts文件 → DNS,配置时需注意:

  • /etc/hosts优先于DNS:如果hosts中有记录,则不会请求DNS。
  • resolv.conf中的nameserver最多3个,按顺序尝试,超时后切换。
  • options timeout:2 attempts:2 可设置超时和重试次数,避免长时间卡顿。

常见陷阱

  • 云服务器或DHCP环境下,网卡重新获取IP会覆盖DNS,需设置ignore-auto-dns。
  • Docker容器内默认使用宿主机DNS,需单独配置--dns参数。
  • 防火墙可能阻止UDP 53端口,导致解析失败。


验证与排错命令

# 测试解析 nslookup example.com dig example.com # 查看实际使用的DNS resolvectl status # 跟踪解析过程 strace -e trace=network getent hosts example.com # 排查本地DNS服务 systemctl status systemd-resolved


西西云产品实战经验案例

西西云Linux云服务器用户常遇到的DNS问题:重启网卡或升级内核后,手动写的resolv.conf被重置,我们的推荐方案是:结合西西云控制台的“VPC网络”能力,在子网层面统一配置DNS,而非单台机器修改,具体操作:

  1. 在西西云控制台进入“VPC → 子网”,点击“编辑DNS”。
  2. 填入内网DNS地址(如0.0.2)和公网备用DNS。
  3. 保存后,所有该子网下的云服务器自动继承配置,即使重启或重装系统也不会丢失

对于需要临时测试的场景,我们建议使用resolvectl命令,因为它能同时兼容NetworkManager和systemd-resolved,避免底层冲突。西西云运维团队还发现

:如果服务器上运行了Docker,Docker默认的17.0.1网关DNS会影响容器解析,建议在/etc/docker/daemon.json中设置"dns": ["8.8.8.8"],并重启Docker。


相关问答

问题1:为什么我修改了/etc/resolv.conf,重启后又被覆盖了?

解答:这是因为你的系统使用了NetworkManager或systemd-resolved等网络管理服务,它们会在网络事件(如重启、重连)时自动重写该文件,解决方法:要么使用nmcli或resolvectl等官方命令配置(推荐),要么将/etc/resolv.conf设置为只读(chattr +i /etc/resolv.conf),但这样可能导致依赖该文件的服务异常,更合理的做法是找到生成该文件的源头(如/etc/NetworkManager/NetworkManager.conf或/etc/systemd/resolved.conf)进行修改。

问题2:配置多个DNS服务器时,系统是按什么顺序使用的?

解答:Linux glibc解析器按/etc/resolv.conf中nameserver出现的顺序依次查询,只有当第一个超时或返回SERVFAIL时才尝试第二个,注意不是负载均衡,建议将最快的DNS放最前面,同时可以通过options rotate启用轮询,但会降低缓存命中率,对于高可用场景,建议在本地运行dnsmasq或unbound作为缓存转发器,将上游DNS配置在转发器中,这样即使某个上游故障也能自动切换。


您是否有过在Linux上配置DNS被覆盖的经历?欢迎在评论区分享您的解决方案,一起探讨更优的配置技巧!

0