【问题标题】:python get primary domain name from ippython从ip获取主域名
【发布时间】:2020-09-03 14:43:36
【问题描述】:

我需要从 ip 获取主域名。我对 gethostbyaddrgetfqdn 等函数的工作方式有些怀疑。

在以下示例中,我将反转一个随机域的 ip,然后尝试取回该域名:

import socket

domain = 'heroku.com'

# get ip from domain
ip = socket.gethostbyname(domain)
print('ip =', ip)

# get domain from ip
print(socket.gethostbyaddr(ip))
print(socket.getfqdn(ip))

# OUTPUT
# ip = 50.19.85.154
# ('ec2-50-19-85-154.compute-1.amazonaws.com', ['154.85.19.50.in-addr.arpa'], ['50.19.85.154'])
# ec2-50-19-85-154.compute-1.amazonaws.com

gethostbyaddrgetfqdn 似乎都在返回 AWS 上负载平衡 ec2 之一的公共 DNS。我的问题是为什么他们不返回域heroku.com,这可能是在 Route53 上注册的域?

google.com 的另一个例子:

import socket

domain = 'google.com'

# get ip from domain
ip = socket.gethostbyname(domain)
print('ip =', ip)

# get domain from ip
print(socket.gethostbyaddr(ip))
print(socket.getfqdn(ip))

# OUTPUT
# ip = 216.58.208.174
# ('mil07s10-in-f14.1e100.net', ['174.208.58.216.in-addr.arpa', 'lhr25s09-in-f14.1e100.net', 'lhr25s09-in-f174.1e100.net'], ['216.58.208.174'])
# mil07s10-in-f14.1e100.net

这里似乎他们正在返回 GCP 上某些机器的公共 DNS。如何从 IP 地址(在这些示例中为 heroku.comgoogle.com)获取真正的主域名?

【问题讨论】:

  • stackoverflow.com/questions/19547328/…。参考这个问题的cmets。似乎无法对 CNAME 记录进行反向 DNS 查找
  • @MohithReddy “反向 DNS 查找 CNAME 记录”没有任何意义。反向查找使用PTR 记录。这从以特定域名编码的 IP 到另一个域名。当您有一个 CNAME 链时,如果那是查询,那么最后您会期望得到 AAAAA 记录。该记录可能有一个PTR 记录,然后用于反向查询。
  • 您似乎相信所有反向查询都应该有效。对此没有任何保证,也没有必要:任何 IP 地址都可以有 PTR 记录,但实际上要么没有,要么有一个给你的名字与你开始使用的名字不同。考虑大规模虚拟 HTTP/HTTPS 托管:多个名称解析为同一个 IP 地址。您不能指望(虽然从技术上讲是可能的)对 IP 的反向查找会完全返回该 IP 上托管的所有名称
  • 是的,我知道这一点。反向 DNS 查询只能使用 IP 地址执行。通过“似乎不可能对 CNAME 记录进行反向 DNS 查找”这一行,我的意思是同样没有这样的程序。
  • 在虚拟主机的情况下,我相信PTR 记录(如果已配置)的配置方式是它返回托管节点名称(如果有的话)而不是它的虚拟主机是托管。不是这样吗?

标签: python dns ip


【解决方案1】:

当我们对主机名进行 DNS 查找时,在大多数情况下,我们会返回 CNAME。我们采用CNAME,并进一步解决它以获得IP。但是第 (n-1) 个阶段的多个 CNAME 可以映射到第 (n) 个阶段的 CNAME。因此,从后期的CNAME 中取回CNAME 并非易事。

另一种可能的方式

好吧,现在讨论从 DNS 移开,但我希望它对您有所帮助。互联网中的每个路由器或节点都映射到一个自治系统,并且有一些组织或站点维护这个映射数据库。因此,通过拥有 IP,我们可以联系一个这样的数据库以获取其自治系统编号 (ASN) 和节点所属的组织。 whois.cymru.com:43 就是这样一个网站。您可以使用像nc 这样的简单网络客户端来查询其数据库。下面我附上了一个这样的查询的截图。

【讨论】:

  • “当我们对主机名进行 DNS 查找时,在大多数情况下,我们会返回 CNAME。”。不。如果您使用递归名称服务器,它会递归地询问,即使它们是多个 CNAME,直到它获得将呈现给您的最终结果。或者一个错误。
  • 任何合适的whois客户端都可以做这样的查询,你不需要nc。您可以在 RIR 中查询 IP 地址和 AS 编号。
  • 是的,但我们不讨论递归和迭代 DNS 查询。要了解幕后发生的事情,请考虑迭代查询。此外,即使在递归查询中,同样的迭代也是由另一个节点代表我们执行的
  • 关于 RIR,我的知识到此为止。我一定会做一些阅读并了解它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 2022-11-13
  • 2011-01-28
  • 2012-05-31
  • 2013-04-27
  • 1970-01-01
相关资源
最近更新 更多