dig 默认支持 EDNS

目录


最近碰到了件挺无语的事。

如果不说废话,那就是:“dig 默认支持 EDNS,关键参数是 +subnet”。

但你可能会好奇为什么这会让我无语。

那我们就唠唠呗。

dig 与 EDNS

我在排查一些问题的过程中,要测试一下 DNS 解析在不同地域的不同配置是否生效,需要模拟客户端发起解析请求,通过类似于 17ce.com 这种拨测工具,已然能满足我绝大多数情况下的需求。

但有些时候,我就是想知道某个 IP 段向权威 DNS 服务器发起请求时,返回的内容是啥。这时候就犯难了:哪有那么巧的事,拨测点还能刚好在我想要的 IP 段上的?

其实无需拨测,多数权威 DNS 服务器是支持 EDNS 协议的,即“扩展了的 DNS 协议”。而指明客户端 IP 就是这个扩展中重要的特性之一。

dig 是一个常用的命令行工具,用来查询域名的解析记录,功能强大,使用起来也不复杂。比如这里查一下这个站点解析是否正常:

image

好了,下一步就简单了,通过参数指定一下 EDNS 协议中客户端 IP 就好了呗。

但不知道是哪个参数,于是我搜了一下。

image

怎么说呢,真没办法的,大家都是中国人,肯定会一眼先被中文搜索结果吸引住,定睛一看,发现中文的搜索结果都异口同声地告诉你:

“dig 工具默认不支持 EDNS,通过打补丁可让其支持。”

编译源码

好了,计时开始,从这里开始我就跑偏了,后面发生的所有事情都单纯浪费自己时间。

我一直非常反感安装个工具还需要从源码编译的,但是没办法哇,碰到个硬茬了,自行编译就自行编译吧,日子还是要过的。

在编译源码的漫长等待过程中,其实我有察觉一点异样,那就是教程指名道姓说要下载特定的 dig 版本,即 9.9.3,版本不对可能会找不到对应的补丁包。

这其实是一个偏旧的版本,作为比较,CentOS 上通过 yum install bind-utils 安装的 dig 已经是 9.11.4 了。

我以为是时间长了,文章的信息没有更新造成的,于是到提供补丁包的网站上看了一下,到目前为止,确实只提供了少数几个版本的补丁包,而 9.9.3 是最新的一版。

image

但是注意看,即使是最新的一版也是 2016 年创建的文件,这就有点诡异了,但是当时的我并没有多想,继续傻乎乎地等编译完成。

端倪

好了,这就不怪我了,我刚才已经提醒你注意看了,但是你仍然没有注意到那么明显的警告,说明你和我一样,眼神都不咋样啊。

前一张图,用那么大一个红框框来转移你的注意点确实是我的心机,但是开头那用加粗大写的“THIS IS RATHER OBSOLETE”你没看到就不完全是我责任了。

我英语不好,如果写 deprecated、outdated 或 expired 我能认得,但 obsolete 这单词确实认不出,没关系,我英语学不好整翻译插件倒是一套一套的,当时但凡能眼睛多看一眼,意识到大写加粗的文字是作者在尝试传达什么不得了的信息,右击翻译轻轻一点,“过时的”三个大字映入眼帘,也就不至于有这么一出了。

后来之所以能发现,还多亏了那些教人打补丁编译源码的教程偷懒了,只教人怎么添加 EDNS 支持,没说怎么使用,于是我不得不找了些其它的文章看,这才发现了端倪,

端倪在于,这玩意儿怎么用还得看版本,不同版本下指定客户端 IP 的参数名竟是不一样的:

  • 9.10 及以上,使用 +subnet,形如 dig google.com +subnet=208.67.222.0
  • 9.9.3 及以上,使用 +client,形如 dig google.com +client=208.67.222.0

可是补丁包只支持到 9.9.3 哇,那怎么样才能……等等,我勒个去……

当我使用未打补丁包的、使用 yum 默认安装的、版本是 9.11.4 的 dig,添加 +subnet 参数执行,它就这样无情的成功了,我甚至能从程序那迅捷而果断的返回输出中,感受到一点嘲讽的气息:“你还自己编译,瞧把你能的!”

最后

事后我去查了一下,发现 9.10 早在 2014 年就已经发布了。

image

即使考虑到各个软件包平台发版的滞后性,那也不至于在六年后,还有“dig 默认不支持 EDNS”这样的说法吧。

挺无语的。

写这么个无语的事儿,当我在想该起什么标题时,有一点纠结,叫《一件无语的事儿》?或者《如何使用支持 EDNS 的 dig》?

不,我就要和这些落后了六年的信息唱反调:

dig 默认支持 EDNS 哇大哥!

评论加载中……

若长时间无法加载,请刷新页面重试,或直接访问