Python中的反向DNS查找

11

如果我有一个IP地址,例如2001:4860:4860::8888

如何以foo.ip6.arpa的格式获取完全限定域名?

编辑:到目前为止,两种解决方案都给了我google-public-dns-a.google.com - 也许反向DNS是错误的名称。对此,我希望输出类似于8.8.8.8.0...etc.ip6.arpa的内容。


答案看起来对我来说是正确的,尽管问题已经被编辑过了。但是难道没有标准模块能够返回.ip6.arpa格式吗? - Pavel Šimerda
2个回答

16

IPy提供了你所需的方法:

>>> from IPy import IP
>>> ip = IP('127.0.0.1')
>>> ip.reverseName()
'1.0.0.127.in-addr.arpa.'

该方法适用于IPv4和IPv6,虽然原始的IPy在IPv6上存在一些缺陷。我创建了一个分支,在https://github.com/steffann/python-ipy 上进行了一些扩展和修复,只要这些修复没有合并回原始代码,您就可以使用它。

更新:

当然,您也可以使用内置的socket模块中的getnameinfo函数

>>> import socket
>>> socket.getnameinfo(('2001:4860:4860::8888', 0), 0)
('google-public-dns-a.google.com', '0')
>>> socket.getnameinfo(('127.0.0.1', 0), 0)
('localhost', '0')

你需要提供一个主机+端口元组,但是你可以将端口设置为0,这样你将得到主机名。


需要注意的是,socket.getnameinfo 并不是真正的反向 DNS 解析(这意味着仅/准确地询问 DNS)。使用 socket.getnameinfo 还可能考虑其他源,例如 /etc/hosts(通常甚至在查询 DNS 之前)并且甚至可能完全不会去查询 DNS。 - calestyo

11

使用 dnspython 库。

from dns import resolver,reversename
addr=reversename.from_address("2001:4860:4860::8888")
str(resolver.query(addr,"PTR")[0])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接