python中的反向DNS查找返回错误的主机

2024-04-25 07:50:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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.amazonaws.com

我该怎么做


Tags: inimportipcomnetaddressgooglesocket
1条回答
网友
1楼 · 发布于 2024-04-25 07:50:17

虽然您期望的结果与您得到的结果不一致,但是您从Python的标准socket.gethostbyaddr()得到的结果是正确的。让我们先看看正在发生的事情,然后根据情况调整您的期望

DNS实用程序(如dig)在处理此类问题时是您的朋友,因此我将在为您寻找答案时显示dig的输出

Reverse DNS lookup不一定是一对一的关系,正如其他人在上述评论中指出的那样。它依赖于一种约定,其中(以上面的IPv4地址为例)您为后缀为PTR的反向IP地址的.in-addr.arpa记录发出DNS查询;在您的情况下,这是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响应是fra16s24-in-f14.1e100.net的PTR记录,这与使用Python的socket.gethostbyaddr()时看到的完全一致

虽然从概念上讲,您可能会将此主机与google.com相关联,但就DNS而言,它可能不会与google.com顶级域相关联

编辑(基于您的更新):

Obviously, when I convert 3.126.***.192, I want to see an actual hostname, and not ec2-3-126-***-192.eu-central-1.compute.amazonaws.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是否都应该有指向stackoverflow.com的PTR记录?不,不一定。。。让我们看一个例子:

▶ 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

在这种情况下,当您在此IP地址上执行反向DNS查找时,没有PTR记录。那么,Python的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实际上无法提供任何进一步的有用信息

如果这个答案不够清楚,写回一条评论,我会修改这个答案,直到一切都清楚

相关问题 更多 >