Назад | Перейти на главную страницу

Странная запись 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

Может кто-нибудь объяснить мне, как это действительная запись.

Это запись 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. Однако неясно, почему кто-то явно захотел добавить такое имя (что оказалось не так).
(Это имя явно не является допустимым именем хоста, а также не соответствует ни одному из широко используемых вариантов использования без имени хоста.)