菜鸟科技网

Linux DNS 解析命令有哪些?

常用 DNS 解析排查命令

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

Linux DNS 解析命令有哪些?-图1
(图片来源网络,侵删)

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 进入交互模式,可以执行更复杂的查询。

Linux DNS 解析命令有哪些?-图2
(图片来源网络,侵删)
$ 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 的输出结构非常清晰,分为几个部分:

Linux DNS 解析命令有哪些?-图3
(图片来源网络,侵删)
  • HEADER: DNS 请求的头部信息。
  • QUESTION SECTION: 你查询的问题。
  • ANSWER SECTION: DNS 服务器返回的答案。
  • AUTHORITY SECTION: 权威 DNS 服务器信息。
  • ADDITIONAL SECTION: 额外的辅助信息(如 A 记录)。

host - 简单快捷的查询工具

host 是一个介于 nslookupdig 之间的工具,简单易用,适合快速查询。

基本用法:

# 查询域名
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-resolvedNetworkManager 等服务动态管理的,直接编辑该文件可能会在系统重启或网络变化后被覆盖,修改 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

这表示解析主机名的顺序是:

  1. files: 首先查找 /etc/hosts 文件。
  2. dns: files 中没有找到,则查询 DNS 服务器。
  3. myhostname: 最后检查本机主机名。

总结与排查流程

当你遇到 DNS 解析问题时,可以按照以下步骤进行排查:

  1. 确认问题: 尝试 ping 一个域名(如 ping www.baidu.com),看是否能解析到 IP。ping IP 地址(如 ping 8.8.8.8)成功,但 ping 域名失败,那几乎可以肯定是 DNS 问题。

  2. 使用 dignslookup: 用 dig +short <域名> 快速确认 DNS 服务器是否返回了正确的 IP,如果失败,尝试使用一个公共 DNS(如 8.8.8)进行查询,以排除本地 DNS 服务器故障。

  3. 检查 /etc/resolv.conf: 确认 nameserver 配置是否正确。

  4. 检查 /etc/hosts: 查看是否有错误的或冲突的条目覆盖了正确的 DNS 解析。

  5. 检查 /etc/nsswitch.conf: 确认 hosts 的解析顺序是否合理。

  6. 检查防火墙或安全组: 确保没有防火墙规则阻止了 DNS 查询(通常是 UDP 53 端口)。

  7. 重启网络服务: 有时简单的重启可以解决临时性的问题,根据你的系统,使用 sudo systemctl restart NetworkManagersudo systemctl restart systemd-networkd

掌握这些命令,你就能应对绝大多数 Linux 环境下的 DNS 解析问题了。

分享:
扫描分享到社交APP
上一篇
下一篇