65·网络进阶

DNS 解析与配置

dnsresolv.conf

第65课 DNS 解析与配置

学习目标

完成本课学习后,你将能够:

  1. 理解DNS(域名系统) 的作用及其在互联网中的基本工作原理。
  2. 掌握Linux系统中DNS客户端配置,特别是 /etc/resolv.conf 文件的核心参数。
  3. 使用命令行工具验证和诊断DNS解析问题。
  4. 理解不同类型的DNS记录(A、AAAA、CNAME等)及其用途。
  5. 了解DNS配置中的常见陷阱及安全注意事项

核心概念

1. 什么是DNS?

想象一下,互联网是一本巨大的电话簿,而DNS就是负责将“人名”(如 www.google.com)转换成“电话号码”(如 142.250.80.46 这个IP地址)的系统。没有DNS,你将不得不记住一长串无规律的数字才能访问网站。

DNS查询过程通常涉及递归查询。当你在浏览器输入一个域名时:

  • 你的电脑首先查询本地缓存。
  • 如果没有,它会询问配置的DNS解析器(通常由你的ISP或公司提供,也称为递归解析器)。
  • 这个解析器会像侦探一样,从根域名服务器开始,一级一级地向下查询,直到找到最终答案,并将结果返回给你的电脑并缓存。

2. Linux系统DNS配置核心:/etc/resolv.conf

这是Linux系统中最关键的DNS客户端配置文件。它告诉你的系统:“当需要解析域名时,去问哪个服务器?以及查询时有什么特殊规则?”

文件内容通常如下:

nameserver 8.8.8.8
nameserver 8.8.4.4
search example.com mydomain.com
options timeout:2 attempts:3
  • nameserver:指定DNS服务器的IP地址。可以有多条,按顺序尝试。
  • search:指定默认的搜索域。当你输入一个简短的主机名(如 server1)时,系统会自动尝试添加这些域后缀来查询(例如查询 server1.example.com)。
  • options:设置查询选项,如超时时间和重试次数。

重要提示:在现代系统(如Ubuntu 18.04+、CentOS 7+)中,此文件通常由systemd-resolvedNetworkManager等服务动态生成和管理。直接手动编辑可能会被覆盖。

3. /etc/hosts文件

这是另一个关键文件,用于静态IP地址与主机名的映射。它的优先级通常高于DNS查询(可通过 /etc/nsswitch.conf 文件中的 hosts: 行配置)。

127.0.0.1   localhost
192.168.1.10 myserver.mydomain.com myserver

这常用于本地开发、测试,或为内网主机提供快速解析。

代码示例

示例1:查看和临时修改DNS配置

# 1. 查看当前的DNS配置
cat /etc/resolv.conf

# 输出可能类似:
# nameserver 127.0.0.53 (这是systemd-resolved的本地缓存地址)
# options edns0 trust-ad

# 2. 查看实际使用的DNS解析器信息(适用于使用systemd-resolved的系统)
resolvectl status

# 3. 临时添加一个Google的公共DNS服务器(重启网络或系统后会失效)
# 需要root权限,使用 `>>` 追加,避免覆盖原有配置
sudo sh -c 'echo "nameserver 8.8.8.8" >> /etc/resolv.conf'

# 4. 验证修改是否生效,再次查看
cat /etc/resolv.conf

示例2:验证域名解析是否工作

# 1. 使用 `nslookup` 工具进行简单查询
nslookup www.baidu.com
# 输出会显示解析出的IP地址和使用的服务器

# 2. 使用更现代的 `dig` 工具(提供更详细的信息)
dig www.baidu.com
# 关注输出中的 `ANSWER SECTION`,A记录就是IPv4地址

# 3. 使用 `host` 工具,输出更简洁
host www.baidu.com
# 如果看到 `has address`,说明解析成功

示例3:编辑本地 hosts 文件实现自定义解析

# 1. 备份原始文件(好习惯!)
sudo cp /etc/hosts /etc/hosts.backup

# 2. 使用文本编辑器添加条目(以vim为例)
sudo vim /etc/hosts
# 在文件末尾添加一行:
# 192.168.100.5  myinternalserver.local  internal

# 3. 立即测试
ping myinternalserver.local
# 应该会ping向 192.168.100.5

实践练习

练习1:基础诊断

  1. 查看你系统当前的 /etc/resolv.conf 文件,记录下配置的 nameserver 地址。
  2. 使用 dig 命令查询 github.com,并找出返回的第一个IPv4地址(A记录)。
  3. 预期输出:在 dig 的输出中,找到类似 github.com. 30 IN A 20.205.243.166 的行。

练习2:配置测试

  1. 尝试将你的DNS服务器临时更改为 1.1.1.1(Cloudflare的公共DNS)。
  2. 使用 ping www.google.comdig www.google.com 测试新的解析是否生效。
  3. 观察解析速度是否有变化。
  4. 预期输出ping 命令能成功解析出IP并开始发送数据包。

练习3:Hosts文件与解析顺序

  1. /etc/hosts 文件中添加一条记录:127.0.0.1 testhost.example.com
  2. 确保你的DNS配置中能正常解析 example.com 这个域。
  3. 使用 ping testhost.example.com 测试,它应该解析到 127.0.0.1
  4. 现在,在 /etc/hosts 中注释掉你刚才添加的那行。
  5. 再次执行 ping testhost.example.com,它现在是否从DNS解析?
  6. 预期输出:第一次ping指向本地回环地址(127.0.0.1),第二次可能解析失败或得到真实IP(取决于 example.com 是否在公共DNS中存在)。

常见错误

  1. 直接编辑 /etc/resolv.conf 但重启后配置丢失:在由 NetworkManagersystemd-resolved 管理的系统上,应通过修改网络连接配置文件(如 /etc/netplan/*.yaml/etc/sysconfig/network-scripts/ifcfg-*)来永久设置DNS。
  2. 误解 search 指令search 域的列表不宜过长,否则会增加不必要的查询延迟。通常只设置一个默认域。
  3. /etc/hosts 文件优先级问题:如果修改了 hosts 文件但解析未生效,检查 /etc/nsswitch.confhosts: 的行,确保 filesdns 之前(如 hosts: files dns myhostname)。
  4. 忽略缓存:即使修改了DNS配置,旧的解析结果可能被系统或应用缓存。可以使用 sudo systemd-resolve --flush-caches(systemd系统)或重启 nscd 服务来清缓存。
  5. 安全风险:随意使用不可信的公共DNS可能带来隐私风险。在企业环境中,务必使用官方指定的DNS服务器。

小结

  • DNS是互联网的基础导航系统,负责将人类可读的域名转换为机器使用的IP地址。
  • /etc/resolv.conf 是Linux DNS客户端的核心配置文件,通过 nameserver 指定查询服务器,search 设定默认搜索域。
  • /etc/hosts 提供了本地的、静态的域名映射,其优先级通常高于DNS,适用于内部网络或开发测试。
  • 使用 nslookup, dig, host 命令是诊断DNS问题的基本技能。
  • 注意系统服务(如NetworkManager)对DNS配置文件的动态管理,以实现永久、正确的配置。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「hostname、host 与 nslookup」 以巩固所学知识。