常用 DNS 解析排查命令
这些命令是你日常排查 DNS 问题最常用、最直接的工具。

nslookup - 查询 DNS 记录的经典工具
nslookup 是最传统、最广泛使用的 DNS 查询工具,它有两种模式:交互式和非交互式。
基本用法 (非交互式):
# 查询域名对应的 IP 地址 (A 记录) nslookup www.baidu.com # 查询 IP 地址对应的域名 (PTR 记录,反向解析) nslookup 8.8.8.8 # 指定 DNS 服务器进行查询 nslookup www.github.com 8.8.8.8 # 查询特定类型的 DNS 记录,如 MX (邮件交换记录) nslookup -type=mx qq.com
交互式模式:
直接输入 nslookup 进入交互模式,可以执行更复杂的查询。

$ nslookup > set type=any # 查询所有类型的记录 > www.google.com > exit # 退出
输出解读: 输出通常分为两部分:
- Non-authoritative answer: 这意味着你的本地 DNS 服务器(如
/etc/resolv.conf中配置的)从另一个权威服务器那里“缓存”了结果,而不是直接从权威服务器获取。 - Authoritative answer: 这意味着你的本地 DNS 服务器直接从管理该域名的权威服务器获取了结果。
dig - 功能更强大的 DNS 查询工具
dig (Domain Information Groper) 是比 nslookup 更现代、信息更详细的工具,也是许多系统管理员的首选。
基本用法:
# 查询 A 记录,默认显示详细信息 dig www.baidu.com # 简洁模式,只返回答案 dig +short www.baidu.com # 指定 DNS 服务器 dig @8.8.8.8 www.github.com # 查询特定类型的记录 dig -t MX qq.com # 查询域名的 NS 记录 (域名服务器) dig -t NS baidu.com # 反向查询 (PTR 记录) dig -x 8.8.8.8
输出解读:
dig 的输出结构非常清晰,分为几个部分:

HEADER: DNS 请求的头部信息。QUESTION SECTION: 你查询的问题。ANSWER SECTION: DNS 服务器返回的答案。AUTHORITY SECTION: 权威 DNS 服务器信息。ADDITIONAL SECTION: 额外的辅助信息(如 A 记录)。
host - 简单快捷的查询工具
host 是一个介于 nslookup 和 dig 之间的工具,简单易用,适合快速查询。
基本用法:
# 查询域名 host www.baidu.com # 指定 DNS 服务器 host www.github.com 8.8.8.8 # 反向查询 host 8.8.8.8 # 查询 MX 记录 host -t MX qq.com
DNS 解析流程与配置管理
当排查发现问题时,你可能需要检查或修改系统的 DNS 配置。
/etc/resolv.conf - 核心配置文件
这个文件定义了系统在进行 DNS 查询时应使用的 DNS 服务器地址。
查看当前配置:
cat /etc/resolv.conf
示例:**
# 这是默认的 DNS 搜索列表 search mylocaldomain.com # 这是系统使用的 DNS 服务器地址,可以多个 nameserver 192.168.1.1 nameserver 8.8.8.8 nameserver 1.1.1.1
重要提示:
在许多现代 Linux 发行版(如 Ubuntu 18.04+, CentOS 7+, Debian 10+)中,/etc/resolv.conf 文件可能是由 systemd-resolved 或 NetworkManager 等服务动态管理的,直接编辑该文件可能会在系统重启或网络变化后被覆盖,修改 DNS 的推荐方法是使用相应的网络管理工具(如 netplan, nmcli)。
修改 DNS 配置的方法
a. 临时修改 (重启后失效)
直接编辑 /etc/resolv.conf(需要 sudo 权限)。
sudo vim /etc/resolv.conf
b. 永久修改 (推荐方法)
-
对于使用
NetworkManager的系统 (如 Ubuntu Desktop, Fedora, CentOS): 使用nmcli命令。# 查看当前连接 nmcli connection show # 修改指定连接的 DNS 服务器 (修改名为 "Wired connection 1" 的连接) sudo nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 1.1.1.1" # 重启网络连接使配置生效 sudo nmcli connection down "Wired connection 1" && sudo nmcli connection up "Wired connection 1"
-
对于使用
systemd-networkd的系统 (如 Ubuntu Server 默认): 编辑网络配置文件,/etc/systemd/network/20-wired.network。[Match] Name=eth0 [Network] DNS=8.8.8.8 1.1.1.1 # 或者使用 DHCP 获取的 DNS # DNS= # Domains=mylocaldomain.com
然后重启
systemd-networkd服务。 -
对于使用
netplan的系统 (如新版本 Ubuntu Server): 编辑/etc/netplan/01-netcfg.yaml文件。network: version: 2 ethernets: eth0: dhcp4: yes # 静态设置 DNS nameservers: addresses: [8.8.8.8, 1.1.1.1] # 或者搜索域 # search: [mylocaldomain.com, anotherdomain.com]然后应用配置:
sudo netplan apply。
进阶与系统级 DNS 工具
systemd-resolve - 查看 systemd-resolved 的缓存
如果你的系统使用 systemd-resolved 作为本地 DNS 解析器(常见于现代发行版),可以使用此命令查看其缓存状态。
# 显示当前 DNS 配置和解析器状态 systemd-resolve --status # 查询特定域名的缓存 systemd-resolve www.baidu.com # 清除 DNS 缓存 sudo systemd-resolve --flush-caches
getent hosts - 通过系统数据库查询主机名
这个命令会查询系统的本地主机名数据库(如 /etc/hosts)和 configured name service switch 库(如 /etc/nsswitch.conf),来查找主机名对应的 IP。
# 优先查找 /etc/hosts,然后查询 DNS getent hosts www.baidu.com # 查看 /etc/hosts 文件中的内容 getent hosts
/etc/nsswitch.conf - 名称服务开关
这个文件定义了系统在查找信息(如主机名、用户、密码等)时,应该查询哪些数据库以及查询的顺序。
查看主机名解析顺序:
cat /etc/nsswitch.conf | grep hosts
输出示例:
hosts: files dns myhostname
这表示解析主机名的顺序是:
files: 首先查找/etc/hosts文件。dns:files中没有找到,则查询 DNS 服务器。myhostname: 最后检查本机主机名。
总结与排查流程
当你遇到 DNS 解析问题时,可以按照以下步骤进行排查:
-
确认问题: 尝试
ping一个域名(如ping www.baidu.com),看是否能解析到 IP。pingIP 地址(如ping 8.8.8.8)成功,但ping域名失败,那几乎可以肯定是 DNS 问题。 -
使用
dig或nslookup: 用dig +short <域名>快速确认 DNS 服务器是否返回了正确的 IP,如果失败,尝试使用一个公共 DNS(如8.8.8)进行查询,以排除本地 DNS 服务器故障。 -
检查
/etc/resolv.conf: 确认nameserver配置是否正确。 -
检查
/etc/hosts: 查看是否有错误的或冲突的条目覆盖了正确的 DNS 解析。 -
检查
/etc/nsswitch.conf: 确认hosts的解析顺序是否合理。 -
检查防火墙或安全组: 确保没有防火墙规则阻止了 DNS 查询(通常是 UDP 53 端口)。
-
重启网络服务: 有时简单的重启可以解决临时性的问题,根据你的系统,使用
sudo systemctl restart NetworkManager或sudo systemctl restart systemd-networkd。
掌握这些命令,你就能应对绝大多数 Linux 环境下的 DNS 解析问题了。
