使得 DNS 难以理解的事情之一是它是 分布式的。有成千上万(也许是几十万?我不知道!)的权威性域名服务器authoritative nameserver,以及至少1000 万个解析器。而且它们正在运行许多不同的软件!不同服务器运行着不同的软件意味着 DNS 的工作方式有很多不一致的地方,这可能导致各种令人沮丧的问题。
但是,与其谈论这些问题,我更感兴趣的是弄清楚 —— 为什么 DNS 是分布式的是一件好事?
为什么 DNS 是分布式的是件好事?
一个原因是 可扩展性—— DNS 的分布式设计使其更容易扩展,对故障的恢复能力更强。我发现,尽管 DNS 已经有近 40 年的历史,但它的扩展性仍然很好,这真是令人惊讶。这一点非常重要,但这并不是这篇文章的主题。
相反,我想说的是,它是分布式的意味着你可以 控制你的 DNS 的工作方式。你可以向巨大而复杂的 DNS 服务器中添加更多的服务器!添加你控制的服务器!
昨天我 在 Twitter 上问为什么你要运行自己的 DNS 服务器,我得到了很多很好的答案,我想在这里总结一下。
这是一个不错的思维模型。但是,“电话簿” 思维模型可能会使你认为,如果你对 google.com进行 DNS 查询,你将永远得到相同的结果。而这是不正确的。
你在 DNS 查询中得到的记录可能取决于:
你在世界的哪个地方(也许你会得到一个离你更近的服务器的 IP 地址)你是否在企业网络里(你可以在其中解析内部域名)该域名是否被你的 DNS 解析器认为是 “坏” 的(它可能被封锁!)之前的 DNS 查询(也许 DNS 解析器正在做基于 DNS 的负载平衡,每次给你一个不同的 IP 地址)你是否在使用机场 Wi-Fi 专属门户(机场 Wi-Fi 会在你登录前以不同的方式解析 DNS 记录,它会给你发送一个特殊的 IP 来重定向你)随便什么
你可能想控制你自己的服务器的很多原因都与 DNS 不是一个静态数据库这一事实有关 —— 对于如何处理 DNS 查询,你可能会有不同的选择(无论是为你的域名还是为你的组织)。
显然,iodine是一个可以让你通过 DNS 隧道传输流量的权威 DNS 服务器,它可以让你像 VPN 一样与外界联系,
运行解析器的原因
原因:隐私
如果有人能看到你所有的 DNS 查询,他们就有你(或你组织中的每个人)正在访问的所有域名的完整列表!你可能更愿意保持这种隐私。你可能更愿意保持这种隐私。
原因:阻止恶意网站
如果你运行你自己的解析器,你可以(通过不返回任何结果)拒绝解析你认为 “坏” 的域名的 DNS 查询。
几个你可以自己运行(或只是使用)的解析器的例子:
Pi-Hole阻止广告商Quad9阻止做恶意软件/网络钓鱼/间谍软件的域名。 Cloudflare 似乎有一个类似的服务我想也有一些企业安全软件会阻止那些托管恶意软件的域名的 DNS 查询DNS 不是静态数据库。它是非常动态的,答案往往实时取决于查询的 IP 地址、内容服务器的当前负载等。除非你将这些记录的服务委托给做出这些决定的实体,否则很难实时实现。DNS 委派控制使访问控制非常简单。从区域中切下的部分都由控制委派服务器的人控制,所以对一个主机名的责任是隐含在 DNS 委派中的。
原因:在 nginx 中获得动态代理
这里有一个很酷的故事,来自 这条推文:
我在一个应用程序中写了一个 DNS 服务器,然后把它设置为 nginx 的解析器,这样我就可以获得动态的后端代理,而不需要 nginx 运行 lua。Nginx 向应用程序发送 DNS 查询,应用程序查询 Redis 并作出相应的反应。这对我正在做的事情来说,效果非常好。
原因:避免恶意解析器
一些 ISP 运行的 DNS 解析器会做一些不好的事情,比如把不存在的域名指向他们控制的 IP,向你显示广告或他们控制的奇怪的搜索页面。