DNS故障的解决方案 |
当我首次了解DNS时,我认为它应该不会那么复杂,只不过是存储在服务器上的一些DNS记录。然而,教科书仅介绍了DNS的原理,而没有说明在实际使用中DNS可能会以多少种方式破坏您的系统。这不仅仅是缓存问题! 因此,我在百度上发起了一个提问,征集人们遇到的DNS问题,尤其是那些起初看起来与DNS无关的问题。(这个梗“总是DNS问题”) 我不打算在这篇文章中讨论如何解决或避免这些问题,但我会提供一些讨论这些问题的链接,您可以在其中找到解决问题的方法。 一问题:网络请求缓慢如果你的网络比预期的要慢,这是因为某些原因导致 DNS 解析器变慢了。这可能是解析器负载过大或者存在内存泄漏等原因导致的。 我的路由器的 DNS 转发器曾遇到过这个问题,导致我的所有 DNS 请求很慢。我通过重启路由器解决了这个问题。 二问题:DNS 超时一些网友提到由于 DNS 查询超时,他们的网络请求需要耗时 2 秒多甚至 30 秒。这跟“网络请求缓慢”问题类似,但情况要更糟糕,因为 DNS 请求就会消耗掉几秒钟时间。 Sophie Haskins 有一篇关于 Kubernete DNS 超时的博客文章 一次 Kube DNS 踩坑经历。 三问题:ndots 设置一些网友提到在 下面是从 这篇《Kubernetes 容器夹中
如果你用上面的配置文件,想要查询得域名是 1. google.com.namespace.svc.cluster.local. 2. google.com.svc.cluster.local. 3. google.com.cluster.local. 4. google.com.eu-west-1.compute.internal. 5. google.com. 简单来说,它会检查 所以每发起一次 DNS 查询,你都得先等待前 4 次查询失败后才能获取到最终查询结果。 四问题:难以判断系统使用的 DNS 解析器这本身并不是一个问题,但当你遇到 DNS 问题时,一般都会跟 DNS 解析器有关。我没有一种判断 DNS 解析器的万能方法。 下面是我知道的方法: · 在 Linux 系统上,最常见的是通过 /etc/resolv.conf 来选择 DNS 解析器。但是也有例外,比如浏览器可能会忽略 /etc/resolv.conf,而是使用 基于 HTTPS 的 DNS(DNS-over-HTTPS) 服务。 · 如果你使用的是 UDP DNS,你可以通过 sudo tcpdump port 53 来查看 DNS 请求被发送到了哪里。但如果你使用的是基于 HTTPS 的 DNS 或 基于 TLS 的 DNS(DNS over TLS),这个方法就不行了。 我依稀记得这在 MacOS 系统上会更加令人迷惑,我也不清楚原因。 五问题:DNS 服务器返回 NXDOMAIN 而不是 NOERROR这是我曾经遇到过的一个 Nginx 不能解析域名的问题。 · 我设置 Nginx 使用一个特定的 DNS 服务器来解析 DNS 查询 · 当访问这个域名时,Nginx 做了两次查询,第一次是对 A 的,第二次是对 AAAA 的 · 对于 A 的查询,DNS 服务器返回 NXDOMAIN · Nginx 认为这个域名不存在,然后放弃查询 · 对于 AAAA 的查询 DNS 服务器返回了成功 · 但 Nginx 忽略了对 AAAA 返回的查询结果,因为它前面已经放弃查询了 问题出在 DNS 服务器本应该返回 NOERROR 的——那个域名确实存在,只是没有关于 A 的记录罢了。我报告了这个问题,然后他们修复了这个问题。 我自己也写出过这个问题,所以我理解为什么会发生这种情况——很容易想当然地认为“没有要查询的记录,就应该返回 NXDOMAIN 错误码”。 六问题:自动生效的 DNS 缓存如果你在生成一个域名的 DNS 记录之前就访问这个域名,那么这个记录的缺失会被缓存起来。当你第一次遇到这个问题时一定会非常吃惊——我也是去年才知道有这个问题。 缓存的 TTL 就是域名的 起始权限记录(Start of Authority)(SOA) 记录的 TTL ——比如对于 七问题:Nginx 永久缓存 DNS 记录如果你在 Nginx 中使用下面的配置:
Nginx 只会在启动的时候解析一次 针对这个问题已经有很多众所周知的方法了,但由于本文不是关于 Nginx 的,所以我不打算深入探讨它。但你第一次遇到它时一定会很惊讶。 八问题:Java 永久缓存 DNS 记录跟上面类似的问题,只是出现在 Java 上:据说 这与你 Java 的配置有关。“JVM 的默认 TTL 设置可能会导致只有 JVM 重启时才会刷新 DNS 记录。” 我还没有遇到过这个问题,不过我那些经常写 Java 的朋友遇到过这个问题。 当然,任何软件都可能存在永久缓存 DNS 的问题,但据我所知它经常出现在 Nginx 和 Java 上。 九问题:被遗忘的 /etc/hosts 记录这是另一种缓存问题: 让人迷惑的是 十问题:电子邮件未发送 / 将成为垃圾邮件电子邮件是通过 DNS(MX 记录, SPF 记录, DKIM 记录)来发送和验证的,所以有些电子邮件问题其实是 DNS 问题。 十一问题:对国际化域名无效你可以使用非 ASCII 字符甚至是表情符来注册域名,比如 拉屎网 https:// |