Python IP地址模块和IPv6反向指针
我将试着用例子来解释我的问题: 当我使用ipv6calc构建反向域时,这就是我想要得到的:Python IP地址模块和IPv6反向指针,python,dns,ipv6,Python,Dns,Ipv6,我将试着用例子来解释我的问题: 当我使用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
$ 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.
现在,我正在尝试用python构建反向域,使用ipaddress模块和如上所述的给定前缀(重要)
输出为
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模块,但它的bug太多,在我看来不可用。有人知道如何解决这个问题吗?我更喜欢不使用shell命令(ipv6calc)的
提前感谢反向指针是这样实现的:
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.3.a.5.8.8.b.d.0.1.0.0.0.2.ip6.arpa
这是正确的版本,即使不是您想要的
您需要将IPv6Network
子类化,并根据自己的喜好重写\u reverse\u 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
,因为每个半字节都有一个点。我不同意投票结果。这个问题已经包含了一个MCVE,它清楚地说明了问题,以及它与预期结果的区别。不过,我的Python不够强大,无法解决这个问题。我有一个简单的解决方案network=ipaddress.IPv6Network('2001:db8:85a3::/48',False);'。join(network.network\u address.reverse\u pointer.split('.')[32-(network.prefixlen//4):])
,这仍然不令人满意。如果将输出与ipv6calc和一些特殊前缀(例如49)进行比较,则您的和我的都不正确
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