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

标签 python python-3.x sockets dns reverse-dns

我正在尝试使用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/

相关文章:

python - Python ping 扫描脚本问题

python - TimedRotatingFileHandler 日志的文件名约定? (Python)

python - 诅咒Windows的替代品

c - ACK真的在最简单的UDP套接字编程中迷失了吗?

python - 希望写入单独的文件; python :

python - 没有名为 PyQt5.sip 的模块

python-3.x - 安装python-flask会显示错误[python setup.py egg_info失败,错误代码为1]

python - 在python中按 block 解压缩文件夹

python - 绑定(bind)套接字时权限被拒绝

c++ - 编写客户端和服务器,UDP