Я узнаю больше о системах 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
Может кто-нибудь объяснить мне, как это действительная запись.
Это запись 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
Предполагаемое доменное имя в вопросе действительно выглядело необычно, поэтому я стал искать контекст.
Google привел меня сюда 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-запрос, указанный в вашем вопросе, он скорее выполняет HTTP-запрос на основе URL-адреса, где 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. Однако неясно, почему кто-то явно захотел добавить такое имя (что оказалось не так).
(Это имя явно не является допустимым именем хоста, а также не соответствует ни одному из широко используемых вариантов использования без имени хоста.)