Ubuntu 22.04 DNS解析故障排查与解决方案

发布时间:2026/10/28 17:27:43
Ubuntu 22.04 DNS解析故障排查与解决方案

1. 问题现象与初步诊断

那天早上,我像往常一样启动Ubuntu 22.04准备开始工作,却发现浏览器打不开任何网页。终端里执行ping 8.8.8.8能通,但ping google.com却提示"Name or service not known"。这种典型的DNS解析失败问题,在Linux系统中其实很常见,但每次遇到都需要系统性地排查。

首先确认基本网络状态:

ip a

这个命令显示我的网卡已经获取到了IP地址,说明物理连接和DHCP服务是正常的。接着测试基础连通性:

ping -c 4 8.8.8.8

得到正常响应,证明TCP/IP协议栈工作正常,能够到达外部网络。问题显然出在域名解析环节。

2. DNS配置深度检查

2.1 查看当前DNS配置

现代Ubuntu使用systemd-resolved管理DNS,首先检查它的状态:

systemd-resolve --status

输出显示DNS服务器被正确设置为路由器IP(192.168.1.1),但奇怪的是解析就是不工作。进一步验证:

cat /etc/resolv.conf

这个本该包含DNS配置的文件,现在只显示了一行注释:

# This is a dynamic resolv.conf file...

原来systemd-resolved通过/run/systemd/resolve/stub-resolv.conf管理实际配置,查看真实配置:

cat /run/systemd/resolve/stub-resolv.conf

这里确实包含了正确的DNS服务器地址。

2.2 手动测试DNS解析

使用dig工具直接测试DNS查询:

dig @8.8.8.8 google.com

这次能正常返回结果,说明问题不是出在外部DNS服务器,而是本地解析器的配置或缓存出了问题。

3. 解决方案实施

3.1 临时解决方案

最快速的解决方法是直接修改/etc/resolv.conf:

sudo nano /etc/resolv.conf

添加:

nameserver 8.8.8.8 nameserver 8.8.4.4

保存后立即生效。但这是个临时方案,因为NetworkManager或systemd-resolved可能会覆盖这个文件。

3.2 永久解决方案

对于Ubuntu 22.04,正确的永久配置方式是通过Netplan。检查/etc/netplan/下的YAML文件:

network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: true nameservers: addresses: [8.8.8.8, 8.8.4.4]

应用配置:

sudo netplan apply

3.3 验证systemd-resolved

确保systemd-resolved服务正常运行:

sudo systemctl restart systemd-resolved sudo systemctl enable systemd-resolved

检查解析状态:

systemd-resolve --statistics

4. 深度问题排查

4.1 检查DNS劫持

有时候问题可能出在ISP的DNS劫持上。使用以下命令检测:

dig +short porttest.dns-oarc.net TXT

如果返回结果包含"DNS Recursion"字样,说明存在DNS放大攻击风险。

4.2 测试不同DNS协议

现代DNS支持TCP和DoT/DoH协议,测试不同协议下的解析:

# 传统UDP dig +short google.com @8.8.8.8 # 强制TCP dig +short google.com @8.8.8.8 +tcp # DoT测试 kdig -d @8.8.8.8 +tls-ca +tls-host=dns.google.com google.com

4.3 检查MTU问题

不合适的MTU设置可能导致DNS包被丢弃:

ping -s 1472 -M do 8.8.8.8

如果能ping通1472字节(1500-28包头),说明MTU设置正常。

5. 高级配置方案

5.1 配置DNS over TLS

编辑/etc/systemd/resolved.conf:

[Resolve] DNS=8.8.8.8 8.8.4.4 DNSOverTLS=opportunistic

重启服务:

sudo systemctl restart systemd-resolved

5.2 使用本地DNS缓存

安装并配置dnsmasq:

sudo apt install dnsmasq

编辑/etc/dnsmasq.conf:

server=8.8.8.8 server=8.8.4.4 cache-size=1000

重启服务:

sudo systemctl restart dnsmasq

5.3 网络管理器配置

对于使用NetworkManager的桌面环境:

nmcli con show nmcli con mod "连接名" ipv4.dns "8.8.8.8 8.8.4.4" nmcli con up "连接名"

6. 疑难问题处理

6.1 处理resolv.conf被覆盖

如果/etc/resolv.conf不断被重置,可以将其设为不可变:

sudo chattr +i /etc/resolv.conf

要修改时先取消属性:

sudo chattr -i /etc/resolv.conf

6.2 诊断DNS泄漏

使用在线工具检查DNS泄漏:

curl ifconfig.me

比较返回的IP与DNS查询的实际出口IP。

6.3 处理IPv6问题

有时IPv6 DNS会导致问题,可以临时禁用:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

7. 最佳实践建议

  1. 多DNS服务器配置:至少配置两个不同的DNS服务器,如一个本地ISP DNS和一个公共DNS(如Cloudflare的1.1.1.1)

  2. 定期清理缓存:

sudo systemd-resolve --flush-caches
  1. 日志监控:定期检查DNS查询日志
journalctl -u systemd-resolved -f
  1. DNS性能测试:使用dnsping比较不同DNS响应速度
dnsping -c 10 8.8.8.8
  1. 应急方案准备:在~/.bashrc中添加别名快速切换DNS
alias fixdns='sudo resolvectl dns eth0 8.8.8.8 8.8.4.4'

经过这样全面的排查和配置后,Ubuntu 22.04的网络连接应该能稳定工作。我在实际运维中发现,90%的DNS问题都源于配置错误或服务异常,系统性的排查能快速定位问题根源。