作为Ubuntu用户,您可能曾经遇到过“域名无法访问但IP可以连接”的情况。这时问题的根源大多数在于DNS设置。尤其是最近的Ubuntu默认使用名为systemd-resolved的DNS解析器守护进程,因此了解其结构非常重要。


1. DNS请求的流程

仔细阅读下面的摘要并理解,几乎所有问题都会得到解决。

  1. 用户在浏览器等应用中请求域名
  2. Linux通常通过读取/etc/resolv.conf来解析DNS(该文件与/run/systemd/resolve/stub-resolv.conf存在符号链接)
  3. /run/systemd/resolve/stub-resolv.conf被设置为127.0.0.53,因此systemd-resolved出现了。
  4. 系统中的systemd-resolved受配置文件/etc/systemd/resolved.conf的控制
  5. 换句话说,systemd-resolved/etc/systemd/resolved.conf中查询配置的DNS服务器,
  6. 收到响应并完成域名到IP地址的转换

2. 核心组成部分总结

如上所述,systemd-resolved有四个核心配置文件。理解这些文件的作用是关键。

2-1. /etc/resolv.conf

  • 传统Linux系统中读取DNS服务器列表的位置
  • 但现在为了与systemd兼容,必须以符号链接存在
  • 通常应该设置为如下,以正常工作: bash /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
  • 也就是说,该文件在当前系统中起到“传统应用与systemd-resolved之间的中介作用”

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

  • 包含由systemd-resolved管理的本地DNS存根服务器(127.0.0.53)信息
  • /etc/resolv.conf指向该文件时,所有DNS请求都会经过systemd-resolved

2-3. /etc/systemd/resolved.conf

  • systemd-resolved核心配置文件
  • 可以在这里设置DNS=FallbackDNS=等项以指定优先级
  • 永久性设置,在重启后保持有效

2-4. /run/systemd/resolve/resolv.conf

  • 包含systemd-resolved管理的实际DNS服务器列表的文件
  • 高级用户如果将此文件链接到/etc/resolv.conf,则可以直接请求DNS服务器(绕过设置)

3. 问题发生的例子:ISP提供的路由器中设置的DNS服务器不稳定

  • 韩国著名ISP KT的DNS服务器(例如:168.126.63.1)被设置在路由器中,但我没有控制该路由器的权限时,DNS问题会间歇性发生。
  • KT DNS的响应速度不稳定,或UDP/TCP握手失败的情况较多
  • 当systemd-resolved日志中反复出现以下消息时,是问题的迹象:
    使用降级特性集TCP而不是UDP请求DNS服务器168.126.63.1。
    使用降级特性集UDP而不是TCP请求DNS服务器168.126.63.1。
  • 最终导致域名解析失败→无法访问网站的现象

4. 推荐DNS服务器

名称 地址 特点
Google DNS 8.8.8.8, 8.8.4.4 快速且稳定
Cloudflare DNS 1.1.1.1, 1.0.0.1 速度快且隐私保护优秀
Quad9 9.9.9.9 提供安全威胁过滤

5. 稳定的DNS配置方法

  1. 打开/etc/systemd/resolved.conf文件
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
  1. 应用设置
sudo systemctl restart systemd-resolved
  1. 检查/etc/resolv.conf是否正确链接
ls -l /etc/resolv.conf

→ 应该链接到/run/systemd/resolve/stub-resolv.conf

如果有需要,可以强制重置:

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

6. 注意NetworkManager的干预

使用GUI环境的Ubuntu中,NetworkManager可能会覆盖DNS设置

  • 如果启用了自动DNS设置,systemd-resolved的设置可能会被忽略
  • 解决方法:
    bash nm-connection-editor
    → 编辑连接 → IPv4选项卡 → 关闭自动DNS → 输入手动DNS

7. 结论

  • 由于KT DNS经常报告不稳定性,建议避免使用
  • 通过systemd-resolved进行DNS配置是提高Ubuntu稳定性的强大方法
  • 准确理解和应用设置,可以降低因域名解析失败带来的压力

8. Jesse的评论

基于理解的设置就是最强大的安全和维护。希望这篇文章能对那些在Ubuntu中对DNS设置感到困惑的人们提供实质性的帮助。