我正在学习更多关于 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
。以下是一些示例,查找foo
和bar
。为了保险起见,他们可能已经在他们的区域中拥有这两个,因为它们通常用于测试和演示,所以让我们寻找一些他们不会预料到的东西—— 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 中将作为此类请求的一部分进行解析的部分)、路径,以及带有值的/
查询字符串参数。name
probe-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.io
DNS 协议本身支持这样的名称。然而,不清楚为什么有人会明确地想要添加这样的名称(事实证明并非如此)。
(该名称显然不是有效的主机名,并且它也不匹配任何广泛使用的非主机名用例。)