我将尝试通过示例来说明我的问题: 当我使用ipv6calc构建反向域时,这就是我想要得到的:
$ ipv6calc --out revnibbles.arpa 2001:0db8:85a3::/48
No input type specified, try autodetection...found type: ipv6addr
3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa.
.
下面是不带前缀(默认值为128)以查看差异的示例
$ ipv6calc --out revnibbles.arpa 2001:0db8:85a3::
No input type specified, try autodetection...found type: ipv6addr
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa.
现在我正在尝试使用ipaddress模块和具有上述前缀(重要)的给定前缀在python中构建反向域
import ipaddress
print(ipaddress.IPv6Network(u"2001:0db8:85a3::/48").reverse_pointer)
输出是
8.4./.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa
似乎该模块没有考虑这一点。 我也尝试过IPy模块,但是它的问题就像地狱一样,在我看来不可用。有谁知道如何解决这个问题?我希望使用一个不使用Shell命令(ipv6calc)的计算机。
提前谢谢
答案 0 :(得分:0)
reverse_pointer
的实现方式为:
def _reverse_pointer(self):
"""Return the reverse DNS pointer name for the IPv6 address.
This implements the method described in RFC3596 2.5.
"""
reverse_chars = self.exploded[::-1].replace(':', '')
return '.'.join(reverse_chars) + '.ip6.arpa'
因此,显然不会考虑前缀。请注意,它专门讲的是IPv6 地址,而不是网络/前缀。
首先,您将通过以下方法得到更好的答案:
print(ipaddress.IPv6Network(u"2001:0db8:85a3::/48").network_address.reverse_pointer)
它给出:0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa
是正确的版本,即使不是您想要的版本。
您需要继承IPv6Network
并重写_reverse_pointer
到您的链接中,或者直接将其当前结果如下所示进行处理,这可能有效,但有一些极端情况:
print(ipaddress.IPv6Network(u"2001:0db8:85a3::/48").network_address.reverse_pointer[(2*(128-48)/4):])
3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa
因为完整的结果是一个32个半字节(十六进制数字)由一个点分隔(除了最后的.ip6.arpa
之外),并且128-48
是非前缀部分的位数,并且自从上一个以位为单位,您需要以十六进制计数字节,因此/4
但以*2
为单位,因为每个半字节都带有一个后接点。