奇怪的 DNS 条目

奇怪的 DNS 条目

我正在学习更多关于 DNS 系统的知识,现在我正在研究一个用 Go 编写的非常好的项目,我注意到在代码中,它会查询一些 DNS 记录nowhere/?name=probe-test.dns.nextdns.io

最初我认为这不可能是正确的,它看起来更像是一个无效的 URL 而不是域名,但是我启动了一个控制台并点击dig nowhere/?name=probe-test.dns.nextdns.io它返回了一条 A 记录。

$ dig nowhere/?name=probe-test.dns.nextdns.io

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> nowhere/?name=probe-test.dns.nextdns.io
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53429
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1452
;; QUESTION SECTION:
;nowhere/?name=probe-test.dns.nextdns.io. IN A

;; ANSWER SECTION:
nowhere/?name=probe-test.dns.nextdns.io. 300 IN A 45.90.28.0

;; Query time: 26 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Thu Mar 12 18:55:41 EET 2020
;; MSG SIZE  rcvd: 84

有人能向我解释一下这怎样才是一个有效的条目吗?

答案1

它是通配符 DNS 条目。dns.nextdns.io 区域配置为返回 45.90.28.0 作为对 之前任何内容的查询的响应dns.nextdns.io。以下是一些示例,查找foobar。为了保险起见,他们可能已经在他们的区域中拥有这两个,因为它们通常用于测试和演示,所以让我们寻找一些他们不会预料到的东西—— NoWayThisExists

C:\Users\me>nslookup foo.dns.nextdns.io 8.8.8.8
Server:  dns.google
Address:  8.8.8.8

Non-authoritative answer:
Name:    foo.dns.nextdns.io
Address:  45.90.28.0


C:\Users\me>nslookup bar.dns.nextdns.io 8.8.8.8
Server:  dns.google
Address:  8.8.8.8

Non-authoritative answer:
Name:    bar.dns.nextdns.io
Address:  45.90.28.0


C:\Users\me>nslookup NoWayThisExists.dns.nextdns.io 8.8.8.8
Server:  dns.google
Address:  8.8.8.8

Non-authoritative answer:
Name:    NoWayThisExists.dns.nextdns.io
Address:  45.90.28.0

因此,只要您放在开头的内容不包含任何会导致 DNS 解析器出错的无效字符,您就会得到 45.90.28.0 作为响应。并且就您而言, 中的任何字符都不会造成问题。事实上,您可以查找一个仅由符号、、和nowhere/?name=probe-test组成的名称。/?=-

C:\Users\me>nslookup ///???===---.dns.nextdns.io 8.8.8.8
Server:  dns.google
Address:  8.8.8.8

Non-authoritative answer:
Name:    ///???===---.dns.nextdns.io
Address:  45.90.28.0

答案2

问题中假定的域名确实看起来不寻常,所以我去搜索上下文。

谷歌带我来到这里https://github.com/nextdns/nextdns/blob/91b3c6cc735c779c730c3b93a7b0372c9e11774f/resolver/endpoint/manager.go#L139看起来与问题中的字符串完全匹配。

相关代码片段:

var TestDomain = "probe-test.dns.nextdns.io"

...

req, _ := http.NewRequest("GET", "https://nowhere/?name="+TestDomain, nil)

如果确实如此,而且看起来太过相似而不像是纯属巧合,那么看起来有问题的代码实际上并没有发出问题中声称的 DNS 查询,而是根据 URL 发出 HTTP 请求,其中是nowhere主机名部分(URL 中将作为此类请求的一部分进行解析的部分)、路径,以及带有值的/查询字符串参数。nameprobe-test.dns.nextdns.io

至于当您尝试问题中的命令时是否有响应dig nowhere/?name=probe-test.dns.nextdns.io,稍微搜索一下就会发现有一个通配符条目*.dns.nextdns.io,因此无论您用什么奇怪的名称结尾,.dns.nextdns.io都会得到相同的响应。
例如,尝试一下dig foobar.dns.nextdns.io,它会产生完全相同的响应。

值得注意的是,nowhere/?name=probe-test.dns.nextdns.ioDNS 协议本身支持这样的名称。然而,不清楚为什么有人会明确地想要添加这样的名称(事实证明并非如此)。
(该名称显然不是有效的主机名,并且它也不匹配任何广泛使用的非主机名用例。)

相关内容