Обратный поиск DNS в python возвращает неверный хост - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь использовать python сокетов, чтобы получить имя хоста ip. Но по какой-то причине, когда я пытаюсь сделать это:

import socket
result = socket.gethostbyaddr('216.58.207.46')  # google ip address
print(result[0])

, я получаю следующее: fra16s24-in-f14.1e100. net.

Как мне получить это для распечатки google.com?

Обновление: я пытаюсь проанализировать диапазон IP-адресов, а затем преобразовать их в имена хостов (если их можно преобразовать). Очевидно, когда я конвертирую 3.126. ***. 192, , я хочу видеть фактическое имя хоста , а не ec2-3-126 - *** - 192.eu-central-1.compute.amazon aws .com.

Как мне это сделать?

1 Ответ

2 голосов
/ 28 мая 2020

Хотя то, что вы ожидаете, не соответствует полученному вами результату, результат, который вы получаете от стандартного socket.gethostbyaddr() Python, является правильным. Давайте начнем с того, что посмотрим, что происходит, а затем поработаем, чтобы соответствующим образом согласовать ваши ожидания ...

Утилиты DNS, такие как dig, станут вашим другом при решении подобных проблем, поэтому я покажу результат dig пока я работаю над ответом для вас.

Обратный поиск в DNS не обязательно является отношением один к одному, как другие указывали в комментариях выше. Он основан на соглашении, согласно которому (используя приведенный выше адрес IPv4 в качестве примера) вы отправляете DNS-запрос для записи PTR для обратного IP-адреса с суффиксом .in-addr.arpa; в вашем случае это 46.207.58.216.in-addr.arpa:

▶ dig 46.207.58.216.in-addr.arpa in ptr 

; <<>> DiG 9.10.6 <<>> 46.207.58.216.in-addr.arpa in ptr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23082
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;46.207.58.216.in-addr.arpa.    IN  PTR

;; ANSWER SECTION:
46.207.58.216.in-addr.arpa. 77579 IN    PTR fra16s24-in-f14.1e100.net.

;; Query time: 85 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Thu May 28 13:17:17 PDT 2020
;; MSG SIZE  rcvd: 83

Ответ DNS здесь представляет собой запись PTR для fra16s24-in-f14.1e100.net, которая полностью соответствует тому, что вы видите, когда используете Python socket.gethostbyaddr().

Хотя это может быть правдой, что вы связываете этот хост с чем-то связанным с google.com концептуально, он может не быть привязан к чему-либо, относящемуся к домену верхнего уровня google.com, что касается DNS. .

Изменить (на основе вашего обновления):

Очевидно, когда я конвертирую 3.126. ***. 192, я хочу видеть реальное имя хоста, а не ec2-3 -126 - *** - 192.eu-central-1.compute.amazon aws .com.

В примере, который вы здесь приводите, вы должны понимать, что ec2-3-126-***-192.eu-central-1.compute.amazonaws.com - это фактическое имя хоста. Взгляните на приведенную выше статью об обратном поиске DNS, а также ознакомьтесь с руководством о том, как работает DNS. Следует повторить, что много адресных записей может существовать для одного имени (и часто это имеет место для ресурсов с балансировкой нагрузки).

Вот пример этого для stackoverflow.com:

▶ dig stackoverflow.com in a

; <<>> DiG 9.10.6 <<>> stackoverflow.com in a
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51644
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;stackoverflow.com.     IN  A

;; ANSWER SECTION:
stackoverflow.com.  106 IN  A   151.101.193.69
stackoverflow.com.  106 IN  A   151.101.129.69
stackoverflow.com.  106 IN  A   151.101.1.69
stackoverflow.com.  106 IN  A   151.101.65.69

;; Query time: 81 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Thu May 28 13:25:55 PDT 2020
;; MSG SIZE  rcvd: 99

Должны ли все эти IP-адреса иметь записи PTR, указывающие на stackoverflow.com? Нет, не обязательно ... Давайте посмотрим на один пример:

▶ dig 69.193.101.151.in-addr.arpa in ptr

; <<>> DiG 9.10.6 <<>> 69.193.101.151.in-addr.arpa in ptr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 418
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;69.193.101.151.in-addr.arpa.   IN  PTR

;; AUTHORITY SECTION:
151.in-addr.arpa.   3125    IN  SOA pri.authdns.ripe.net. dns.ripe.net. 1586415572 3600 600 864000 3600

;; Query time: 79 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Thu May 28 13:28:03 PDT 2020
;; MSG SIZE  rcvd: 116

В этом случае есть no PTR-записи, когда вы выполняете обратный поиск DNS по этому IP-адресу . Итак, как Python s gethostbyaddr обработает этот случай?

>>> socket.gethostbyaddr('151.101.193.69')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.herror: [Errno 1] Unknown host

В этом случае возникает исключение. Если в ответе DNS нет записи PTR для обратного просмотра, Python не может предложить никакой дополнительной полезной информации.

Если этот ответ недостаточно ясен, напишите в комментарии, и я буду исправлять этот ответ, пока все не будет ясно.

...