【发布时间】:2020-09-03 14:43:36
【问题描述】:
我需要从 ip 获取主域名。我对 gethostbyaddr 和 getfqdn 等函数的工作方式有些怀疑。
在以下示例中,我将反转一个随机域的 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
gethostbyaddr 和 getfqdn 似乎都在返回 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.com 和 google.com)获取真正的主域名?
【问题讨论】:
-
stackoverflow.com/questions/19547328/…。参考这个问题的cmets。似乎无法对 CNAME 记录进行反向 DNS 查找
-
@MohithReddy “反向 DNS 查找 CNAME 记录”没有任何意义。反向查找使用
PTR记录。这从以特定域名编码的 IP 到另一个域名。当您有一个 CNAME 链时,如果那是查询,那么最后您会期望得到A或AAAA记录。该记录可能有一个PTR记录,然后用于反向查询。 -
您似乎相信所有反向查询都应该有效。对此没有任何保证,也没有必要:任何 IP 地址都可以有
PTR记录,但实际上要么没有,要么有一个给你的名字与你开始使用的名字不同。考虑大规模虚拟 HTTP/HTTPS 托管:多个名称解析为同一个 IP 地址。您不能指望(虽然从技术上讲是可能的)对 IP 的反向查找会完全返回该 IP 上托管的所有名称 -
是的,我知道这一点。反向 DNS 查询只能使用 IP 地址执行。通过“似乎不可能对 CNAME 记录进行反向 DNS 查找”这一行,我的意思是同样没有这样的程序。
-
在虚拟主机的情况下,我相信
PTR记录(如果已配置)的配置方式是它返回托管节点名称(如果有的话)而不是它的虚拟主机是托管。不是这样吗?