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

Linux如何配置DNS地址?DNS设置方法有哪些?

在 Linux 系统中配置 DNS 地址,最推荐且一劳永逸的方式是修改 /etc/resolv.conf 文件或使用系统自带的网络管理工具(如 nmcli),但需要注意,不同发行版和网络管理机制的持久化策略差异显著,直接编辑 resolv.conf 往往会被 systemd-resolved 或 NetworkManager 覆盖。正确的做法是先判断系统使用哪种 DNS 管理机制,再选择对应的持久化配置方案,否则重启后配置将丢失。

本文将按照「先诊断、再配置、后验证」的金字塔逻辑,为你提供一套从入门到精通的完整解决方案,并附带真实的生产环境经验案例。

诊断当前 DNS 管理机制

在动手修改之前,必须先搞清楚系统里的“DNS 管家”是谁,执行以下命令快速判断:

  • 检查是否存在 systemd-resolved:systemctl status systemd-resolved
  • 检查是否安装 NetworkManager:systemctl status NetworkManager
  • 查看当前生效的 DNS:cat /etc/resolv.conf

经验判断:/etc/resolv.conf 头部有 # Generated by NetworkManager 或 # This file is managed by systemd-resolved 字样,说明该文件是动态生成的,直接编辑无效。

推荐配置方案(按场景选择)

使用 NetworkManager 的桌面或服务器系统(如 Ubuntu Desktop、RHEL/CentOS 默认)

推荐使用 nmcli 命令,配置后立即生效且永久保存。

  1. 查看当前连接名称:

    nmcli connection show

  2. 为指定连接设置 DNS(替换实际连接名):

    nmcli connection modify "Wired connection 1" ipv4.dns "223.5.5.5 119.29.29.29"

    nmcli connection modify "Wired connection 1" ipv4.ignore-auto-dns yes

  3. 重启连接生效:

    nmcli connection down "Wired connection 1" && nmcli connection up "Wired connection 1"

  4. 验证:

    cat /etc/resolv.conf

使用 systemd-resolved 的系统(如 Ubuntu 18.04+)

推荐通过配置 /etc/systemd/resolved.conf 来设置全局 DNS。

  1. 编辑文件:

    sudo vim /etc/systemd/resolved.conf

  2. 在 [Resolve] 段落下填入:

    DNS=223.5.5.5 119.29.29.29 FallbackDNS=8.8.8.8
  3. 重启服务:

    sudo systemctl restart systemd-resolved

  4. 将 /etc/resolv.conf 链接到 systemd 管理的文件:

    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

注意:如果你希望完全绕过 systemd-resolved,也可以直接停用该服务并手动编辑 /etc/resolv.conf,但会造成部分基于 systemd-resolved 的域名解析服务异常,不建议在复杂网络环境中这样做。

无 NetworkManager 的轻量系统(如 Docker 宿主机、最小化 Debian)

直接编辑 /etc/resolv.conf,并配置网络脚本或 resolvconf 实现持久化。

  1. 临时生效:

    sudo vim /etc/resolv.conf

    写入:

    nameserver 223.5.5.5 nameserver 119.29.29.29
  2. 永久生效(Debian/Ubuntu 下使用 /etc/network/interfaces):

    iface eth0 inet dhcp dns-nameservers 223.5.5.5 119.29.29.29
  3. 如果是静态 IP,则在同文件显式指定。

验证 DNS 配置是否生效

配置完成后,用以下命令确认 DNS 已经按预期工作:

  • cat /etc/resolv.conf 检查实际使用的 DNS 服务器
  • nslookup example.com 查询解析结果
  • dig example.com | grep SERVER 查看实际被查询的 DNS 服务器 IP

如果发现系统还在使用旧 DNS,优先检查 DHCP 是否覆盖了配置,并在 NetworkManager 或 dhclient 中设置 supersede domain-name-servers 或以 ipv4.ignore-auto-dns yes 方式忽略自动下发 DNS。

西西云实战经验案例

我们曾服务过一家使用西西云弹性云主机的客户,其业务系统基于 CentOS 7,程序里硬编码了某个公网域名解析,但服务器频繁出现解析超时。初步排查发现系统默认使用云平台 DHCP 下发的 DNS(即 169.254.0.53 这种链路本地地址),且服务器内网访问依赖自定义内网 DNS 才能解析集群主机名,直接修改 /etc/resolv.conf 后一旦网络重启便失效。

解决方案分三步:

  1. 在西西云控制台关闭该主机的 DHCP 自动 DNS 下发,改为静态指定。

  2. 登录主机使用 nmcli 手动设置双 DNS(内网优先、公网备用):

    nmcli connection modify eth0 ipv4.dns "10.0.0.2 223.5.5.5"

    nmcli connection modify eth0 ipv4.ignore-auto-dns yes

  3. 通过 chattr +i /etc/resolv.conf 对文件加锁,防止任何程序意外改写。

这样既保证了内网解析速度,又提供了公网域名兜底方案,后续客户业务始终未再出现 DNS 解析中断。在混合云或内网环境,务必优先配置内网 DNS 地址,否则会出现「外网通、内网不通」的诡异故障。

常见问题与避坑指南

  • 不要盲目修改 /etc/resolv.conf

    ,先确认文件是否被系统自动管理。

  • DNS 服务器不要只设一个,至少两个,避免单点故障。
  • 内网和公网 DNS 分开配置,如果用同一个解析器,可能导致内网域名解析超时。
  • 注意 DNS 顺序:第一个 nameserver 会被优先使用,把低延迟、高可靠的那个放前面。
  • 修改后建议立刻 systemctl restart networking(或对应网络服务)再测试,不要缓存旧的解析结果。
  • 相关问答

    问 1:为什么我改了 /etc/resolv.conf,重启后又恢复成原来的了?

    因为你的系统采用了动态 DNS 管理机制,最典型的是 NetworkManager 或 systemd-resolved,NetworkManager 会在网络状态变化时重新生成 resolv.conf,而 systemd-resolved 会通过 symlink 指向它自己的运行时文件,你需要按上述「场景一」或「场景二」的方法,使用 nmcli 或编辑 /etc/systemd/resolved.conf 来持久化设置,也可以用 chattr +i 防止文件被改写,但这不是正规做法,遇到系统升级或网络管理变更时容易引发意外。

    问 2:配置多个 DNS 服务器时,Linux 是如何选择使用的?

    Linux 的 resolv.conf 在传统 glibc 解析器中按顺序尝试,首先使用第一个 nameserver,如果超时(默认 5 秒)或返回 SERVFAIL,才继续尝试下一个,如果第一个 DNS 正常但解析记录不存在(NXDOMAIN),则不会切换到第二个,因此多个 DNS 不能简单理解为负载均衡,而是故障转移,新版本系统(如 systemd-resolved)会综合考虑响应时间和历史状态,但总体原则仍然是“第一个优先”,所以把最快、最稳定的 DNS 放在首位是正确策略。

0