我正在尝试使用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。
我怎么做?
最佳答案
尽管您期望的结果与获得的结果不一致,但是从Python的标准socket.gethostbyaddr()
获得的结果是正确的。让我们开始看看发生了什么,然后相应地调整您的期望...
在解决此类问题时,诸如dig
之类的DNS实用程序是您的 friend ,因此,在为您解决问题时,我将显示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不能真正提供任何进一步的有用信息。
如果这个答案不够清楚,请在评论中写回,然后我将修改这个答案,直到一切都清楚为止。
关于python - python中的反向DNS查找返回错误的主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62073423/